dropItemController.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. local dropItemController = class("dropItemController")
  2. dropItemController.NAME = "dropItemController"
  3. local proxyUtils = requireProxy( "proxyUtils" )
  4. local DROPITEM_RES_PATH = "res/item"
  5. local DROPITEM_GROUND_RES_PATH = "res/item_ground"
  6. function dropItemController:ctor()
  7. self.mLastDropItemX = 0xFFFF
  8. self.mLastDropItemY = 0xFFFF
  9. self.mTryCheckDrop = 0.0
  10. self.mLooksCache = {}
  11. self:Init()
  12. end
  13. function dropItemController:destory()
  14. if dropItemController.instance then
  15. dropItemController.instance = nil
  16. end
  17. end
  18. function dropItemController:Inst()
  19. if not dropItemController.instance then
  20. dropItemController.instance = dropItemController.new()
  21. end
  22. return dropItemController.instance
  23. end
  24. function dropItemController:Tick(delta)
  25. self.mTryCheckDrop = self.mTryCheckDrop + delta
  26. self:cheakPickSprite(delta)
  27. end
  28. function dropItemController:cheakPickSprite(delta)
  29. -- dump(delta,"delta__")
  30. local PickupSpriteProxy = global.Facade:retrieveProxy(global.ProxyTable.PickupSpriteProxy)
  31. if PickupSpriteProxy:getPickupSpriteState() then
  32. local time = PickupSpriteProxy:getTickTime()
  33. local delay = PickupSpriteProxy:getDelayTime() + 200--+200延时不然服务器不认
  34. time = time + delta * 1000
  35. if time > delay then
  36. time = 0
  37. global.Facade:sendNotification(global.NoticeTable.AutoPickupBySprite)
  38. end
  39. PickupSpriteProxy:setTickTime(time)
  40. end
  41. end
  42. -----------------------------------------------------------------------------
  43. function dropItemController:Cleanup()
  44. self.mLastDropItemX = 0xFFFF
  45. self.mLastDropItemY = 0xFFFF
  46. self.mTryCheckDrop = 0.0
  47. self.mLooksCache = {}
  48. end
  49. -----------------------------------------------------------------------------
  50. function dropItemController:Init()
  51. local function loadCallback(actor, act)
  52. self:onPlayerActCompleted(actor, act)
  53. end
  54. global.gamePlayerController:AddHandleOnActCompleted(loadCallback)
  55. end
  56. -----------------------------------------------------------------------------
  57. function dropItemController:handleMessage(msg)
  58. return -99
  59. end
  60. -----------------------------------------------------------------------------
  61. function dropItemController:HandleDropItemPick(mapX, mapY)
  62. local pickInterval = SL:GetMetaValue("GAME_DATA", "PickupTime")
  63. if self.mTryCheckDrop <= (pickInterval * 0.001) then
  64. return 1
  65. end
  66. -- 同位置时,1s间隔
  67. if self.mLastDropItemX == mapX and self.mLastDropItemY == mapY and self.mTryCheckDrop <= 1 then
  68. return 1
  69. end
  70. local dItems = global.dropItemManager:FindDropItemAllInMapXY(mapX, mapY)
  71. if not dItems then
  72. return
  73. end
  74. local bagProxy = global.Facade:retrieveProxy( global.ProxyTable.Bag )
  75. local bagfull = bagProxy:isToBeFull()
  76. local pickable = false
  77. for k, dItem in pairs(dItems) do
  78. if dItem and proxyUtils:DropItemPickEnable(dItem) and dItem:IsPickEnable() then
  79. if not bagfull then
  80. dItem:PickStateMark()
  81. end
  82. pickable = true
  83. break
  84. end
  85. end
  86. if pickable then
  87. self.mLastDropItemX = mapX
  88. self.mLastDropItemY = mapY
  89. self.mTryCheckDrop = 0
  90. LuaSendMsg(global.MsgType.MSG_CS_MAP_ITEM_PICK, 0, mapX, mapY, 0, 0, 0)
  91. end
  92. return 1
  93. end
  94. -----------------------------------------------------------------------------
  95. function dropItemController:AddDropItemToWorld(item)
  96. -- if exist, change ownerID
  97. local id = item.Id
  98. local mapX = item.X
  99. local mapY = item.Y
  100. local looks = item.Looks
  101. local ownerID = item.Of
  102. local MakeIndex = item.MakeIndex
  103. local ShowItemDropEff = item.ShowItemDropEff
  104. local findDropItem = global.actorManager:GetActor(id)
  105. if findDropItem then
  106. findDropItem.mOwnerID = ownerID
  107. return 2
  108. end
  109. local p = {}
  110. p.cloth = looks
  111. p.ownerID = ownerID
  112. local dropItem = global.actorManager:CreateActor(id, global.MMO.ACTOR_DROPITEM, p, true)
  113. if nil == dropItem then
  114. return -1
  115. end
  116. dropItem:SetMakeIndex(MakeIndex)
  117. dropItem:SetDropShake(ShowItemDropEff)
  118. -- position
  119. dropItem.mCurrMapX = mapX
  120. dropItem.mCurrMapY = mapY
  121. -- To map grid position.
  122. local actorPos = global.sceneManager:MapPos2WorldPos(mapX, mapY, true)
  123. dropItem:setPosition(actorPos.x, actorPos.y)
  124. -- to drop item manager
  125. global.dropItemManager:AddDropItem(dropItem)
  126. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  127. if mainPlayer then
  128. -- pick cd, item under player feet
  129. if mainPlayer:GetMapX() == mapX and mainPlayer:GetMapY() == mapY then
  130. dropItem:SetBornStamp(GetServerTime())
  131. end
  132. end
  133. return 1
  134. end
  135. -----------------------------------------------------------------------------
  136. function dropItemController:RmvDroItemFromWorld(id)
  137. -- to drop item manager
  138. global.dropItemManager:RmvDropItem(id)
  139. global.actorManager:RemoveActor(id)
  140. end
  141. -----------------------------------------------------------------------------
  142. function dropItemController:onPlayerActCompleted(actor, act)
  143. if global.MMO.ACTION_DIE ~= act and global.MMO.ACTION_DEATH ~= act then
  144. self:HandleDropItemPick(actor:GetMapX(), actor:GetMapY())
  145. end
  146. end
  147. -----------------------------------------------------------------------------
  148. function dropItemController:PickMainPlayerPosItem(targetPos)
  149. local mainPlayer = global.gamePlayerController:GetMainPlayer()
  150. if not mainPlayer then
  151. return false
  152. end
  153. local mapX = mainPlayer:GetMapX()
  154. local mapY = mainPlayer:GetMapY()
  155. if targetPos and next(targetPos) then
  156. if targetPos.mapX ~= mapX or targetPos.mapY ~= mapY then
  157. return false
  158. end
  159. end
  160. local dItems = global.dropItemManager:FindDropItemAllInMapXY(mapX, mapY)
  161. if not dItems then
  162. return false
  163. end
  164. LuaSendMsg(global.MsgType.MSG_CS_MAP_ITEM_PICK, 0, mapX, mapY, 0, 0, 0)
  165. return true
  166. end
  167. -----------------------------------------------------------------------------
  168. function dropItemController:GetItemGroundFile(looks)
  169. if not (self.mLooksCache[looks]) then
  170. local fileIndex = looks % 10000
  171. local fileName = string.format(GET_STRING(1070), fileIndex)
  172. local pathIndex = math.floor(looks / 10000)
  173. local groundFile = string.format("%s/item_ground_%s/%s.png", DROPITEM_GROUND_RES_PATH, pathIndex, fileName)
  174. groundFile = global.FileUtilCtl:isFileExist(groundFile) and groundFile or string.format("%s/item_%s/%s.png", DROPITEM_RES_PATH, pathIndex, fileName)
  175. self.mLooksCache[looks] = groundFile
  176. end
  177. return self.mLooksCache[looks]
  178. end
  179. return dropItemController