issue-5: add teleport hud
This commit is contained in:
@@ -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():
|
||||
|
||||
173
assets/root/uiTeleport.py
Normal file
173
assets/root/uiTeleport.py
Normal file
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user