| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- local dropItemController = class("dropItemController")
- dropItemController.NAME = "dropItemController"
- local proxyUtils = requireProxy( "proxyUtils" )
- local DROPITEM_RES_PATH = "res/item"
- local DROPITEM_GROUND_RES_PATH = "res/item_ground"
- function dropItemController:ctor()
- self.mLastDropItemX = 0xFFFF
- self.mLastDropItemY = 0xFFFF
- self.mTryCheckDrop = 0.0
- self.mLooksCache = {}
- self:Init()
- end
- function dropItemController:destory()
- if dropItemController.instance then
- dropItemController.instance = nil
- end
- end
- function dropItemController:Inst()
- if not dropItemController.instance then
- dropItemController.instance = dropItemController.new()
- end
- return dropItemController.instance
- end
- function dropItemController:Tick(delta)
- self.mTryCheckDrop = self.mTryCheckDrop + delta
- self:cheakPickSprite(delta)
- end
- function dropItemController:cheakPickSprite(delta)
- -- dump(delta,"delta__")
- local PickupSpriteProxy = global.Facade:retrieveProxy(global.ProxyTable.PickupSpriteProxy)
- if PickupSpriteProxy:getPickupSpriteState() then
- local time = PickupSpriteProxy:getTickTime()
- local delay = PickupSpriteProxy:getDelayTime() + 200--+200延时不然服务器不认
- time = time + delta * 1000
- if time > delay then
- time = 0
- global.Facade:sendNotification(global.NoticeTable.AutoPickupBySprite)
- end
- PickupSpriteProxy:setTickTime(time)
- end
- end
- -----------------------------------------------------------------------------
- function dropItemController:Cleanup()
- self.mLastDropItemX = 0xFFFF
- self.mLastDropItemY = 0xFFFF
- self.mTryCheckDrop = 0.0
- self.mLooksCache = {}
- end
- -----------------------------------------------------------------------------
- function dropItemController:Init()
- local function loadCallback(actor, act)
- self:onPlayerActCompleted(actor, act)
- end
- global.gamePlayerController:AddHandleOnActCompleted(loadCallback)
- end
- -----------------------------------------------------------------------------
- function dropItemController:handleMessage(msg)
- return -99
- end
- -----------------------------------------------------------------------------
- function dropItemController:HandleDropItemPick(mapX, mapY)
- local pickInterval = SL:GetMetaValue("GAME_DATA", "PickupTime")
- if self.mTryCheckDrop <= (pickInterval * 0.001) then
- return 1
- end
- -- 同位置时,1s间隔
- if self.mLastDropItemX == mapX and self.mLastDropItemY == mapY and self.mTryCheckDrop <= 1 then
- return 1
- end
- local dItems = global.dropItemManager:FindDropItemAllInMapXY(mapX, mapY)
- if not dItems then
- return
- end
- local bagProxy = global.Facade:retrieveProxy( global.ProxyTable.Bag )
- local bagfull = bagProxy:isToBeFull()
- local pickable = false
- for k, dItem in pairs(dItems) do
- if dItem and proxyUtils:DropItemPickEnable(dItem) and dItem:IsPickEnable() then
- if not bagfull then
- dItem:PickStateMark()
- end
- pickable = true
- break
- end
- end
- if pickable then
- self.mLastDropItemX = mapX
- self.mLastDropItemY = mapY
- self.mTryCheckDrop = 0
- LuaSendMsg(global.MsgType.MSG_CS_MAP_ITEM_PICK, 0, mapX, mapY, 0, 0, 0)
- end
- return 1
- end
- -----------------------------------------------------------------------------
- function dropItemController:AddDropItemToWorld(item)
- -- if exist, change ownerID
- local id = item.Id
- local mapX = item.X
- local mapY = item.Y
- local looks = item.Looks
- local ownerID = item.Of
- local MakeIndex = item.MakeIndex
- local ShowItemDropEff = item.ShowItemDropEff
- local findDropItem = global.actorManager:GetActor(id)
- if findDropItem then
- findDropItem.mOwnerID = ownerID
- return 2
- end
- local p = {}
- p.cloth = looks
- p.ownerID = ownerID
- local dropItem = global.actorManager:CreateActor(id, global.MMO.ACTOR_DROPITEM, p, true)
- if nil == dropItem then
- return -1
- end
- dropItem:SetMakeIndex(MakeIndex)
- dropItem:SetDropShake(ShowItemDropEff)
-
- -- position
- dropItem.mCurrMapX = mapX
- dropItem.mCurrMapY = mapY
-
- -- To map grid position.
- local actorPos = global.sceneManager:MapPos2WorldPos(mapX, mapY, true)
- dropItem:setPosition(actorPos.x, actorPos.y)
- -- to drop item manager
- global.dropItemManager:AddDropItem(dropItem)
- local mainPlayer = global.gamePlayerController:GetMainPlayer()
- if mainPlayer then
- -- pick cd, item under player feet
- if mainPlayer:GetMapX() == mapX and mainPlayer:GetMapY() == mapY then
- dropItem:SetBornStamp(GetServerTime())
- end
- end
-
- return 1
- end
- -----------------------------------------------------------------------------
- function dropItemController:RmvDroItemFromWorld(id)
- -- to drop item manager
- global.dropItemManager:RmvDropItem(id)
- global.actorManager:RemoveActor(id)
- end
- -----------------------------------------------------------------------------
- function dropItemController:onPlayerActCompleted(actor, act)
- if global.MMO.ACTION_DIE ~= act and global.MMO.ACTION_DEATH ~= act then
- self:HandleDropItemPick(actor:GetMapX(), actor:GetMapY())
- end
- end
- -----------------------------------------------------------------------------
- function dropItemController:PickMainPlayerPosItem(targetPos)
- local mainPlayer = global.gamePlayerController:GetMainPlayer()
- if not mainPlayer then
- return false
- end
- local mapX = mainPlayer:GetMapX()
- local mapY = mainPlayer:GetMapY()
- if targetPos and next(targetPos) then
- if targetPos.mapX ~= mapX or targetPos.mapY ~= mapY then
- return false
- end
- end
- local dItems = global.dropItemManager:FindDropItemAllInMapXY(mapX, mapY)
- if not dItems then
- return false
- end
- LuaSendMsg(global.MsgType.MSG_CS_MAP_ITEM_PICK, 0, mapX, mapY, 0, 0, 0)
- return true
- end
- -----------------------------------------------------------------------------
- function dropItemController:GetItemGroundFile(looks)
- if not (self.mLooksCache[looks]) then
- local fileIndex = looks % 10000
- local fileName = string.format(GET_STRING(1070), fileIndex)
- local pathIndex = math.floor(looks / 10000)
- local groundFile = string.format("%s/item_ground_%s/%s.png", DROPITEM_GROUND_RES_PATH, pathIndex, fileName)
- groundFile = global.FileUtilCtl:isFileExist(groundFile) and groundFile or string.format("%s/item_%s/%s.png", DROPITEM_RES_PATH, pathIndex, fileName)
- self.mLooksCache[looks] = groundFile
- end
- return self.mLooksCache[looks]
- end
- return dropItemController
|