--只能用于单机玩法和主城,是不同步的采集物 local EventSystem = require('Event/EventSystem') local Base = require("Battle/Logic/Level/LevelItemFactory/LevelItem") local LevelItem_Collection = class("LevelItem_Collection", Base) local ColliderManager = require("Battle/Logic/Level/ColliderManager") local COUNT_CEIL_NUM = 1 function LevelItem_Collection:initialize(data) Base.initialize(self,data) self._allItemList = {} -- 所有出生的entity self._colliectionData = DataSheetManager.CollectionData:GetDataByID(data.CollectionID) self._curCount = 0 self._triggeredCollections = {} end --region --***************生命周期***************-- function LevelItem_Collection:OnActive() if Base.OnActive(self) then if self._colliectionData.ActiveTaskID == 0 or MDL.Task.GetTask(self._colliectionData.ActiveTaskID) or MDL.Task.GetTaskByCollectionItemID(self.LevelItemID) then self:Born(self.ItemData.Count) end EventSystem.Regist(EventID.ChildTaskStart, self.OnTaskStart, self) EventSystem.Regist(EventID.UI_Collection_Finish, self.OnCollectionDead, self) EventSystem.Regist(EventID.UI_Task_Update, self.OnTaskEndUpdate, self) if self._colliectionData.BeChosen ~= false then EventSystem.Regist(EventID.OnClickSceneColliderSystem, self.OnVisited, self) end return true end end function LevelItem_Collection:OnDeactive() if Base.OnDeactive(self) then EventSystem.UnRegist(EventID.ChildTaskStart,self.OnTaskStart,self) EventSystem.UnRegist(EventID.UI_Collection_Finish,self.OnCollectionDead,self) EventSystem.UnRegist(EventID.UI_Task_Update,self.OnTaskEndUpdate,self) if self._colliectionData.BeChosen ~= false then EventSystem.UnRegist(EventID.OnClickSceneColliderSystem,self.OnVisited,self) end return true end end function LevelItem_Collection:ClearItems() if self._allItemList then local modelData = DataSheetManager.MonsterModelData:GetDataByID(self._colliectionData.ModelID) for k,entity in pairs(self._allItemList) do TK2API.ReturnInstance(modelData.Path,entity.colliderSystem.gameObject) ColliderManager.DestroyCollider(entity.colliderID) entity.colliderID = nil self._allItemList[k] = nil end end if self.itemEffectList then for k,effectID in pairs(self.itemEffectList) do AuxUtil.StopDynamicObject(effectID) self.itemEffectList[k] = nil end end self._curCount = 0 end function LevelItem_Collection:OnDestroy() Base.OnDestroy(self) self:ClearItems() self.itemEffectList = nil self._allItemList = nil-- 所有出生的entity self._triggeredCollections = nil end --endregion 生命周期 --region --***************事件相关***************-- function LevelItem_Collection:DoAction(actionType, match, param1) if actionType == LuaConst.LevelActionType.Collection_Active then self:OnActive() elseif actionType == LuaConst.LevelActionType.Collection_Deactive then self:OnDeactive() self:ClearItems() end Base.DoAction(self, actionType,param1) end function LevelItem_Collection:OnTaskStart(itemId,taskId) if self._colliectionData.ActiveTaskID == taskId and self._curCount == 0 then local task = MDL.Task.GetTask(self._colliectionData.ActiveTaskID) if task then local childInfo = task.taskInfo.childInfo[1] local childTask = task.taskChildData[1] if childTask.ActionType == MDL.Task.Enum_ActionType.Collection and childInfo.process.param == 0 then self:Born(self.ItemData.Count, true) end end end end function LevelItem_Collection:OnTaskEndUpdate() --判断采集任务是否完成 if not MDL.Task.GetTask(self._colliectionData.ActiveTaskID) then self:ClearItems() end end function LevelItem_Collection:OnCollectionDead(itemId,itemIndex) if self.LevelItemID == itemId then if self._colliectionData.IsDestroy then self._curCount = self._curCount - 1 local item = self._allItemList[itemIndex] self._allItemList[itemIndex] = nil local modelData = DataSheetManager.MonsterModelData:GetDataByID(self._colliectionData.ModelID) if item.ObstructId then LuaShoveManager.CloseObstruct(item.ObstructId) end ColliderManager.DestroyCollider(item.colliderID) item.colliderID = nil TK2API.ReturnInstance(modelData.Path,item.colliderSystem.gameObject) if self.itemEffectList ~= nil then local effectID = self.itemEffectList[itemIndex] if effectID then AuxUtil.StopDynamicObject(effectID) end end end local collectionID = self.ItemData.CollectionID if MDL.Task.GetTaskByCollectionItemID(self.LevelItemID) then MDL.Task.TaskNpcCollectRequest(collectionID) else self:Dispatch(LuaConst.LevelConditionType.CollectNumber,nil, collectionID, COUNT_CEIL_NUM) LevelItemManager.Global:Notify_CollectionDone(collectionID) end end end --endregion 事件相关 --region --***************内部方法***************-- --先不做缓存 function LevelItem_Collection:Born(count,byTask) local data = self.ItemData local itemPosV2 = data.ItemPos local forwardV2 = data.ItemDir local rightV2 = FP.V2.GetRightByForward(forwardV2) local layout = data.LayoutType if not LevelManager.CheckCurLevelType(LuaConst.LevelType.MonsterTest) then local task = MDL.Task.GetTaskByCollectionItemID(self.LevelItemID) if task then count = count - task.process.param end end if layout == LuaConst.EntityLayoutType.OriginPos then for i = 1,count do local positionV2 = itemPosV2 self:CreateEntity(positionV2,forwardV2,byTask) end elseif layout == LuaConst.EntityLayoutType.Random_Circle then for i = 1,count do local radian = LogicRandom.GetRangeValue(nil, FP.Const.Zero, FP.Const.PI2 ,40) local radius = LogicRandom.GetRangeValue(nil, FP.Const.Zero, data.Radius ,41) local offX = radius * FP.Math.Cos(radian) local offZ = radius * FP.Math.Sin(radian) local positionV2 = itemPosV2 + FP.newV2(offX,offZ) self:CreateEntity(positionV2,forwardV2,byTask) end elseif layout == LuaConst.EntityLayoutType.Random_Square then for i= 1,count do local halfLength = data.Length / 2 local halfWidth = data.Width / 2 local randLength = LogicRandom.GetRangeValue(nil, -halfLength,halfLength,42) local randWidth = LogicRandom.GetRangeValue(nil, -halfWidth, halfWidth ,43) local positionV2 = itemPosV2 + rightV2 * randLength + forwardV2 * randWidth self:CreateEntity(positionV2,forwardV2,byTask) end elseif layout == LuaConst.EntityLayoutType.Matrix then local orgOffsetCol = data.Gap * (data.Col - 1) / 2 local orgOffsetRow = data.Gap * (data.Row - 1) / 2 local orgPosV2 = itemPosV2 - rightV2 * orgOffsetCol - forwardV2 * orgOffsetRow local index = 0 for i=0,data.Col - 1 do for j = 0,data.Row - 1 do local positionV2 = orgPosV2 + rightV2 * i * data.Gap + forwardV2 * j * data.Gap self:CreateEntity(positionV2,forwardV2,byTask) if index >= count then break end end if index >= count then break end end end end local function OnCollectionColliderEnter(collection) collection.Item:OnCollectionEnter(collection) end local function OnCollectionColliderExit(collection) collection.Item:OnCollectionExit(collection) end function LevelItem_Collection:OnCollectionEnter(collection) self:Interact(collection.colliderSystem.ItemId,collection.colliderSystem.ItemIndex) self._triggeredCollections[collection] = true end function LevelItem_Collection:OnCollectionExit(collection) self._triggeredCollections[collection] = nil EventSystem.Dispatch(EventID.Level_CloseUIView, "Collect/UICollectView") for i, v in pairs(self._triggeredCollections) do self:Interact(collection.colliderSystem.ItemId,collection.colliderSystem.ItemIndex) break end end function LevelItem_Collection:CreateEntity(positionV2,forwardV2,byTask) local px, pz = FP.tonumberV2(positionV2) local modelData = DataSheetManager.MonsterModelData:GetDataByID(self._colliectionData.ModelID) local interactData = DataSheetManager.InteractData:GetDataByID(self._colliectionData.InteractID)--self._colliectionData. local model = TK2API.GetInstance(modelData.Path,nil) model.transform:SetLocalScale(modelData.ModelScale, modelData.ModelScale, modelData.ModelScale) --添加特效 if self._colliectionData.ModelEffects ~= "" then local effectID = AuxUtil.PlayDynamicObject(self._colliectionData.ModelEffects, 9999, model.transform) if self.itemEffectList == nil then self.itemEffectList = {} end table.insert(self.itemEffectList,effectID) end local colliderSystem = ColliderSystem.CreateColliderSystem(model) colliderSystem:Init(self.LevelItemID,#self._allItemList+1,FP.tonumberV1(interactData.InteractRange)) local fx, fz = FP.tonumberV2(forwardV2) colliderSystem:SetPosAndDir(px, pz,fx,fz) local colliderID = ColliderManager.CreateCircleCollider(positionV2,interactData.InteractRange) local collection = { LogicPos = positionV2, colliderSystem = colliderSystem, colliderID=colliderID, Item = self} ColliderManager.AddEnterEvent(colliderID,OnCollectionColliderEnter ,collection) ColliderManager.AddExitEvent(colliderID,OnCollectionColliderExit , collection) ColliderManager.ActiveCollider(colliderID, LogicUpdateManager.ValidSyncEntityIter) table.insert(self._allItemList, collection) local id = self.LevelItemID..#self._allItemList if self._colliectionData.IsObstruct then LuaShoveManager.SetObstructData(id, positionV2, forwardV2, FP.newV1(modelData.ShoveDiameterZ), FP.newV1(modelData.ShoveDiameterX)) LuaShoveManager.OpenObstruct(id) collection.ObstructId = id end self._curCount = self._curCount + 1 end function LevelItem_Collection:OnVisited(colliderSystem) if MDL.Task.GetTaskByCollectionItemID(self.LevelItemID) == nil and not LevelManager.CheckCurLevelType(LuaConst.LevelType.MonsterTest) then return end for i,v in pairs(self._allItemList) do if v.colliderSystem == colliderSystem then --主视角调用 local mainEntityMove = LogicUpdateManager._curEntity.components.move SystemManager.StopAutoFightPathInTown(LogicUpdateManager._curEntity) local interactData = DataSheetManager.InteractData:GetDataByID(self._colliectionData.InteractID) if FP.V2.DistanceSqr(mainEntityMove.LogicPos, v.LogicPos) < interactData.InteractRange then self:Interact(colliderSystem.ItemId,colliderSystem.ItemIndex) else local pos = v.LogicPos local callback = function () self:Interact(colliderSystem.ItemId,colliderSystem.ItemIndex)end --主视角调用 SystemManager.AutoFindPathInTown(LogicUpdateManager._curEntity, pos, LuaConst.NpcAutoFindDistance,callback) end break end end end function LevelItem_Collection:Interact(itemId,itemIndex) if MDL.Task.GetTaskByCollectionItemID(self.LevelItemID) == nil and (LevelManager.CheckCurLevelType(LuaConst.LevelType.TOWN) or LevelManager.CheckCurLevelType(LuaConst.LevelType.CrossServerTown)) then return end EventSystem.Dispatch(EventID.Interact_DoCollection ,self.ItemData.CollectionID,itemId,itemIndex) end function LevelItem_Collection:GetFindPathCollectItemPos() for k,v in pairs(self._allItemList) do if v then EventSystem.Dispatch(EventID.Task_SetCurCollectionIndex, k) return v.LogicPos end end end --endregion return LevelItem_Collection