using CoreGame; using Entitas; namespace CoreGame.Render { public class AttractorEndWaitCatchSystem : IExecuteSystem { private readonly IGroup m_AttractorGroup; public AttractorEndWaitCatchSystem(Contexts contexts) { var matcher = CombatMatcher.AllOf(CombatMatcher.Attractor, CombatMatcher.WaitPickUpDropItem); m_AttractorGroup = contexts.combat.GetGroup(matcher); } public void Execute(float deltaTime) { m_AttractorGroup.GetEntities(Contexts.s_CacheEntities); if (Contexts.s_CacheEntities.Count == 0) return; for (int i = 0; i < Contexts.s_CacheEntities.Count; i++) { var attractorEnt = Contexts.s_CacheEntities[i]; if (attractorEnt.isDead) { attractorEnt.RemoveWaitPickUpDropItem(); continue; } var attractorPos = attractorEnt.transformProxy.position; var range = attractorEnt.property.PickupRange; var waitPickUpDropItem = attractorEnt.waitPickUpDropItem; var targetDropItemEntity = Contexts.Combat.GetEntity(waitPickUpDropItem.dropItemEid); if (!targetDropItemEntity.IsValid() || !targetDropItemEntity.hasWaitToBeAttracted || targetDropItemEntity.hasBeAttracted) { attractorEnt.RemoveWaitPickUpDropItem(); } else { var waitToBeAttracted = targetDropItemEntity.waitToBeAttracted; if (waitToBeAttracted.pickUpRange > 0.001f) { range = waitToBeAttracted.pickUpRange; } var et = targetDropItemEntity.transformProxy; var inAreaRange = (attractorPos - et.position).SqrMagnitude() < range * range; if (inAreaRange) { waitPickUpDropItem.timeAcc += deltaTime; if (waitPickUpDropItem.timeAcc < waitToBeAttracted.pickUpTime) continue; attractorEnt.RemoveWaitPickUpDropItem(); // targetDropItemEntity.AddBeAttracted(attractorEnt.creationIndex, et.position, // et.GetLocalScale().x, BattleConst.DropItemScale, // BattleConst.DropItemFlyDuration); } else { attractorEnt.RemoveWaitPickUpDropItem(); } } } } } }