1. import ui
  2. import app
  3. import net
  4. import grp
  5. import chat
  6. import item
  7. import time
  8. import wndMgr
  9. import player
  10. import uiCommon
  11. import exchange
  12. import localeInfo
  13. import mouseModule
  14. import uiPickMoney
  15. import playerSettingModule
  16. class ExchangeDialog(ui.ScriptWindow):
  17. FACE_IMAGE_DICT = {
  18. playerSettingModule.RACE_WARRIOR_M : "icon/face/warrior_m.tga",
  19. playerSettingModule.RACE_WARRIOR_W : "icon/face/warrior_w.tga",
  20. playerSettingModule.RACE_ASSASSIN_M : "icon/face/assassin_m.tga",
  21. playerSettingModule.RACE_ASSASSIN_W : "icon/face/assassin_w.tga",
  22. playerSettingModule.RACE_SURA_M : "icon/face/sura_m.tga",
  23. playerSettingModule.RACE_SURA_W : "icon/face/sura_w.tga",
  24. playerSettingModule.RACE_SHAMAN_M : "icon/face/shaman_m.tga",
  25. playerSettingModule.RACE_SHAMAN_W : "icon/face/shaman_w.tga",
  26. }
  27. #if app.ENABLE_WOLFMAN_CHARACTER:
  28. #FACE_IMAGE_DICT.update({playerSettingModule.RACE_WOLFMAN_M : "icon/face/wolfman_m.tga",})
  29. def __init__(self):
  30. ui.ScriptWindow.__init__(self)
  31. self.TitleName = 0
  32. self.tooltipItem = 0
  33. self.xStart = 0
  34. self.yStart = 0
  35. if app.WJ_ENABLE_TRADABLE_ICON:
  36. self.interface = 0
  37. self.wndInventory = 0
  38. self.lockedItems = {i:(-1,-1) for i in range(exchange.EXCHANGE_ITEM_MAX_NUM)}
  39. def __del__(self):
  40. ui.ScriptWindow.__del__(self)
  41. class Item(ui.ListBoxEx.Item):
  42. def __init__(self,parent, text, value=0):
  43. ui.ListBoxEx.Item.__init__(self)
  44. self.textBox=ui.TextLine()
  45. self.textBox.SetParent(self)
  46. self.textBox.SetText(text)
  47. self.textBox.Show()
  48. self.value = value
  49. def GetValue(self):
  50. return self.value
  51. def __del__(self):
  52. ui.ListBoxEx.Item.__del__(self)
  53. def LoadDialog(self):
  54. PythonScriptLoader = ui.PythonScriptLoader()
  55. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  56. PythonScriptLoader.LoadScriptFile(self, "UIScript/exchangedialog_new.py")
  57. else:
  58. PythonScriptLoader.LoadScriptFile(self, "UIScript/exchangedialog.py")
  59. self.OwnerSlot = self.GetChild("Owner_Slot")
  60. self.OwnerSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectOwnerEmptySlot))
  61. self.OwnerSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectOwnerItemSlot))
  62. self.OwnerSlot.SetOverInItemEvent(ui.__mem_func__(self.OverInOwnerItem))
  63. self.OwnerSlot.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
  64. self.OwnerMoney = self.GetChild("Owner_Money_Value")
  65. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  66. self.OwnerAcceptLight = self.GetChild("Owner_Accept_Light")
  67. self.OwnerAcceptLight.Disable()
  68. self.OwnerMoneyButton = self.GetChild("Owner_Money")
  69. self.OwnerMoneyButton.SetEvent(ui.__mem_func__(self.OpenPickMoneyDialog))
  70. self.TargetSlot = self.GetChild("Target_Slot")
  71. self.TargetSlot.SetOverInItemEvent(ui.__mem_func__(self.OverInTargetItem))
  72. self.TargetSlot.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
  73. self.TargetMoney = self.GetChild("Target_Money_Value")
  74. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  75. self.TargetAcceptLight = self.GetChild("Target_Accept_Light")
  76. self.TargetAcceptLight.Disable()
  77. dlgPickMoney = uiPickMoney.PickMoneyDialog()
  78. dlgPickMoney.LoadDialog()
  79. dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney))
  80. dlgPickMoney.SetTitleName(localeInfo.EXCHANGE_MONEY)
  81. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  82. dlgPickMoney.SetMax(6)
  83. else:
  84. dlgPickMoney.SetMax(20)
  85. dlgPickMoney.Hide()
  86. self.dlgPickMoney = dlgPickMoney
  87. self.AcceptButton = self.GetChild("Owner_Accept_Button")
  88. self.AcceptButton.SetToggleDownEvent(ui.__mem_func__(self.AcceptExchange))
  89. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  90. self.TargetAcceptButton = self.GetChild("Target_Accept_Button")
  91. self.TitleName = self.GetChild("TitleName")
  92. self.GetChild("TitleBar").SetCloseEvent(net.SendExchangeExitPacket)
  93. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  94. self.FaceOwnerImage = self.GetChild("FaceOwner_Image")
  95. self.FaceTargetImage = self.GetChild("FaceTarget_Image")
  96. self.TargetName = self.GetChild("target_NameText")
  97. self.TargetLevel = self.GetChild("target_LvText")
  98. self.ExchangeLogs = self.GetChild("ExchangeLogs")
  99. self.LogsScrollBar = ui.ThinScrollBar()
  100. self.LogsScrollBar.SetParent(self.ExchangeLogs)
  101. self.LogsScrollBar.SetPosition(442 - 75, 17)
  102. self.LogsScrollBar.SetScrollBarSize(50)
  103. self.LogsScrollBar.Show()
  104. self.LogsDropList = ui.ListBoxEx()
  105. self.LogsDropList.SetParent(self.ExchangeLogs)
  106. self.LogsDropList.itemHeight = 12
  107. self.LogsDropList.itemStep = 13
  108. self.LogsDropList.SetPosition(35, 27)
  109. self.LogsDropList.SetSize(0, 45)
  110. self.LogsDropList.SetScrollBar(self.LogsScrollBar)
  111. self.LogsDropList.SetViewItemCount(2)
  112. self.LogsDropList.Show()
  113. self.LogsScrollBar.Show()
  114. self.listOwnerSlot = []
  115. self.listTargetSlot = []
  116. def Destroy(self):
  117. print "---------------------------------------------------------------------------- DESTROY EXCHANGE"
  118. self.ClearDictionary()
  119. self.dlgPickMoney.Destroy()
  120. self.dlgPickMoney = 0
  121. self.OwnerSlot = 0
  122. self.OwnerMoney = 0
  123. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  124. self.OwnerAcceptLight = 0
  125. self.OwnerMoneyButton = 0
  126. self.TargetSlot = 0
  127. self.TargetMoney = 0
  128. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  129. self.TargetAcceptLight = 0
  130. self.TitleName = 0
  131. self.AcceptButton = 0
  132. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  133. self.TargetAcceptButton = 0
  134. self.FaceOwnerImage = None
  135. self.FaceTargetImage = None
  136. self.TargetName = None
  137. self.TargetLevel = None
  138. self.ExchangesLogsWindow = None
  139. self.LogsDropList.RemoveAllItems()
  140. self.LogsScrollBar = None
  141. self.LogsDropList = None
  142. self.tooltipItem = 0
  143. if app.WJ_ENABLE_TRADABLE_ICON:
  144. self.interface = 0
  145. self.wndInventory = 0
  146. self.lockedItems = {i:(-1,-1) for i in range(exchange.EXCHANGE_ITEM_MAX_NUM)}
  147. def OpenDialog(self):
  148. self.TitleName.SetText(localeInfo.EXCHANGE_TITLE % (exchange.GetNameFromTarget()))
  149. #REVEN
  150. self.AcceptButton.Enable()
  151. self.AcceptButton.SetUp()
  152. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  153. self.TargetAcceptButton.Disable()
  154. self.TargetAcceptButton.SetUp()
  155. self.FaceOwnerImage.LoadImage(self.FACE_IMAGE_DICT[exchange.GetRaceFromSelf()])
  156. self.FaceTargetImage.LoadImage(self.FACE_IMAGE_DICT[exchange.GetRaceFromTarget()])
  157. self.TargetName.SetText(exchange.GetNameFromTarget())
  158. self.TargetLevel.SetText(localeInfo.NEW_EXCHANGE_LEVEL % (exchange.GetLevelFromTarget()))
  159. self.LogsDropList.RemoveAllItems()
  160. self.LogsDropList.AppendItem(self.Item(self, localeInfo.NEW_EXCHANGE_YOU_READY % (str(time.strftime("[%H:%M:%S]"))), 0))
  161. if app.WJ_ENABLE_TRADABLE_ICON:
  162. self.interface.SetOnTopWindow(player.ON_TOP_WND_EXCHANGE)
  163. self.interface.RefreshMarkInventoryBag()
  164. self.Show()
  165. (self.xStart, self.yStart, z) = player.GetMainCharacterPosition()
  166. def CloseDialog(self):
  167. wndMgr.OnceIgnoreMouseLeftButtonUpEvent()
  168. if 0 != self.tooltipItem:
  169. self.tooltipItem.HideToolTip()
  170. if app.WJ_ENABLE_TRADABLE_ICON:
  171. for exchangePos, (itemInvenPage, itemSlotPos) in self.lockedItems.items():
  172. if itemInvenPage == self.wndInventory.GetInventoryPageIndex():
  173. self.wndInventory.wndItem.SetCanMouseEventSlot(itemSlotPos)
  174. self.lockedItems = {i:(-1,-1) for i in range(exchange.EXCHANGE_ITEM_MAX_NUM)}
  175. self.interface.SetOnTopWindow(player.ON_TOP_WND_NONE)
  176. self.interface.RefreshMarkInventoryBag()
  177. self.dlgPickMoney.Close()
  178. self.Hide()
  179. def SetItemToolTip(self, tooltipItem):
  180. self.tooltipItem = tooltipItem
  181. def OpenPickMoneyDialog(self):
  182. if exchange.GetElkFromSelf() > 0:
  183. chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EXCHANGE_CANT_EDIT_MONEY)
  184. return
  185. self.dlgPickMoney.Open(player.GetElk())
  186. def OnPickMoney(self, money):
  187. net.SendExchangeElkAddPacket(money)
  188. def AcceptExchange(self):
  189. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  190. atLeastOneItem = 0
  191. atLeastOneYang = 0
  192. for i in xrange(exchange.EXCHANGE_ITEM_MAX_NUM):
  193. itemCount = exchange.GetItemCountFromTarget(i)
  194. if itemCount >= 1:
  195. atLeastOneYang = 1
  196. break
  197. if exchange.GetElkFromTarget() >= 1:
  198. atLeastOneYang = 1
  199. if atLeastOneItem or atLeastOneYang:
  200. net.SendExchangeAcceptPacket()
  201. self.AcceptButton.Disable()
  202. else:
  203. atLeastOneItem = 0
  204. atLeastOneYang = 0
  205. for i in xrange(exchange.EXCHANGE_ITEM_MAX_NUM):
  206. itemCount = exchange.GetItemCountFromSelf(i)
  207. if itemCount >= 1:
  208. atLeastOneYang = 1
  209. break
  210. if exchange.GetElkFromSelf() >= 1:
  211. atLeastOneYang = 1
  212. if atLeastOneItem or atLeastOneYang:
  213. self.questionDialog = uiCommon.QuestionDialog2()
  214. self.questionDialog.SetText1(localeInfo.NEW_EXCHANGE_ALERT1)
  215. self.questionDialog.SetText2(localeInfo.NEW_EXCHANGE_ALERT2)
  216. self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.AcceptQuestion))
  217. self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
  218. self.questionDialog.Open()
  219. else:
  220. net.SendExchangeAcceptPacket()
  221. self.AcceptButton.Disable()
  222. else:
  223. net.SendExchangeAcceptPacket()
  224. self.AcceptButton.Disable()
  225. if app.ENABLE_NEW_EXCHANGE_WINDOW:
  226. def AcceptQuestion(self):
  227. net.SendExchangeAcceptPacket()
  228. self.AcceptButton.Disable()
  229. if self.questionDialog:
  230. self.questionDialog.Close()
  231. self.questionDialog = None
  232. def OnCloseQuestionDialog(self):
  233. if self.questionDialog:
  234. self.questionDialog.Close()
  235. self.questionDialog = None
  236. self.AcceptButton.Enable()
  237. self.AcceptButton.SetUp()
  238. def SelectOwnerEmptySlot(self, SlotIndex):
  239. if False == mouseModule.mouseController.isAttached():
  240. return
  241. if mouseModule.mouseController.IsAttachedMoney():
  242. net.SendExchangeElkAddPacket(str(mouseModule.mouseController.GetAttachedMoneyAmount()))
  243. else:
  244. attachedSlotType = mouseModule.mouseController.GetAttachedType()
  245. if (player.SLOT_TYPE_INVENTORY == attachedSlotType or player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType):
  246. attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  247. SrcSlotNumber = mouseModule.mouseController.GetAttachedSlotNumber()
  248. DstSlotNumber = SlotIndex
  249. itemID = player.GetItemIndex(attachedInvenType, SrcSlotNumber)
  250. item.SelectItem(itemID)
  251. if item.IsAntiFlag(item.ANTIFLAG_GIVE):
  252. chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.EXCHANGE_CANNOT_GIVE)
  253. mouseModule.mouseController.DeattachObject()
  254. return
  255. net.SendExchangeItemAddPacket(attachedInvenType, SrcSlotNumber, DstSlotNumber)
  256. mouseModule.mouseController.DeattachObject()
  257. def SelectOwnerItemSlot(self, SlotIndex):
  258. if player.ITEM_MONEY == mouseModule.mouseController.GetAttachedItemIndex():
  259. money = mouseModule.mouseController.GetAttachedItemCount()
  260. net.SendExchangeElkAddPacket(str(money))
  261. def RefreshOwnerSlot(self):
  262. for i in xrange(exchange.EXCHANGE_ITEM_MAX_NUM):
  263. itemIndex = exchange.GetItemVnumFromSelf(i)
  264. itemCount = exchange.GetItemCountFromSelf(i)
  265. if 1 == itemCount:
  266. itemCount = 0
  267. self.OwnerSlot.SetItemSlot(i, itemIndex, itemCount)
  268. self.OwnerSlot.RefreshSlot()
  269. def RefreshTargetSlot(self):
  270. for i in xrange(exchange.EXCHANGE_ITEM_MAX_NUM):
  271. itemIndex = exchange.GetItemVnumFromTarget(i)
  272. itemCount = exchange.GetItemCountFromTarget(i)
  273. if 1 == itemCount:
  274. itemCount = 0
  275. self.TargetSlot.SetItemSlot(i, itemIndex, itemCount)
  276. self.TargetSlot.RefreshSlot()
  277. def Refresh(self):
  278. self.RefreshOwnerSlot()
  279. self.RefreshTargetSlot()
  280. if app.WJ_ENABLE_TRADABLE_ICON:
  281. self.RefreshLockedSlot()
  282. self.OwnerMoney.SetText(localeInfo.NumberToMoneyString2(str(exchange.GetElkFromSelf())))
  283. self.TargetMoney.SetText(localeInfo.NumberToMoneyString2(str(exchange.GetElkFromTarget())))
  284. if exchange.GetAcceptFromSelf() == True:
  285. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  286. self.OwnerAcceptLight.Down()
  287. else:
  288. self.OwnerSlot.SetSlotBaseImage("d:/ymir work/ui/public/slot_base.sub", 0.3500, 0.8500, 0.3500, 1.0)
  289. self.LogsDropList.AppendItem(self.Item(self, localeInfo.NEW_EXCHANGE_YOU_ACCEPT % (str((time.strftime("[%H:%M:%S]")))), 0))
  290. else:
  291. if self.AcceptButton.IsDown() == True:
  292. self.LogsDropList.AppendItem(self.Item(self, localeInfo.NEW_EXCHANGE_YOU_ABORT % (str((time.strftime("[%H:%M:%S]")))), 0))
  293. self.AcceptButton.Enable()
  294. self.AcceptButton.SetUp()
  295. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  296. self.OwnerAcceptLight.SetUp()
  297. else:
  298. self.OwnerSlot.SetSlotBaseImage("d:/ymir work/ui/public/slot_base.sub", 1.0, 1.0, 1.0, 1.0)
  299. if exchange.GetAcceptFromTarget() == True:
  300. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  301. self.TargetAcceptLight.Down()
  302. else:
  303. self.TargetAcceptButton.Down()
  304. self.TargetSlot.SetSlotBaseImage("d:/ymir work/ui/public/slot_base.sub", 0.3500, 0.8500, 0.3500, 1.0)
  305. self.LogsDropList.AppendItem(self.Item(self, localeInfo.NEW_EXCHANGE_ACCEPT % (str((time.strftime("[%H:%M:%S]"))), exchange.GetNameFromTarget()), 0))
  306. else:
  307. if not app.ENABLE_NEW_EXCHANGE_WINDOW:
  308. self.TargetAcceptLight.SetUp()
  309. else:
  310. if self.TargetAcceptButton.IsDown() == True:
  311. self.LogsDropList.AppendItem(self.Item(self, localeInfo.NEW_EXCHANGE_ABORT % (str((time.strftime("[%H:%M:%S]"))), exchange.GetNameFromTarget()), 0))
  312. self.TargetAcceptButton.SetUp()
  313. self.TargetSlot.SetSlotBaseImage("d:/ymir work/ui/public/slot_base.sub", 1.0, 1.0, 1.0, 1.0)
  314. def OverInOwnerItem(self, slotIndex):
  315. if 0 != self.tooltipItem:
  316. self.tooltipItem.SetExchangeOwnerItem(slotIndex)
  317. def OverInTargetItem(self, slotIndex):
  318. if 0 != self.tooltipItem:
  319. self.tooltipItem.SetExchangeTargetItem(slotIndex)
  320. def OverOutItem(self):
  321. if 0 != self.tooltipItem:
  322. self.tooltipItem.HideToolTip()
  323. def OnTop(self):
  324. self.tooltipItem.SetTop()
  325. if app.WJ_ENABLE_TRADABLE_ICON:
  326. if self.interface:
  327. self.interface.SetOnTopWindow(player.ON_TOP_WND_EXCHANGE)
  328. self.interface.RefreshMarkInventoryBag()
  329. if app.WJ_ENABLE_TRADABLE_ICON:
  330. def CantTradableItem(self, destSlotIndex, srcSlotIndex):
  331. if True == exchange.GetAcceptFromTarget():
  332. return
  333. itemInvenPage = srcSlotIndex / player.INVENTORY_PAGE_SIZE
  334. localSlotPos = srcSlotIndex - (itemInvenPage * player.INVENTORY_PAGE_SIZE)
  335. self.lockedItems[destSlotIndex] = (itemInvenPage, localSlotPos)
  336. if self.wndInventory.GetInventoryPageIndex() == itemInvenPage and self.IsShow():
  337. self.wndInventory.wndItem.SetCantMouseEventSlot(localSlotPos)
  338. def RefreshLockedSlot(self):
  339. if self.wndInventory:
  340. for exchangePos, (itemInvenPage, itemSlotPos) in self.lockedItems.items():
  341. if self.wndInventory.GetInventoryPageIndex() == itemInvenPage:
  342. self.wndInventory.wndItem.SetCantMouseEventSlot(itemSlotPos)
  343. self.wndInventory.wndItem.RefreshSlot()
  344. def BindInterface(self, interface):
  345. self.interface = interface
  346. def SetInven(self, wndInventory):
  347. from _weakref import proxy
  348. self.wndInventory = proxy(wndInventory)
  349. def OnUpdate(self):
  350. USE_EXCHANGE_LIMIT_RANGE = 10000
  351. (x, y, z) = player.GetMainCharacterPosition()
  352. if abs(x - self.xStart) > USE_EXCHANGE_LIMIT_RANGE or abs(y - self.yStart) > USE_EXCHANGE_LIMIT_RANGE:
  353. (self.xStart, self.yStart, z) = player.GetMainCharacterPosition()
  354. net.SendExchangeExitPacket()