2025-06-04 05:02:57 +08:00

416 lines
14 KiB
Plaintext

local ItemHandleCommand = class("ItemHandleCommand",pm.SimpleCommand)
function ItemHandleCommand:execute(note)
if(note~=nil)then
self.cdRefreshcmd = FunctionCDCommand.Me():GetAssiRemoveProxy(BagProxy.Instance)
self.equipBag = BagProxy.Instance.bagMap[SceneItem_pb.EPACKTYPE_EQUIP]
self.equipItems = nil
self.profess = Game.Myself.data.userdata:Get(UDEnum.PROFESSION)
-- print(note.name)
if(note.name == ServiceEvent.ItemPackageItem) then
self:ReInit(note)
elseif(note.name == ServiceEvent.ItemPackageUpdate)then
self:Update(note)
elseif(note.name == ServiceEvent.ItemPackageSort)then
self:ReArrange(note)
end
end
end
function ItemHandleCommand:ReInit(note)
local PackageItem = note.body
local bagData = BagProxy.Instance.bagMap[PackageItem.type]
if(bagData ~=nil) then
local t = os.clock()
-- bagData:Reset()
bagData:UpdateItems(PackageItem.data)
bagData:SetUplimit(PackageItem.maxslot);
self:ForEachInitItems(bagData,PackageItem.data)
--測試使用符文揹包填充著揹包物品
if(PackageItem.type == SceneItem_pb.EPACKTYPE_MAIN) then
local RuneBagData = BagProxy.Instance.bagMap[SceneItem_pb.EPACKTYPE_RUNE]
if(RuneBagData ~=nil) then
-- bagData:Reset()
local serverData = PackageItem.data
local runeDatas = {}
for i=1,#serverData do
if(serverData[i].base.type == 550 or serverData[i].base.type == 560) then
table.insert(runeDatas,serverData[i])
end
end
if(#runeDatas>0) then
RuneBagData:UpdateItems(runeDatas)
RuneBagData:SetUplimit(PackageItem.maxslot);
self:ForEachInitItems(RuneBagData,runeDatas)
end
end
end
--print("remove nums.."..#PackageItem.delItems)
-- print("update nums.."..#PackageItem.data)
if(PackageItem.type == SceneItem_pb.EPACKTYPE_MAIN) then
self.facade:sendNotification(ItemEvent.ItemUpdate)
self.facade:sendNotification(ItemEvent.RuneUpdate)
EventManager.Me():PassEvent(ItemEvent.RuneUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_STORE) then
-- 在最後一個揹包初始化的時候更新套裝資訊(倉庫揹包)
self.facade:sendNotification(ItemEvent.ItemUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_PERSONAL_STORE) then
-- 在最後一個揹包初始化的時候更新套裝資訊(倉庫揹包)
self.facade:sendNotification(ItemEvent.ItemUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_EQUIP)then
self.facade:sendNotification(ItemEvent.EquipUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FASHIONEQUIP)then
self.facade:sendNotification(ItemEvent.EquipUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FASHION) then
self.facade:sendNotification(ItemEvent.FashionUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_CARD) then
self.facade:sendNotification(ItemEvent.CardBagUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_TEMP_MAIN) then
self.facade:sendNotification(ItemEvent.TempBagUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_BARROW) then
self.facade:sendNotification(ItemEvent.BarrowUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_QUEST)then
self.facade:sendNotification(ItemEvent.QuestUpdate)
EventManager.Me():PassEvent(ItemEvent.QuestUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FOOD)then
self.facade:sendNotification(ItemEvent.FoodUpdate)
EventManager.Me():PassEvent(ItemEvent.FoodUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_PET)then
self.facade:sendNotification(ItemEvent.PetUpdate)
EventManager.Me():PassEvent(ItemEvent.PetUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_RUNE)then
self.facade:sendNotification(ItemEvent.RuneUpdate)
EventManager.Me():PassEvent(ItemEvent.RuneUpdate)
end
if(self.betterEquipChanged) then
self.facade:sendNotification(ItemEvent.BetterEquipAdd)
end
end
end
function ItemHandleCommand:Update(note)
local PackageItem = note.body
local bagData = BagProxy.Instance.bagMap[PackageItem.type]
-- print("揹包型別:"..PackageItem.type.." !!!")
if(bagData ~=nil) then
--處理移除cd
self:ForEachRemoveItems(bagData,PackageItem.delItems)
bagData:RemoveItems(PackageItem.delItems)
bagData:UpdateItems(PackageItem.updateItems)
self:ForEachAddItems(bagData,PackageItem.updateItems)
-- print("remove nums.."..#PackageItem.delItems)
-- print("update nums.."..#PackageItem.updateItems)
--測試使用符文揹包填充著揹包物品
if(PackageItem.type == SceneItem_pb.EPACKTYPE_MAIN) then
local RuneBagData = BagProxy.Instance.bagMap[SceneItem_pb.EPACKTYPE_RUNE]
if(RuneBagData ~=nil) then
self:ForEachRemoveItems(RuneBagData,PackageItem.delItems)
RuneBagData:RemoveItems(PackageItem.delItems)
--RuneBagData:UpdateItems(PackageItem.updateItems)
--self:ForEachAddItems(RuneBagData,PackageItem.updateItems)
--local deleData = PackageItem.delItems
--local runeDeleDatas = {}
--for i=1,#deleData do
-- if(deleData[i].base.type == 550 or deleData[i].base.type == 560) then
-- table.insert(runeDeleDatas,deleData[i])
-- end
--end
--if(#runeDeleDatas>0) then
-- self:ForEachRemoveItems(RuneBagData,runeDeleDatas)
-- RuneBagData:RemoveItems(runeDeleDatas)
--
--
--end
local updateItems = PackageItem.updateItems
local newUpdateItems = {}
for i=1,#updateItems do
if(updateItems[i].base.type == 550 or updateItems[i].base.type == 560) then
table.insert(newUpdateItems,updateItems[i])
end
end
RuneBagData:UpdateItems(newUpdateItems)
self:ForEachAddItems(RuneBagData,newUpdateItems)
end
end
if(PackageItem.type == SceneItem_pb.EPACKTYPE_MAIN) then
self.facade:sendNotification(ItemEvent.ItemUpdate)
EventManager.Me():PassEvent(ItemEvent.ItemUpdate)
self.facade:sendNotification(ItemEvent.RuneUpdate)
EventManager.Me():PassEvent(ItemEvent.RuneUpdate)
-- self:CheckForShortCut(PackageItem.delItems,PackageItem.updateItems)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_STORE) then
self.facade:sendNotification(ItemEvent.ItemUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_PERSONAL_STORE) then
EventManager.Me():PassEvent(ItemEvent.ItemUpdate)
self.facade:sendNotification(ItemEvent.ItemUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_EQUIP) then
-- 序號在裝備揹包之後的揹包可能會更新不及時
self.facade:sendNotification(ItemEvent.EquipUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FASHIONEQUIP)then
self.facade:sendNotification(ItemEvent.EquipUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FASHION) then
self.facade:sendNotification(ItemEvent.FashionUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_CARD) then
self.facade:sendNotification(ItemEvent.CardBagUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_TEMP_MAIN) then
self.facade:sendNotification(ItemEvent.TempBagUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_BARROW) then
self.facade:sendNotification(ItemEvent.BarrowUpdate)
EventManager.Me():PassEvent(ItemEvent.ItemUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_QUEST)then
self.facade:sendNotification(ItemEvent.QuestUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_FOOD)then
self.facade:sendNotification(ItemEvent.FoodUpdate)
EventManager.Me():PassEvent(ItemEvent.FoodUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_PET)then
self.facade:sendNotification(ItemEvent.PetUpdate)
EventManager.Me():PassEvent(ItemEvent.PetUpdate)
elseif(PackageItem.type == SceneItem_pb.EPACKTYPE_RUNE)then
self.facade:sendNotification(ItemEvent.RuneUpdate)
EventManager.Me():PassEvent(ItemEvent.RuneUpdate)
end
if(self.betterEquipChanged) then
self.facade:sendNotification(ItemEvent.BetterEquipAdd)
end
end
end
--初始化新增時,遍歷操作本次初始化的道具
function ItemHandleCommand:ForEachInitItems(bagData,list)
self:ForEachItems(bagData,list,self.InitItemHandle)
end
--重新整理時,遍歷操作本次重新整理/新增的道具
function ItemHandleCommand:ForEachAddItems(bagData,list)
self.equipItems = self.equipBag.siteMap
self:ForEachItems(bagData,list,self.AddItemHandle)
end
--初始化單個道具的處理
function ItemHandleCommand:InitItemHandle(bagData,item )
self:TryAddCD(item)
self:TryAddCompare(bagData,item)
self:TryAddReviveItem(bagData, item);
self:AddTempItemDelCheck(bagData,item);
item.bagtype = bagData.type;
end
--更新單個道具的處理
function ItemHandleCommand:AddItemHandle(bagData,item,sItem)
self:TryAddCD(item)
self:TryAddCompare(bagData,item,sItem)
self:TryAddReviveItem(bagData, item);
self:AddTempItemDelCheck(bagData,item);
item.bagtype = bagData.type;
end
function ItemHandleCommand:ForEachRemoveItems(bagData,list)
self:ForEachItems(bagData,list,self.RemoveItemHandle)
end
function ItemHandleCommand:RemoveItemHandle( bagData,item,sItem)
self:TryRemoveCD(item)
self:TryRemoveCompare(bagData,item,sItem)
self:TryRemoveReviveItem(bagData, item);
self:RemoveTempItemDelCheck(bagData,item);
end
function ItemHandleCommand:ForEachItems(bagData,list,func)
for i=1,#list do
local sItem = list[i]
local item = bagData:GetItemByGuid(sItem.base.guid)
if(item) then
func(self,bagData,item,sItem)
end
end
if(bagData.type == BagProxy.BagType.RoleEquip)then
FunctionBuff.Me():UpdateBreakEquipBuff();
end
end
function ItemHandleCommand:TryRemoveCD(item)
if(item) then
self.cdRefreshcmd:Remove(item)
end
end
function ItemHandleCommand:TryAddCD(item)
if(item and item.cdTime >0) then
self.cdRefreshcmd:Add(item)
end
end
function ItemHandleCommand:TryAddCompare(bagData,item,sItem)
if(bagData.type == BagProxy.BagType.MainBag or bagData.type == BagProxy.BagType.Temp) then
-- print(string.format("%s 來源:%s 是否新的:%s",item.staticData.NameZh,sItem.base.source,tostring(item:IsNew())))
-- if(sItem.base.source~= ProtoCommon_pb.ESOURCE_EQUIP or sItem.base.source== ProtoCommon_pb.ESOURCE_NORMAL) then
self:NewAddCompare(item,sItem)
-- else
-- self:UpdateCompare(item,sItem)
-- end
end
end
function ItemHandleCommand:TryAddReviveItem(bagData, item)
if(bagData.type == BagProxy.BagType.MainBag) then
-- CheckReviveItemChange
local playerRelive = GameConfig.PlayerRelive;
if(playerRelive)then
local leafreviveId = playerRelive.deathcost[1].id;
local skillItemId = playerRelive.Skillcost[1].id;
if(item.staticData.id == leafreviveId or item.staticData.id == skillItemId)then
self.facade:sendNotification(ItemEvent.ReviveItemAdd, item)
end
end
end
end
function ItemHandleCommand:AddTempItemDelCheck(bagData, item)
if(bagData.type == BagProxy.BagType.Temp)then
if(item and item.staticData and item.staticData.NoSale ~= 1)then
FunctionTempItem.Me():AddTempItemDelCheck(item.id, item.deltime)
end
end
end
function ItemHandleCommand:NewAddCompare(item,sItem)
if(FunctionItemCompare.Me():CompareItem(item)) then
self.betterEquipChanged = true
end
end
function ItemHandleCommand:UpdateCompare(item,sItem)
if(item:IsFashion()) then
if(not item:IsNew()) then
if(QuickUseProxy.Instance:RemoveNeverEquipedFashion(item.staticData.id,true)) then
self.betterEquipChanged = true
end
end
end
end
function ItemHandleCommand:TryRemoveCompare(bagData,item,sItem)
if(bagData.type == BagProxy.BagType.MainBag) then
if(FunctionItemCompare.Me():TryRemove(item)) then
self.betterEquipChanged = true
end
end
end
function ItemHandleCommand:TryRemoveReviveItem(bagData, item)
if(bagData.type == BagProxy.BagType.MainBag)then
-- CheckReviveItemChange
local playerRelive = GameConfig.PlayerRelive;
if(playerRelive)then
local leafreviveId = playerRelive.deathcost[1].id;
local skillItemId = playerRelive.Skillcost[1].id;
if(item.staticData.id == leafreviveId or item.staticData.id == skillItemId)then
self.facade:sendNotification(ItemEvent.ReviveItemRemove, item)
end
end
end
end
function ItemHandleCommand:RemoveTempItemDelCheck(bagData, item)
if(bagData.type == BagProxy.BagType.Temp)then
FunctionTempItem.Me():RemoveTempItemDelCheck(item.id)
end
end
-- function ItemHandleCommand:CheckForShortCut(delItems,updateItems)
-- if(self:CheckHasType(updateItems,40) or self:CheckHasType(updateItems,42)) then
-- ShortCutProxy.Instance:AutoFillShortCut()
-- end
-- end
function ItemHandleCommand:CheckHasType(items,typeID)
local item
if(items~=nil) then
for i=1,#items do
item = Table_Item[items[i].base.id]
if(item ~= nil and item.Type == typeID) then
return true
end
end
end
return false
end
function ItemHandleCommand:CheckHasGUID(items,guid)
if(items~=nil) then
for i=1,#items do
if(items[i].base.guid == guid) then
return true
end
end
end
return false
end
function ItemHandleCommand:CheckHasID(items,id)
if(items~=nil) then
for i=1,#items do
if(items[i].base.id == id) then
return true
end
end
end
return false
end
function ItemHandleCommand:ReArrange(note)
local bagType = note.body.type or SceneItem_pb.EPACKTYPE_MAIN
local bagData = BagProxy.Instance.bagMap[bagType]
bagData.wholeTab:ReArrange(note.body.item)
-- print("after ReArrange and get cost---"..(os.clock()-t))
-- self:TestOutPut(bagData)
self.facade:sendNotification(ItemEvent.ItemReArrage, bagType)
end
function ItemHandleCommand:TestRemove(bagData,datas)
local removes = {}
local t = os.clock()
for i=2,5 do
-- print("removing ..."..datas[i].base.guid)
table.insert( removes, datas[i].base.guid )
end
bagData:RemoveItemsByGuid(removes)
print("after remove cost---"..(os.clock()-t))
end
function ItemHandleCommand:TestAddNew(bagData,datas)
local newAdd = {}
local count = #datas
for i=1,8 do
datas[i].base.guid = "TestAddnew_"..i
datas[i].base.count = math.random(10,50)
datas[i].base.index = count + i
table.insert( newAdd, datas[i] )
end
bagData:UpdateItems(newAdd)
end
function ItemHandleCommand:TestAddSame(bagData,datas)
local newAdd = {}
for i=1,8 do
datas[i].base.count = math.random(10,50)
table.insert( newAdd, datas[i] )
end
bagData:UpdateItems(newAdd)
end
return ItemHandleCommand