diff --git a/assets/root/interfacemodule.py b/assets/root/interfacemodule.py index a2752c77..02976c0a 100644 --- a/assets/root/interfacemodule.py +++ b/assets/root/interfacemodule.py @@ -26,6 +26,7 @@ import uiRestart import uiToolTip import uiMiniMap import uiBiolog +import uiTeleport import uiParty import uiSafebox import uiGuild @@ -77,6 +78,7 @@ class Interface(object): self.wndMessenger = None self.wndMiniMap = None self.wndBiolog = None + self.wndTeleport = None self.wndGuild = None self.wndGuildBuilding = None @@ -183,6 +185,7 @@ class Interface(object): wndMiniMap = uiMiniMap.MiniMap() wndBiolog = uiBiolog.BiologWindow() + wndTeleport = uiTeleport.TeleportWindow() wndSafebox = uiSafebox.SafeboxWindow() # ITEM_MALL @@ -199,9 +202,11 @@ class Interface(object): self.wndDragonSoulRefine = wndDragonSoulRefine self.wndMiniMap = wndMiniMap self.wndBiolog = wndBiolog + self.wndTeleport = wndTeleport self.wndSafebox = wndSafebox self.wndChatLog = wndChatLog self.wndMiniMap.SetBiologButtonEvent(ui.__mem_func__(self.ToggleBiologWindow)) + self.wndMiniMap.SetTeleportButtonEvent(ui.__mem_func__(self.ToggleTeleportWindow)) if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.SetDragonSoulRefineWindow(self.wndDragonSoulRefine) @@ -963,6 +968,15 @@ class Interface(object): else: self.wndBiolog.Hide() + def ToggleTeleportWindow(self): + if False == self.wndTeleport.IsShow(): + (miniMapX, miniMapY) = self.wndMiniMap.GetGlobalPosition() + self.wndTeleport.SetPosition(max(10, miniMapX - self.wndTeleport.GetWidth() - 10), miniMapY + 24) + self.wndTeleport.Show() + self.wndTeleport.SetTop() + else: + self.wndTeleport.Hide() + def ToggleCharacterWindow(self, state): if False == player.IsObserverMode(): if False == self.wndCharacter.IsShow(): diff --git a/assets/root/uiTeleport.py b/assets/root/uiTeleport.py new file mode 100644 index 00000000..d3caebed --- /dev/null +++ b/assets/root/uiTeleport.py @@ -0,0 +1,173 @@ +import time + +import background +import net +import player +import quest +import ui + + +class TeleportWindow(ui.BoardWithTitleBar): + TITLE = "Teleport System" + PRESET_BUTTONS = ( + (1, "Village 1"), + (2, "Village 2"), + (3, "Valley"), + (4, "Desert"), + (5, "Sohan"), + (6, "Fireland"), + (7, "Devil"), + (8, "Cave"), + ) + + def __init__(self): + ui.BoardWithTitleBar.__init__(self) + + self.lastRefreshTime = 0.0 + self.slotRows = [] + + self.AddFlag("float") + self.AddFlag("movable") + self.SetSize(310, 255) + self.SetTitleName("Teleport") + self.SetCloseEvent(self.Hide) + + self.__CreateChildren() + self.Hide() + + def __del__(self): + ui.BoardWithTitleBar.__del__(self) + + def __CreateChildren(self): + self.statusLine = self.__CreateValueLine(15, 36) + self.mapLine = self.__CreateValueLine(15, 56) + self.coordLine = self.__CreateValueLine(15, 76) + self.slotSummaryLine = self.__CreateValueLine(15, 96) + self.cooldownLine = self.__CreateValueLine(15, 116) + + for index, presetData in enumerate(self.PRESET_BUTTONS): + (presetId, label) = presetData + row = index // 4 + column = index % 4 + + button = self.__CreateButton(15 + column * 71, 142 + row * 24, 64, label) + button.SetEvent(self.__SendPresetWarp, presetId) + + for slot in range(1, 6): + label = self.__CreateValueLine(15, 196 + (slot - 1) * 11) + saveButton = self.__CreateButton(100, 192 + (slot - 1) * 11, 42, "Save") + saveButton.SetEvent(self.__SendSaveSlot, slot) + useButton = self.__CreateButton(148, 192 + (slot - 1) * 11, 42, "Use") + useButton.SetEvent(self.__SendUseSlot, slot) + self.slotRows.append((label, saveButton, useButton)) + + def __CreateValueLine(self, x, y): + textLine = ui.TextLine() + textLine.SetParent(self) + textLine.SetPosition(x, y) + textLine.SetOutline() + textLine.Show() + return textLine + + def __CreateButton(self, x, y, width, text): + button = ui.Button() + button.SetParent(self) + button.SetPosition(x, y) + button.SetUpVisual("d:/ymir work/ui/public/small_thin_button_01.sub") + button.SetOverVisual("d:/ymir work/ui/public/small_thin_button_02.sub") + button.SetDownVisual("d:/ymir work/ui/public/small_thin_button_03.sub") + button.SetDisableVisual("d:/ymir work/ui/public/small_thin_button_01.sub") + button.SetSize(width, 17) + button.SetText(text) + button.Show() + return button + + def __GetTeleportQuestData(self): + questCount = min(quest.GetQuestCount(), quest.QUEST_MAX_NUM) + for questIndex in range(questCount): + (questName, questIcon, questCounterName, questCounterValue) = quest.GetQuestData(questIndex) + if questName != self.TITLE: + continue + + maxSlots = 3 + if "/" in questCounterName: + parts = questCounterName.split("/") + try: + maxSlots = int(parts[-1].strip()) + except: + maxSlots = 3 + + (clockName, clockValue) = quest.GetQuestLastTime(questIndex) + return { + "savedCount" : max(questCounterValue, 0), + "maxSlots" : max(maxSlots, 3), + "clockName" : clockName, + "clockValue" : max(clockValue, 0), + } + + return None + + def __FormatCooldown(self, seconds): + return "%02d:%02d" % (seconds // 60, seconds % 60) + + def __RefreshSlotRows(self, maxSlots): + for slot, row in enumerate(self.slotRows, 1): + (label, saveButton, useButton) = row + if slot <= maxSlots: + label.SetText("Slot %d" % slot) + saveButton.Enable() + useButton.Enable() + else: + label.SetText("Slot %d (VIP)" % slot) + saveButton.Disable() + useButton.Disable() + + def Refresh(self): + teleportData = self.__GetTeleportQuestData() + (x, y, z) = player.GetMainCharacterPosition() + currentMap = background.GetCurrentMapName() + + self.mapLine.SetText("Map: %s" % currentMap) + self.coordLine.SetText("Coords: %d, %d" % (x // 100, y // 100)) + + if not teleportData: + self.statusLine.SetText("Status: Waiting for teleport quest") + self.slotSummaryLine.SetText("Saved: -") + self.cooldownLine.SetText("Cooldown: -") + self.__RefreshSlotRows(3) + return + + self.statusLine.SetText("Status: %s" % ("Cooldown" if teleportData["clockValue"] > 0 else "Ready")) + self.slotSummaryLine.SetText("Saved: %d / %d" % (teleportData["savedCount"], teleportData["maxSlots"])) + if teleportData["clockValue"] > 0 and len(teleportData["clockName"]) > 0: + self.cooldownLine.SetText("Cooldown: %s" % self.__FormatCooldown(teleportData["clockValue"])) + else: + self.cooldownLine.SetText("Cooldown: Ready") + + self.__RefreshSlotRows(teleportData["maxSlots"]) + + def Show(self): + self.Refresh() + ui.BoardWithTitleBar.Show(self) + + def OnUpdate(self): + currentTime = time.time() + if currentTime - self.lastRefreshTime < 0.2: + return + + self.lastRefreshTime = currentTime + self.Refresh() + + def __SendTeleportCommand(self, action, arg): + net.SendChatPacket("/teleport_system %s %d" % (action, arg), 0) + self.lastRefreshTime = 0.0 + self.Refresh() + + def __SendSaveSlot(self, slot): + self.__SendTeleportCommand("save", slot) + + def __SendUseSlot(self, slot): + self.__SendTeleportCommand("saved", slot) + + def __SendPresetWarp(self, presetId): + self.__SendTeleportCommand("preset", presetId) diff --git a/assets/root/uiminimap.py b/assets/root/uiminimap.py index ae0143a8..cc2e1d97 100644 --- a/assets/root/uiminimap.py +++ b/assets/root/uiminimap.py @@ -225,6 +225,9 @@ class MiniMap(ui.ScriptWindow): self.tooltipBiolog = MapTextToolTip() self.tooltipBiolog.SetText("Biolog") self.tooltipBiolog.Show() + self.tooltipTeleport = MapTextToolTip() + self.tooltipTeleport.SetText("Teleport") + self.tooltipTeleport.Show() self.tooltipInfo = MapTextToolTip() self.tooltipInfo.Show() @@ -263,7 +266,9 @@ class MiniMap(ui.ScriptWindow): self.MiniMapShowButton = 0 self.AtlasShowButton = 0 self.BiologButton = 0 + self.TeleportButton = 0 self.biologButtonEvent = None + self.teleportButtonEvent = None self.tooltipMiniMapOpen = 0 self.tooltipMiniMapClose = 0 @@ -271,6 +276,7 @@ class MiniMap(ui.ScriptWindow): self.tooltipScaleDown = 0 self.tooltipAtlasOpen = 0 self.tooltipBiolog = 0 + self.tooltipTeleport = 0 self.tooltipInfo = None self.serverInfo = None @@ -363,6 +369,17 @@ class MiniMap(ui.ScriptWindow): self.BiologButton.SetEvent(self.biologButtonEvent) self.BiologButton.Show() + self.TeleportButton = ui.Button() + self.TeleportButton.SetParent(self.OpenWindow) + self.TeleportButton.SetPosition(9, 132) + self.TeleportButton.SetUpVisual("d:/ymir work/ui/public/small_thin_button_01.sub") + self.TeleportButton.SetOverVisual("d:/ymir work/ui/public/small_thin_button_02.sub") + self.TeleportButton.SetDownVisual("d:/ymir work/ui/public/small_thin_button_03.sub") + self.TeleportButton.SetText("TP") + if self.teleportButtonEvent: + self.TeleportButton.SetEvent(self.teleportButtonEvent) + self.TeleportButton.Show() + (ButtonPosX, ButtonPosY) = self.MiniMapShowButton.GetGlobalPosition() self.tooltipMiniMapOpen.SetTooltipPosition(ButtonPosX, ButtonPosY) @@ -381,6 +398,9 @@ class MiniMap(ui.ScriptWindow): (ButtonPosX, ButtonPosY) = self.BiologButton.GetGlobalPosition() self.tooltipBiolog.SetTooltipPosition(ButtonPosX, ButtonPosY) + (ButtonPosX, ButtonPosY) = self.TeleportButton.GetGlobalPosition() + self.tooltipTeleport.SetTooltipPosition(ButtonPosX, ButtonPosY) + self.ShowMiniMap() def Destroy(self): @@ -466,6 +486,11 @@ class MiniMap(ui.ScriptWindow): else: self.tooltipBiolog.Hide() + if True == self.TeleportButton.IsIn(): + self.tooltipTeleport.Show() + else: + self.tooltipTeleport.Hide() + def OnRender(self): (x, y) = self.GetGlobalPosition() fx = float(x) @@ -515,3 +540,8 @@ class MiniMap(ui.ScriptWindow): self.biologButtonEvent = event if self.BiologButton: self.BiologButton.SetEvent(event) + + def SetTeleportButtonEvent(self, event): + self.teleportButtonEvent = event + if self.TeleportButton: + self.TeleportButton.SetEvent(event)