--速度 local InteractSystem = {} local ColliderManager = require("Battle/Logic/Level/ColliderManager") local EventSystem = require('Event/EventSystem') local BattleEffect = require"Battle/Logic/BattleEffect/BattleEffect" function InteractSystem.InteractStarted(entity, interactData, interactIndex) entity.components.interact:OnInteractStart(interactData, interactIndex) BattleEventSystem.OnEntityInteractStarted(entity, interactIndex) end -- entity 是交互者 function InteractSystem.OnInteractAbort(entity, interactEntity, abortReason) if entity.components.interact:GetInteractState() == LuaConst.EInteractState.START then if abortReason then local interactData = entity.components.interact:GetInteractingData() local reasonTable = interactData.FailureReasonData_Table for i,reason in ipairs(reasonTable) do if reason.FailureReason == abortReason then ExpLevelManager.ShowTips(entity, reason.FailurePrompt) end end end entity.components.interact:OnInteractAbort() BattleEventSystem.OnEntityInteractAbort(entity, interactEntity) end end -- entity 是交互者(不是采集物等) function InteractSystem.InteractSucceed(entity, interactData) entity.components.interact:OnInteractSucceed() if interactData.InteractEffect > 0 then local interactEntity = entity.components.interact:GetCmdOpInteractEntity() local interactIndex = interactEntity.components.interact:GetInteractIndexByData(interactData) BattleEffect.ExecuteByEffectId(interactData.InteractEffect, {interactIndex = interactIndex}, entity,interactEntity) end end -- entity 是交互者 (此方法中的顺序别改 ,先开下一个再关当前的 ,否则会发生:AB重叠,A有下一个交互,但是开始显示B的UI了,应优先A显示) function InteractSystem.InteractAfterSucceed(entity, interactData) local interactEntity = entity.components.interact:GetCmdOpInteractEntity() -- 交互完毕后 ,关闭自己 if interactData.IsCloseSelf then InteractSystem.DisActiveInteract(interactEntity, interactData.ID) end if interactData.NextInteractID > 0 then InteractSystem.ActiveInteract(interactEntity, interactData.NextInteractID) ColliderManager.OnUpdate() -- 立即刷新下碰撞 end end -- entity 是交互物 function InteractSystem.OnActive(entity) local interactComp = entity.components.interact local colliderIDs = interactComp:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] local interactData = interactComp:GetInteractDataByColliderID(colliderID) if not interactData.IsDefaultDisActive then ColliderManager.ActiveCollider(colliderID, LogicUpdateManager.ValidSyncEntityIter) end end end end -- entity 是交互物 ;激活交互物的某一个交互功能 function InteractSystem.ActiveInteract(entity, interactID) local interactComp = entity.components.interact local colliderIDs = interactComp:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] local interactData = interactComp:GetInteractDataByColliderID(colliderID) if interactData.ID == interactID then ColliderManager.ActiveCollider(colliderID, LogicUpdateManager.ValidSyncEntityIter) end end end end -- entity 是交互物 ;关闭交互物的某一个交互功能 function InteractSystem.DisActiveInteract(entity, interactID) if entity == nil then -- 如果在交互完毕时,通过battleeffect已删除此交互,则在交互成功删除时则为空(一般是需要配置控制好逻辑,此代码只是保护) return end local interactComp = entity.components.interact local colliderIDs = interactComp:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] local interactData = interactComp:GetInteractDataByColliderID(colliderID) if interactData.ID == interactID then ColliderManager.DeActiveCollider(colliderID) end end end end -- entity 是交互物 function InteractSystem.OnMove(entity) local colliderIDs = entity.components.interact:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] ColliderManager.UpdatePos(colliderID, entity.components.move.LogicPos) end end end -- entity 是交互物 function InteractSystem.OnDisActive(entity) local colliderIDs = entity.components.interact:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] ColliderManager.DeActiveCollider(colliderID) end end end -- entity 是交互物 function InteractSystem.OnDead(entity) local colliderIDs = entity.components.interact:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] ColliderManager.DestroyCollider(colliderID) end end end function InteractSystem.OnSwitchHero(fromEntity, toEntity, dontBackground) if not dontBackground then InteractSystem.OnDisActive(fromEntity) InteractSystem.OnActive(toEntity) end end -- entity 是交互者 function InteractSystem.OnHpChange(entity, realDelta, hpChangeType) if entity.components.interact:IsInteracting() then if realDelta < FP.Const.Zero then if hpChangeType ~= LuaConst.EHpChangeType.DOT then --策划要求Dot不打断交互 SystemManager.InteractAbort(entity, entity.components.interact:GetCmdOpInteractEntity(), LuaConst.EInteractAbortReason.HITTED) end end end end function InteractSystem.DisableInteract(entity) local colliderIDs = entity.components.interact:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] ColliderManager.DeActiveCollider(colliderID) end end end -- entity :交互物 。重置交互物的碰撞盒 function InteractSystem.ResetInteractColliderState(entity) local interactComp = entity.components.interact local colliderIDs = interactComp:GetColliderIDs() if colliderIDs then local count = #colliderIDs for i = 1 ,count do local colliderID = colliderIDs[i] local interactData = interactComp:GetInteractDataByColliderID(colliderID) if interactData.IsDefaultDisActive then ColliderManager.DeActiveCollider(colliderID) else ColliderManager.ActiveCollider(colliderID, LogicUpdateManager.ValidSyncEntityIter) end end end end --entity 交互物 。添加一个交互功能 function InteractSystem.AddInteract(entity, interactID, pos) local colliderID, disActive = entity.components.interact:AddInteract(interactID, pos) if not disActive then ColliderManager.ActiveCollider(colliderID, LogicUpdateManager.ValidSyncEntityIter) end end --entity 交互物 。删除一个交互功能 function InteractSystem.DeleteInteract(entity, interactID) InteractSystem.DisActiveInteract(entity, interactID) local interactComp = entity.components.interact interactComp:DeleteInteract(entity, interactID) end return InteractSystem