--[[ 关卡内领地的管理模块 关卡内的元素是可以有归属的,通过此模块可以管理元素的归属 1、此模块目前只生效于据点元素(StrongHold), 后续有需要可以进行扩展 2、对于不同的占领规则,可以在此模块中创建Territory类型,实现OnOccupyEnter和OnOccupyExit接口进行管理 ]]-- local LevelTerritoryModule = {} local EventSystem = require('Event/EventSystem') local private = { territoryDic = {} } --region --------------------------- Camp Entity Num Territory --------------------------- --[[ 依据阵营内实体数量的领地类型,此领地趋于归属于实体数量多的阵营 ]]-- local CampEntityNumTerritory = class("CampEntityNumTerritory") function CampEntityNumTerritory:initialize(data) self.Event_OccupierChange = data.LevelItemID..EventID._OccupierChanged self.OccupierCampID = -1 self.OccupierCount = 0 self.CampCountDic = {} end function CampEntityNumTerritory:Dispose() self.OccupierCampID = nil self.OccupierCount = nil self.Event_OccupierChange = nil self.CampCountDic = nil end function CampEntityNumTerritory:OnStrongChangeStageAction(entity) self:RefreshOccupy() end function CampEntityNumTerritory:OnOccupyEnter(entity, inSuspend) local campID = entity:GetCampID() local count = self.CampCountDic[campID] count = count and count + 1 or 1 self.CampCountDic[campID] = count if campID == self.OccupierCampID then self.OccupierCount = count end if not inSuspend then self:RefreshOccupy() end end function CampEntityNumTerritory:OnOccupyExit(entity, inSuspend) local campID = entity:GetCampID() local count = self.CampCountDic[campID] count = count and count - 1 or 0 self.CampCountDic[campID] = count if campID == self.OccupierCampID then self.OccupierCount = count end if not inSuspend then self:RefreshOccupy() end end function CampEntityNumTerritory:Reset() self.OccupierCampID = -1 self.OccupierCount = 0 for i, v in pairs(self.CampCountDic) do self.CampCountDic[i] = nil end end function CampEntityNumTerritory:RefreshOccupy() local tempCamp = -1 local tempCount = 0 local pickedCount = 0 -- 选中的实体数最多阵营的个数 for campID, count in pairs(self.CampCountDic) do --pairs safe if count > tempCount then tempCamp = campID tempCount = count pickedCount = 1 elseif count == tempCount then pickedCount = pickedCount + 1 end end self.OccupierCount = tempCount tempCamp = pickedCount ~= 1 and -1 or tempCamp if tempCamp ~= self.OccupierCampID then self.OccupierCampID = tempCamp EventSystem.Dispatch(self.Event_OccupierChange, tempCamp, tempCamp == LevelPlayerManager.MainEntityCampID) end end --endregion Camp Entity Num Territory function LevelTerritoryModule.InitLevel() EventSystem.Regist(EventID.Level_ItemTriggerOccupy, private.OnItemOccupyTriggered) EventSystem.Regist(EventID.Level_ItemSuspendOccupy, private.OnItemOccupySuspended) EventSystem.Regist(EventID.Level_StrongHoldChangeStageAction, private.OnStrongChangeStageAction) for i, v in LevelItemManager.GetItemIterByType(LuaConst.LevelItemType.StrongHold) do if v.ItemData.OccupyRule == LuaConst.LevelOccupyRule.CampEntityNum then local territory = CampEntityNumTerritory:new(v.ItemData) private.territoryDic[v.LevelItemID] = territory end end end function LevelTerritoryModule.ExitLevel() EventSystem.UnRegist(EventID.Level_ItemTriggerOccupy, private.OnItemOccupyTriggered) EventSystem.UnRegist(EventID.Level_ItemSuspendOccupy, private.OnItemOccupySuspended) EventSystem.UnRegist(EventID.Level_StrongHoldChangeStageAction, private.OnStrongChangeStageAction) for i, territory in pairs(private.territoryDic) do territory:Dispose() private.territoryDic[i] = nil end end function private.OnStrongChangeStageAction(itemID) local territory = private.territoryDic[itemID] if not territory then return end territory:OnStrongChangeStageAction(itemID) end function private.OnItemOccupyTriggered(itemID, entity, enter, inSuspend) --↓↓↓↓ old 一些基础功能依然要运行,比如统计据点内人数(由LevelTerritoryModule统计)。所以这里不能return,需要处理人数统计 -- if inSuspend then -- return -- end --↑↑↑↑ local territory = private.territoryDic[itemID] if not territory then return end if enter then territory:OnOccupyEnter(entity, inSuspend) else territory:OnOccupyExit(entity, inSuspend) end end function private.OnItemOccupySuspended(itemID) local territory = private.territoryDic[itemID] if not territory then return end --territory:Reset() --这里不应该reset,因为即便suspend了,也得继续统计圈内人数。suspend目前定义:占领进度不再改变。 end return LevelTerritoryModule