issue-5: add teleport hud

This commit is contained in:
server
2026-04-16 18:33:07 +02:00
parent c11008d1c8
commit 4ef859e26f
3 changed files with 217 additions and 0 deletions

View File

@@ -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
View 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)

View File

@@ -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)