protected override void OnUpdate() { if (CheckTime(ref inter) == false) { return; } Entities.With(group).ForEach((Entity entity, ref BoidComponent.Component boid, ref BaseUnitStatus.Component status, ref BaseUnitTarget.Component target, ref CommanderStatus.Component commander, ref BaseUnitMovement.Component movement, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; var side = status.Side; var speed = movement.MoveSpeed; var forward = trans.forward; var commanderRank = status.Rank; var soldierRange = RangeDictionary.BaseBoidsRange; var soldiers = getAllyUnits(side, pos, soldierRange, allowDead: false, selfId: entityId.EntityId, GetSingleUnitTypes(UnitType.Soldier)); float f_length = boid.ForwardLength; boid_calculate(pos + forward * f_length, pos, soldierRange, forward * speed, boid.SepareteWeight, boid.AlignmentWeight, boid.CohesionWeight, soldiers); if (commanderRank < 1) { return; } var commanderRange = RangeDictionary.GetBoidsRange(commanderRank); var coms = getAllyUnits(side, pos, commanderRange, allowDead: false, selfId: entityId.EntityId, GetSingleUnitTypes(UnitType.Commander)); commanders.Clear(); foreach (var c in coms) { if (c.rank == commanderRank - 1) { commanders.Add(c); } } f_length = AttackLogicDictionary.RankScaled(f_length, commanderRank); f_length += commander.AllyRange; boid_calculate(pos + forward * f_length, pos, commanderRange, forward * speed, boid.SepareteWeight, boid.AlignmentWeight, boid.CohesionWeight, commanders); }); }
private void TeamQuery(Entity entity, ref CommanderSight.Component sight, ref CommanderTeam.Component team, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsOfficer(status.Type) == false) { return; } if (status.Order == OrderType.Idle) { return; } if (status.Rank == 0) { return; } var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; team.FollowerInfo.UnderCommanders.Clear(); var rank = status.Rank - 1; var range = RangeDictionary.GetBoidsRange(status.Rank); var allies = getAllyUnits(status.Side, pos, range, allowDead: false, GetSingleUnitTypes(UnitType.Commander)); foreach (var unit in allies) { if (unit.id == entityId.EntityId) { continue; } BaseUnitStatus.Component?sts; if (this.TryGetComponent(unit.id, out sts) == false) { continue; } if (sts.Value.Rank != rank) { continue; } team.FollowerInfo.UnderCommanders.Add(unit.id); } }
protected override void OnUpdate() { if (CheckTime(ref inter) == false) { return; } var damageDic = new Dictionary <EntityId, TroopDamage>(); Entities.With(group).ForEach((Entity entity, ref VirtualTroop.Component troop, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; var boidRange = RangeDictionary.GetBoidsRange(status.Rank); var range = boidRange * sightRate; var unit = getNearestPlayer(pos, range, selfId: null); if ((unit == null) == troop.IsActive) { if (CheckConflict(ref troop, status.Side, trans, status.Rank, out var damage)) { damageDic[damage.id] = damage; } } else { UpdateContainer(ref troop, unit == null, status.Side, trans, boidRange, status.Rank); } }); // SendDamage foreach (var kvp in damageDic) { var diff = new TotalHealthDiff(kvp.Value.healthDiff); this.UpdateSystem.SendEvent(new VirtualTroop.TotalHealthDiff.Event(diff), kvp.Key); } }