-
Contador contenido
8 -
Ingreso
-
Última visita
Mensajes publicados por GMR
-
-
No me deja editar,
Mi interfacemodule.py
## ## Interface ## import constInfo import systemSetting import wndMgr import chat import app import player import uiTaskBar import uiCharacter import uiInventory import uiDragonSoul import uiChat import uiMessenger import guild import ui import uiHelp import uiWhisper import uiPointReset import uiShop import uiExchange import uiSystem import uiRestart import uiToolTip import uiMiniMap import uiParty import uiSafebox import uiGuild import uiQuest import uiPrivateShopBuilder import uiCommon import uiRefine import uiEquipmentDialog import uiGameButton import uiTip import uiCube import miniMap # ACCESSORY_REFINE_ADD_METIN_STONE import uiselectitem # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE import uiScriptLocale import event import localeInfo IsQBHide = 0 class Interface(object): CHARACTER_STATUS_TAB = 1 CHARACTER_SKILL_TAB = 2 LastContactTimeStamp = app.GetTime() - 5 WaitTime = 12 State = "Kapali" def __init__(self): systemSetting.SetInterfaceHandler(self) self.windowOpenPosition = 0 self.dlgWhisperWithoutTarget = None self.inputDialog = None self.tipBoard = None self.bigBoard = None # ITEM_MALL self.mallPageDlg = None # END_OF_ITEM_MALL self.wndWeb = None self.wndTaskBar = None self.wndCharacter = None self.wndInventory = None self.wndExpandedTaskBar = None self.wndDragonSoul = None self.wndDragonSoulRefine = None self.wndChat = None self.wndMessenger = None self.wndMiniMap = None self.wndGuild = None self.wndGuildBuilding = None self.listGMName = {} self.wndQuestWindow = {} self.wndQuestWindowNewKey = 0 self.privateShopAdvertisementBoardDict = {} self.guildScoreBoardDict = {} self.equipmentDialogDict = {} event.SetInterfaceWindow(self) def __del__(self): systemSetting.DestroyInterfaceHandler() event.SetInterfaceWindow(None) ################################ ## Make Windows & Dialogs def __MakeUICurtain(self): wndUICurtain = ui.Bar("TOP_MOST") wndUICurtain.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) wndUICurtain.SetColor(0x77000000) wndUICurtain.Hide() self.wndUICurtain = wndUICurtain def __MakeMessengerWindow(self): self.wndMessenger = uiMessenger.MessengerWindow() from _weakref import proxy self.wndMessenger.SetWhisperButtonEvent(lambda n,i=proxy(self):i.OpenWhisperDialog(n)) self.wndMessenger.SetGuildButtonEvent(ui.__mem_func__(self.ToggleGuildWindow)) def __MakeGuildWindow(self): self.wndGuild = uiGuild.GuildWindow() def __MakeChatWindow(self): wndChat = uiChat.ChatWindow() wndChat.SetSize(wndChat.CHAT_WINDOW_WIDTH, 0) wndChat.SetPosition(wndMgr.GetScreenWidth()/2 - wndChat.CHAT_WINDOW_WIDTH/2, wndMgr.GetScreenHeight() - wndChat.EDIT_LINE_HEIGHT - 37) wndChat.SetHeight(200) wndChat.Refresh() wndChat.Show() self.wndChat = wndChat self.wndChat.BindInterface(self) self.wndChat.SetSendWhisperEvent(ui.__mem_func__(self.OpenWhisperDialogWithoutTarget)) self.wndChat.SetOpenChatLogEvent(ui.__mem_func__(self.ToggleChatLogWindow)) def __MakeTaskBar(self): wndTaskBar = uiTaskBar.TaskBar() wndTaskBar.LoadWindow() self.wndTaskBar = wndTaskBar self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_CHARACTER, ui.__mem_func__(self.ToggleCharacterWindowStatusPage)) self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_INVENTORY, ui.__mem_func__(self.ToggleInventoryWindow)) self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_MESSENGER, ui.__mem_func__(self.ToggleMessenger)) self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_SYSTEM, ui.__mem_func__(self.ToggleSystemDialog)) if uiTaskBar.TaskBar.IS_EXPANDED: self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_EXPAND, ui.__mem_func__(self.ToggleExpandedButton)) self.wndExpandedTaskBar = uiTaskBar.ExpandedTaskBar() self.wndExpandedTaskBar.LoadWindow() self.wndExpandedTaskBar.SetToggleButtonEvent(uiTaskBar.ExpandedTaskBar.BUTTON_DRAGON_SOUL, ui.__mem_func__(self.ToggleDragonSoulWindow)) else: self.wndTaskBar.SetToggleButtonEvent(uiTaskBar.TaskBar.BUTTON_CHAT, ui.__mem_func__(self.ToggleChat)) self.wndEnergyBar = None import app if app.ENABLE_ENERGY_SYSTEM: wndEnergyBar = uiTaskBar.EnergyBar() wndEnergyBar.LoadWindow() self.wndEnergyBar = wndEnergyBar def __MakeParty(self): wndParty = uiParty.PartyWindow() wndParty.Hide() self.wndParty = wndParty def __MakeGameButtonWindow(self): wndGameButton = uiGameButton.GameButtonWindow() wndGameButton.SetTop() wndGameButton.Show() wndGameButton.SetButtonEvent("STATUS", ui.__mem_func__(self.__OnClickStatusPlusButton)) wndGameButton.SetButtonEvent("SKILL", ui.__mem_func__(self.__OnClickSkillPlusButton)) wndGameButton.SetButtonEvent("QUEST", ui.__mem_func__(self.__OnClickQuestButton)) wndGameButton.SetButtonEvent("HELP", ui.__mem_func__(self.__OnClickHelpButton)) wndGameButton.SetButtonEvent("BUILD", ui.__mem_func__(self.__OnClickBuildButton)) self.wndGameButton = wndGameButton def __IsChatOpen(self): return TRUE def __MakeWindows(self): wndCharacter = uiCharacter.CharacterWindow() wndInventory = uiInventory.InventoryWindow() wndInventory.BindInterfaceClass(self) if app.ENABLE_DRAGON_SOUL_SYSTEM: wndDragonSoul = uiDragonSoul.DragonSoulWindow() wndDragonSoulRefine = uiDragonSoul.DragonSoulRefineWindow() else: wndDragonSoul = None wndDragonSoulRefine = None wndMiniMap = uiMiniMap.MiniMap() wndSafebox = uiSafebox.SafeboxWindow() # ITEM_MALL wndMall = uiSafebox.MallWindow() self.wndMall = wndMall # END_OF_ITEM_MALL wndChatLog = uiChat.ChatLogWindow() wndChatLog.BindInterface(self) self.wndCharacter = wndCharacter self.wndInventory = wndInventory self.wndDragonSoul = wndDragonSoul self.wndDragonSoulRefine = wndDragonSoulRefine self.wndMiniMap = wndMiniMap self.wndSafebox = wndSafebox self.wndChatLog = wndChatLog if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.SetDragonSoulRefineWindow(self.wndDragonSoulRefine) self.wndDragonSoulRefine.SetInventoryWindows(self.wndInventory, self.wndDragonSoul) self.wndInventory.SetDragonSoulRefineWindow(self.wndDragonSoulRefine) def __MakeDialogs(self): self.dlgExchange = uiExchange.ExchangeDialog() self.dlgExchange.LoadDialog() self.dlgExchange.SetCenterPosition() self.dlgExchange.Hide() self.dlgPointReset = uiPointReset.PointResetDialog() self.dlgPointReset.LoadDialog() self.dlgPointReset.Hide() self.dlgShop = uiShop.ShopDialog() self.dlgShop.LoadDialog() self.dlgShop.Hide() self.dlgRestart = uiRestart.RestartDialog() self.dlgRestart.LoadDialog() self.dlgRestart.Hide() self.dlgSystem = uiSystem.SystemDialog() self.dlgSystem.LoadDialog() self.dlgSystem.SetOpenHelpWindowEvent(ui.__mem_func__(self.OpenHelpWindow)) self.dlgSystem.Hide() self.dlgPassword = uiSafebox.PasswordDialog() self.dlgPassword.Hide() self.hyperlinkItemTooltip = uiToolTip.HyperlinkItemToolTip() self.hyperlinkItemTooltip.Hide() self.tooltipItem = uiToolTip.ItemToolTip() self.tooltipItem.Hide() self.tooltipSkill = uiToolTip.SkillToolTip() self.tooltipSkill.Hide() self.privateShopBuilder = uiPrivateShopBuilder.PrivateShopBuilder() self.privateShopBuilder.Hide() self.dlgRefineNew = uiRefine.RefineDialogNew() self.dlgRefineNew.Hide() def __MakeHelpWindow(self): self.wndHelp = uiHelp.HelpWindow() self.wndHelp.LoadDialog() self.wndHelp.SetCloseEvent(ui.__mem_func__(self.CloseHelpWindow)) self.wndHelp.Hide() def __MakeTipBoard(self): self.tipBoard = uiTip.TipBoard() self.tipBoard.Hide() self.bigBoard = uiTip.BigBoard() self.bigBoard.Hide() def __MakeWebWindow(self): if constInfo.IN_GAME_SHOP_ENABLE: import uiWeb self.wndWeb = uiWeb.WebWindow() self.wndWeb.LoadWindow() self.wndWeb.Hide() def __MakeCubeWindow(self): self.wndCube = uiCube.CubeWindow() self.wndCube.LoadWindow() self.wndCube.Hide() def __MakeCubeResultWindow(self): self.wndCubeResult = uiCube.CubeResultWindow() self.wndCubeResult.LoadWindow() self.wndCubeResult.Hide() # ACCESSORY_REFINE_ADD_METIN_STONE def __MakeItemSelectWindow(self): self.wndItemSelect = uiselectitem.SelectItemWindow() self.wndItemSelect.Hide() # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE def MakeInterface(self): self.__MakeMessengerWindow() self.__MakeGuildWindow() self.__MakeChatWindow() self.__MakeParty() self.__MakeWindows() self.__MakeDialogs() self.__MakeUICurtain() self.__MakeTaskBar() self.__MakeGameButtonWindow() self.__MakeHelpWindow() self.__MakeTipBoard() self.__MakeWebWindow() self.__MakeCubeWindow() self.__MakeCubeResultWindow() # ACCESSORY_REFINE_ADD_METIN_STONE self.__MakeItemSelectWindow() # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE self.questButtonList = [] self.whisperButtonList = [] self.whisperDialogDict = {} self.privateShopAdvertisementBoardDict = {} self.wndInventory.SetItemToolTip(self.tooltipItem) if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.SetItemToolTip(self.tooltipItem) self.wndDragonSoulRefine.SetItemToolTip(self.tooltipItem) self.wndSafebox.SetItemToolTip(self.tooltipItem) self.wndCube.SetItemToolTip(self.tooltipItem) self.wndCubeResult.SetItemToolTip(self.tooltipItem) # ITEM_MALL self.wndMall.SetItemToolTip(self.tooltipItem) # END_OF_ITEM_MALL self.wndCharacter.SetSkillToolTip(self.tooltipSkill) self.wndTaskBar.SetItemToolTip(self.tooltipItem) self.wndTaskBar.SetSkillToolTip(self.tooltipSkill) self.wndGuild.SetSkillToolTip(self.tooltipSkill) # ACCESSORY_REFINE_ADD_METIN_STONE self.wndItemSelect.SetItemToolTip(self.tooltipItem) # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE self.dlgShop.SetItemToolTip(self.tooltipItem) self.dlgExchange.SetItemToolTip(self.tooltipItem) self.privateShopBuilder.SetItemToolTip(self.tooltipItem) self.__InitWhisper() self.DRAGON_SOUL_IS_QUALIFIED = FALSE def MakeHyperlinkTooltip(self, hyperlink): tokens = hyperlink.split(":") if tokens and len(tokens): type = tokens[0] if "item" == type: self.hyperlinkItemTooltip.SetHyperlinkItem(tokens) ## Make Windows & Dialogs ################################ def Close(self): if self.dlgWhisperWithoutTarget: self.dlgWhisperWithoutTarget.Destroy() del self.dlgWhisperWithoutTarget if uiQuest.QuestDialog.__dict__.has_key("QuestCurtain"): uiQuest.QuestDialog.QuestCurtain.Close() if self.wndQuestWindow: for key, eachQuestWindow in self.wndQuestWindow.items(): eachQuestWindow.nextCurtainMode = -1 eachQuestWindow.CloseSelf() eachQuestWindow = None self.wndQuestWindow = {} if self.wndChat: self.wndChat.Destroy() if self.wndTaskBar: self.wndTaskBar.Destroy() if self.wndExpandedTaskBar: self.wndExpandedTaskBar.Destroy() if self.wndEnergyBar: self.wndEnergyBar.Destroy() if self.wndCharacter: self.wndCharacter.Destroy() if self.wndInventory: self.wndInventory.Destroy() if self.wndDragonSoul: self.wndDragonSoul.Destroy() if self.wndDragonSoulRefine: self.wndDragonSoulRefine.Destroy() if self.dlgExchange: self.dlgExchange.Destroy() if self.dlgPointReset: self.dlgPointReset.Destroy() if self.dlgShop: self.dlgShop.Destroy() if self.dlgRestart: self.dlgRestart.Destroy() if self.dlgSystem: self.dlgSystem.Destroy() if self.dlgPassword: self.dlgPassword.Destroy() if self.wndMiniMap: self.wndMiniMap.Destroy() if self.wndSafebox: self.wndSafebox.Destroy() if self.wndWeb: self.wndWeb.Destroy() self.wndWeb = None if self.wndMall: self.wndMall.Destroy() if self.wndParty: self.wndParty.Destroy() if self.wndHelp: self.wndHelp.Destroy() if self.wndCube: self.wndCube.Destroy() if self.wndCubeResult: self.wndCubeResult.Destroy() if self.wndMessenger: self.wndMessenger.Destroy() if self.wndGuild: self.wndGuild.Destroy() if self.privateShopBuilder: self.privateShopBuilder.Destroy() if self.dlgRefineNew: self.dlgRefineNew.Destroy() if self.wndGuildBuilding: self.wndGuildBuilding.Destroy() if self.wndGameButton: self.wndGameButton.Destroy() # ITEM_MALL if self.mallPageDlg: self.mallPageDlg.Destroy() # END_OF_ITEM_MALL # ACCESSORY_REFINE_ADD_METIN_STONE if self.wndItemSelect: self.wndItemSelect.Destroy() # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE self.wndChatLog.Destroy() for btn in self.questButtonList: btn.SetEvent(0) for btn in self.whisperButtonList: btn.SetEvent(0) for dlg in self.whisperDialogDict.itervalues(): dlg.Destroy() for brd in self.guildScoreBoardDict.itervalues(): brd.Destroy() for dlg in self.equipmentDialogDict.itervalues(): dlg.Destroy() # ITEM_MALL del self.mallPageDlg # END_OF_ITEM_MALL del self.wndGuild del self.wndMessenger del self.wndUICurtain del self.wndChat del self.wndTaskBar if self.wndExpandedTaskBar: del self.wndExpandedTaskBar del self.wndEnergyBar del self.wndCharacter del self.wndInventory if self.wndDragonSoul: del self.wndDragonSoul if self.wndDragonSoulRefine: del self.wndDragonSoulRefine del self.dlgExchange del self.dlgPointReset del self.dlgShop del self.dlgRestart del self.dlgSystem del self.dlgPassword del self.hyperlinkItemTooltip del self.tooltipItem del self.tooltipSkill del self.wndMiniMap del self.wndSafebox del self.wndMall del self.wndParty del self.wndHelp del self.wndCube del self.wndCubeResult del self.privateShopBuilder del self.inputDialog del self.wndChatLog del self.dlgRefineNew del self.wndGuildBuilding del self.wndGameButton del self.tipBoard del self.bigBoard del self.wndItemSelect self.questButtonList = [] self.whisperButtonList = [] self.whisperDialogDict = {} self.privateShopAdvertisementBoardDict = {} self.guildScoreBoardDict = {} self.equipmentDialogDict = {} uiChat.DestroyChatInputSetWindow() ## Skill def OnUseSkill(self, slotIndex, coolTime): self.wndCharacter.OnUseSkill(slotIndex, coolTime) self.wndTaskBar.OnUseSkill(slotIndex, coolTime) self.wndGuild.OnUseSkill(slotIndex, coolTime) def OnActivateSkill(self, slotIndex): self.wndCharacter.OnActivateSkill(slotIndex) self.wndTaskBar.OnActivateSkill(slotIndex) def OnDeactivateSkill(self, slotIndex): self.wndCharacter.OnDeactivateSkill(slotIndex) self.wndTaskBar.OnDeactivateSkill(slotIndex) def OnChangeCurrentSkill(self, skillSlotNumber): self.wndTaskBar.OnChangeCurrentSkill(skillSlotNumber) def SelectMouseButtonEvent(self, dir, event): self.wndTaskBar.SelectMouseButtonEvent(dir, event) ## Refresh def RefreshAlignment(self): self.wndCharacter.RefreshAlignment() def RefreshStatus(self): self.wndTaskBar.RefreshStatus() self.wndCharacter.RefreshStatus() self.wndInventory.RefreshStatus() if self.wndEnergyBar: self.wndEnergyBar.RefreshStatus() if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.RefreshStatus() def RefreshStamina(self): self.wndTaskBar.RefreshStamina() def RefreshSkill(self): self.wndCharacter.RefreshSkill() self.wndTaskBar.RefreshSkill() def RefreshInventory(self): self.wndTaskBar.RefreshQuickSlot() self.wndInventory.RefreshItemSlot() if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.RefreshItemSlot() def RefreshCharacter(self): ## Character 페이지의 얼굴, Inventory 페이지의 전신 그림 등의 Refresh self.wndCharacter.RefreshCharacter() self.wndTaskBar.RefreshQuickSlot() def RefreshQuest(self): self.wndCharacter.RefreshQuest() def RefreshSafebox(self): self.wndSafebox.RefreshSafebox() # ITEM_MALL def RefreshMall(self): self.wndMall.RefreshMall() def OpenItemMall(self): if not self.mallPageDlg: self.mallPageDlg = uiShop.MallPageDialog() self.mallPageDlg.Open() # END_OF_ITEM_MALL def RefreshMessenger(self): self.wndMessenger.RefreshMessenger() def RefreshGuildInfoPage(self): self.wndGuild.RefreshGuildInfoPage() def RefreshGuildBoardPage(self): self.wndGuild.RefreshGuildBoardPage() def RefreshGuildMemberPage(self): self.wndGuild.RefreshGuildMemberPage() def RefreshGuildMemberPageGradeComboBox(self): self.wndGuild.RefreshGuildMemberPageGradeComboBox() def RefreshGuildSkillPage(self): self.wndGuild.RefreshGuildSkillPage() def RefreshGuildGradePage(self): self.wndGuild.RefreshGuildGradePage() def DeleteGuild(self): self.wndMessenger.ClearGuildMember() self.wndGuild.DeleteGuild() def RefreshMobile(self): self.dlgSystem.RefreshMobile() def OnMobileAuthority(self): self.dlgSystem.OnMobileAuthority() def OnBlockMode(self, mode): self.dlgSystem.OnBlockMode(mode) ## Calling Functions # PointReset def OpenPointResetDialog(self): self.dlgPointReset.Show() self.dlgPointReset.SetTop() def ClosePointResetDialog(self): self.dlgPointReset.Close() # Shop def OpenShopDialog(self, vid): self.wndInventory.Show() self.wndInventory.SetTop() self.dlgShop.Open(vid) self.dlgShop.SetTop() def CloseShopDialog(self): self.dlgShop.Close() def RefreshShopDialog(self): self.dlgShop.Refresh() ## Quest def OpenCharacterWindowQuestPage(self): self.wndCharacter.Show() self.wndCharacter.SetState("QUEST") def OpenQuestWindow(self, skin, idx): # YIV WORK: Achievement if constInfo.CQC == 1: return wnds = () q = uiQuest.QuestDialog(skin, idx) q.SetWindowName("QuestWindow" + str(idx)) q.Show() if skin: q.Lock() wnds = self.__HideWindows() # UNKNOWN_UPDATE q.AddOnDoneEvent(lambda tmp_self, args=wnds: self.__ShowWindows(args)) # END_OF_UNKNOWN_UPDATE if skin: q.AddOnCloseEvent(q.Unlock) q.AddOnCloseEvent(lambda key = self.wndQuestWindowNewKey:ui.__mem_func__(self.RemoveQuestDialog)(key)) self.wndQuestWindow[self.wndQuestWindowNewKey] = q self.wndQuestWindowNewKey = self.wndQuestWindowNewKey + 1 # END_OF_UNKNOWN_UPDATE def RemoveQuestDialog(self, key): del self.wndQuestWindow[key] ## Exchange def StartExchange(self): self.dlgExchange.OpenDialog() self.dlgExchange.Refresh() def EndExchange(self): self.dlgExchange.CloseDialog() def RefreshExchange(self): self.dlgExchange.Refresh() ## Party def AddPartyMember(self, pid, name): self.wndParty.AddPartyMember(pid, name) self.__ArrangeQuestButton() def UpdatePartyMemberInfo(self, pid): self.wndParty.UpdatePartyMemberInfo(pid) def RemovePartyMember(self, pid): self.wndParty.RemovePartyMember(pid) ##!! 20061026.levites.퀘스트_위치_보정 self.__ArrangeQuestButton() def LinkPartyMember(self, pid, vid): self.wndParty.LinkPartyMember(pid, vid) def UnlinkPartyMember(self, pid): self.wndParty.UnlinkPartyMember(pid) def UnlinkAllPartyMember(self): self.wndParty.UnlinkAllPartyMember() def ExitParty(self): self.wndParty.ExitParty() ##!! 20061026.levites.퀘스트_위치_보정 self.__ArrangeQuestButton() def PartyHealReady(self): self.wndParty.PartyHealReady() def ChangePartyParameter(self, distributionMode): self.wndParty.ChangePartyParameter(distributionMode) ## Safebox def AskSafeboxPassword(self): if self.wndSafebox.IsShow(): return # SAFEBOX_PASSWORD self.dlgPassword.SetTitle(localeInfo.PASSWORD_TITLE) self.dlgPassword.SetSendMessage("/safebox_password ") # END_OF_SAFEBOX_PASSWORD self.dlgPassword.ShowDialog() def OpenSafeboxWindow(self, size): self.dlgPassword.CloseDialog() self.wndSafebox.ShowWindow(size) def RefreshSafeboxMoney(self): self.wndSafebox.RefreshSafeboxMoney() def CommandCloseSafebox(self): self.wndSafebox.CommandCloseSafebox() # ITEM_MALL def AskMallPassword(self): if self.wndMall.IsShow(): return self.dlgPassword.SetTitle(localeInfo.MALL_PASSWORD_TITLE) self.dlgPassword.SetSendMessage("/mall_password ") self.dlgPassword.ShowDialog() def OpenMallWindow(self, size): self.dlgPassword.CloseDialog() self.wndMall.ShowWindow(size) def CommandCloseMall(self): self.wndMall.CommandCloseMall() # END_OF_ITEM_MALL ## Guild def OnStartGuildWar(self, guildSelf, guildOpp): self.wndGuild.OnStartGuildWar(guildSelf, guildOpp) guildWarScoreBoard = uiGuild.GuildWarScoreBoard() guildWarScoreBoard.Open(guildSelf, guildOpp) guildWarScoreBoard.Show() self.guildScoreBoardDict[uiGuild.GetGVGKey(guildSelf, guildOpp)] = guildWarScoreBoard def OnEndGuildWar(self, guildSelf, guildOpp): self.wndGuild.OnEndGuildWar(guildSelf, guildOpp) key = uiGuild.GetGVGKey(guildSelf, guildOpp) if not self.guildScoreBoardDict.has_key(key): return self.guildScoreBoardDict[key].Destroy() del self.guildScoreBoardDict[key] # GUILDWAR_MEMBER_COUNT def UpdateMemberCount(self, gulidID1, memberCount1, guildID2, memberCount2): key = uiGuild.GetGVGKey(gulidID1, guildID2) if not self.guildScoreBoardDict.has_key(key): return self.guildScoreBoardDict[key].UpdateMemberCount(gulidID1, memberCount1, guildID2, memberCount2) # END_OF_GUILDWAR_MEMBER_COUNT def OnRecvGuildWarPoint(self, gainGuildID, opponentGuildID, point): key = uiGuild.GetGVGKey(gainGuildID, opponentGuildID) if not self.guildScoreBoardDict.has_key(key): return guildBoard = self.guildScoreBoardDict[key] guildBoard.SetScore(gainGuildID, opponentGuildID, point) ## PK Mode def OnChangePKMode(self): self.wndCharacter.RefreshAlignment() self.dlgSystem.OnChangePKMode() ## Refine def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type): self.dlgRefineNew.Open(targetItemPos, nextGradeItemVnum, cost, prob, type) def AppendMaterialToRefineDialog(self, vnum, count): self.dlgRefineNew.AppendMaterial(vnum, count) ## Show & Hide def ShowDefaultWindows(self): self.wndTaskBar.Show() self.wndMiniMap.Show() self.wndMiniMap.ShowMiniMap() if self.wndEnergyBar: self.wndEnergyBar.Show() def ShowAllWindows(self): self.wndTaskBar.Show() self.wndCharacter.Show() self.wndInventory.Show() if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.Show() self.wndDragonSoulRefine.Show() self.wndChat.Show() self.wndMiniMap.Show() if self.wndEnergyBar: self.wndEnergyBar.Show() if self.wndExpandedTaskBar: self.wndExpandedTaskBar.Show() self.wndExpandedTaskBar.SetTop() def HideAllWindows(self): if self.wndTaskBar: self.wndTaskBar.Hide() if self.wndEnergyBar: self.wndEnergyBar.Hide() if self.wndCharacter: self.wndCharacter.Hide() if self.wndInventory: self.wndInventory.Hide() if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.Hide() self.wndDragonSoulRefine.Hide() if self.wndChat: self.wndChat.Hide() if self.wndMiniMap: self.wndMiniMap.Hide() if self.wndMessenger: self.wndMessenger.Hide() if self.wndGuild: self.wndGuild.Hide() if self.wndExpandedTaskBar: self.wndExpandedTaskBar.Hide() def ShowMouseImage(self): self.wndTaskBar.ShowMouseImage() def HideMouseImage(self): self.wndTaskBar.HideMouseImage() def ToggleChat(self): if TRUE == self.wndChat.IsEditMode(): self.wndChat.CloseChat() else: # 웹페이지가 열렸을때는 채팅 입력이 안됨 if self.wndWeb and self.wndWeb.IsShow(): pass else: self.wndChat.OpenChat() def IsOpenChat(self): return self.wndChat.IsEditMode() def SetChatFocus(self): self.wndChat.SetChatFocus() def OpenRestartDialog(self): self.dlgRestart.OpenDialog() self.dlgRestart.SetTop() def CloseRestartDialog(self): self.dlgRestart.Close() def ToggleSystemDialog(self): if FALSE == self.dlgSystem.IsShow(): self.dlgSystem.OpenDialog() self.dlgSystem.SetTop() else: self.dlgSystem.Close() def OpenSystemDialog(self): self.dlgSystem.OpenDialog() self.dlgSystem.SetTop() def ToggleMessenger(self): if self.wndMessenger.IsShow(): self.wndMessenger.Hide() else: self.wndMessenger.SetTop() self.wndMessenger.Show() def ToggleMiniMap(self): if app.IsPressed(app.DIK_LSHIFT) or app.IsPressed(app.DIK_RSHIFT): if FALSE == self.wndMiniMap.isShowMiniMap(): self.wndMiniMap.ShowMiniMap() self.wndMiniMap.SetTop() else: self.wndMiniMap.HideMiniMap() else: self.wndMiniMap.ToggleAtlasWindow() def PressMKey(self): if app.IsPressed(app.DIK_LALT) or app.IsPressed(app.DIK_RALT): self.ToggleMessenger() else: self.ToggleMiniMap() def SetMapName(self, mapName): self.wndMiniMap.SetMapName(mapName) def MiniMapScaleUp(self): self.wndMiniMap.ScaleUp() def MiniMapScaleDown(self): self.wndMiniMap.ScaleDown() def ToggleCharacterWindow(self, state): if FALSE == player.IsObserverMode(): if FALSE == self.wndCharacter.IsShow(): self.OpenCharacterWindowWithState(state) else: if state == self.wndCharacter.GetState(): self.wndCharacter.OverOutItem() self.wndCharacter.Hide() else: self.wndCharacter.SetState(state) def OpenCharacterWindowWithState(self, state): if FALSE == player.IsObserverMode(): self.wndCharacter.SetState(state) self.wndCharacter.Show() self.wndCharacter.SetTop() def ToggleCharacterWindowStatusPage(self): self.ToggleCharacterWindow("STATUS") def ToggleInventoryWindow(self): if self.State == "Kapali": chat.AppendChat(chat.CHAT_TYPE_INFO, "Aviso: Podras abrir el inventario en " + str(int(int(self.LastContactTimeStamp) + self.WaitTime) - int(app.GetTime())) + " segundos") return else: if FALSE == player.IsObserverMode(): if FALSE == self.wndInventory.IsShow(): self.wndInventory.Show() self.wndInventory.SetTop() else: self.wndInventory.OverOutItem() self.wndInventory.Close() def ToggleExpandedButton(self): if FALSE == player.IsObserverMode(): if FALSE == self.wndExpandedTaskBar.IsShow(): self.wndExpandedTaskBar.Show() self.wndExpandedTaskBar.SetTop() else: self.wndExpandedTaskBar.Close() # 용혼석 def DragonSoulActivate(self, deck): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.ActivateDragonSoulByExtern(deck) def DragonSoulDeactivate(self): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.DeactivateDragonSoul() def Highligt_Item(self, inven_type, inven_pos): if player.DRAGON_SOUL_INVENTORY == inven_type: if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.HighlightSlot(inven_pos) def DragonSoulGiveQuilification(self): self.DRAGON_SOUL_IS_QUALIFIED = TRUE self.wndExpandedTaskBar.SetToolTipText(uiTaskBar.ExpandedTaskBar.BUTTON_DRAGON_SOUL, uiScriptLocale.TASKBAR_DRAGON_SOUL) def ToggleDragonSoulWindow(self): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if FALSE == self.wndDragonSoul.IsShow(): if self.DRAGON_SOUL_IS_QUALIFIED: self.wndDragonSoul.Show() else: try: self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED) self.wndPopupDialog.Open() except: self.wndPopupDialog = uiCommon.PopupDialog() self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNQUALIFIED) self.wndPopupDialog.Open() else: self.wndDragonSoul.Close() def ToggleDragonSoulWindowWithNoInfo(self): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if FALSE == self.wndDragonSoul.IsShow(): if self.DRAGON_SOUL_IS_QUALIFIED: self.wndDragonSoul.Show() else: self.wndDragonSoul.Close() def FailDragonSoulRefine(self, reason, inven_type, inven_pos): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if TRUE == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.RefineFail(reason, inven_type, inven_pos) def SucceedDragonSoulRefine(self, inven_type, inven_pos): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if TRUE == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.RefineSucceed(inven_type, inven_pos) def OpenDragonSoulRefineWindow(self): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if FALSE == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.Show() if None != self.wndDragonSoul: if FALSE == self.wndDragonSoul.IsShow(): self.wndDragonSoul.Show() def CloseDragonSoulRefineWindow(self): if FALSE == player.IsObserverMode(): if app.ENABLE_DRAGON_SOUL_SYSTEM: if TRUE == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.Close() # 용혼석 끝 def ToggleGuildWindow(self): if not self.wndGuild.IsShow(): if self.wndGuild.CanOpen(): self.wndGuild.Open() else: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GUILD_YOU_DO_NOT_JOIN) else: self.wndGuild.OverOutItem() self.wndGuild.Hide() def ToggleChatLogWindow(self): if self.wndChatLog.IsShow(): self.wndChatLog.Hide() else: self.wndChatLog.Show() def CheckGameButton(self): if self.wndGameButton: self.wndGameButton.CheckGameButton() def __OnClickStatusPlusButton(self): self.ToggleCharacterWindow("STATUS") def __OnClickSkillPlusButton(self): self.ToggleCharacterWindow("SKILL") def __OnClickQuestButton(self): self.ToggleCharacterWindow("QUEST") def __OnClickHelpButton(self): player.SetPlayTime(1) self.CheckGameButton() self.OpenHelpWindow() def __OnClickBuildButton(self): self.BUILD_OpenWindow() def OpenHelpWindow(self): self.wndUICurtain.Show() self.wndHelp.Open() def CloseHelpWindow(self): self.wndUICurtain.Hide() self.wndHelp.Close() def OpenWebWindow(self, url): self.wndWeb.Open(url) # 웹페이지를 열면 채팅을 닫는다 self.wndChat.CloseChat() # show GIFT def ShowGift(self): self.wndTaskBar.ShowGift() def CloseWbWindow(self): self.wndWeb.Close() def OpenCubeWindow(self): self.wndCube.Open() if FALSE == self.wndInventory.IsShow(): self.wndInventory.Show() def UpdateCubeInfo(self, gold, itemVnum, count): self.wndCube.UpdateInfo(gold, itemVnum, count) def CloseCubeWindow(self): self.wndCube.Close() def FailedCubeWork(self): self.wndCube.Refresh() def SucceedCubeWork(self, itemVnum, count): self.wndCube.Clear() print "큐브 제작 성공! [%d:%d]" % (itemVnum, count) if 0: # 결과 메시지 출력은 생략 한다 self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition()) self.wndCubeResult.SetCubeResultItem(itemVnum, count) self.wndCubeResult.Open() self.wndCubeResult.SetTop() def __HideWindows(self): hideWindows = self.wndTaskBar,\ self.wndCharacter,\ self.wndInventory,\ self.wndMiniMap,\ self.wndGuild,\ self.wndMessenger,\ self.wndChat,\ self.wndParty,\ self.wndGameButton, if self.wndEnergyBar: hideWindows += self.wndEnergyBar, if self.wndExpandedTaskBar: hideWindows += self.wndExpandedTaskBar, if app.ENABLE_DRAGON_SOUL_SYSTEM: hideWindows += self.wndDragonSoul,\ self.wndDragonSoulRefine, hideWindows = filter(lambda x:x.IsShow(), hideWindows) map(lambda x:x.Hide(), hideWindows) import sys self.HideAllQuestButton() self.HideAllWhisperButton() if self.wndChat.IsEditMode(): self.wndChat.CloseChat() return hideWindows def __ShowWindows(self, wnds): import sys map(lambda x:x.Show(), wnds) global IsQBHide if not IsQBHide: self.ShowAllQuestButton() else: self.HideAllQuestButton() self.ShowAllWhisperButton() def BINARY_OpenAtlasWindow(self): if self.wndMiniMap: self.wndMiniMap.ShowAtlas() def BINARY_SetObserverMode(self, flag): self.wndGameButton.SetObserverMode(flag) # ACCESSORY_REFINE_ADD_METIN_STONE def BINARY_OpenSelectItemWindow(self): self.wndItemSelect.Open() # END_OF_ACCESSORY_REFINE_ADD_METIN_STONE ##################################################################################### ### Private Shop ### def OpenPrivateShopInputNameDialog(self): #if player.IsInSafeArea(): # chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.CANNOT_OPEN_PRIVATE_SHOP_IN_SAFE_AREA) # return inputDialog = uiCommon.InputDialog() inputDialog.SetTitle(localeInfo.PRIVATE_SHOP_INPUT_NAME_DIALOG_TITLE) inputDialog.SetMaxLength(32) inputDialog.SetAcceptEvent(ui.__mem_func__(self.OpenPrivateShopBuilder)) inputDialog.SetCancelEvent(ui.__mem_func__(self.ClosePrivateShopInputNameDialog)) inputDialog.Open() self.inputDialog = inputDialog def ClosePrivateShopInputNameDialog(self): self.inputDialog = None return TRUE def OpenPrivateShopBuilder(self): if not self.inputDialog: return TRUE if not len(self.inputDialog.GetText()): return TRUE self.privateShopBuilder.Open(self.inputDialog.GetText()) self.ClosePrivateShopInputNameDialog() return TRUE def AppearPrivateShop(self, vid, text): board = uiPrivateShopBuilder.PrivateShopAdvertisementBoard() board.Open(vid, text) self.privateShopAdvertisementBoardDict[vid] = board def DisappearPrivateShop(self, vid): if not self.privateShopAdvertisementBoardDict.has_key(vid): return del self.privateShopAdvertisementBoardDict[vid] uiPrivateShopBuilder.DeleteADBoard(vid) ##################################################################################### ### Equipment ### def OpenEquipmentDialog(self, vid): dlg = uiEquipmentDialog.EquipmentDialog() dlg.SetItemToolTip(self.tooltipItem) dlg.SetCloseEvent(ui.__mem_func__(self.CloseEquipmentDialog)) dlg.Open(vid) self.equipmentDialogDict[vid] = dlg def SetEquipmentDialogItem(self, vid, slotIndex, vnum, count): if not vid in self.equipmentDialogDict: return self.equipmentDialogDict[vid].SetEquipmentDialogItem(slotIndex, vnum, count) def SetEquipmentDialogSocket(self, vid, slotIndex, socketIndex, value): if not vid in self.equipmentDialogDict: return self.equipmentDialogDict[vid].SetEquipmentDialogSocket(slotIndex, socketIndex, value) def SetEquipmentDialogAttr(self, vid, slotIndex, attrIndex, type, value): if not vid in self.equipmentDialogDict: return self.equipmentDialogDict[vid].SetEquipmentDialogAttr(slotIndex, attrIndex, type, value) def CloseEquipmentDialog(self, vid): if not vid in self.equipmentDialogDict: return del self.equipmentDialogDict[vid] ##################################################################################### ##################################################################################### ### Quest ### def BINARY_ClearQuest(self, index): btn = self.__FindQuestButton(index) if 0 != btn: self.__DestroyQuestButton(btn) def RecvQuest(self, index, name): # QUEST_LETTER_IMAGE self.BINARY_RecvQuest(index, name, "file", localeInfo.GetLetterImageName()) # END_OF_QUEST_LETTER_IMAGE def BINARY_RecvQuest(self, index, name, iconType, iconName): btn = self.__FindQuestButton(index) if 0 != btn: self.__DestroyQuestButton(btn) btn = uiWhisper.WhisperButton() # QUEST_LETTER_IMAGE ##!! 20061026.levites.퀘스트_이미지_교체 import item if "item"==iconType: item.SelectItem(int(iconName)) buttonImageFileName=item.GetIconImageFileName() else: buttonImageFileName=iconName if localeInfo.IsEUROPE(): if "highlight" == iconType: btn.SetUpVisual("locale/ymir_ui/highlighted_quest.tga") btn.SetOverVisual("locale/ymir_ui/highlighted_quest_r.tga") btn.SetDownVisual("locale/ymir_ui/highlighted_quest_r.tga") else: btn.SetUpVisual(localeInfo.GetLetterCloseImageName()) btn.SetOverVisual(localeInfo.GetLetterOpenImageName()) btn.SetDownVisual(localeInfo.GetLetterOpenImageName()) else: btn.SetUpVisual(buttonImageFileName) btn.SetOverVisual(buttonImageFileName) btn.SetDownVisual(buttonImageFileName) btn.Flash() # END_OF_QUEST_LETTER_IMAGE if localeInfo.IsARABIC(): btn.SetToolTipText(name, 0, 35) btn.ToolTipText.SetHorizontalAlignCenter() else: btn.SetToolTipText(name, -20, 35) btn.ToolTipText.SetHorizontalAlignLeft() btn.SetEvent(ui.__mem_func__(self.__StartQuest), btn) btn.Show() btn.index = index btn.name = name self.questButtonList.insert(0, btn) self.__ArrangeQuestButton() #chat.AppendChat(chat.CHAT_TYPE_NOTICE, localeInfo.QUEST_APPEND) def __ArrangeQuestButton(self): screenWidth = wndMgr.GetScreenWidth() screenHeight = wndMgr.GetScreenHeight() ##!! 20061026.levites.퀘스트_위치_보정 if self.wndParty.IsShow(): xPos = 100 + 30 else: xPos = 20 if localeInfo.IsARABIC(): xPos = xPos + 15 yPos = 170 * screenHeight / 600 yCount = (screenHeight - 330) / 63 count = 0 for btn in self.questButtonList: btn.SetPosition(xPos + (int(count/yCount) * 100), yPos + (count%yCount * 63)) count += 1 global IsQBHide if IsQBHide: btn.Hide() else: btn.Show() def __StartQuest(self, btn): event.QuestButtonClick(btn.index) self.__DestroyQuestButton(btn) def __FindQuestButton(self, index): for btn in self.questButtonList: if btn.index == index: return btn return 0 def __DestroyQuestButton(self, btn): btn.SetEvent(0) self.questButtonList.remove(btn) self.__ArrangeQuestButton() def HideAllQuestButton(self): for btn in self.questButtonList: btn.Hide() def ShowAllQuestButton(self): for btn in self.questButtonList: btn.Show() ##################################################################################### ##################################################################################### ### Whisper ### def __InitWhisper(self): chat.InitWhisper(self) ## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수 ## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다. def OpenWhisperDialogWithoutTarget(self): if not self.dlgWhisperWithoutTarget: dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper.BindInterface(self) dlgWhisper.LoadDialog() dlgWhisper.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) dlgWhisper.SetPosition(self.windowOpenPosition*30,self.windowOpenPosition*30) dlgWhisper.Show() self.dlgWhisperWithoutTarget = dlgWhisper self.windowOpenPosition = (self.windowOpenPosition+1) % 5 else: self.dlgWhisperWithoutTarget.SetTop() self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) ## 이름 없는 대화창에서 이름을 결정했을때 WhisperDialogDict에 창을 넣어주는 함수 def RegisterTemporaryWhisperDialog(self, name): if not self.dlgWhisperWithoutTarget: return btn = self.__FindWhisperButton(name) if 0 != btn: self.__DestroyWhisperButton(btn) elif self.whisperDialogDict.has_key(name): oldDialog = self.whisperDialogDict[name] oldDialog.Destroy() del self.whisperDialogDict[name] self.whisperDialogDict[name] = self.dlgWhisperWithoutTarget self.dlgWhisperWithoutTarget.OpenWithTarget(name) self.dlgWhisperWithoutTarget = None self.__CheckGameMaster(name) ## 캐릭터 메뉴의 1:1 대화 하기를 눌렀을때 이름을 가지고 바로 창을 여는 함수 def OpenWhisperDialog(self, name): if not self.whisperDialogDict.has_key(name): dlg = self.__MakeWhisperDialog(name) dlg.OpenWithTarget(name) dlg.chatLine.SetFocus() dlg.Show() self.__CheckGameMaster(name) btn = self.__FindWhisperButton(name) if 0 != btn: self.__DestroyWhisperButton(btn) ## 다른 캐릭터로부터 메세지를 받았을때 일단 버튼만 띄워 두는 함수 def RecvWhisper(self, name): if not self.whisperDialogDict.has_key(name): btn = self.__FindWhisperButton(name) if 0 == btn: btn = self.__MakeWhisperButton(name) btn.Flash() chat.AppendChat(chat.CHAT_TYPE_NOTICE, localeInfo.RECEIVE_MESSAGE % (name)) else: btn.Flash() elif self.IsGameMasterName(name): dlg = self.whisperDialogDict[name] dlg.SetGameMasterLook() def MakeWhisperButton(self, name): self.__MakeWhisperButton(name) ## 버튼을 눌렀을때 창을 여는 함수 def ShowWhisperDialog(self, btn): try: self.__MakeWhisperDialog(btn.name) dlgWhisper = self.whisperDialogDict[btn.name] dlgWhisper.OpenWithTarget(btn.name) dlgWhisper.Show() self.__CheckGameMaster(btn.name) except: import dbg dbg.TraceError("interface.ShowWhisperDialog - Failed to find key") ## 버튼 초기화 self.__DestroyWhisperButton(btn) ## WhisperDialog 창에서 최소화 명령을 수행했을때 호출되는 함수 ## 창을 최소화 합니다. def MinimizeWhisperDialog(self, name): if 0 != name: self.__MakeWhisperButton(name) self.CloseWhisperDialog(name) ## WhisperDialog 창에서 닫기 명령을 수행했을때 호출되는 함수 ## 창을 지웁니다. def CloseWhisperDialog(self, name): if 0 == name: if self.dlgWhisperWithoutTarget: self.dlgWhisperWithoutTarget.Destroy() self.dlgWhisperWithoutTarget = None return try: dlgWhisper = self.whisperDialogDict[name] dlgWhisper.Destroy() del self.whisperDialogDict[name] except: import dbg dbg.TraceError("interface.CloseWhisperDialog - Failed to find key") ## 버튼의 개수가 바뀌었을때 버튼을 재정렬 하는 함수 def __ArrangeWhisperButton(self): screenWidth = wndMgr.GetScreenWidth() screenHeight = wndMgr.GetScreenHeight() xPos = screenWidth - 70 yPos = 170 * screenHeight / 600 yCount = (screenHeight - 330) / 63 #yCount = (screenHeight - 285) / 63 count = 0 for button in self.whisperButtonList: button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63)) count += 1 ## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수 ## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며 ## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다. def __FindWhisperButton(self, name): for button in self.whisperButtonList: if button.name == name: return button return 0 ## 창을 만듭니다. def __MakeWhisperDialog(self, name): dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper.BindInterface(self) dlgWhisper.LoadDialog() dlgWhisper.SetPosition(self.windowOpenPosition*30,self.windowOpenPosition*30) self.whisperDialogDict[name] = dlgWhisper self.windowOpenPosition = (self.windowOpenPosition+1) % 5 return dlgWhisper ## 버튼을 만듭니다. def __MakeWhisperButton(self, name): whisperButton = uiWhisper.WhisperButton() whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetOverVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") whisperButton.SetDownVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") if self.IsGameMasterName(name): whisperButton.SetToolTipTextWithColor(name, 0xffffa200) else: whisperButton.SetToolTipText(name) whisperButton.ToolTipText.SetHorizontalAlignCenter() whisperButton.SetEvent(ui.__mem_func__(self.ShowWhisperDialog), whisperButton) whisperButton.Show() whisperButton.name = name self.whisperButtonList.insert(0, whisperButton) self.__ArrangeWhisperButton() return whisperButton def __DestroyWhisperButton(self, button): button.SetEvent(0) self.whisperButtonList.remove(button) self.__ArrangeWhisperButton() def HideAllWhisperButton(self): for btn in self.whisperButtonList: btn.Hide() def ShowAllWhisperButton(self): for btn in self.whisperButtonList: btn.Show() def __CheckGameMaster(self, name): if not self.listGMName.has_key(name): return if self.whisperDialogDict.has_key(name): dlg = self.whisperDialogDict[name] dlg.SetGameMasterLook() def RegisterGameMasterName(self, name): if self.listGMName.has_key(name): return self.listGMName[name] = "GM" def IsGameMasterName(self, name): if self.listGMName.has_key(name): return TRUE else: return FALSE ##################################################################################### ##################################################################################### ### Guild Building ### def BUILD_OpenWindow(self): self.wndGuildBuilding = uiGuild.BuildGuildBuildingWindow() self.wndGuildBuilding.Open() self.wndGuildBuilding.wnds = self.__HideWindows() self.wndGuildBuilding.SetCloseEvent(ui.__mem_func__(self.BUILD_CloseWindow)) def BUILD_CloseWindow(self): self.__ShowWindows(self.wndGuildBuilding.wnds) self.wndGuildBuilding = None def BUILD_OnUpdate(self): if not self.wndGuildBuilding: return if self.wndGuildBuilding.IsPositioningMode(): import background x, y, z = background.GetPickingPoint() self.wndGuildBuilding.SetBuildingPosition(x, y, z) def BUILD_OnMouseLeftButtonDown(self): if not self.wndGuildBuilding: return # GUILD_BUILDING if self.wndGuildBuilding.IsPositioningMode(): self.wndGuildBuilding.SettleCurrentPosition() return TRUE elif self.wndGuildBuilding.IsPreviewMode(): pass else: return TRUE # END_OF_GUILD_BUILDING return FALSE def BUILD_OnMouseLeftButtonUp(self): if not self.wndGuildBuilding: return if not self.wndGuildBuilding.IsPreviewMode(): return TRUE return FALSE def BULID_EnterGuildArea(self, areaID): # GUILD_BUILDING mainCharacterName = player.GetMainCharacterName() masterName = guild.GetGuildMasterName() if mainCharacterName != masterName: return if areaID != player.GetGuildID(): return # END_OF_GUILD_BUILDING self.wndGameButton.ShowBuildButton() def BULID_ExitGuildArea(self, areaID): self.wndGameButton.HideBuildButton() ##################################################################################### def IsEditLineFocus(self): if self.ChatWindow.chatLine.IsFocus(): return 1 if self.ChatWindow.chatToLine.IsFocus(): return 1 return 0 def EmptyFunction(self): pass if __name__ == "__main__": import app import wndMgr import systemSetting import mouseModule import grp import ui import localeInfo app.SetMouseHandler(mouseModule.mouseController) app.SetHairColorEnable(TRUE) wndMgr.SetMouseHandler(mouseModule.mouseController) wndMgr.SetScreenSize(systemSetting.GetWidth(), systemSetting.GetHeight()) app.Create(localeInfo.APP_TITLE, systemSetting.GetWidth(), systemSetting.GetHeight(), 1) mouseModule.mouseController.Create() class TestGame(ui.Window): def __init__(self): ui.Window.__init__(self) localeInfo.LoadLocaleData() player.SetItemData(0, 27001, 10) player.SetItemData(1, 27004, 10) self.interface = Interface() self.interface.MakeInterface() self.interface.ShowDefaultWindows() self.interface.RefreshInventory() #self.interface.OpenCubeWindow() def __del__(self): ui.Window.__del__(self) def OnUpdate(self): app.UpdateGame() def OnRender(self): app.RenderGame() grp.PopState() grp.SetInterfaceRenderState() game = TestGame() game.SetSize(systemSetting.GetWidth(), systemSetting.GetHeight()) game.Show() app.Loop()
-
Hola, sera que alguien me podria ayudar? El comercio entre jugadores no me funciona.
0814 13:37:56217 :: Traceback (most recent call last): 0814 13:37:56218 :: File "game.py", line 974, in StartExchange 0814 13:37:56218 :: File "interfaceModule.py", line 682, in StartExchange 0814 13:37:56218 :: File "uiExchange.py", line 84, in OpenDialog 0814 13:37:56218 :: TypeError 0814 13:37:56218 :: : 0814 13:37:56218 :: not enough arguments for format string 0814 13:37:56219 ::
Mi game.py
import os import app import dbg import grp import item import background import chr import chrmgr import player import snd import chat import textTail import snd import net import effect import wndMgr import fly import systemSetting import quest import guild import skill import messenger import localeInfo import constInfo import exchange import ime import ui import uiCommon import uiPhaseCurtain import uiMapNameShower import uiAffectShower import uiPlayerGauge import uiCharacter import uiTarget import uiAchievement import time # PRIVATE_SHOP_PRICE_LIST import uiPrivateShopBuilder # END_OF_PRIVATE_SHOP_PRICE_LIST import mouseModule import consoleModule import localeInfo import playerSettingModule import interfaceModule import musicInfo import debugInfo import stringCommander from _weakref import proxy # TEXTTAIL_LIVINGTIME_CONTROL #if localeInfo.IsJAPAN(): # app.SetTextTailLivingTime(8.0) # END_OF_TEXTTAIL_LIVINGTIME_CONTROL # SCREENSHOT_CWDSAVE SCREENSHOT_CWDSAVE = FALSE SCREENSHOT_DIR = None if localeInfo.IsEUROPE(): SCREENSHOT_CWDSAVE = TRUE if localeInfo.IsCIBN10(): SCREENSHOT_CWDSAVE = FALSE SCREENSHOT_DIR = "YT2W" cameraDistance = 1550.0 cameraPitch = 27.0 cameraRotation = 0.0 cameraHeight = 100.0 testAlignment = 0 BPisLodaded = 0 class GameWindow(ui.ScriptWindow): def __init__(self, stream): ui.ScriptWindow.__init__(self, "GAME") self.SetWindowName("game") net.SetPhaseWindow(net.PHASE_WINDOW_GAME, self) player.SetGameWindow(self) self.quickSlotPageIndex = 0 self.lastPKModeSendedTime = 0 self.pressNumber = None self.guildWarQuestionDialog = None self.interface = None self.targetBoard = None self.console = None self.mapNameShower = None self.affectShower = None self.playerGauge = None self.stream=stream self.interface = interfaceModule.Interface() self.interface.MakeInterface() self.interface.ShowDefaultWindows() self.curtain = uiPhaseCurtain.PhaseCurtain() self.curtain.speed = 0.03 self.curtain.Hide() self.targetBoard = uiTarget.TargetBoard() self.targetBoard.SetWhisperEvent(ui.__mem_func__(self.interface.OpenWhisperDialog)) self.targetBoard.Hide() self.console = consoleModule.ConsoleWindow() self.console.BindGameClass(self) self.console.SetConsoleSize(wndMgr.GetScreenWidth(), 200) self.console.Hide() self.mapNameShower = uiMapNameShower.MapNameShower() self.affectShower = uiAffectShower.AffectShower() self.playerGauge = uiPlayerGauge.PlayerGauge(self) self.playerGauge.Hide() # YIV WORK: Achievement self.achievementWindow = uiAchievement.AchievementBoard() self.achievementWindow.Close() #wj 2014.1.2. ESC키를 누를 시 우선적으로 DropQuestionDialog를 끄도록 만들었다. 하지만 처음에 itemDropQuestionDialog가 선언되어 있지 않아 ERROR가 발생하여 init에서 선언과 동시에 초기화 시킴. self.itemDropQuestionDialog = None self.__SetQuickSlotMode() self.__ServerCommand_Build() self.__ProcessPreservedServerCommand() self.timeLine = ui.TextLine() self.timeLine.SetFontName(localeInfo.UI_DEF_FONT) self.timeLine.SetFontColor( 255, 045, 0) self.timeLine.SetPosition((wndMgr.GetScreenWidth() - 130) / 2, 180) def __del__(self): player.SetGameWindow(0) net.ClearPhaseWindow(net.PHASE_WINDOW_GAME, self) ui.ScriptWindow.__del__(self) def Open(self): app.SetFrameSkip(1) self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()) self.quickSlotPageIndex = 0 self.PickingCharacterIndex = -1 self.PickingItemIndex = -1 self.consoleEnable = FALSE self.isShowDebugInfo = FALSE self.ShowNameFlag = FALSE self.enableXMasBoom = FALSE self.startTimeXMasBoom = 0.0 self.indexXMasBoom = 0 global cameraDistance, cameraPitch, cameraRotation, cameraHeight app.SetCamera(cameraDistance, cameraPitch, cameraRotation, cameraHeight) constInfo.SET_DEFAULT_CAMERA_MAX_DISTANCE() constInfo.SET_DEFAULT_CHRNAME_COLOR() constInfo.SET_DEFAULT_FOG_LEVEL() constInfo.SET_DEFAULT_CONVERT_EMPIRE_LANGUAGE_ENABLE() constInfo.SET_DEFAULT_USE_ITEM_WEAPON_TABLE_ATTACK_BONUS() constInfo.SET_DEFAULT_USE_SKILL_EFFECT_ENABLE() # TWO_HANDED_WEAPON_ATTACK_SPEED_UP constInfo.SET_TWO_HANDED_WEAPON_ATT_SPEED_DECREASE_VALUE() # END_OF_TWO_HANDED_WEAPON_ATTACK_SPEED_UP import event event.SetLeftTimeString(localeInfo.UI_LEFT_TIME) textTail.EnablePKTitle(constInfo.PVPMODE_ENABLE) if constInfo.PVPMODE_TEST_ENABLE: self.testPKMode = ui.TextLine() self.testPKMode.SetFontName(localeInfo.UI_DEF_FONT) self.testPKMode.SetPosition(0, 15) self.testPKMode.SetWindowHorizontalAlignCenter() self.testPKMode.SetHorizontalAlignCenter() self.testPKMode.SetFeather() self.testPKMode.SetOutline() self.testPKMode.Show() self.testAlignment = ui.TextLine() self.testAlignment.SetFontName(localeInfo.UI_DEF_FONT) self.testAlignment.SetPosition(0, 35) self.testAlignment.SetWindowHorizontalAlignCenter() self.testAlignment.SetHorizontalAlignCenter() self.testAlignment.SetFeather() self.testAlignment.SetOutline() self.testAlignment.Show() self.__BuildKeyDict() self.__BuildDebugInfo() # PRIVATE_SHOP_PRICE_LIST uiPrivateShopBuilder.Clear() # END_OF_PRIVATE_SHOP_PRICE_LIST # UNKNOWN_UPDATE exchange.InitTrading() # END_OF_UNKNOWN_UPDATE if debugInfo.IsDebugMode(): self.ToggleDebugInfo() ## Sound snd.SetMusicVolume(systemSetting.GetMusicVolume()*net.GetFieldMusicVolume()) snd.SetSoundVolume(systemSetting.GetSoundVolume()) netFieldMusicFileName = net.GetFieldMusicFileName() if netFieldMusicFileName: snd.FadeInMusic("BGM/" + netFieldMusicFileName) elif musicInfo.fieldMusic != "": snd.FadeInMusic("BGM/" + musicInfo.fieldMusic) self.__SetQuickSlotMode() self.__SelectQuickPage(self.quickSlotPageIndex) self.SetFocus() self.Show() app.ShowCursor() net.SendEnterGamePacket() # START_GAME_ERROR_EXIT try: self.StartGame() except: import exception exception.Abort("GameWindow.Open") # END_OF_START_GAME_ERROR_EXIT # NPC가 큐브시스템으로 만들 수 있는 아이템들의 목록을 캐싱 # ex) cubeInformation[20383] = [ {"rewordVNUM": 72723, "rewordCount": 1, "materialInfo": "101,1&102,2", "price": 999 }, ... ] self.cubeInformation = {} self.currentCubeNPC = 0 def Close(self): self.Hide() global cameraDistance, cameraPitch, cameraRotation, cameraHeight (cameraDistance, cameraPitch, cameraRotation, cameraHeight) = app.GetCamera() if musicInfo.fieldMusic != "": snd.FadeOutMusic("BGM/"+ musicInfo.fieldMusic) self.onPressKeyDict = None self.onClickKeyDict = None chat.Close() snd.StopAllSound() grp.InitScreenEffect() chr.Destroy() textTail.Clear() quest.Clear() background.Destroy() guild.Destroy() messenger.Destroy() skill.ClearSkillData() wndMgr.Unlock() mouseModule.mouseController.DeattachObject() if self.guildWarQuestionDialog: self.guildWarQuestionDialog.Close() self.guildNameBoard = None self.partyRequestQuestionDialog = None self.partyInviteQuestionDialog = None self.guildInviteQuestionDialog = None self.guildWarQuestionDialog = None self.messengerAddFriendQuestion = None # UNKNOWN_UPDATE self.itemDropQuestionDialog = None # END_OF_UNKNOWN_UPDATE # QUEST_CONFIRM self.confirmDialog = None # END_OF_QUEST_CONFIRM self.PrintCoord = None self.FrameRate = None self.Pitch = None self.Splat = None self.TextureNum = None self.ObjectNum = None self.ViewDistance = None self.PrintMousePos = None self.ClearDictionary() # YIV WORK: Achievement self.achievementWindow.Close() self.achievementWindow = None if self.console: self.console.BindGameClass(0) self.console.Close() self.console=None if self.targetBoard: self.targetBoard.Destroy() self.targetBoard = None if self.interface: self.interface.HideAllWindows() self.interface.Close() self.interface=None player.ClearSkillDict() player.ResetCameraRotation() self.KillFocus() app.HideCursor() print "---------------------------------------------------------------------------- CLOSE GAME WINDOW" def __BuildKeyDict(self): onPressKeyDict = {} ##PressKey 는 누르고 있는 동안 계속 적용되는 키이다. ## 숫자 단축키 퀵슬롯에 이용된다.(이후 숫자들도 퀵 슬롯용 예약) ## F12 는 클라 디버그용 키이므로 쓰지 않는 게 좋다. onPressKeyDict[app.DIK_1] = lambda : self.__PressNumKey(1) onPressKeyDict[app.DIK_2] = lambda : self.__PressNumKey(2) onPressKeyDict[app.DIK_3] = lambda : self.__PressNumKey(3) onPressKeyDict[app.DIK_4] = lambda : self.__PressNumKey(4) onPressKeyDict[app.DIK_5] = lambda : self.__PressNumKey(5) onPressKeyDict[app.DIK_6] = lambda : self.__PressNumKey(6) onPressKeyDict[app.DIK_7] = lambda : self.__PressNumKey(7) onPressKeyDict[app.DIK_8] = lambda : self.__PressNumKey(8) onPressKeyDict[app.DIK_9] = lambda : self.__PressNumKey(9) onPressKeyDict[app.DIK_F1] = lambda : self.__PressQuickSlot(4) onPressKeyDict[app.DIK_F2] = lambda : self.__PressQuickSlot(5) onPressKeyDict[app.DIK_F3] = lambda : self.__PressQuickSlot(6) onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7) onPressKeyDict[app.DIK_F5] = lambda : self.Switcher() onPressKeyDict[app.DIK_F6] = lambda : self.__quikeqchange() onPressKeyDict[app.DIK_F7] = lambda : self.__BonusPage() onPressKeyDict[app.DIK_F8] = lambda : self.achievementWindow.ToggleVisible() onPressKeyDict[app.DIK_LALT] = lambda : self.ShowName() onPressKeyDict[app.DIK_LCONTROL] = lambda : self.ShowMouseImage() onPressKeyDict[app.DIK_SYSRQ] = lambda : self.SaveScreen() onPressKeyDict[app.DIK_SPACE] = lambda : self.StartAttack() #캐릭터 이동키 onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp() onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown() onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft() onPressKeyDict[app.DIK_RIGHT] = lambda : self.MoveRight() onPressKeyDict[app.DIK_W] = lambda : self.MoveUp() onPressKeyDict[app.DIK_S] = lambda : self.MoveDown() onPressKeyDict[app.DIK_A] = lambda : self.MoveLeft() onPressKeyDict[app.DIK_D] = lambda : self.MoveRight() onPressKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_TO_NEGATIVE) #onPressKeyDict[app.DIK_F] = lambda: app.ZoomCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_T] = lambda: app.PitchCamera(app.CAMERA_TO_NEGATIVE) onPressKeyDict[app.DIK_G] = self.__PressGKey onPressKeyDict[app.DIK_Q] = self.__PressQKey onPressKeyDict[app.DIK_NUMPAD9] = lambda: app.MovieResetCamera() onPressKeyDict[app.DIK_NUMPAD4] = lambda: app.MovieRotateCamera(app.CAMERA_TO_NEGATIVE) onPressKeyDict[app.DIK_NUMPAD6] = lambda: app.MovieRotateCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_PGUP] = lambda: app.MovieZoomCamera(app.CAMERA_TO_NEGATIVE) onPressKeyDict[app.DIK_PGDN] = lambda: app.MovieZoomCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_NUMPAD8] = lambda: app.MoviePitchCamera(app.CAMERA_TO_NEGATIVE) onPressKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_TO_POSITIVE) onPressKeyDict[app.DIK_GRAVE] = lambda : self.PickUpItem() onPressKeyDict[app.DIK_Z] = lambda : self.PickUpItem() onPressKeyDict[app.DIK_C] = lambda state = "STATUS": self.interface.ToggleCharacterWindow(state) onPressKeyDict[app.DIK_V] = lambda state = "SKILL": self.interface.ToggleCharacterWindow(state) #onPressKeyDict[app.DIK_B] = lambda state = "EMOTICON": self.interface.ToggleCharacterWindow(state) onPressKeyDict[app.DIK_N] = lambda state = "QUEST": self.interface.ToggleCharacterWindow(state) onPressKeyDict[app.DIK_I] = lambda : self.interface.ToggleInventoryWindow() onPressKeyDict[app.DIK_O] = lambda : self.interface.ToggleDragonSoulWindowWithNoInfo() onPressKeyDict[app.DIK_M] = lambda : self.interface.PressMKey() #onPressKeyDict[app.DIK_H] = lambda : self.interface.OpenHelpWindow() onPressKeyDict[app.DIK_ADD] = lambda : self.interface.MiniMapScaleUp() onPressKeyDict[app.DIK_SUBTRACT] = lambda : self.interface.MiniMapScaleDown() onPressKeyDict[app.DIK_L] = lambda : self.interface.ToggleChatLogWindow() onPressKeyDict[app.DIK_COMMA] = lambda : self.ShowConsole() # "`" key onPressKeyDict[app.DIK_LSHIFT] = lambda : self.__SetQuickPageMode() onPressKeyDict[app.DIK_J] = lambda : self.__PressJKey() onPressKeyDict[app.DIK_H] = lambda : self.__PressHKey() onPressKeyDict[app.DIK_B] = lambda : self.__PressBKey() onPressKeyDict[app.DIK_F] = lambda : self.__PressFKey() # CUBE_TEST #onPressKeyDict[app.DIK_K] = lambda : self.interface.OpenCubeWindow() # CUBE_TEST_END self.onPressKeyDict = onPressKeyDict onClickKeyDict = {} onClickKeyDict[app.DIK_UP] = lambda : self.StopUp() onClickKeyDict[app.DIK_DOWN] = lambda : self.StopDown() onClickKeyDict[app.DIK_LEFT] = lambda : self.StopLeft() onClickKeyDict[app.DIK_RIGHT] = lambda : self.StopRight() onClickKeyDict[app.DIK_SPACE] = lambda : self.EndAttack() onClickKeyDict[app.DIK_W] = lambda : self.StopUp() onClickKeyDict[app.DIK_S] = lambda : self.StopDown() onClickKeyDict[app.DIK_A] = lambda : self.StopLeft() onClickKeyDict[app.DIK_D] = lambda : self.StopRight() onClickKeyDict[app.DIK_Q] = lambda: app.RotateCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_E] = lambda: app.RotateCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_R] = lambda: app.ZoomCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_F] = lambda: app.ZoomCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_T] = lambda: app.PitchCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_G] = lambda: self.__ReleaseGKey() onClickKeyDict[app.DIK_NUMPAD4] = lambda: app.MovieRotateCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_NUMPAD6] = lambda: app.MovieRotateCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_PGUP] = lambda: app.MovieZoomCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_PGDN] = lambda: app.MovieZoomCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_NUMPAD8] = lambda: app.MoviePitchCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_NUMPAD2] = lambda: app.MoviePitchCamera(app.CAMERA_STOP) onClickKeyDict[app.DIK_LALT] = lambda: self.HideName() onClickKeyDict[app.DIK_LCONTROL] = lambda: self.HideMouseImage() onClickKeyDict[app.DIK_LSHIFT] = lambda: self.__SetQuickSlotMode() #if constInfo.PVPMODE_ACCELKEY_ENABLE: # onClickKeyDict[app.DIK_B] = lambda: self.ChangePKMode() self.onClickKeyDict=onClickKeyDict def __PressNumKey(self,num): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if num >= 1 and num <= 9: if(chrmgr.IsPossibleEmoticon(-1)): chrmgr.SetEmoticon(-1,int(num)-1) net.SendEmoticon(int(num)-1) else: if num >= 1 and num <= 4: self.pressNumber(num-1) def __ClickBKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): return else: if constInfo.PVPMODE_ACCELKEY_ENABLE: self.ChangePKMode() def __PressJKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if player.IsMountingHorse(): net.SendChatPacket("/unmount") else: #net.SendChatPacket("/user_horse_ride") if not uiPrivateShopBuilder.IsBuildingPrivateShop(): for i in xrange(player.INVENTORY_PAGE_SIZE): if player.GetItemIndex(i) in (71114, 71116, 71118, 71120): net.SendItemUsePacket(i) break def __PressHKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/user_horse_ride") else: self.interface.OpenHelpWindow() def __PressBKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/user_horse_back") else: state = "EMOTICON" self.interface.ToggleCharacterWindow(state) def __PressFKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/user_horse_feed") else: app.ZoomCamera(app.CAMERA_TO_POSITIVE) def __PressGKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): net.SendChatPacket("/ride") else: if self.ShowNameFlag: self.interface.ToggleGuildWindow() else: app.PitchCamera(app.CAMERA_TO_POSITIVE) def __ReleaseGKey(self): app.PitchCamera(app.CAMERA_STOP) def __PressQKey(self): if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL): if 0==interfaceModule.IsQBHide: interfaceModule.IsQBHide = 1 self.interface.HideAllQuestButton() else: interfaceModule.IsQBHide = 0 self.interface.ShowAllQuestButton() else: app.RotateCamera(app.CAMERA_TO_NEGATIVE) def __SetQuickSlotMode(self): self.pressNumber=ui.__mem_func__(self.__PressQuickSlot) def __SetQuickPageMode(self): self.pressNumber=ui.__mem_func__(self.__SelectQuickPage) def __PressQuickSlot(self, localSlotIndex): if localeInfo.IsARABIC(): if 0 <= localSlotIndex and localSlotIndex < 4: player.RequestUseLocalQuickSlot(3-localSlotIndex) else: player.RequestUseLocalQuickSlot(11-localSlotIndex) else: player.RequestUseLocalQuickSlot(localSlotIndex) def __SelectQuickPage(self, pageIndex): self.quickSlotPageIndex = pageIndex player.SetQuickPage(pageIndex) def ToggleDebugInfo(self): self.isShowDebugInfo = not self.isShowDebugInfo if self.isShowDebugInfo: self.PrintCoord.Show() self.FrameRate.Show() self.Pitch.Show() self.Splat.Show() self.TextureNum.Show() self.ObjectNum.Show() self.ViewDistance.Show() self.PrintMousePos.Show() else: self.PrintCoord.Hide() self.FrameRate.Hide() self.Pitch.Hide() self.Splat.Hide() self.TextureNum.Hide() self.ObjectNum.Hide() self.ViewDistance.Hide() self.PrintMousePos.Hide() def __BuildDebugInfo(self): ## Character Position Coordinate self.PrintCoord = ui.TextLine() self.PrintCoord.SetFontName(localeInfo.UI_DEF_FONT) self.PrintCoord.SetPosition(wndMgr.GetScreenWidth() - 270, 0) ## Frame Rate self.FrameRate = ui.TextLine() self.FrameRate.SetFontName(localeInfo.UI_DEF_FONT) self.FrameRate.SetPosition(wndMgr.GetScreenWidth() - 270, 20) ## Camera Pitch self.Pitch = ui.TextLine() self.Pitch.SetFontName(localeInfo.UI_DEF_FONT) self.Pitch.SetPosition(wndMgr.GetScreenWidth() - 270, 40) ## Splat self.Splat = ui.TextLine() self.Splat.SetFontName(localeInfo.UI_DEF_FONT) self.Splat.SetPosition(wndMgr.GetScreenWidth() - 270, 60) ## self.PrintMousePos = ui.TextLine() self.PrintMousePos.SetFontName(localeInfo.UI_DEF_FONT) self.PrintMousePos.SetPosition(wndMgr.GetScreenWidth() - 270, 80) # TextureNum self.TextureNum = ui.TextLine() self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT) self.TextureNum.SetPosition(wndMgr.GetScreenWidth() - 270, 100) # 오브젝트 그리는 개수 self.ObjectNum = ui.TextLine() self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT) self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120) # 시야거리 self.ViewDistance = ui.TextLine() self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT) self.ViewDistance.SetPosition(0, 0) #Saat self.timeLine.SetWindowHorizontalAlignCenter() self.timeLine.SetHorizontalAlignCenter() self.timeLine.SetFeather() self.timeLine.SetOutline() self.timeLine.Show() def __NotifyError(self, msg): chat.AppendChat(chat.CHAT_TYPE_INFO, msg) def ChangePKMode(self): if not app.IsPressed(app.DIK_LCONTROL): return if player.GetStatus(player.LEVEL)<constInfo.PVPMODE_PROTECTED_LEVEL: self.__NotifyError(localeInfo.OPTION_PVPMODE_PROTECT % (constInfo.PVPMODE_PROTECTED_LEVEL)) return curTime = app.GetTime() if curTime - self.lastPKModeSendedTime < constInfo.PVPMODE_ACCELKEY_DELAY: return self.lastPKModeSendedTime = curTime curPKMode = player.GetPKMode() nextPKMode = curPKMode + 1 if nextPKMode == player.PK_MODE_PROTECT: if 0 == player.GetGuildID(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.OPTION_PVPMODE_CANNOT_SET_GUILD_MODE) nextPKMode = 0 else: nextPKMode = player.PK_MODE_GUILD elif nextPKMode == player.PK_MODE_MAX_NUM: nextPKMode = 0 net.SendChatPacket("/PKMode " + str(nextPKMode)) print "/PKMode " + str(nextPKMode) def OnChangePKMode(self): self.interface.OnChangePKMode() try: self.__NotifyError(localeInfo.OPTION_PVPMODE_MESSAGE_DICT[player.GetPKMode()]) except KeyError: print "UNKNOWN PVPMode[%d]" % (player.GetPKMode()) if constInfo.PVPMODE_TEST_ENABLE: curPKMode = player.GetPKMode() alignment, grade = chr.testGetPKData() self.pkModeNameDict = { 0 : "PEACE", 1 : "REVENGE", 2 : "FREE", 3 : "PROTECT", } self.testPKMode.SetText("Current PK Mode : " + self.pkModeNameDict.get(curPKMode, "UNKNOWN")) self.testAlignment.SetText("Current Alignment : " + str(alignment) + " (" + localeInfo.TITLE_NAME_LIST[grade] + ")") ############################################################################################### ############################################################################################### ## Game Callback Functions # Start def StartGame(self): self.RefreshInventory() self.RefreshEquipment() self.RefreshCharacter() self.RefreshSkill() # Refresh def CheckGameButton(self): if self.interface: self.interface.CheckGameButton() def RefreshAlignment(self): self.interface.RefreshAlignment() def RefreshStatus(self): self.CheckGameButton() if self.interface: self.interface.RefreshStatus() if self.playerGauge: self.playerGauge.RefreshGauge() def RefreshStamina(self): self.interface.RefreshStamina() def RefreshSkill(self): self.CheckGameButton() if self.interface: self.interface.RefreshSkill() def RefreshQuest(self): self.interface.RefreshQuest() def RefreshMessenger(self): self.interface.RefreshMessenger() def RefreshGuildInfoPage(self): self.interface.RefreshGuildInfoPage() def RefreshGuildBoardPage(self): self.interface.RefreshGuildBoardPage() def RefreshGuildMemberPage(self): self.interface.RefreshGuildMemberPage() def RefreshGuildMemberPageGradeComboBox(self): self.interface.RefreshGuildMemberPageGradeComboBox() def RefreshGuildSkillPage(self): self.interface.RefreshGuildSkillPage() def RefreshGuildGradePage(self): self.interface.RefreshGuildGradePage() def RefreshMobile(self): if self.interface: self.interface.RefreshMobile() def OnMobileAuthority(self): self.interface.OnMobileAuthority() def OnBlockMode(self, mode): self.interface.OnBlockMode(mode) def OpenQuestWindow(self, skin, idx): self.interface.OpenQuestWindow(skin, idx) def AskGuildName(self): guildNameBoard = uiCommon.InputDialog() guildNameBoard.SetTitle(localeInfo.GUILD_NAME) guildNameBoard.SetAcceptEvent(ui.__mem_func__(self.ConfirmGuildName)) guildNameBoard.SetCancelEvent(ui.__mem_func__(self.CancelGuildName)) guildNameBoard.Open() self.guildNameBoard = guildNameBoard def ConfirmGuildName(self): guildName = self.guildNameBoard.GetText() if not guildName: return if net.IsInsultIn(guildName): self.PopupMessage(localeInfo.GUILD_CREATE_ERROR_INSULT_NAME) return net.SendAnswerMakeGuildPacket(guildName) self.guildNameBoard.Close() self.guildNameBoard = None return TRUE def CancelGuildName(self): self.guildNameBoard.Close() self.guildNameBoard = None return TRUE ## Refine def PopupMessage(self, msg): self.stream.popupWindow.Close() self.stream.popupWindow.Open(msg, 0, localeInfo.UI_OK) def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type=0): self.interface.OpenRefineDialog(targetItemPos, nextGradeItemVnum, cost, prob, type) def AppendMaterialToRefineDialog(self, vnum, count): self.interface.AppendMaterialToRefineDialog(vnum, count) def RunUseSkillEvent(self, slotIndex, coolTime): self.interface.OnUseSkill(slotIndex, coolTime) def ClearAffects(self): self.affectShower.ClearAffects() def SetAffect(self, affect): self.affectShower.SetAffect(affect) def ResetAffect(self, affect): self.affectShower.ResetAffect(affect) # UNKNOWN_UPDATE def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration): self.affectShower.BINARY_NEW_AddAffect(type, pointIdx, value, duration) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1) elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type: self.BINARY_DragonSoulGiveQuilification() def BINARY_NEW_RemoveAffect(self, type, pointIdx): self.affectShower.BINARY_NEW_RemoveAffect(type, pointIdx) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulDeactivate() # END_OF_UNKNOWN_UPDATE def ActivateSkillSlot(self, slotIndex): if self.interface: self.interface.OnActivateSkill(slotIndex) def DeactivateSkillSlot(self, slotIndex): if self.interface: self.interface.OnDeactivateSkill(slotIndex) def RefreshEquipment(self): if self.interface: self.interface.RefreshInventory() def RefreshInventory(self): if self.interface: self.interface.RefreshInventory() def RefreshCharacter(self): if self.interface: self.interface.RefreshCharacter() def OnGameOver(self): self.CloseTargetBoard() self.OpenRestartDialog() def OpenRestartDialog(self): self.interface.OpenRestartDialog() def ChangeCurrentSkill(self, skillSlotNumber): self.interface.OnChangeCurrentSkill(skillSlotNumber) ## TargetBoard def SetPCTargetBoard(self, vid, name): self.targetBoard.Open(vid, name) if app.IsPressed(app.DIK_LCONTROL): if not player.IsSameEmpire(vid): return if player.IsMainCharacterIndex(vid): return elif chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(vid): return self.interface.OpenWhisperDialog(name) def RefreshTargetBoardByVID(self, vid): self.targetBoard.RefreshByVID(vid) def RefreshTargetBoardByName(self, name): self.targetBoard.RefreshByName(name) def __RefreshTargetBoard(self): self.targetBoard.Refresh() def SetHPTargetBoard(self, vid, hpPercentage): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.ResetTargetBoard() self.targetBoard.SetEnemyVID(vid) self.targetBoard.SetHP(hpPercentage) self.targetBoard.Show() def CloseTargetBoardIfDifferent(self, vid): if vid != self.targetBoard.GetTargetVID(): self.targetBoard.Close() def CloseTargetBoard(self): self.targetBoard.Close() ## View Equipment def OpenEquipmentDialog(self, vid): self.interface.OpenEquipmentDialog(vid) def SetEquipmentDialogItem(self, vid, slotIndex, vnum, count): self.interface.SetEquipmentDialogItem(vid, slotIndex, vnum, count) def SetEquipmentDialogSocket(self, vid, slotIndex, socketIndex, value): self.interface.SetEquipmentDialogSocket(vid, slotIndex, socketIndex, value) def SetEquipmentDialogAttr(self, vid, slotIndex, attrIndex, type, value): self.interface.SetEquipmentDialogAttr(vid, slotIndex, attrIndex, type, value) # SHOW_LOCAL_MAP_NAME def ShowMapName(self, mapName, x, y): if self.mapNameShower: self.mapNameShower.ShowMapName(mapName, x, y) if self.interface: self.interface.SetMapName(mapName) # END_OF_SHOW_LOCAL_MAP_NAME def BINARY_OpenAtlasWindow(self): self.interface.BINARY_OpenAtlasWindow() ## Chat def OnRecvWhisper(self, mode, name, line): if mode == chat.WHISPER_TYPE_GM: self.interface.RegisterGameMasterName(name) chat.AppendWhisper(mode, name, line) self.interface.RecvWhisper(name) def OnRecvWhisperSystemMessage(self, mode, name, line): chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, line) self.interface.RecvWhisper(name) def OnRecvWhisperError(self, mode, name, line): if localeInfo.WHISPER_ERROR.has_key(mode): chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, localeInfo.WHISPER_ERROR[mode](name)) else: chat.AppendWhisper(chat.WHISPER_TYPE_SYSTEM, name, "Whisper Unknown Error(mode=%d, name=%s)" % (mode, name)) self.interface.RecvWhisper(name) def RecvWhisper(self, name): self.interface.RecvWhisper(name) def OnPickMoney(self, money): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_PICK_MONEY % (money)) def OnShopError(self, type): try: self.PopupMessage(localeInfo.SHOP_ERROR_DICT[type]) except KeyError: self.PopupMessage(localeInfo.SHOP_ERROR_UNKNOWN % (type)) def OnSafeBoxError(self): self.PopupMessage(localeInfo.SAFEBOX_ERROR) def OnFishingSuccess(self, isFish, fishName): chat.AppendChatWithDelay(chat.CHAT_TYPE_INFO, localeInfo.FISHING_SUCCESS(isFish, fishName), 2000) # ADD_FISHING_MESSAGE def OnFishingNotifyUnknown(self): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_UNKNOWN) def OnFishingWrongPlace(self): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_WRONG_PLACE) # END_OF_ADD_FISHING_MESSAGE def OnFishingNotify(self, isFish, fishName): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.FISHING_NOTIFY(isFish, fishName)) def OnFishingFailure(self): chat.AppendChatWithDelay(chat.CHAT_TYPE_INFO, localeInfo.FISHING_FAILURE, 2000) def OnCannotPickItem(self): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_CANNOT_PICK_ITEM) # MINING def OnCannotMining(self): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.GAME_CANNOT_MINING) # END_OF_MINING def OnCannotUseSkill(self, vid, type): if localeInfo.USE_SKILL_ERROR_TAIL_DICT.has_key(type): textTail.RegisterInfoTail(vid, localeInfo.USE_SKILL_ERROR_TAIL_DICT[type]) if localeInfo.USE_SKILL_ERROR_CHAT_DICT.has_key(type): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_SKILL_ERROR_CHAT_DICT[type]) def OnCannotShotError(self, vid, type): textTail.RegisterInfoTail(vid, localeInfo.SHOT_ERROR_TAIL_DICT.get(type, localeInfo.SHOT_ERROR_UNKNOWN % (type))) ## PointReset def StartPointReset(self): self.interface.OpenPointResetDialog() ## Shop def StartShop(self, vid): self.interface.OpenShopDialog(vid) def EndShop(self): self.interface.CloseShopDialog() def RefreshShop(self): self.interface.RefreshShopDialog() def SetShopSellingPrice(self, Price): pass ## Exchange def StartExchange(self): self.interface.StartExchange() def EndExchange(self): self.interface.EndExchange() def RefreshExchange(self): self.interface.RefreshExchange() ## Party def RecvPartyInviteQuestion(self, leaderVID, leaderName): partyInviteQuestionDialog = uiCommon.QuestionDialog() partyInviteQuestionDialog.SetText(leaderName + localeInfo.PARTY_DO_YOU_JOIN) partyInviteQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerPartyInvite(arg)) partyInviteQuestionDialog.Open() partyInviteQuestionDialog.partyLeaderVID = leaderVID self.partyInviteQuestionDialog = partyInviteQuestionDialog def AnswerPartyInvite(self, answer): if not self.partyInviteQuestionDialog: return partyLeaderVID = self.partyInviteQuestionDialog.partyLeaderVID distance = player.GetCharacterDistance(partyLeaderVID) if distance < 0.0 or distance > 5000: answer = FALSE net.SendPartyInviteAnswerPacket(partyLeaderVID, answer) self.partyInviteQuestionDialog.Close() self.partyInviteQuestionDialog = None def AddPartyMember(self, pid, name): self.interface.AddPartyMember(pid, name) def UpdatePartyMemberInfo(self, pid): self.interface.UpdatePartyMemberInfo(pid) def RemovePartyMember(self, pid): self.interface.RemovePartyMember(pid) self.__RefreshTargetBoard() def LinkPartyMember(self, pid, vid): self.interface.LinkPartyMember(pid, vid) def UnlinkPartyMember(self, pid): self.interface.UnlinkPartyMember(pid) def UnlinkAllPartyMember(self): self.interface.UnlinkAllPartyMember() def ExitParty(self): self.interface.ExitParty() self.RefreshTargetBoardByVID(self.targetBoard.GetTargetVID()) def ChangePartyParameter(self, distributionMode): self.interface.ChangePartyParameter(distributionMode) ## Messenger def OnMessengerAddFriendQuestion(self, name): messengerAddFriendQuestion = uiCommon.QuestionDialog2() messengerAddFriendQuestion.SetText1(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_1 % (name)) messengerAddFriendQuestion.SetText2(localeInfo.MESSENGER_DO_YOU_ACCEPT_ADD_FRIEND_2) messengerAddFriendQuestion.SetAcceptEvent(ui.__mem_func__(self.OnAcceptAddFriend)) messengerAddFriendQuestion.SetCancelEvent(ui.__mem_func__(self.OnDenyAddFriend)) messengerAddFriendQuestion.Open() messengerAddFriendQuestion.name = name self.messengerAddFriendQuestion = messengerAddFriendQuestion def OnAcceptAddFriend(self): name = self.messengerAddFriendQuestion.name net.SendChatPacket("/messenger_auth y " + name) self.OnCloseAddFriendQuestionDialog() return TRUE def OnDenyAddFriend(self): name = self.messengerAddFriendQuestion.name net.SendChatPacket("/messenger_auth n " + name) self.OnCloseAddFriendQuestionDialog() return TRUE def OnCloseAddFriendQuestionDialog(self): self.messengerAddFriendQuestion.Close() self.messengerAddFriendQuestion = None return TRUE ## SafeBox def OpenSafeboxWindow(self, size): self.interface.OpenSafeboxWindow(size) def RefreshSafebox(self): self.interface.RefreshSafebox() def RefreshSafeboxMoney(self): self.interface.RefreshSafeboxMoney() # ITEM_MALL def OpenMallWindow(self, size): self.interface.OpenMallWindow(size) def RefreshMall(self): self.interface.RefreshMall() # END_OF_ITEM_MALL ## Guild def RecvGuildInviteQuestion(self, guildID, guildName): guildInviteQuestionDialog = uiCommon.QuestionDialog() guildInviteQuestionDialog.SetText(guildName + localeInfo.GUILD_DO_YOU_JOIN) guildInviteQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.AnswerGuildInvite(arg)) guildInviteQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.AnswerGuildInvite(arg)) guildInviteQuestionDialog.Open() guildInviteQuestionDialog.guildID = guildID self.guildInviteQuestionDialog = guildInviteQuestionDialog def AnswerGuildInvite(self, answer): if not self.guildInviteQuestionDialog: return guildLeaderVID = self.guildInviteQuestionDialog.guildID net.SendGuildInviteAnswerPacket(guildLeaderVID, answer) self.guildInviteQuestionDialog.Close() self.guildInviteQuestionDialog = None def DeleteGuild(self): self.interface.DeleteGuild() ## Clock def ShowClock(self, second): self.interface.ShowClock(second) def HideClock(self): self.interface.HideClock() ## Emotion def BINARY_ActEmotion(self, emotionIndex): if self.interface.wndCharacter: self.interface.wndCharacter.ActEmotion(emotionIndex) ############################################################################################### ############################################################################################### ## Keyboard Functions def CheckFocus(self): if FALSE == self.IsFocus(): if TRUE == self.interface.IsOpenChat(): self.interface.ToggleChat() self.SetFocus() def SaveScreen(self): print "save screen" # SCREENSHOT_CWDSAVE if SCREENSHOT_CWDSAVE: if not os.path.exists(os.getcwd()+os.sep+"screenshot"): os.mkdir(os.getcwd()+os.sep+"screenshot") (succeeded, name) = grp.SaveScreenShotToPath(os.getcwd()+os.sep+"screenshot"+os.sep) elif SCREENSHOT_DIR: (succeeded, name) = grp.SaveScreenShot(SCREENSHOT_DIR) else: (succeeded, name) = grp.SaveScreenShot() # END_OF_SCREENSHOT_CWDSAVE if succeeded: pass """ chat.AppendChat(chat.CHAT_TYPE_INFO, name + localeInfo.SCREENSHOT_SAVE1) chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE2) """ else: chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SCREENSHOT_SAVE_FAILURE) def ShowConsole(self): if debugInfo.IsDebugMode() or TRUE == self.consoleEnable: player.EndKeyWalkingImmediately() self.console.OpenWindow() def ShowName(self): self.ShowNameFlag = TRUE self.playerGauge.EnableShowAlways() player.SetQuickPage(self.quickSlotPageIndex+1) # ADD_ALWAYS_SHOW_NAME def __IsShowName(self): if systemSetting.IsAlwaysShowName(): return TRUE if self.ShowNameFlag: return TRUE return FALSE # END_OF_ADD_ALWAYS_SHOW_NAME def HideName(self): self.ShowNameFlag = FALSE self.playerGauge.DisableShowAlways() player.SetQuickPage(self.quickSlotPageIndex) def ShowMouseImage(self): self.interface.ShowMouseImage() def HideMouseImage(self): self.interface.HideMouseImage() def StartAttack(self): player.SetAttackKeyState(TRUE) def EndAttack(self): player.SetAttackKeyState(FALSE) def MoveUp(self): player.SetSingleDIKKeyState(app.DIK_UP, TRUE) def MoveDown(self): player.SetSingleDIKKeyState(app.DIK_DOWN, TRUE) def MoveLeft(self): player.SetSingleDIKKeyState(app.DIK_LEFT, TRUE) def MoveRight(self): player.SetSingleDIKKeyState(app.DIK_RIGHT, TRUE) def StopUp(self): player.SetSingleDIKKeyState(app.DIK_UP, FALSE) def StopDown(self): player.SetSingleDIKKeyState(app.DIK_DOWN, FALSE) def StopLeft(self): player.SetSingleDIKKeyState(app.DIK_LEFT, FALSE) def StopRight(self): player.SetSingleDIKKeyState(app.DIK_RIGHT, FALSE) def PickUpItem(self): player.PickCloseItem() ############################################################################################### ############################################################################################### ## Event Handler def OnKeyDown(self, key): if self.interface.wndWeb and self.interface.wndWeb.IsShow(): return if key == app.DIK_ESC: self.RequestDropItem(FALSE) constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) try: self.onPressKeyDict[key]() except KeyError: pass except: raise return TRUE def OnKeyUp(self, key): try: self.onClickKeyDict[key]() except KeyError: pass except: raise return TRUE def OnMouseLeftButtonDown(self): if self.interface.BUILD_OnMouseLeftButtonDown(): return if mouseModule.mouseController.isAttached(): self.CheckFocus() else: hyperlink = ui.GetHyperlink() if hyperlink: return else: self.CheckFocus() player.SetMouseState(player.MBT_LEFT, player.MBS_PRESS); return TRUE def OnMouseLeftButtonUp(self): if self.interface.BUILD_OnMouseLeftButtonUp(): return if mouseModule.mouseController.isAttached(): attachedType = mouseModule.mouseController.GetAttachedType() attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex() attachedItemSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() attachedItemCount = mouseModule.mouseController.GetAttachedItemCount() ## QuickSlot if player.SLOT_TYPE_QUICK_SLOT == attachedType: player.RequestDeleteGlobalQuickSlot(attachedItemSlotPos) ## Inventory elif player.SLOT_TYPE_INVENTORY == attachedType: if player.ITEM_MONEY == attachedItemIndex: self.__PutMoney(attachedType, attachedItemCount, self.PickingCharacterIndex) else: self.__PutItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, self.PickingCharacterIndex) ## DragonSoul elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType: self.__PutItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, self.PickingCharacterIndex) mouseModule.mouseController.DeattachObject() else: hyperlink = ui.GetHyperlink() if hyperlink: if app.IsPressed(app.DIK_LALT): link = chat.GetLinkFromHyperlink(hyperlink) ime.PasteString(link) else: self.interface.MakeHyperlinkTooltip(hyperlink) return else: player.SetMouseState(player.MBT_LEFT, player.MBS_CLICK) #player.EndMouseWalking() return TRUE def __PutItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount, dstChrID): if player.SLOT_TYPE_INVENTORY == attachedType or player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType: attachedInvenType = player.SlotTypeToInvenType(attachedType) if TRUE == chr.HasInstance(self.PickingCharacterIndex) and player.GetMainCharacterIndex() != dstChrID: if player.IsEquipmentSlot(attachedItemSlotPos) and player.SLOT_TYPE_DRAGON_SOUL_INVENTORY != attachedType: self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.EXCHANGE_FAILURE_EQUIP_ITEM, 0, localeInfo.UI_OK) else: if chr.IsNPC(dstChrID): net.SendGiveItemPacket(dstChrID, attachedInvenType, attachedItemSlotPos, attachedItemCount) else: net.SendExchangeStartPacket(dstChrID) net.SendExchangeItemAddPacket(attachedInvenType, attachedItemSlotPos, 0) else: self.__DropItem(attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount) def __PutMoney(self, attachedType, attachedMoney, dstChrID): if TRUE == chr.HasInstance(dstChrID) and player.GetMainCharacterIndex() != dstChrID: net.SendExchangeStartPacket(dstChrID) net.SendExchangeElkAddPacket(attachedMoney) else: self.__DropMoney(attachedType, attachedMoney) def __DropMoney(self, attachedType, attachedMoney): # PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP if attachedMoney>=1000: self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.DROP_MONEY_FAILURE_1000_OVER, 0, localeInfo.UI_OK) return itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(localeInfo.DO_YOU_DROP_MONEY % (attachedMoney)) itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropCount = attachedMoney itemDropQuestionDialog.dropNumber = player.ITEM_MONEY self.itemDropQuestionDialog = itemDropQuestionDialog def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): # PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP if player.SLOT_TYPE_INVENTORY == attachedType and player.IsEquipmentSlot(attachedItemSlotPos): self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.DROP_ITEM_FAILURE_EQUIP_ITEM, 0, localeInfo.UI_OK) else: if player.SLOT_TYPE_INVENTORY == attachedType: dropItemIndex = player.GetItemIndex(attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() ## Question Text questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) ## Dialog itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1) elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType: dropItemIndex = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() ## Question Text questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) ## Dialog itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.RequestDropItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1) def RequestDropItem(self, answer): if not self.itemDropQuestionDialog: return if answer: dropType = self.itemDropQuestionDialog.dropType dropCount = self.itemDropQuestionDialog.dropCount dropNumber = self.itemDropQuestionDialog.dropNumber if player.SLOT_TYPE_INVENTORY == dropType: if dropNumber == player.ITEM_MONEY: net.SendGoldDropPacketNew(dropCount) snd.PlaySound("sound/ui/money.wav") else: # PRIVATESHOP_DISABLE_ITEM_DROP self.__SendDropItemPacket(dropNumber, dropCount) # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == dropType: # PRIVATESHOP_DISABLE_ITEM_DROP self.__SendDropItemPacket(dropNumber, dropCount, player.DRAGON_SOUL_INVENTORY) # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP self.itemDropQuestionDialog.Close() self.itemDropQuestionDialog = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) # PRIVATESHOP_DISABLE_ITEM_DROP def __SendDropItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return net.SendItemDropPacketNew(itemInvenType, itemVNum, itemCount) # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP def OnMouseRightButtonDown(self): self.CheckFocus() if TRUE == mouseModule.mouseController.isAttached(): mouseModule.mouseController.DeattachObject() else: player.SetMouseState(player.MBT_RIGHT, player.MBS_PRESS) return TRUE def OnMouseRightButtonUp(self): if TRUE == mouseModule.mouseController.isAttached(): return TRUE player.SetMouseState(player.MBT_RIGHT, player.MBS_CLICK) return TRUE def OnMouseMiddleButtonDown(self): player.SetMouseMiddleButtonState(player.MBS_PRESS) def OnMouseMiddleButtonUp(self): player.SetMouseMiddleButtonState(player.MBS_CLICK) def OnUpdate(self): app.UpdateGame() if self.mapNameShower.IsShow(): self.mapNameShower.Update() if self.isShowDebugInfo: self.UpdateDebugInfo() if self.enableXMasBoom: self.__XMasBoom_Update() if 1 == constInfo.AUTO_PICK_UP: self.PickUpItem() if int(int(self.interface.LastContactTimeStamp) + self.interface.WaitTime) < int(app.GetTime()) and self.interface.State == "Kapali": self.interface.State = "Acik" self.interface.BUILD_OnUpdate() localtime = localtime = time.strftime("%d.%m.%y %H:%M:%S") self.timeLine.SetText(localtime) self.timeLine.Show() def UpdateDebugInfo(self): # # 캐릭터 좌표 및 FPS 출력 (x, y, z) = player.GetMainCharacterPosition() nUpdateTime = app.GetUpdateTime() nUpdateFPS = app.GetUpdateFPS() nRenderFPS = app.GetRenderFPS() nFaceCount = app.GetFaceCount() fFaceSpeed = app.GetFaceSpeed() nST=background.GetRenderShadowTime() (fAveRT, nCurRT) = app.GetRenderTime() (iNum, fFogStart, fFogEnd, fFarCilp) = background.GetDistanceSetInfo() (iPatch, iSplat, fSplatRatio, sTextureNum) = background.GetRenderedSplatNum() if iPatch == 0: iPatch = 1 #(dwRenderedThing, dwRenderedCRC) = background.GetRenderedGraphicThingInstanceNum() #self.PrintCoord.SetText("Coordinate: %.2f %.2f %.2f ATM: %d" % (x, y, z, app.GetAvailableTextureMemory()/(1024*1024))) #xMouse, yMouse = wndMgr.GetMousePosition() #self.PrintMousePos.SetText("MousePosition: %d %d" % (xMouse, yMouse)) #self.FrameRate.SetText("UFPS: %3d UT: %3d FS %.2f" % (nUpdateFPS, nUpdateTime, fFaceSpeed)) #if fAveRT>1.0: #self.Pitch.SetText("RFPS: %3d RT:%.2f(%3d) FC: %d(%.2f) " % (nRenderFPS, fAveRT, nCurRT, nFaceCount, nFaceCount/fAveRT)) #self.Splat.SetText("PATCH: %d SPLAT: %d BAD(%.2f)" % (iPatch, iSplat, fSplatRatio)) #self.Pitch.SetText("Pitch: %.2f" % (app.GetCameraPitch()) #self.TextureNum.SetText("TN : %s" % (sTextureNum)) #self.ObjectNum.SetText("GTI : %d, CRC : %d" % (dwRenderedThing, dwRenderedCRC)) #self.ViewDistance.SetText("Num : %d, FS : %f, FE : %f, FC : %f" % (iNum, fFogStart, fFogEnd, fFarCilp)) def OnRender(self): app.RenderGame() if self.console.Console.collision: background.RenderCollision() chr.RenderCollision() (x, y) = app.GetCursorPosition() ######################## # Picking ######################## textTail.UpdateAllTextTail() if TRUE == wndMgr.IsPickedWindow(self.hWnd): self.PickingCharacterIndex = chr.Pick() if -1 != self.PickingCharacterIndex: textTail.ShowCharacterTextTail(self.PickingCharacterIndex) if 0 != self.targetBoard.GetTargetVID(): textTail.ShowCharacterTextTail(self.targetBoard.GetTargetVID()) # ADD_ALWAYS_SHOW_NAME if not self.__IsShowName(): self.PickingItemIndex = item.Pick() if -1 != self.PickingItemIndex: textTail.ShowItemTextTail(self.PickingItemIndex) # END_OF_ADD_ALWAYS_SHOW_NAME ## Show all name in the range # ADD_ALWAYS_SHOW_NAME if self.__IsShowName(): textTail.ShowAllTextTail() self.PickingItemIndex = textTail.Pick(x, y) # END_OF_ADD_ALWAYS_SHOW_NAME textTail.UpdateShowingTextTail() textTail.ArrangeTextTail() if -1 != self.PickingItemIndex: textTail.SelectItemName(self.PickingItemIndex) grp.PopState() grp.SetInterfaceRenderState() textTail.Render() textTail.HideAllTextTail() def OnPressEscapeKey(self): if app.TARGET == app.GetCursor(): app.SetCursor(app.NORMAL) elif TRUE == mouseModule.mouseController.isAttached(): mouseModule.mouseController.DeattachObject() else: self.interface.OpenSystemDialog() return TRUE def OnIMEReturn(self): if app.IsPressed(app.DIK_LSHIFT): self.interface.OpenWhisperDialogWithoutTarget() else: self.interface.ToggleChat() return TRUE def OnPressExitKey(self): self.interface.ToggleSystemDialog() return TRUE ## BINARY CALLBACK ###################################################################################### # WEDDING def BINARY_LoverInfo(self, name, lovePoint): if self.interface.wndMessenger: self.interface.wndMessenger.OnAddLover(name, lovePoint) if self.affectShower: self.affectShower.SetLoverInfo(name, lovePoint) def BINARY_UpdateLovePoint(self, lovePoint): if self.interface.wndMessenger: self.interface.wndMessenger.OnUpdateLovePoint(lovePoint) if self.affectShower: self.affectShower.OnUpdateLovePoint(lovePoint) # END_OF_WEDDING # QUEST_CONFIRM def BINARY_OnQuestConfirm(self, msg, timeout, pid): confirmDialog = uiCommon.QuestionDialogWithTimeLimit() confirmDialog.Open(msg, timeout) confirmDialog.SetAcceptEvent(lambda answer=TRUE, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) confirmDialog.SetCancelEvent(lambda answer=FALSE, pid=pid: net.SendQuestConfirmPacket(answer, pid) or self.confirmDialog.Hide()) self.confirmDialog = confirmDialog # END_OF_QUEST_CONFIRM # GIFT command def Gift_Show(self): self.interface.ShowGift() # CUBE def BINARY_Cube_Open(self, npcVNUM): self.currentCubeNPC = npcVNUM self.interface.OpenCubeWindow() if npcVNUM not in self.cubeInformation: net.SendChatPacket("/cube r_info") else: cubeInfoList = self.cubeInformation[npcVNUM] i = 0 for cubeInfo in cubeInfoList: self.interface.wndCube.AddCubeResultItem(cubeInfo["vnum"], cubeInfo["count"]) j = 0 for materialList in cubeInfo["materialList"]: for materialInfo in materialList: itemVnum, itemCount = materialInfo self.interface.wndCube.AddMaterialInfo(i, j, itemVnum, itemCount) j = j + 1 i = i + 1 self.interface.wndCube.Refresh() def BINARY_Cube_Close(self): self.interface.CloseCubeWindow() # 제작에 필요한 골드, 예상되는 완성품의 VNUM과 개수 정보 update def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count): self.interface.UpdateCubeInfo(gold, itemVnum, count) def BINARY_Cube_Succeed(self, itemVnum, count): print "큐브 제작 성공" self.interface.SucceedCubeWork(itemVnum, count) pass def BINARY_Cube_Failed(self): print "큐브 제작 실패" self.interface.FailedCubeWork() pass def BINARY_Cube_ResultList(self, npcVNUM, listText): # ResultList Text Format : 72723,1/72725,1/72730.1/50001,5 이런식으로 "/" 문자로 구분된 리스트를 줌 #print listText if npcVNUM == 0: npcVNUM = self.currentCubeNPC self.cubeInformation[npcVNUM] = [] try: for eachInfoText in listText.split("/"): eachInfo = eachInfoText.split(",") itemVnum = int(eachInfo[0]) itemCount = int(eachInfo[1]) self.cubeInformation[npcVNUM].append({"vnum": itemVnum, "count": itemCount}) self.interface.wndCube.AddCubeResultItem(itemVnum, itemCount) resultCount = len(self.cubeInformation[npcVNUM]) requestCount = 7 modCount = resultCount % requestCount splitCount = resultCount / requestCount for i in xrange(splitCount): #print("/cube r_info %d %d" % (i * requestCount, requestCount)) net.SendChatPacket("/cube r_info %d %d" % (i * requestCount, requestCount)) if 0 < modCount: #print("/cube r_info %d %d" % (splitCount * requestCount, modCount)) net.SendChatPacket("/cube r_info %d %d" % (splitCount * requestCount, modCount)) except RuntimeError, msg: dbg.TraceError(msg) return 0 pass def BINARY_Cube_MaterialInfo(self, startIndex, listCount, listText): # Material Text Format : 125,1|126,2|127,2|123,5&555,5&555,4/120000 try: #print listText if 3 > len(listText): dbg.TraceError("Wrong Cube Material Infomation") return 0 eachResultList = listText.split("@") cubeInfo = self.cubeInformation[self.currentCubeNPC] itemIndex = 0 for eachResultText in eachResultList: cubeInfo[startIndex + itemIndex]["materialList"] = [[], [], [], [], []] materialList = cubeInfo[startIndex + itemIndex]["materialList"] gold = 0 splitResult = eachResultText.split("/") if 1 < len(splitResult): gold = int(splitResult[1]) #print "splitResult : ", splitResult eachMaterialList = splitResult[0].split("&") i = 0 for eachMaterialText in eachMaterialList: complicatedList = eachMaterialText.split("|") if 0 < len(complicatedList): for complicatedText in complicatedList: (itemVnum, itemCount) = complicatedText.split(",") itemVnum = int(itemVnum) itemCount = int(itemCount) self.interface.wndCube.AddMaterialInfo(itemIndex + startIndex, i, itemVnum, itemCount) materialList[i].append((itemVnum, itemCount)) else: itemVnum, itemCount = eachMaterialText.split(",") itemVnum = int(itemVnum) itemCount = int(itemCount) self.interface.wndCube.AddMaterialInfo(itemIndex + startIndex, i, itemVnum, itemCount) materialList[i].append((itemVnum, itemCount)) i = i + 1 itemIndex = itemIndex + 1 self.interface.wndCube.Refresh() except RuntimeError, msg: dbg.TraceError(msg) return 0 pass # END_OF_CUBE # 용혼석 def BINARY_Highlight_Item(self, inven_type, inven_pos): self.interface.Highligt_Item(inven_type, inven_pos) def BINARY_DragonSoulGiveQuilification(self): self.interface.DragonSoulGiveQuilification() def BINARY_DragonSoulRefineWindow_Open(self): self.interface.OpenDragonSoulRefineWindow() def BINARY_DragonSoulRefineWindow_RefineFail(self, reason, inven_type, inven_pos): self.interface.FailDragonSoulRefine(reason, inven_type, inven_pos) def BINARY_DragonSoulRefineWindow_RefineSucceed(self, inven_type, inven_pos): self.interface.SucceedDragonSoulRefine(inven_type, inven_pos) # END of DRAGON SOUL REFINE WINDOW def BINARY_SetBigMessage(self, message): self.interface.bigBoard.SetTip(message) def BINARY_SetTipMessage(self, message): self.interface.tipBoard.SetTip(message) def BINARY_AppendNotifyMessage(self, type): if not type in localeInfo.NOTIFY_MESSAGE: return chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.NOTIFY_MESSAGE[type]) def BINARY_Guild_EnterGuildArea(self, areaID): self.interface.BULID_EnterGuildArea(areaID) def BINARY_Guild_ExitGuildArea(self, areaID): self.interface.BULID_ExitGuildArea(areaID) def BINARY_GuildWar_OnSendDeclare(self, guildID): pass def BINARY_GuildWar_OnRecvDeclare(self, guildID, warType): mainCharacterName = player.GetMainCharacterName() masterName = guild.GetGuildMasterName() if mainCharacterName == masterName: self.__GuildWar_OpenAskDialog(guildID, warType) def BINARY_GuildWar_OnRecvPoint(self, gainGuildID, opponentGuildID, point): self.interface.OnRecvGuildWarPoint(gainGuildID, opponentGuildID, point) def BINARY_GuildWar_OnStart(self, guildSelf, guildOpp): self.interface.OnStartGuildWar(guildSelf, guildOpp) def BINARY_GuildWar_OnEnd(self, guildSelf, guildOpp): self.interface.OnEndGuildWar(guildSelf, guildOpp) def BINARY_BettingGuildWar_SetObserverMode(self, isEnable): self.interface.BINARY_SetObserverMode(isEnable) def BINARY_BettingGuildWar_UpdateObserverCount(self, observerCount): self.interface.wndMiniMap.UpdateObserverCount(observerCount) def __GuildWar_UpdateMemberCount(self, guildID1, memberCount1, guildID2, memberCount2, observerCount): guildID1 = int(guildID1) guildID2 = int(guildID2) memberCount1 = int(memberCount1) memberCount2 = int(memberCount2) observerCount = int(observerCount) self.interface.UpdateMemberCount(guildID1, memberCount1, guildID2, memberCount2) self.interface.wndMiniMap.UpdateObserverCount(observerCount) def __GuildWar_OpenAskDialog(self, guildID, warType): guildName = guild.GetGuildName(guildID) # REMOVED_GUILD_BUG_FIX if "Noname" == guildName: return # END_OF_REMOVED_GUILD_BUG_FIX import uiGuild questionDialog = uiGuild.AcceptGuildWarDialog() questionDialog.SAFE_SetAcceptEvent(self.__GuildWar_OnAccept) questionDialog.SAFE_SetCancelEvent(self.__GuildWar_OnDecline) questionDialog.Open(guildName, warType) self.guildWarQuestionDialog = questionDialog def __GuildWar_CloseAskDialog(self): self.guildWarQuestionDialog.Close() self.guildWarQuestionDialog = None def __GuildWar_OnAccept(self): guildName = self.guildWarQuestionDialog.GetGuildName() net.SendChatPacket("/war " + guildName) self.__GuildWar_CloseAskDialog() return 1 def __GuildWar_OnDecline(self): guildName = self.guildWarQuestionDialog.GetGuildName() net.SendChatPacket("/nowar " + guildName) self.__GuildWar_CloseAskDialog() return 1 ## BINARY CALLBACK ###################################################################################### def __ServerCommand_Build(self): serverCommandList={ # YIV WORK: Achievement "achievement" : self.achievementWindow.HandleAchievementServerCommand, "cqc_start" : self.cqcStart, "cqc_get" : self.cqcGet, "cqc_end" : self.cqcEnd, "ConsoleEnable" : self.__Console_Enable, "DayMode" : self.__DayMode_Update, "PRESERVE_DayMode" : self.__PRESERVE_DayMode_Update, "CloseRestartWindow" : self.__RestartDialog_Close, "OpenPrivateShop" : self.__PrivateShop_Open, "PartyHealReady" : self.PartyHealReady, "ShowMeSafeboxPassword" : self.AskSafeboxPassword, "CloseSafebox" : self.CommandCloseSafebox, # ITEM_MALL "CloseMall" : self.CommandCloseMall, "ShowMeMallPassword" : self.AskMallPassword, "item_mall" : self.__ItemMall_Open, # END_OF_ITEM_MALL "RefineSuceeded" : self.RefineSuceededMessage, "RefineFailed" : self.RefineFailedMessage, "xmas_snow" : self.__XMasSnow_Enable, "xmas_boom" : self.__XMasBoom_Enable, "xmas_song" : self.__XMasSong_Enable, "xmas_tree" : self.__XMasTree_Enable, "newyear_boom" : self.__XMasBoom_Enable, "PartyRequest" : self.__PartyRequestQuestion, "PartyRequestDenied" : self.__PartyRequestDenied, "horse_state" : self.__Horse_UpdateState, "hide_horse_state" : self.__Horse_HideState, "WarUC" : self.__GuildWar_UpdateMemberCount, "test_server" : self.__EnableTestServerFlag, "mall" : self.__InGameShop_Show, "open_notice_info" : self.__open_notice_info, "write_notice_info" : self.__write_notice_info, # WEDDING "lover_login" : self.__LoginLover, "lover_logout" : self.__LogoutLover, "lover_near" : self.__LoverNear, "lover_far" : self.__LoverFar, "lover_divorce" : self.__LoverDivorce, "PlayMusic" : self.__PlayMusic, # END_OF_WEDDING # PRIVATE_SHOP_PRICE_LIST "MyShopPriceList" : self.__PrivateShop_PriceList, # END_OF_PRIVATE_SHOP_PRICE_LIST } self.serverCommander=stringCommander.Analyzer() for serverCommandItem in serverCommandList.items(): self.serverCommander.SAFE_RegisterCallBack( serverCommandItem[0], serverCommandItem[1] ) def BINARY_ServerCommand_Run(self, line): #dbg.TraceError(line) try: #print " BINARY_ServerCommand_Run", line return self.serverCommander.Run(line) except RuntimeError, msg: dbg.TraceError(msg) return 0 def __ProcessPreservedServerCommand(self): try: command = net.GetPreservedServerCommand() while command: print " __ProcessPreservedServerCommand", command self.serverCommander.Run(command) command = net.GetPreservedServerCommand() except RuntimeError, msg: dbg.TraceError(msg) return 0 def PartyHealReady(self): self.interface.PartyHealReady() def AskSafeboxPassword(self): self.interface.AskSafeboxPassword() # ITEM_MALL def AskMallPassword(self): self.interface.AskMallPassword() def __ItemMall_Open(self): self.interface.OpenItemMall(); def CommandCloseMall(self): self.interface.CommandCloseMall() # END_OF_ITEM_MALL def RefineSuceededMessage(self): snd.PlaySound("sound/ui/make_soket.wav") self.PopupMessage(localeInfo.REFINE_SUCCESS) def RefineFailedMessage(self): snd.PlaySound("sound/ui/jaeryun_fail.wav") self.PopupMessage(localeInfo.REFINE_FAILURE) def CommandCloseSafebox(self): self.interface.CommandCloseSafebox() # PRIVATE_SHOP_PRICE_LIST def __PrivateShop_PriceList(self, itemVNum, itemPrice): uiPrivateShopBuilder.SetPrivateShopItemPrice(itemVNum, itemPrice) # END_OF_PRIVATE_SHOP_PRICE_LIST def __Horse_HideState(self): self.affectShower.SetHorseState(0, 0, 0) def __Horse_UpdateState(self, level, health, battery): self.affectShower.SetHorseState(int(level), int(health), int(battery)) def __IsXMasMap(self): mapDict = ( "metin2_map_n_flame_01", "metin2_map_n_desert_01", "metin2_map_spiderdungeon", "metin2_map_deviltower1", ) if background.GetCurrentMapName() in mapDict: return FALSE return TRUE def __XMasSnow_Enable(self, mode): self.__XMasSong_Enable(mode) if "1"==mode: if not self.__IsXMasMap(): return print "XMAS_SNOW ON" background.EnableSnow(1) else: print "XMAS_SNOW OFF" background.EnableSnow(0) def __XMasBoom_Enable(self, mode): if "1"==mode: if not self.__IsXMasMap(): return print "XMAS_BOOM ON" self.__DayMode_Update("dark") self.enableXMasBoom = TRUE self.startTimeXMasBoom = app.GetTime() else: print "XMAS_BOOM OFF" self.__DayMode_Update("light") self.enableXMasBoom = FALSE def __XMasTree_Enable(self, grade): print "XMAS_TREE ", grade background.SetXMasTree(int(grade)) def __XMasSong_Enable(self, mode): if "1"==mode: print "XMAS_SONG ON" XMAS_BGM = "xmas.mp3" if app.IsExistFile("BGM/" + XMAS_BGM)==1: if musicInfo.fieldMusic != "": snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic) musicInfo.fieldMusic=XMAS_BGM snd.FadeInMusic("BGM/" + musicInfo.fieldMusic) else: print "XMAS_SONG OFF" if musicInfo.fieldMusic != "": snd.FadeOutMusic("BGM/" + musicInfo.fieldMusic) musicInfo.fieldMusic=musicInfo.METIN2THEMA snd.FadeInMusic("BGM/" + musicInfo.fieldMusic) def __RestartDialog_Close(self): self.interface.CloseRestartDialog() def __Console_Enable(self): constInfo.CONSOLE_ENABLE = TRUE self.consoleEnable = TRUE app.EnableSpecialCameraMode() ui.EnablePaste(TRUE) ## PrivateShop def __PrivateShop_Open(self): self.interface.OpenPrivateShopInputNameDialog() def BINARY_PrivateShop_Appear(self, vid, text): self.interface.AppearPrivateShop(vid, text) def BINARY_PrivateShop_Disappear(self, vid): self.interface.DisappearPrivateShop(vid) ## DayMode def __PRESERVE_DayMode_Update(self, mode): if "light"==mode: background.SetEnvironmentData(0) elif "dark"==mode: if not self.__IsXMasMap(): return background.RegisterEnvironmentData(1, constInfo.ENVIRONMENT_NIGHT) background.SetEnvironmentData(1) def __DayMode_Update(self, mode): if "light"==mode: self.curtain.SAFE_FadeOut(self.__DayMode_OnCompleteChangeToLight) elif "dark"==mode: if not self.__IsXMasMap(): return self.curtain.SAFE_FadeOut(self.__DayMode_OnCompleteChangeToDark) def __DayMode_OnCompleteChangeToLight(self): background.SetEnvironmentData(0) self.curtain.FadeIn() def __DayMode_OnCompleteChangeToDark(self): background.RegisterEnvironmentData(1, constInfo.ENVIRONMENT_NIGHT) background.SetEnvironmentData(1) self.curtain.FadeIn() ## XMasBoom def __XMasBoom_Update(self): self.BOOM_DATA_LIST = ( (2, 5), (5, 2), (7, 3), (10, 3), (20, 5) ) if self.indexXMasBoom >= len(self.BOOM_DATA_LIST): return boomTime = self.BOOM_DATA_LIST[self.indexXMasBoom][0] boomCount = self.BOOM_DATA_LIST[self.indexXMasBoom][1] if app.GetTime() - self.startTimeXMasBoom > boomTime: self.indexXMasBoom += 1 for i in xrange(boomCount): self.__XMasBoom_Boom() def __XMasBoom_Boom(self): x, y, z = player.GetMainCharacterPosition() randX = app.GetRandom(-150, 150) randY = app.GetRandom(-150, 150) snd.PlaySound3D(x+randX, -y+randY, z, "sound/common/etc/salute.mp3") def __PartyRequestQuestion(self, vid): vid = int(vid) partyRequestQuestionDialog = uiCommon.QuestionDialog() partyRequestQuestionDialog.SetText(chr.GetNameByVID(vid) + localeInfo.PARTY_DO_YOU_ACCEPT) partyRequestQuestionDialog.SetAcceptText(localeInfo.UI_ACCEPT) partyRequestQuestionDialog.SetCancelText(localeInfo.UI_DENY) partyRequestQuestionDialog.SetAcceptEvent(lambda arg=TRUE: self.__AnswerPartyRequest(arg)) partyRequestQuestionDialog.SetCancelEvent(lambda arg=FALSE: self.__AnswerPartyRequest(arg)) partyRequestQuestionDialog.Open() partyRequestQuestionDialog.vid = vid self.partyRequestQuestionDialog = partyRequestQuestionDialog def __AnswerPartyRequest(self, answer): if not self.partyRequestQuestionDialog: return vid = self.partyRequestQuestionDialog.vid if answer: net.SendChatPacket("/party_request_accept " + str(vid)) else: net.SendChatPacket("/party_request_deny " + str(vid)) self.partyRequestQuestionDialog.Close() self.partyRequestQuestionDialog = None def __PartyRequestDenied(self): self.PopupMessage(localeInfo.PARTY_REQUEST_DENIED) def __EnableTestServerFlag(self): app.EnableTestServerFlag() def __InGameShop_Show(self, url): if constInfo.IN_GAME_SHOP_ENABLE: self.interface.OpenWebWindow("http://tatakaim2.com/tienda") def __open_notice_info(self): self.interface.RegisterGameMasterName("<--System-->") self.interface.RecvWhisper("<--System-->") def __write_notice_info(self,text): chat.AppendWhisper(chat.WHISPER_TYPE_CHAT, "<--System-->", text.replace("_", " ")) # WEDDING def __LoginLover(self): if self.interface.wndMessenger: self.interface.wndMessenger.OnLoginLover() def __LogoutLover(self): if self.interface.wndMessenger: self.interface.wndMessenger.OnLogoutLover() if self.affectShower: self.affectShower.HideLoverState() def __LoverNear(self): if self.affectShower: self.affectShower.ShowLoverState() def __LoverFar(self): if self.affectShower: self.affectShower.HideLoverState() def __LoverDivorce(self): if self.interface.wndMessenger: self.interface.wndMessenger.ClearLoverInfo() if self.affectShower: self.affectShower.ClearLoverState() def __PlayMusic(self, flag, filename): flag = int(flag) if flag: snd.FadeOutAllMusic() musicInfo.SaveLastPlayFieldMusic() snd.FadeInMusic("BGM/" + filename) else: snd.FadeOutAllMusic() musicInfo.LoadLastPlayFieldMusic() snd.FadeInMusic("BGM/" + musicInfo.fieldMusic) # END_OF_WEDDING # def Switcher(self): import uiswitch self.switch = uiswitch.Switcher() if self.switch.IsShow(): self.switch.Hide() else: self.switch.Show() def __quikeqchange(self): import uifastequip self.uuifastequipDlg = uifastequip.changeequip() self.uuifastequipDlg.Show() # def __BonusPage(self): import PaginaBonusuri global BPisLodaded try: if BPisLodaded == 0: BPisLodaded = 1 exec 'PaginaBonusuri.BonusBoardDialog().Show()' else: exec 'PaginaBonusuri.BonusBoardDialog().Hide()' BPisLodaded = 0 except ImportError: import dbg,app dbg.Trace('PaginaBonusuri.py Importing error') app.Abort # YIV WORK: Achievement def cqcStart(self): constInfo.CQC = 1 def cqcGet(self): net.SendQuestInputStringPacket(str(constInfo.CQC_INFO)) def cqcEnd(self): constInfo.CQC_INFO = None constInfo.CQC = 0
-
Olviden ese post, se me olvido poner las siguientes funciones en quest.functions
monturas_sello_adulta monturas_sello_joven monturas_sello_valerosa give_mount_bonus say_grey say_orange
-
Hola, cuando hago ./qc monturas_invocar.quest
Calls undeclared function! : give_mount_bonus Abort (core dumped)
Aqui dejo mi questlib.lua
CONFIRM_NO = 0 CONFIRM_YES = 1 CONFIRM_OK = 1 CONFIRM_TIMEOUT = 2 MALE = 0 FEMALE = 1 --quest.create = function(f) return coroutine.create(f) end --quest.process = function(co,args) return coroutine.resume(co, args) end setstate = q.setstate newstate = q.setstate q.set_clock = function(name, value) q.set_clock_name(name) q.set_clock_value(value) end q.set_counter = function(name, value) q.set_counter_name(name) q.set_counter_value(value) end c_item_name = function(vnum) return ("[ITEM value;"..vnum.."]") end c_mob_name = function(vnum) return ("[MOB value;"..vnum.."]") end -- d.set_folder = function (path) raw_script("[SET_PATH path;"..path.."]") end -- d.set_folder = function (path) path.show_cinematic("[SET_PATH path;"..path.."]") end -- party.run_cinematic = function (path) party.show_cinematic("[RUN_CINEMATIC value;"..path.."]") end newline = "[ENTER]" function color256(r, g, b) return "[COLOR r;"..(r/255.0).."|g;"..(g/255.0).."|b;"..(b/255.0).."]" end function color(r,g,b) return "[COLOR r;"..r.."|g;"..g.."|b;"..b.."]" end function delay(v) return "[DELAY value;"..v.."]" end function setcolor(r,g,b) raw_script(color(r,g,b)) end function setdelay(v) raw_script(delay(v)) end function resetcolor(r,g,b) raw_script("[/COLOR]") end function resetdelay(v) raw_script("[/DELAY]") end -- trim a string function trim(s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")) end -- minimap에 동그라미 표시 function addmapsignal(x,y) raw_script("[ADDMAPSIGNAL x;"..x.."|y;"..y.."]") end -- minimap 동그라미들 모두 클리어 function clearmapsignal() raw_script("[CLEARMAPSIGNAL]") end -- 클라이언트에서 보여줄 대화창 배경 그림을 정한다. function setbgimage(src) raw_script("[BGIMAGE src;") raw_script(src) raw_script("]") end -- 대화창에 이미지를 보여준다. function addimage(x,y,src) raw_script("[IMAGE x;"..x.."|y;"..y) raw_script("|src;") raw_script(src) raw_script("]") end -- generate when a linebreak in the functions: d.notice,notice,notice_all function notice_multiline( str , func ) local p = 0 local i = 0 while true do i = string.find( str, "%[ENTER%]", i+1 ) if i == nil then if string.len(str) > p then func( string.sub( str, p, string.len(str) ) ) end break end func( string.sub( str, p, i-1 ) ) p = i + 7 end end function makequestbutton(name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("]") end function make_quest_button_ex(name, icon_type, icon_name) test_chat(icon_type) test_chat(icon_name) raw_script("[QUESTBUTTON idx;") raw_script(""..q.getcurrentquestindex()) raw_script("|name;") raw_script(name) raw_script("|icon_type;") raw_script(icon_type) raw_script("|icon_name;") raw_script(icon_name) raw_script("]") end function make_quest_button(name) makequestbutton(name) end function send_letter_ex(name, icon_type, icon_name) make_quest_button_ex(name, icon_type, icon_name) set_skin(NOWINDOW) q.set_title(name) q.start() end function send_letter(name) makequestbutton(name) set_skin(NOWINDOW) q.set_title(name) q.start() end function clear_letter() q.done() end function say_title(name) say(color256(255, 230, 186)..name..color256(196, 196, 196)) end function say_reward(name) say(color256(255, 200, 200)..name..color256(196, 196, 196)) end function say_pc_name() say(pc.get_name()..":") end function say_size(width, height) say("[WINDOW_SIZE width;"..width.."|height;"..height.."]") end function setmapcenterposition(x,y) raw_script("[SETCMAPPOS x;") raw_script(x.."|y;") raw_script(y.."]") end function say_item(name, vnum, desc) say("[INSERT_IMAGE image_type;item|idx;"..vnum.."|title;"..name.."|desc;"..desc.."|index;".. 0 .."|total;".. 1 .."]") end function say_show_item(vnum) say("[INSERT_IMAGE image_type;item|idx;"..vnum.."|index;".. 0 .."|total;".. 1 .."]") end function say_item_vnum(vnum) say_item(item_name(vnum), vnum, "") end function say_item_vnum_inline(vnum,index,total) if index >= total then return end if total > 3 then return end raw_script("[INSERT_IMAGE image_type;item|idx;"..vnum.."|title;"..item_name(vnum).."|desc;".."".."|index;"..index.."|total;"..total.."]") end function pc_is_novice() if pc.get_skill_group()==0 then return true else return false end end function pc_get_exp_bonus(exp, text) say_reward(text) pc.give_exp2(exp) set_quest_state("levelup", "run") end function pc_get_village_map_index(index) return village_map[pc.get_empire()][index] end function pc_has_even_id() return math.mod(pc.get_player_id(),2) == 0 end function pc_get_account_id() return math.mod(pc.get_account_id(), 2) !=0 end village_map = { {1, 3}, {21, 23}, {41, 43}, } function npc_is_same_empire() if pc.get_empire()==npc.empire then return true else return false end end function npc_get_skill_teacher_race(pc_empire, pc_job, sub_job) if sub_job == 1 then if pc_job == 0 then return WARRIOR1_NPC_LIST[pc_empire] elseif pc_job == 1 then return ASSASSIN1_NPC_LIST[pc_empire] elseif pc_job == 2 then return SURA1_NPC_LIST[pc_empire] elseif pc_job == 3 then return SHAMAN1_NPC_LIST[pc_empire] elseif pc_job == 4 then return WOLFMAN1_NPC_LIST[pc_empire] end elseif sub_job == 2 then if pc_job == 0 then return WARRIOR2_NPC_LIST[pc_empire] elseif pc_job == 1 then return ASSASSIN2_NPC_LIST[pc_empire] elseif pc_job == 2 then return SURA2_NPC_LIST[pc_empire] elseif pc_job == 3 then return SHAMAN2_NPC_LIST[pc_empire] elseif pc_job == 4 then return WOLFMAN2_NPC_LIST[pc_empire] end end return 0 end function pc_find_square_guard_vid() if pc.get_empire()==1 then return find_npc_by_vnum(11000) elseif pc.get_empire()==2 then return find_npc_by_vnum(11002) elseif pc.get_empire()==3 then return find_npc_by_vnum(11004) end return 0 end function pc_find_skill_teacher_vid(sub_job) local vnum=npc_get_skill_teacher_race(pc.get_empire(), pc.get_job(), sub_job) return find_npc_by_vnum(vnum) end function pc_find_square_guard_vid() local pc_empire=pc.get_empire() if pc_empire==1 then return find_npc_by_vnum(11000) elseif pc_empire==2 then return find_npc_by_vnum(11002) elseif pc_empire==3 then return find_npc_by_vnum(11004) end end function npc_is_same_job() local pc_job = pc.get_job() local npc_vnum = npc.get_race() if pc_job == 0 then if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return true end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return true end elseif pc_job == 1 then if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return true end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return true end elseif pc_job == 2 then if table_is_in(SURA1_NPC_LIST, npc_vnum) then return true end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return true end elseif pc_job == 3 then if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return true end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return true end elseif pc_job == 4 then if table_is_in(WOLFMAN1_NPC_LIST, npc_vnum) then return true end if table_is_in(WOLFMAN2_NPC_LIST, npc_vnum) then return true end end return false end function npc_get_job() local npc_vnum = npc.get_race() if table_is_in(WARRIOR1_NPC_LIST, npc_vnum) then return COND_WARRIOR_1 end if table_is_in(WARRIOR2_NPC_LIST, npc_vnum) then return COND_WARRIOR_2 end if table_is_in(ASSASSIN1_NPC_LIST, npc_vnum) then return COND_ASSASSIN_1 end if table_is_in(ASSASSIN2_NPC_LIST, npc_vnum) then return COND_ASSASSIN_2 end if table_is_in(SURA1_NPC_LIST, npc_vnum) then return COND_SURA_1 end if table_is_in(SURA2_NPC_LIST, npc_vnum) then return COND_SURA_2 end if table_is_in(SHAMAN1_NPC_LIST, npc_vnum) then return COND_SHAMAN_1 end if table_is_in(SHAMAN2_NPC_LIST, npc_vnum) then return COND_SHAMAN_2 end if table_is_in(WOLFMAN1_NPC_LIST, npc_vnum) then return COND_WOLFMAN_1 end if table_is_in(WOLFMAN2_NPC_LIST, npc_vnum) then return COND_WOLFMAN_2 end return 0 end function time_min_to_sec(value) return 60*value end function time_hour_to_sec(value) return 3600*value end function next_time_set(value, test_value) local nextTime=get_time()+value if is_test_server() then nextTime=get_time()+test_value end pc.setqf("__NEXT_TIME__", nextTime) end function next_time_is_now(value) if get_time()>=pc.getqf("__NEXT_TIME__") then return true else return false end end function table_get_random_item(self) return self[number(1, table.getn(self))] end function table_is_in(self, test) for i = 1, table.getn(self) do if self[i]==test then return true end end return false end function giveup_quest_menu(title) local s=select("진행한다", "포기한다") if 2==s then say(title.." 퀘스트를 정말로") say("포기하시겠습니까?") local s=select("네, 그렇습니다", "아닙니다") if 1==s then say(title.."퀘스트를 포기했습니다") restart_quest() end end end function restart_quest() set_state("start") q.done() end function complete_quest() set_state("__COMPLETE__") q.done() end function giveup_quest() set_state("__GIVEUP__") q.done() end function complete_quest_state(state_name) set_state(state_name) q.done() end function test_chat(log) if is_test_server() then chat(log) end end function bool_to_str(is) if is then return "true" else return "false" end end WARRIOR1_NPC_LIST = {20300, 20320, 20340, } WARRIOR2_NPC_LIST = {20301, 20321, 20341, } ASSASSIN1_NPC_LIST = {20302, 20322, 20342, } ASSASSIN2_NPC_LIST = {20303, 20323, 20343, } SURA1_NPC_LIST = {20304, 20324, 20344, } SURA2_NPC_LIST = {20305, 20325, 20345, } SHAMAN1_NPC_LIST = {20306, 20326, 20346, } SHAMAN2_NPC_LIST = {20307, 20327, 20347, } WOLFMAN1_NPC_LIST = {20402, 20402, 20402,} WOLFMAN2_NPC_LIST = {20402, 20402, 20402,} function skill_group_dialog(e, j, g) -- e = 제국, j = 직업, g = 그룹 e = 1 -- XXX 메시지가 나라별로 있다가 하나로 통합되었음 -- 다른 직업이거나 다른 제국일 경우 if pc.job != j then say(locale.skill_group.dialog[e][pc.job][3]) elseif pc.get_skill_group() == 0 then if pc.level < 5 then say(locale.skill_group.dialog[e][j][g][1]) return end say(locale.skill_group.dialog[e][j][g][2]) local answer = select(locale.yes, locale.no) if answer == 1 then --say(locale.skill_group.dialog[e][j][g][2]) pc.set_skill_group(g) else --say(locale.skill_group.dialog[e][j][g][3]) end --elseif pc.get_skill_group() == g then --say(locale.skill_group.dialog[e][j][g][4]) --else --say(locale.skill_group.dialog[e][j][g][5]) end end function show_horse_menu() if horse.is_mine() then say(locale.horse_menu.menu) local s = 0 if horse.is_dead() then s = select(locale.horse_menu.revive, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) else s = select(locale.horse_menu.feed, locale.horse_menu.ride, locale.horse_menu.unsummon, locale.horse_menu.close) end if s==1 then if horse.is_dead() then horse.revive() else local food = horse.get_grade() + 50054 - 1 if pc.countitem(food) > 0 then pc.removeitem(food, 1) horse.feed() else say(locale.need_item_prefix..item_name(food)..locale.need_item_postfix); end end elseif s==2 then horse.ride() elseif s==3 then horse.unsummon() elseif s==4 then -- do nothing end end end npc_index_table = { ['race'] = npc.getrace, ['empire'] = npc.get_empire, } pc_index_table = { ['weapon'] = pc.getweapon, ['level'] = pc.get_level, ['hp'] = pc.gethp, ['maxhp'] = pc.getmaxhp, ['sp'] = pc.getsp, ['maxsp'] = pc.getmaxsp, ['exp'] = pc.get_exp, ['nextexp'] = pc.get_next_exp, ['job'] = pc.get_job, ['money'] = pc.getmoney, ['gold'] = pc.getmoney, ['name'] = pc.getname, ['playtime'] = pc.getplaytime, ['leadership'] = pc.getleadership, ['empire'] = pc.getempire, ['skillgroup'] = pc.get_skill_group, ['x'] = pc.getx, ['y'] = pc.gety, ['local_x'] = pc.get_local_x, ['local_y'] = pc.get_local_y, } item_index_table = { ['vnum'] = item.get_vnum, ['name'] = item.get_name, ['size'] = item.get_size, ['count'] = item.get_count, ['type'] = item.get_type, ['sub_type'] = item.get_sub_type, ['refine_vnum'] = item.get_refine_vnum, ['level'] = item.get_level, } guild_war_bet_price_table = { 10000, 30000, 50000, 100000 } function npc_index(t,i) local npit = npc_index_table if npit[i] then return npit[i]() else return rawget(t,i) end end function pc_index(t,i) local pit = pc_index_table if pit[i] then return pit[i]() else return rawget(t,i) end end function item_index(t, i) local iit = item_index_table if iit[i] then return iit[i]() else return rawget(t, i) end end setmetatable(pc,{__index=pc_index}) setmetatable(npc,{__index=npc_index}) setmetatable(item,{__index=item_index}) --coroutine을 이용한 선택항 처리 function select(...) return q.yield('select', arg) end function select_table(table) return q.yield('select', table) end -- coroutine을 이용한 다음 엔터 기다리기 function wait() q.yield('wait') end function input() return q.yield('input') end function confirm(vid, msg, timeout) return q.yield('confirm', vid, msg, timeout) end function select_item() setskin(NOWINDOW) return q.yield('select_item') end --전역 변수 접근과 관련된 계열 NOWINDOW = 0 NORMAL = 1 CINEMATIC = 2 SCROLL = 3 WARRIOR = 0 ASSASSIN = 1 SURA = 2 SHAMAN = 3 WOLFMAN = 4 COND_WARRIOR_0 = 8 COND_WARRIOR_1 = 16 COND_WARRIOR_2 = 32 COND_WARRIOR = 56 COND_ASSASSIN_0 = 64 COND_ASSASSIN_1 = 128 COND_ASSASSIN_2 = 256 COND_ASSASSIN = 448 COND_SURA_0 = 512 COND_SURA_1 = 1024 COND_SURA_2 = 2048 COND_SURA = 3584 COND_SHAMAN_0 = 4096 COND_SHAMAN_1 = 8192 COND_SHAMAN_2 = 16384 COND_SHAMAN = 28672 COND_WOLFMAN_0 = 32768 COND_WOLFMAN_1 = 65536 COND_WOLFMAN_2 = 131072 COND_WOLFMAN = 229376 PART_MAIN = 0 PART_HAIR = 3 GUILD_CREATE_ITEM_VNUM = 70101 QUEST_SCROLL_TYPE_KILL_MOB = 1 QUEST_SCROLL_TYPE_KILL_ANOTHER_EMPIRE = 2 apply = { ["MAX_HP"] = 1, ["MAX_SP"] = 2, ["CON"] = 3, ["INT"] = 4, ["STR"] = 5, ["DEX"] = 6, ["ATT_SPEED"] = 7, ["MOV_SPEED"] = 8, ["CAST_SPEED"] = 9, ["HP_REGEN"] = 10, ["SP_REGEN"] = 11, ["POISON_PCT"] = 12, ["STUN_PCT"] = 13, ["SLOW_PCT"] = 14, ["CRITICAL_PCT"] = 15, ["PENETRATE_PCT"] = 16, ["ATTBONUS_HUMAN"] = 17, ["ATTBONUS_ANIMAL"] = 18, ["ATTBONUS_ORC"] = 19, ["ATTBONUS_MILGYO"] = 20, ["ATTBONUS_UNDEAD"] = 21, ["ATTBONUS_DEVIL"] = 22, ["STEAL_HP"] = 23, ["STEAL_SP"] = 24, ["MANA_BURN_PCT"] = 25, ["DAMAGE_SP_RECOVER"] = 26, ["BLOCK"] = 27, ["DODGE"] = 28, ["RESIST_SWORD"] = 29, ["RESIST_TWOHAND"] = 30, ["RESIST_DAGGER"] = 31, ["RESIST_BELL"] = 32, ["RESIST_FAN"] = 33, ["RESIST_BOW"] = 34, ["RESIST_FIRE"] = 35, ["RESIST_ELEC"] = 36, ["RESIST_MAGIC"] = 37, ["RESIST_WIND"] = 38, ["REFLECT_MELEE"] = 39, ["REFLECT_CURSE"] = 40, ["POISON_REDUCE"] = 41, ["KILL_SP_RECOVER"] = 42, ["EXP_DOUBLE_BONUS"] = 43, ["GOLD_DOUBLE_BONUS"] = 44, ["ITEM_DROP_BONUS"] = 45, ["POTION_BONUS"] = 46, ["KILL_HP_RECOVER"] = 47, ["IMMUNE_STUN"] = 48, ["IMMUNE_SLOW"] = 49, ["IMMUNE_FALL"] = 50, ["SKILL"] = 51, ["BOW_DISTANCE"] = 52, ["ATT_GRADE_BONUS"] = 53, ["DEF_GRADE_BONUS"] = 54, ["MAGIC_ATT_GRADE"] = 55, ["MAGIC_DEF_GRADE"] = 56, ["CURSE_PCT"] = 57, ["MAX_STAMINA"] = 58, ["ATTBONUS_WARRIOR"] = 59, ["ATTBONUS_ASSASSIN"] = 60, ["ATTBONUS_SURA"] = 61, ["ATTBONUS_SHAMAN"] = 62, ["ATTBONUS_MONSTER"] = 63, ["MALL_EXPBONUS"] = 66, ["MAX_HP_PCT"] = 69, ["MAX_SP_PCT"] = 70, ["MALL_DEFBONUS"] = 65, ["NORMAL_HIT_DEFEND_BONUS"] = 74, ["ATTBONUS_WOLFMAN"] = 94, ["RESIST_WOLFMAN"] = 95, ["RESIST_CLAW"] = 96, } -- 레벨업 퀘스트 -_- special = {} special.fortune_telling = { -- { prob 크리 item money remove money { 1, 0, 20, 20, 0 }, -- 10 { 499, 0, 10, 10, 0 }, -- 5 { 2500, 0, 5, 5, 0 }, -- 1 { 5000, 0, 0, 0, 0 }, { 1500, 0, -5, -5, 20000 }, { 499, 0, -10, -10, 20000 }, { 1, 0, -20, -20, 20000 }, } special.questscroll_reward = { {1, 1500, 3000, 30027, 0, 0 }, {2, 1500, 3000, 30028, 0, 0 }, {3, 1000, 2000, 30034, 30018, 0 }, {4, 1000, 2000, 30034, 30011, 0 }, {5, 1000, 2000, 30011, 30034, 0 }, {6, 1000, 2000, 27400, 0, 0 }, {7, 2000, 4000, 30023, 30003, 0 }, {8, 2000, 4000, 30005, 30033, 0 }, {9, 2000, 8000, 30033, 30005, 0 }, {10, 4000, 8000, 30021, 30033, 30045}, {11, 4000, 8000, 30045, 30022, 30046}, {12, 5000, 12000, 30047, 30045, 30055}, {13, 5000, 12000, 30051, 30017, 30058}, {14, 5000, 12000, 30051, 30007, 30041}, {15, 5000, 15000, 30091, 30017, 30018}, {16, 3500, 6500, 30021, 30033, 0 }, {17, 4000, 9000, 30051, 30033, 0 }, {18, 4500, 10000, 30056, 30057, 30058}, {19, 4500, 10000, 30059, 30058, 30041}, {20, 5000, 15000, 0, 0, 0 }, } special.active_skill_list = { { { 1, 2, 3, 4, 5, 6}, { 16, 17, 18, 19, 20, 21}, }, { {31, 32, 33, 34, 35, 6}, {46, 47, 48, 49, 50, 51}, }, { {61, 62, 63, 64, 65, 66}, {76, 77, 78, 79, 80, 81}, }, { {91, 92, 93, 94, 95, 96}, {106, 107, 108, 109, 110, 111}, }, { {170, 171, 172, 173, 174, 175}, }, } special.skill_reset_cost = { 2000, 2000, 2000, 2000, 2000, 2000, 4000, 6000, 8000, 10000, 14000, 18000, 22000, 28000, 34000, 41000, 50000, 59000, 70000, 90000, 101000, 109000, 114000, 120000, 131000, 141000, 157000, 176000, 188000, 200000, 225000, 270000, 314000, 348000, 393000, 427000, 470000, 504000, 554000, 600000, 758000, 936000, 1103000, 1276000, 1407000, 1568000, 1704000, 1860000, 2080000, 2300000, 2700000, 3100000, 3500000, 3900000, 4300000, 4800000, 5300000, 5800000, 6400000, 7000000, 8000000, 9000000, 10000000, 11000000, 12000000, 13000000, 14000000, 15000000, 16000000, 17000000, } special.levelup_img = { [170] = "dog.tga", [171] = "wolfman.tga", [172] = "wolfman.tga", [173] = "wolfman.tga", [174] = "wolfman.tga", [175] = "wolfman.tga", [176] = "wolfman.tga", [177] = "wolfman.tga", [178] = "wild_boar.tga", [179] = "wild_boar.tga", [180] = "bear.tga", [181] = "bear.tga", [182] = "bear.tga", [183] = "bear.tga", [184] = "tiger.tga", [185] = "tiger.tga", [351] = "bak_inf.tga", [352] = "bak_gung.tga", [353] = "bak_gen1.tga", [354] = "bak_gen2.tga", [402] = "402.tga", [451] = "huk_inf.tga", [452] = "huk_dol.tga", [453] = "huk_gen1.tga", [454] = "huk_gen2.tga", [456] = "456.tga", [551] = "o_inf.tga", [552] = "o_jol.tga", [553] = "o_gung.tga", [554] = "o_jang.tga", [651] = "ung_inf.tga", [652] = "ung_chuk.tga", [653] = "ung_tu.tga", [751] = "mil_chu.tga", [752] = "mil_na.tga", [753] = "mil_na.tga", [754] = "mil_na.tga", [755] = "mil_jip.tga", [756] = "756.tga", [757] = "757.tga", [771] = "mil_chu.tga", [772] = "mil_na.tga", [773] = "mil_na.tga", [774] = "mil_na.tga", [775] = "mil_jip.tga", [776] = "776.tga", [777] = "777.tga", [931] = "sigwi.tga", [932] = "932.tga", [933] = "gwoijil.tga", [934] = "934.tga", [935] = "935.tga", [936] = "936.tga", [937] = "937.tga", [1001] = "1001.tga", [1002] = "1002.tga", [1003] = "1003.tga", [1004] = "1004.tga", [1061] = "1061.tga", [1063] = "1063.tga", [1064] = "1064.tga", [1065] = "1065.tga", [1066] = "1066.tga", [1068] = "1068.tga", [1069] = "1069.tga", [1070] = "1070.tga", [1071] = "1071.tga", [1101] = "1101.tga", [1102] = "1102.tga", [1104] = "1104.tga", [1105] = "1105.tga", [1106] = "1106.tga", [1107] = "1107.tga", [1131] = "1131.tga", [1132] = "1132.tga", [1133] = "1133.tga", [1135] = "1135.tga", [1136] = "1136.tga", [1137] = "1137.tga", [1301] = "1301.tga", [1303] = "1303.tga", [1305] = "1305.tga", [2001] = "spider.tga", [2002] = "spider.tga", [2003] = "spider.tga", [2004] = "spider.tga", [2005] = "spider.tga", [2051] = "spider.tga", [2052] = "spider.tga", [2053] = "spider.tga", [2054] = "spider.tga", [2055] = "spider.tga", [2031] = "2031.tga", [2032] = "2032.tga", [2033] = "2033.tga", [2034] = "2034.tga", [2061] = "2061.tga", [2062] = "2062.tga", [2063] = "2063.tga", [2102] = "2102.tga", [2103] = "2103.tga", [2106] = "2106.tga", [2131] = "2131.tga", [2158] = "2158.tga", [2201] = "2201.tga", [2202] = "2202.tga", [2204] = "2204.tga", [2205] = "2205.tga", [2301] = "2301.tga", [2302] = "2302.tga", [2303] = "2303.tga", [2304] = "2304.tga", [2305] = "2305.tga", [2311] = "2311.tga", [2312] = "2312.tga", [2313] = "2313.tga", [2314] = "2314.tga", [2315] = "2315.tga", [5123] = "5123.tga", [5124] = "5124.tga", [5125] = "5125.tga", [5126] = "5126.tga", } special.levelup_quest = { -- monster kill monster kill -- vnum qty. vnum qty. exp percent { 0 , 0 , 0 , 0 , 0 } , -- lev 1 { 171 , 10 , 172 , 5 , 10 } , -- lev 2 { 171 , 20 , 172 , 10 , 10 } , -- lev 3 { 172 , 15 , 173 , 5 , 10 } , -- lev 4 { 173 , 10 , 174 , 10 , 10 } , -- lev 5 { 174 , 20 , 178 , 10 , 10 } , -- lev 6 { 178 , 10 , 175 , 5 , 10 } , -- lev 7 { 178 , 20 , 175 , 10 , 10 } , -- lev 8 { 175 , 15 , 179 , 5 , 10 } , -- lev 9 { 175 , 20 , 179 , 10 , 10 } , -- lev 10 { 179 , 10 , 180 , 5 , 10 } , -- lev 11 { 180 , 15 , 176 , 10 , 10 } , -- lev 12 { 176 , 20 , 181 , 5 , 10 } , -- lev 13 { 181 , 15 , 177 , 5 , 10 } , -- lev 14 { 181 , 20 , 177 , 10 , 10 } , -- lev 15 { 177 , 15 , 184 , 5 , 10 } , -- lev 16 { 177 , 20 , 184 , 10 , 10 } , -- lev 17 { 184 , 10 , 182 , 10 , 10 } , -- lev 18 { 182 , 20 , 183 , 10 , 10 } , -- lev 19 { 183 , 20 , 352 , 15 , 10 } , -- lev 20 { 352 , 20 , 185 , 10 , "2-10" } , -- lev 21 { 185 , 25 , 354 , 10 , "2-10" } , -- lev 22 { 354 , 20 , 451 , 40 , "2-10" } , -- lev 23 { 451 , 60 , 402 , 80 , "2-10" } , -- lev 24 { 551 , 80 , 454 , 20 , "2-10" } , -- lev 25 { 552 , 80 , 456 , 20 , "2-10" } , -- lev 26 { 456 , 30 , 554 , 20 , "2-10" } , -- lev 27 { 651 , 35 , 554 , 30 , "2-10" } , -- lev 28 { 651 , 40 , 652 , 30 , "2-10" } , -- lev 29 { 652 , 40 , 2102 , 30 , "2-10" } , -- lev 30 { 652 , 50 , 2102 , 45 , "2-5" } , -- lev 31 { 653 , 45 , 2051 , 40 , "2-5" } , -- lev 32 { 751 , 35 , 2103 , 30 , "2-5" } , -- lev 33 { 751 , 40 , 2103 , 40 , "2-5" } , -- lev 34 { 752 , 40 , 2052 , 30 , "2-5" } , -- lev 35 { 754 , 20 , 2106 , 20 , "2-5" } , -- lev 36 { 773 , 30 , 2003 , 20 , "2-5" } , -- lev 37 { 774 , 40 , 2004 , 20 , "2-5" } , -- lev 38 { 756 , 40 , 2005 , 30 , "2-5" } , -- lev 39 { 757 , 40 , 2158 , 20 , "2-5" } , -- lev 40 { 931 , 40 , 5123 , 25 , "2-5" } , -- lev 41 { 932 , 30 , 5123 , 30 , "2-5" } , -- lev 42 { 932 , 40 , 2031 , 35 , "2-5" } , -- lev 43 { 933 , 40 , 2031 , 40 , "2-5" } , -- lev 44 { 771 , 50 , 2032 , 45 , "2-5" } , -- lev 45 { 772 , 30 , 5124 , 30 , "2-5" } , -- lev 46 { 933 , 35 , 5125 , 30 , "2-5" } , -- lev 47 { 934 , 40 , 5125 , 35 , "2-5" } , -- lev 48 { 773 , 40 , 2033 , 45 , "2-5" } , -- lev 49 { 774 , 40 , 5126 , 20 , "2-5" } , -- lev 50 { 775 , 50 , 5126 , 30 , "1-4" } , -- lev 51 { 934 , 45 , 2034 , 45 , "1-4" } , -- lev 52 { 934 , 50 , 2034 , 50 , "1-4" } , -- lev 53 { 776 , 40 , 1001 , 30 , "1-4" } , -- lev 54 { 777 , 40 , 1301 , 35 , "1-4" } , -- lev 55 { 935 , 50 , 1002 , 30 , "1-4" } , -- lev 56 { 935 , 60 , 1002 , 40 , "1-4" } , -- lev 57 { 936 , 45 , 1303 , 40 , "1-4" } , -- lev 58 { 936 , 50 , 1303 , 45 , "1-4" } , -- lev 59 { 937 , 45 , 1003 , 40 , "1-4" } , -- lev 60 { 1004 , 50 , 2061 , 60 , "2-4" } , -- lev 61 { 1305 , 45 , 2131 , 55 , "2-4" } , -- lev 62 { 1305 , 50 , 1101 , 45 , "2-4" } , -- lev 63 { 2062 , 50 , 1102 , 45 , "2-4" } , -- lev 64 { 1104 , 40 , 2063 , 40 , "2-4" } , -- lev 65 { 2301 , 50 , 1105 , 45 , "2-4" } , -- lev 66 { 2301 , 55 , 1105 , 50 , "2-4" } , -- lev 67 { 1106 , 50 , 1061 , 50 , "2-4" } , -- lev 68 { 1107 , 45 , 1061 , 50 , "2-4" } , -- lev 69 { 2302 , 55 , 2201 , 55 , "2-4" } , -- lev 70 { 2303 , 55 , 2202 , 55 , "2-4" } , -- lev 71 { 2303 , 60 , 2202 , 60 , "2-4" } , -- lev 72 { 2304 , 55 , 1063 , 55 , "2-4" } , -- lev 73 { 2305 , 50 , 1063 , 55 , "2-4" } , -- lev 74 { 1064 , 50 , 2204 , 50 , "2-4" } , -- lev 75 { 2205 , 45 , 1065 , 50 , "2-4" } , -- lev 76 { 2311 , 50 , 1068 , 50 , "2-4" } , -- lev 77 { 1070 , 50 , 1066 , 55 , "2-4" } , -- lev 78 { 1070 , 50 , 1069 , 50 , "2-4" } , -- lev 79 { 1071 , 50 , 2312 , 55 , "2-4" } , -- lev 80 { 1071 , 55 , 2312 , 50 , "2-4" } , -- lev 81 { 2313 , 55 , 2314 , 45 , "2-4" } , -- lev 82 { 2313 , 55 , 2314 , 45 , "2-4" } , -- lev 83 { 1131 , 60 , 2315 , 45 , "5-10"} , -- lev 84 { 1131 , 60 , 2315 , 45 , "5-10"} , -- lev 85 { 1132 , 60 , 1135 , 50 , "5-10"} , -- lev 86 { 1132 , 60 , 1135 , 50 , "5-10"} , -- lev 87 { 1133 , 60 , 1136 , 50 , "5-10"} , -- lev 88 { 1133 , 60 , 1137 , 50 , "5-10"} , -- lev 89 { 1132 , 60 , 1137 , 40 , "5-10"} , -- lev 90 } special.levelup_reward1 = { -- warrior assassin sura shaman { 0, 0, 0, 0 }, { 11200, 11400, 11600, 11800 }, -- 갑옷 { 12200, 12340, 12480, 12620 }, -- 투구 { 13000, 13000, 13000, 13000 } -- 방패 } -- levelup_reward1 테이블 크기보다 레벨이 높아지면 아래 -- 테이블을 이용하여 아이템을 준다. special.levelup_reward3 = { -- pct item # item count { 33, 27002, 10 }, -- 25% { 67, 27005, 10 }, -- 25% --{ 75, 27101, 5 }, -- 25% { 100, 27114, 5 }, -- 25% } special.levelup_reward_gold21 = { { 10000, 20 }, { 20000, 50 }, { 40000, 25 }, { 80000, 3 }, { 100000, 2 }, } special.levelup_reward_gold31 = { { 20000, 20 }, { 40000, 40 }, { 60000, 25 }, { 80000, 10 }, { 100000, 5 }, } special.levelup_reward_gold41 = { { 40000, 20 }, { 60000, 40 }, { 80000, 25 }, { 100000, 10 }, { 150000, 5 }, } special.levelup_reward_gold51 = { { 60000, 20 }, { 80000, 40 }, { 100000, 25 }, { 150000, 10 }, { 200000, 5 }, } special.levelup_reward_exp21 = { { 2, 9 }, { 3, 14 }, { 4, 39 }, { 6, 24 }, { 8, 9 }, { 10, 4 }, } special.levelup_reward_exp31 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp41 = { { 2, 10 }, { 2.5, 15 }, { 3, 40 }, { 3.5, 25 }, { 4, 8 }, { 4.5, 5 }, { 5, 2 }, } special.levelup_reward_exp51 = { { 1, 10 }, { 1.5, 15 }, { 2, 40 }, { 2.5, 25 }, { 3, 8 }, { 3.5, 5 }, { 4, 2 }, } special.levelup_reward_exp84 = { { 5, 9 }, { 6, 14 }, { 7, 39 }, { 8, 24 }, { 9, 9 }, { 10, 4 }, } special.levelup_reward_item_21 = { -- no couple ring { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 21 { 15080, 15100, 15120, 15140 }, -- lev 22 { 16080, 16100, 16120, 16140 }, -- lev 23 { 17080, 17100, 17120, 17140 }, -- lev 24 { { 27002, 10 }, { 27005, 10 }, { 27114, 10 } }, -- lev 25 { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 -- with couple ring -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 21 -- { 15080, 15100, 15120, 15140, 70301 }, -- lev 22 -- { 16080, 16100, 16120, 16140, 70301 }, -- lev 23 -- { 17080, 17100, 17120, 17140, 70301 }, -- lev 24 -- { { 27002, 10 }, { 27005, 10 }, { 27114, 10 }, { 70301, 1 } }, -- lev 25 -- { { 27003, 20 }, { 27006, 20 }, { 27114, 10 } }, -- over lev 25 } special.warp_to_pos = { -- 승룡곡 { { 402100, 673900 }, { 270400, 739900 }, { 321300, 808000 }, }, --도염화지 { --A 5994 7563 --B 5978 6222 --C 7307 6898 { 599400, 756300 }, { 597800, 622200 }, { 730700, 689800 }, }, --영비사막 { --A 2178 6272 { 217800, 627200 }, --B 2219 5027 { 221900, 502700 }, --C 3440 5025 { 344000, 502500 }, }, --서한산 { --A 4342 2906 { 434200, 290600 }, --B 3752 1749 { 375200, 174900 }, --C 4918 1736 { 491800, 173600 }, }, } special.devil_tower = { --{ 123, 608 }, { 2048+126, 6656+384 }, { 2048+134, 6656+147 }, { 2048+369, 6656+629 }, { 2048+369, 6656+401 }, { 2048+374, 6656+167 }, { 2048+579, 6656+616 }, { 2048+578, 6656+392 }, { 2048+575, 6656+148 }, } special.lvq_map = { { -- "A1" 1 {}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, { { 440, 565 }, { 460, 771 }, { 668, 800 },}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{496, 401}, {494, 951}, {542, 1079}, {748, 9741},}, {{853,557}, {845,780}, {910,956},}, {{853,557}, {845,780}, {910,956},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{340, 179}, {692, 112}, {787, 256}, {898, 296},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{224,395}, {137,894}, {206,830}, {266,1067},}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, {{405,74}}, }, { -- "A2" 2 {}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{ 640,1437 }}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{640,1437}}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{244,1309}, {4567,1080}, {496,885}, {798,975}, {1059,1099}, {855,1351},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, {{193,772}, {390,402}, {768,600}, {1075,789}, {1338,813},}, }, { -- "A3" 3 {}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{ 948,804 }}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{438, 895}, {725, 864}, {632, 671},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{847, 412}, {844, 854}, {823, 757}, {433, 407},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{316,168}, {497,130}, {701,157}, {858,316},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{200,277}, {130,646}, {211,638}, {291,851},}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, {{100,150}}, }, {}, -- 4 {}, -- 5 {}, -- 6 {}, -- 7 {}, -- 8 {}, -- 9 {}, -- 10 {}, -- 11 {}, -- 12 {}, -- 13 {}, -- 14 {}, -- 15 {}, -- 16 {}, -- 17 {}, -- 18 {}, -- 19 {}, -- 20 { -- "B1" 21 {}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{412,635}, {629,428}, {829,586},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{329,643}, {632,349}, {905,556},}, {{866,822}, {706,224}, {247,722},}, {{866,822}, {706,224}, {247,722},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{617,948}, {353,221},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{496,1089}, {890,1043},}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{876,1127}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, {{908,87}}, }, { -- "B2" 22 {}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{ 95,819 }}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{746,1438}}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{ 172,810}, {288,465}, {475,841}, {303,156}, {687,466},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, {{787,235}, {1209,382}, {1350,571}, {1240,852}, {1254,1126}, {1078,1285}, {727,1360},}, }, { -- "B3" 23 {}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{ 106,88 }}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{230, 244}, {200, 444}, {594, 408},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{584,204}, {720,376}, {861,272},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{566,694}, {349,574}, {198,645},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{816,721}, {489,823},}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, {{772,140}}, }, {}, -- 24 {}, -- 25 {}, -- 26 {}, -- 27 {}, -- 28 {}, -- 29 {}, -- 30 {}, -- 31 {}, -- 32 {}, -- 33 {}, -- 34 {}, -- 35 {}, -- 36 {}, -- 37 {}, -- 38 {}, -- 39 {}, -- 40 { -- "C1" 41 {}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,446}, {169,592}, {211,692}, {632,681},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{385,374}, {227,815}, {664,771},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{169,362}, {368,304}, {626,409}, {187,882}, {571,858},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{178,275}, {365,242}, {644,313}, {194,950}, {559,936},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{452,160}, {536,1034}, {184,1044},}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, {{137,126}}, }, { -- "C2" 42 {}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{1409,139}}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{991,222}, {1201,525}, {613,232}, {970,751}, {1324,790},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, {{192,211}, {247,600}, {249,882}, {987,981}, {1018,1288}, {1303,1174},}, }, { -- "C3" 43 {}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{901,151}}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{421, 189}, {167, 353},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{679,459}, {505,709},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{858,638}, {234,596},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{635,856}, {324,855},}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, {{136,899}}, }, {}, -- 44 {}, -- 45 {}, -- 46 {}, -- 47 {}, -- 48 {}, -- 49 {}, -- 50 {}, -- 51 {}, -- 52 {}, -- 53 {}, -- 54 {}, -- 55 {}, -- 56 {}, -- 57 {}, -- 58 {}, -- 59 {}, -- 60 } function BuildSkillList(job, group) local skill_vnum_list = {} local skill_name_list = {} if pc.get_skill_group() != 0 then local skill_list = special.active_skill_list[job+1][group] table.foreachi( skill_list, function(i, t) local lev = pc.get_skill_level(t) if lev > 0 then local name = locale.GM_SKILL_NAME_DICT[t] if name != nil then table.insert(skill_vnum_list, t) table.insert(skill_name_list, name) end end end ) end table.insert(skill_vnum_list, 0) table.insert(skill_name_list, gameforge.locale.cancel) return { skill_vnum_list, skill_name_list } end --BEGIN EDIT created for Heavens cave pre event, Arne 23Sept09 -- Table for storing character names, char_name_list = {} char_name_list[1] = {} char_name_list[2] = {} char_name_list[3] = {} char_name_list[4] = {} char_name_list[5] = {} char_name_list[6] = {} char_name_list[7] = {} char_name_list[8] = {} char_name_list[9] = {} char_name_list[10] = {} --no return, just used for storing a name into the list function store_charname_by_id(id, charname, charid) char_name_list[id]["name"] = charname char_name_list[id]["eid"] = charid return nil end -- returns the name of a given list item, id is the highscore slot function return_charname_by_id(charid) local counter = 11 repeat counter = counter -1 until char_name_list[counter]["eid"] == charid return char_name_list[counter]["name"] end function get_map_name_by_number(number) map_name = { --EmpireNr-MapNrs [1] = {[1] = gameforge.functions._100_say, [2] = gameforge.functions._130_say, [3] = gameforge.functions._130_say, [4] = gameforge.functions._160_say, [61] = gameforge.functions._200_say, [62] = gameforge.functions._210_say, [63] = gameforge.functions._220_say, [64] = gameforge.functions._190_say, [65] = gameforge.functions._230_say, [72] = gameforge.functions._240_say, [73] = gameforge.functions._240_say,}, [2] = {[1] = gameforge.functions._110_say, [2] = gameforge.functions._140_say, [3] = gameforge.functions._140_say, [4] = gameforge.functions._170_say, [61] = gameforge.functions._200_say, [62] = gameforge.functions._210_say, [63] = gameforge.functions._220_say, [64] = gameforge.functions._190_say, [65] = gameforge.functions._230_say, [72] = gameforge.functions._240_say, [73] = gameforge.functions._240_say,}, [3] = {[1] = gameforge.functions._120_say, [2] = gameforge.functions._150_say, [3] = gameforge.functions._150_say, [4] = gameforge.functions._180_say, [61] = gameforge.functions._200_say, [62] = gameforge.functions._210_say, [63] = gameforge.functions._220_say, [64] = gameforge.functions._190_say, [65] = gameforge.functions._230_say, [72] = gameforge.functions._240_say, [73] = gameforge.functions._240_say,}, } return map_name[pc.get_empire()][number] end --END EDIT PREMIUM_EXP = 0 PREMIUM_ITEM = 1 PREMIUM_SAFEBOX = 2 PREMIUM_AUTOLOOT = 3 PREMIUM_FISH_MIND = 4 PREMIUM_MARRIAGE_FAST = 5 PREMIUM_GOLD = 6 -- point type start POINT_NONE = 0 POINT_LEVEL = 1 POINT_VOICE = 2 POINT_EXP = 3 POINT_NEXT_EXP = 4 POINT_HP = 5 POINT_MAX_HP = 6 POINT_SP = 7 POINT_MAX_SP = 8 POINT_STAMINA = 9 --스테미너 POINT_MAX_STAMINA = 10 --최대 스테미너 POINT_GOLD = 11 POINT_ST = 12 --근력 POINT_HT = 13 --체력 POINT_DX = 14 --민첩성 POINT_IQ = 15 --정신력 POINT_DEF_GRADE = 16 POINT_ATT_SPEED = 17 --공격속도 POINT_ATT_GRADE = 18 --공격력 MAX POINT_MOV_SPEED = 19 --이동속도 POINT_CLIENT_DEF_GRADE = 20 --방어등급 POINT_CASTING_SPEED = 21 --주문속도 (쿨다운타임*100) / (100 + 이값) = 최종 쿨다운 타임 POINT_MAGIC_ATT_GRADE = 22 --마법공격력 POINT_MAGIC_DEF_GRADE = 23 --마법방어력 POINT_EMPIRE_POINT = 24 --제국점수 POINT_LEVEL_STEP = 25 --한 레벨에서의 단계.. (1 2 3 될 때 보상 4 되면 레벨 업) POINT_STAT = 26 --능력치 올릴 수 있는 개수 POINT_SUB_SKILL = 27 --보조 스킬 포인트 POINT_SKILL = 28 --액티브 스킬 포인트 POINT_WEAPON_MIN = 29 --무기 최소 데미지 POINT_WEAPON_MAX = 30 --무기 최대 데미지 POINT_PLAYTIME = 31 --플레이시간 POINT_HP_REGEN = 32 --HP 회복률 POINT_SP_REGEN = 33 --SP 회복률 POINT_BOW_DISTANCE = 34 --활 사정거리 증가치 (meter) POINT_HP_RECOVERY = 35 --체력 회복 증가량 POINT_SP_RECOVERY = 36 --정신력 회복 증가량 POINT_POISON_PCT = 37 --독 확률 POINT_STUN_PCT = 38 --기절 확률 POINT_SLOW_PCT = 39 --슬로우 확률 POINT_CRITICAL_PCT = 40 --크리티컬 확률 POINT_PENETRATE_PCT = 41 --관통타격 확률 POINT_CURSE_PCT = 42 --저주 확률 POINT_ATTBONUS_HUMAN = 43 --인간에게 강함 POINT_ATTBONUS_ANIMAL = 44 --동물에게 데미지 % 증가 POINT_ATTBONUS_ORC = 45 --웅귀에게 데미지 % 증가 POINT_ATTBONUS_MILGYO = 46 --밀교에게 데미지 % 증가 POINT_ATTBONUS_UNDEAD = 47 --시체에게 데미지 % 증가 POINT_ATTBONUS_DEVIL = 48 --마귀(악마)에게 데미지 % 증가 POINT_ATTBONUS_INSECT = 49 --벌레족 POINT_ATTBONUS_FIRE = 50 --화염족 POINT_ATTBONUS_ICE = 51 --빙설족 POINT_ATTBONUS_DESERT = 52 --사막족 POINT_ATTBONUS_MONSTER = 53 --모든 몬스터에게 강함 POINT_ATTBONUS_WARRIOR = 54 --무사에게 강함 POINT_ATTBONUS_ASSASSIN = 55 --자객에게 강함 POINT_ATTBONUS_SURA = 56 --수라에게 강함 POINT_ATTBONUS_SHAMAN = 57 --무당에게 강함 -- ADD_TRENT_MONSTER POINT_ATTBONUS_TREE = 58 --나무에게 강함 20050729.myevan UNUSED5 -- END_OF_ADD_TRENT_MONSTER POINT_RESIST_WARRIOR = 59 --무사에게 저항 POINT_RESIST_ASSASSIN = 60 --자객에게 저항 POINT_RESIST_SURA = 61 --수라에게 저항 POINT_RESIST_SHAMAN = 62 --무당에게 저항 POINT_STEAL_HP = 63 --생명력 흡수 POINT_STEAL_SP = 64 --정신력 흡수 POINT_MANA_BURN_PCT = 65 --마나 번 --/ 피해시 보너스 =/ POINT_DAMAGE_SP_RECOVER = 66 --공격당할 시 정신력 회복 확률 POINT_BLOCK = 67 --블럭율 POINT_DODGE = 68 --회피율 POINT_RESIST_SWORD = 69 POINT_RESIST_TWOHAND = 70 POINT_RESIST_DAGGER = 71 POINT_RESIST_BELL = 72 POINT_RESIST_FAN = 73 POINT_RESIST_BOW = 74 --화살 저항 : 대미지 감소 POINT_RESIST_FIRE = 75 --화염 저항 : 화염공격에 대한 대미지 감소 POINT_RESIST_ELEC = 76 --전기 저항 : 전기공격에 대한 대미지 감소 POINT_RESIST_MAGIC = 77 --술법 저항 : 모든술법에 대한 대미지 감소 POINT_RESIST_WIND = 78 --바람 저항 : 바람공격에 대한 대미지 감소 POINT_REFLECT_MELEE = 79 --공격 반사 --/ 특수 피해시 =/ POINT_REFLECT_CURSE = 80 --저주 반사 POINT_POISON_REDUCE = 81 --독데미지 감소 --/ 적 소멸시 =/ POINT_KILL_SP_RECOVER = 82 --적 소멸시 MP 회복 POINT_EXP_DOUBLE_BONUS = 83 POINT_GOLD_DOUBLE_BONUS = 84 POINT_ITEM_DROP_BONUS = 85 --/ 회복 관련 =/ POINT_POTION_BONUS = 86 POINT_KILL_HP_RECOVERY = 87 POINT_IMMUNE_STUN = 88 POINT_IMMUNE_SLOW = 89 POINT_IMMUNE_FALL = 90 --======== POINT_PARTY_ATTACKER_BONUS = 91 POINT_PARTY_TANKER_BONUS = 92 POINT_ATT_BONUS = 93 POINT_DEF_BONUS = 94 POINT_ATT_GRADE_BONUS = 95 POINT_DEF_GRADE_BONUS = 96 POINT_MAGIC_ATT_GRADE_BONUS = 97 POINT_MAGIC_DEF_GRADE_BONUS = 98 POINT_RESIST_NORMAL_DAMAGE = 99 POINT_HIT_HP_RECOVERY = 100 POINT_HIT_SP_RECOVERY = 101 POINT_MANASHIELD = 102 --흑신수호 스킬에 의한 마나쉴드 효과 정도 POINT_PARTY_BUFFER_BONUS = 103 POINT_PARTY_SKILL_MASTER_BONUS = 104 POINT_HP_RECOVER_CONTINUE = 105 POINT_SP_RECOVER_CONTINUE = 106 POINT_STEAL_GOLD = 107 POINT_POLYMORPH = 108 --변신한 몬스터 번호 POINT_MOUNT = 109 --타고있는 몬스터 번호 POINT_PARTY_HASTE_BONUS = 110 POINT_PARTY_DEFENDER_BONUS = 111 POINT_STAT_RESET_COUNT = 112 --피의 단약 사용을 통한 스텟 리셋 포인트 (1당 1포인트 리셋가능) POINT_HORSE_SKILL = 113 POINT_MALL_ATTBONUS = 114 --공격력 +x% POINT_MALL_DEFBONUS = 115 --방어력 +x% POINT_MALL_EXPBONUS = 116 --경험치 +x% POINT_MALL_ITEMBONUS = 117 --아이템 드롭율 x/10배 POINT_MALL_GOLDBONUS = 118 --돈 드롭율 x/10배 POINT_MAX_HP_PCT = 119 --최대생명력 +x% POINT_MAX_SP_PCT = 120 --최대정신력 +x% POINT_SKILL_DAMAGE_BONUS = 121 --스킬 데미지 *(100+x)% POINT_NORMAL_HIT_DAMAGE_BONUS = 122 --평타 데미지 *(100+x)% -- DEFEND_BONUS_ATTRIBUTES POINT_SKILL_DEFEND_BONUS = 123 --스킬 방어 데미지 POINT_NORMAL_HIT_DEFEND_BONUS = 124 --평타 방어 데미지 -- END_OF_DEFEND_BONUS_ATTRIBUTES -- PC_BANG_ITEM_ADD POINT_PC_BANG_EXP_BONUS = 125 --PC방 전용 경험치 보너스 POINT_PC_BANG_DROP_BONUS = 126 --PC방 전용 드롭률 보너스 POINT_ATTBONUS_WOLFMAN = 127 POINT_RESIST_WOLFMAN = 128 POINT_RESIST_CLAW = 129 -- END_PC_BANG_ITEM_ADD -- POINT_MAX_NUM = 128 common/length.h -- point type start function input_number (sentence) say (sentence) local n = nil while n == nil do n = tonumber (input()) if n != nil then break end say ("input number") end return n end ITEM_NONE = 0 ITEM_WEAPON = 1 ITEM_ARMOR = 2 WEAPON_SWORD = 0 WEAPON_DAGGER = 1 WEAPON_BOW = 2 WEAPON_TWO_HANDED = 3 WEAPON_BELL = 4 WEAPON_FAN = 5 WEAPON_ARROW = 6 WEAPON_MOUNT_SPEAR = 7 WEAPON_CLAW = 8 --dofile( get_locale_base_path() .. "/quest/GFquestlib.lua") function get_today_count(questname, flag_name) local today = math.floor(get_global_time() / 86400) local today_flag = flag_name.."_today" local today_count_flag = flag_name.."_today_count" local last_day = pc.getf(questname, today_flag) if last_day == today then return pc.getf(questname, today_count_flag) else return 0 end end -- "$flag_name"_today unix_timestamp % 86400 -- "$flag_name"_count count function inc_today_count(questname, flag_name, count) local today = math.floor(get_global_time() / 86400) local today_flag = flag_name.."_today" local today_count_flag = flag_name.."_today_count" local last_day = pc.getqf(questname, today_flag) if last_day == today then pc.setf(questname, today_count_flag, pc.getf(questname, today_count_flag) + 1) else pc.setf(questname, today_flag, today) pc.setf(questname, today_count_flag, 1) end end function LIB_duration(ipe) -- if have == nil then -- seconds = ipe - get_global_time() -- chat("nil") -- else -- seconds = (get_global_time() + ipe) - get_global_time() -- chat("no nil") -- end if ipe >= get_global_time() then seconds = ipe - get_global_time() --chat("nil") else seconds = (get_global_time() + ipe) - get_global_time() --chat("no nil") end local days = 0 local hours = math.floor(seconds / 3600) local mins = math.floor((seconds - (hours*3600)) / 60) local secs = math.floor(seconds - hours*3600 - mins*60 ) local t = "" if tonumber(hours) >= 24 then days = math.floor(hours / 24) hours = math.floor(hours - (days*24)) end if tonumber(days) == 1 then t = t..days.." Tag " elseif tonumber(days) >= 1 then t = t..days.." Tage " end if tonumber(hours) == 1 then t = t..hours.." Stunde " elseif tonumber(hours) >= 1 then t = t..hours.." Stunden " end if tonumber(mins) == 1 then t = t..mins.." Minute " elseif tonumber(mins) >= 1 then t = t..mins.." Minuten " end if tonumber(secs) == 1 then t = t..secs.." Sekunde " elseif tonumber(secs) >= 1 then t = t..secs.." Sekunden " end if t == "" then return "(Keine Zeit Vorhanden!)" end return t end function say_npc() say_title(""..mob_name(npc.get_race()).."") end -- This function will return true always in window os, -- but not in freebsd. -- (In window os, RAND_MAX = 0x7FFF = 32767.) function drop_gamble_with_flag(drop_flag) local dp, range = pc.get_killee_drop_pct() dp = 40000 * dp / game.get_event_flag(drop_flag) if dp < 0 or range < 0 then return false end return dp >= number(1, range) end function tablo_kontrol ( e, t ) for _,v in pairs(t) do if (v==e) then return true end end return false end tipo_sello_mascota = { [52001] = 1, [52002] = 1, [52003] = 1, [52004] = 1, [52005] = 1, [52006] = 2, [52007] = 2, [52008] = 2, [52009] = 2, [52010] = 2, [52011] = 3, [52012] = 3, [52013] = 3, [52014] = 3, [52015] = 3, [52016] = 1, [52017] = 1, [52018] = 1, [52019] = 1, [52020] = 1, [52021] = 2, [52022] = 2, [52023] = 2, [52024] = 2, [52025] = 2, [52026] = 3, [52027] = 3, [52028] = 3, [52029] = 3, [52030] = 3, [52031] = 1, [52032] = 1, [52033] = 1, [52034] = 1, [52035] = 1, [52036] = 2, [52037] = 2, [52038] = 2, [52039] = 2, [52040] = 2, [52041] = 3, [52042] = 3, [52043] = 3, [52044] = 3, [52045] = 3, [52046] = 1, [52047] = 1, [52048] = 1, [52049] = 1, [52050] = 1, [52051] = 2, [52052] = 2, [52053] = 2, [52054] = 2, [52055] = 2, [52056] = 3, [52057] = 3, [52058] = 3, [52059] = 3, [52060] = 3, [52061] = 1, [52062] = 1, [52063] = 1, [52064] = 1, [52065] = 1, [52066] = 2, [52067] = 2, [52068] = 2, [52069] = 2, [52070] = 2, [52071] = 3, [52072] = 3, [52073] = 3, [52074] = 3, [52075] = 3, [52076] = 1, [52077] = 1, [52078] = 1, [52079] = 1, [52080] = 1, [52081] = 2, [52082] = 2, [52083] = 2, [52084] = 2, [52085] = 2, [52086] = 3, [52087] = 3, [52088] = 3, [52089] = 3, [52090] = 3, [52091] = 1, [52092] = 1, [52093] = 1, [52094] = 1, [52095] = 1, [52096] = 2, [52097] = 2, [52098] = 2, [52099] = 2, [52100] = 2, [52101] = 3, [52102] = 3, [52103] = 3, [52104] = 3, [52105] = 3, } function monturas_sello_joven() if tipo_sello_mascota[item.get_vnum()] == 1 then return true else return false end end function monturas_sello_adulta() if tipo_sello_mascota[item.get_vnum()] == 2 then return true else return false end end function monturas_sello_valerosa() if tipo_sello_mascota[item.get_vnum()] == 3 then return true else return false end end function give_mount_bonus(a) local vnum = a local mounts_bonus = { [52001] = { 20201,'NO_SKILL',0}, --Jabalí Joven [52002] = { 20201,'NO_SKILL',0}, --Jabalí Joven [52003] = { 20201,'NO_SKILL',0}, --Jabalí Joven [52004] = { 20201,'NO_SKILL',0}, --Jabalí Joven [52005] = { 20201,'NO_SKILL',0}, --Jabalí Joven [52006] = { 20205,apply.ATTBONUS_MONSTER,5}, --Jabalí Adulto [52007] = { 20205,apply.EXP_DOUBLE_BONUS,10}, --Jabalí Adulto [52008] = { 20205,apply.MAX_HP,1000}, --Jabalí Adulto [52009] = { 20205,apply.DEF_GRADE_BONUS,50}, --Jabalí Adulto [52010] = { 20205,apply.ATT_GRADE_BONUS,50}, --Jabalí Adulto [52011] = { 20209,apply.ATTBONUS_MONSTER,10}, --Jabalí Valeroso [52012] = { 20209,apply.EXP_DOUBLE_BONUS,30}, --Jabalí Valeroso [52013] = { 20209,apply.MAX_HP,2000}, --Jabalí Valeroso [52014] = { 20209,apply.DEF_GRADE_BONUS,100}, --Jabalí Valeroso [52015] = { 20209,apply.ATT_GRADE_BONUS,100}, --Jabalí Valeroso [52016] = { 20202,'NO_SKILL',0}, --Lobo Joven [52017] = { 20202,'NO_SKILL',0}, --Lobo Joven [52018] = { 20202,'NO_SKILL',0}, --Lobo Joven [52019] = { 20202,'NO_SKILL',0}, --Lobo Joven [52020] = { 20202,'NO_SKILL',0}, --Lobo Joven [52021] = { 20206,apply.ATTBONUS_MONSTER,5}, --Lobo Adulto [52022] = { 20206,apply.EXP_DOUBLE_BONUS,10}, --Lobo Adulto [52023] = { 20206,apply.MAX_HP,1000}, --Lobo Adulto [52024] = { 20206,apply.DEF_GRADE_BONUS,50}, --Lobo Adulto [52025] = { 20206,apply.ATT_GRADE_BONUS,50}, --Lobo Adulto [52026] = { 20210,apply.ATTBONUS_MONSTER,10}, --Lobo Valeroso [52027] = { 20210,apply.EXP_DOUBLE_BONUS,30}, --Lobo Valeroso [52028] = { 20210,apply.MAX_HP,2000}, --Lobo Valeroso [52029] = { 20210,apply.DEF_GRADE_BONUS,100}, --Lobo Valeroso [52030] = { 20210,apply.ATT_GRADE_BONUS,100}, --Lobo Valeroso [52031] = { 20204,'NO_SKILL',0}, --León Joven [52032] = { 20204,'NO_SKILL',0}, --León Joven [52033] = { 20204,'NO_SKILL',0}, --León Joven [52034] = { 20204,'NO_SKILL',0}, --León Joven [52035] = { 20204,'NO_SKILL',0}, --León Joven [52036] = { 20208,apply.ATTBONUS_MONSTER,5}, --León Adulto [52037] = { 20208,apply.EXP_DOUBLE_BONUS,10}, --León Adulto [52038] = { 20208,apply.MAX_HP,1000}, --León Adulto [52039] = { 20208,apply.DEF_GRADE_BONUS,50}, --León Adulto [52040] = { 20208,apply.ATT_GRADE_BONUS,50}, --León Adulto [52041] = { 20212,apply.ATTBONUS_MONSTER,10}, --León Valeroso [52042] = { 20212,apply.EXP_DOUBLE_BONUS,30}, --León Valeroso [52043] = { 20212,apply.MAX_HP,2000}, --León Valeroso [52044] = { 20212,apply.DEF_GRADE_BONUS,100}, --León Valeroso [52045] = { 20212,apply.ATT_GRADE_BONUS,100}, --León Valeroso [52046] = { 20203,'NO_SKILL',0}, --Tigre Joven [52047] = { 20203,'NO_SKILL',0}, --Tigre Joven [52048] = { 20203,'NO_SKILL',0}, --Tigre Joven [52049] = { 20203,'NO_SKILL',0}, --Tigre Joven [52050] = { 20203,'NO_SKILL',0}, --Tigre Joven [52051] = { 20207,apply.ATTBONUS_MONSTER,5}, --Tigre Adulto [52052] = { 20207,apply.EXP_DOUBLE_BONUS,10}, --Tigre Adulto [52053] = { 20207,apply.MAX_HP,1000}, --Tigre Adulto [52054] = { 20207,apply.DEF_GRADE_BONUS,50}, --Tigre Adulto [52055] = { 20207,apply.ATT_GRADE_BONUS,50}, --Tigre Adulto [52056] = { 20211,apply.ATTBONUS_MONSTER,10}, --Tigre Valeroso [52057] = { 20211,apply.EXP_DOUBLE_BONUS,30}, --Tigre Valeroso [52058] = { 20211,apply.MAX_HP,200}, --Tigre Valeroso [52059] = { 20211,apply.DEF_GRADE_BONUS,100}, --Tigre Valeroso [52060] = { 20211,apply.ATT_GRADE_BONUS,100}, --Tigre Valeroso [52061] = { 20213,'NO_SKILL',0}, --Reno Joven (m) [52062] = { 20213,'NO_SKILL',0}, --Reno Joven (m) [52063] = { 20213,'NO_SKILL',0}, --Reno Joven (m) [52064] = { 20213,'NO_SKILL',0}, --Reno Joven (m) [52065] = { 20213,'NO_SKILL',0}, --Reno Joven (m) [52066] = { 20214,apply.ATTBONUS_MONSTER,5}, --Reno Adulto (m) [52067] = { 20214,apply.EXP_DOUBLE_BONUS,10}, --Reno Adulto (m) [52068] = { 20214,apply.MAX_HP,1000}, --Reno Adulto (m) [52069] = { 20214,apply.DEF_GRADE_BONUS,50}, --Reno Adulto (m) [52070] = { 20214,apply.ATT_GRADE_BONUS,50}, --Reno Adulto (m) [52071] = { 20215,apply.ATTBONUS_MONSTER,10}, --Reno Valeroso (m) [52072] = { 20215,apply.EXP_DOUBLE_BONUS,30}, --Reno Valeroso (m) [52073] = { 20215,apply.MAX_HP,2000}, --Reno Valeroso (m) [52074] = { 20215,apply.DEF_GRADE_BONUS,100}, --Reno Valeroso (m) [52075] = { 20215,apply.ATT_GRADE_BONUS,100}, --Reno Valeroso (m) [52076] = { 20216,'NO_SKILL',0}, --Reno Joven (w) [52077] = { 20216,'NO_SKILL',0}, --Reno Joven (w) [52078] = { 20216,'NO_SKILL',0}, --Reno Joven (w) [52079] = { 20216,'NO_SKILL',0}, --Reno Joven (w) [52080] = { 20216,'NO_SKILL',0}, --Reno Joven (w) [52081] = { 20217,apply.ATTBONUS_MONSTER,5}, --Reno Adulto (w) [52082] = { 20217,apply.EXP_DOUBLE_BONUS,10}, --Reno Adulto (w) [52083] = { 20217,apply.MAX_HP,1000}, --Reno Adulto (w) [52084] = { 20217,apply.DEF_GRADE_BONUS,50}, --Reno Adulto (w) [52085] = { 20217,apply.ATT_GRADE_BONUS,50}, --Reno Adulto (w) [52086] = { 20218,apply.ATTBONUS_MONSTER,10}, --Reno Valeroso (w) [52087] = { 20218,apply.EXP_DOUBLE_BONUS,30}, --Reno Valeroso (w) [52088] = { 20218,apply.MAX_HP,2000}, --Reno Valeroso (w) [52089] = { 20218,apply.DEF_GRADE_BONUS,100}, --Reno Valeroso (w) [52090] = { 20218,apply.ATT_GRADE_BONUS,100}, --Reno Valeroso (w) [52091] = { 20223,'NO_SKILL',0}, --Dinosaurio Joven [52092] = { 20223,'NO_SKILL',0}, --Dinosaurio Joven [52093] = { 20223,'NO_SKILL',0}, --Dinosaurio Joven [52094] = { 20223,'NO_SKILL',0}, --Dinosaurio Joven [52095] = { 20223,'NO_SKILL',0}, --Dinosaurio Joven [52096] = { 20224,apply.ATTBONUS_MONSTER,5}, --Dinosaurio Adulto [52097] = { 20224,apply.EXP_DOUBLE_BONUS,10}, --Dinosaurio Adulto [52098] = { 20224,apply.MAX_HP,1000}, --Dinosaurio Adulto [52099] = { 20224,apply.DEF_GRADE_BONUS,50}, --Dinosaurio Adulto [52100] = { 20224,apply.ATT_GRADE_BONUS,50}, --Dinosaurio Adulto [52101] = { 20225,apply.ATTBONUS_MONSTER,10}, --Dinosaurio Valeroso [52102] = { 20225,apply.EXP_DOUBLE_BONUS,30}, --Dinosaurio Valeroso [52103] = { 20225,apply.MAX_HP,2000}, --Dinosaurio Valeroso [52104] = { 20225,apply.DEF_GRADE_BONUS,100}, --Dinosaurio Valeroso [52105] = { 20225,apply.ATT_GRADE_BONUS,100} --Dinosaurio Valeroso } local ride_npc = mounts_bonus[a][1] local ride_time = item.get_socket(2)*60 local ride_skill = mounts_bonus[a][2] local ride_value = mounts_bonus[a][3] pc.mount(ride_npc,ride_time) if vnum >= 52001 and vnum <= 52005 or vnum >= 52016 and vnum <= 52020 or vnum >= 52031 and vnum <= 52035 or vnum >= 52046 and vnum <= 52050 or vnum >= 52061 and vnum <= 52065 or vnum >= 52076 and vnum <= 52080 or vnum >= 52091 and vnum <= 52095 then --Monturas Jovenes (30+ Velocidad de Movimiento) pc.mount_bonus(apply.MOV_SPEED, 30, ride_time ) pc.mount_bonus(apply.ATT_SPEED, 10, ride_time ) return true elseif vnum >= 52006 and vnum <= 52010 or vnum >= 52021 and vnum <= 52025 or vnum >= 52036 and vnum <= 52040 or vnum >= 52051 and vnum <= 52055 or vnum >= 52066 and vnum <= 52070 or vnum >= 52081 and vnum <= 52085 or vnum >= 52096 and vnum <= 52100 then --Monturas Adultas (60+ Velocidad de Movimiento) pc.mount_bonus(apply.MOV_SPEED, 60, ride_time ) pc.mount_bonus(ride_skill, ride_value, ride_time) pc.mount_bonus(apply.ATT_SPEED, 10, ride_time ) --chat("debug# 40 speed") return true elseif vnum >= 52011 and vnum <= 52015 or vnum >= 52026 and vnum <= 52030 or vnum >= 52041 and vnum <= 52045 or vnum >= 52056 and vnum <= 52060 or vnum >= 52071 and vnum <= 52075 or vnum >= 52086 and vnum <= 52090 or vnum >= 52101 and vnum <= 52105 then --Monturas Valerosas (90+ Velocidad de Movimiento) pc.mount_bonus(apply.MOV_SPEED, 90, ride_time) pc.mount_bonus(ride_skill, ride_value, ride_time ) pc.mount_bonus(apply.ATT_SPEED, 20, ride_time ) return true else --syschat("ERROR") return false end end
-
xd cambiale la extencion de .exe a .bin y listo .-.
#Resuelto
Gracias @carlos21 nunca se me paso por la cabeza esa solucion
-
Hola, necesito un poco de ayuda con el tema del .bin , tengo el source de maxmi ....etc..etc , pero para el autopatcher me hace falta el .bin o un metodo para que el patcher abra directamente el .exe
Muchas gracias
-
Muy bonita, lo unico que me vuelve loco es que la palabra Entrar no esta centrada xD
[Ayuda]Negociar no funciona
en Temas resueltos
Publicado
Muchas gracias macho, me resolviste el problema.