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); } }
private void HandleRequest() { Entities.With(group).ForEach((Unity.Entities.Entity entity, ref UnitArmyObserver.Component observer, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } if (status.Order == OrderType.Idle) { return; } var inter = observer.Interval; if (inter.CheckTime() == false) { return; } observer.Interval = inter; var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; var hq = getNearestAlly(status.Side, pos, RangeDictionary.Get(FixedRangeType.RadioRange), UnitType.HeadQuarter); if (hq == null) { return; } Entity hqEntity; if (TryGetEntity(hq.id, out hqEntity) == false) { return; } var list = getAllyUnits(status.Side, pos, RangeDictionary.Get(FixedRangeType.BaseRange), UnitType.Commander); foreach (var unit in list) { CommanderStatus.Component?comp; if (TryGetComponent(unit.id, out comp) == false) { return; } CommanderTeam.Component?team; if (TryGetComponent(unit.id, out team) == false) { return; } var id = entityId.EntityId.Id; if (team.Value.SuperiorInfo.EntityId.IsValid()) { requestedIds.Remove(id); return; } if (requestedIds.Contains(id)) { return; } var request = new HeadQuarters.AddOrder.Request(hq.id, new OrganizeOrder() { Customer = unit.id, CustomerRank = comp.Value.Rank, Pos = pos.ToFixedPointVector3(), Side = status.Side }); this.CommandSystem.SendCommand(request, hqEntity); requestedIds.Add(id); } }); }
private void MovementQuery(Entity entity, ref MovementData movement, ref NavPathData path, ref BaseUnitSight.Component sight, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) { movement.MoveSpeed = 0.0f; movement.RotSpeed = 0.0f; if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsAutomaticallyMoving(status.Type) == false) { return; } var unit = EntityManager.GetComponentObject <UnitTransform>(entity); // check ground if (unit == null || unit.GetGrounded(out var hitInfo) == false) { return; } if (sight.State == TargetState.None) { return; } var trans = unit.transform; var pos = trans.position; Vector3?tgt = null; Vector3 spread = Vector3.zero; var id = entityId.EntityId; if (vectorDic.ContainsKey(id)) { //tgt = vectorDic[id].boidTarget; spread = vectorDic[id].spread; } if (tgt == null) { tgt = sight.GetTargetPosition(this.Origin, pos); } tgt = CheckNavPathAndTarget(tgt.Value, pos, unit.SizeRadius, sight.State, entityId.EntityId.Id, ref path); if (RangeDictionary.IsSpreadValid(spread)) { var length = (tgt.Value - pos).magnitude; tgt += spread * Mathf.Max(1.0f, (length / RangeDictionary.SpreadSize)); } var positionDiff = tgt.Value - pos; var forward = get_forward(positionDiff, sight.TargetRange); MovementDictionary.TryGet(status.Type, out var speed, out var rot); var isRotate = rotate(rot, trans, positionDiff); if (forward != 0.0f) { movement.MoveSpeed = forward * speed; } if (isRotate != 0) { movement.RotSpeed = rot * isRotate; } }
protected override void OnUpdate() { Entities.With(group).ForEach((Entity entity, ref HeadQuarters.Component headQuarter, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) => { if (status.State != UnitState.Alive) { return; } if (status.Type != UnitType.HeadQuarter) { return; } if (status.Order == OrderType.Idle) { return; } if (headQuarter.Orders.Count == 0) { return; } if (headQuarter.UpperRank >= headQuarter.MaxRank) { return; } var inter = headQuarter.Interval; if (inter.CheckTime() == false) { return; } headQuarter.Interval = inter; foreach (var order in headQuarter.Orders) { var pos = order.Pos.ToWorkerPosition(this.Origin); var str = getNearestAlly(status.Side, pos, RangeDictionary.Get(FixedRangeType.RadioRange), UnitType.Stronghold); if (str == null) { continue; } var map = headQuarter.FactoryDatas; uint u_rank; SetSuperior(str.id, status.Side, order, ref map, entityId.EntityId, out u_rank); headQuarter.FactoryDatas = map; if (headQuarter.UpperRank < u_rank) { headQuarter.UpperRank = u_rank; } } headQuarter.Orders.Clear(); }); }
private void Query(Entity entity, ref StrategyOrderManager.Component manager, ref BaseUnitStatus.Component status, ref SpatialEntityId spatialEntityId) { if (status.State != UnitState.Alive) { return; } if (status.Type != UnitType.HeadQuarter) { return; } var inter = manager.Interval; if (CheckTime(ref inter) == false) { return; } manager.Interval = inter; var trans = EntityManager.GetComponentObject <Transform>(entity); var range = RangeDictionary.Get(FixedRangeType.HeadQuarterRange); var enemy = getNearestEnemy(status.Side, trans.position); if (enemy == null) { return; } var entityId = new EntityId(); entityId = enemy.id; var target = manager.TargetHq; if (target.HeadQuarterId != entityId) { manager.TargetHq = new TargetHeadQuartersInfo() { HeadQuarterId = enemy.id, Side = enemy.side, Position = enemy.pos.ToWorldCoordinates(this.Origin), }; } var st_range = RangeDictionary.Get(FixedRangeType.StrongholdRange); var allies = getAllyUnits(status.Side, trans.position); var diff = (enemy.pos - trans.position).normalized; foreach (var unit in allies) { if (unit.type != UnitType.Stronghold) { continue; } SendCommand(unit.id, enemy.side, diff * st_range); } }