private void Query(Entity entity, ref BaseUnitSight.Component sight, ref UnitActionData action, ref BaseUnitStatus.Component status, ref BaseUnitTarget.Component target, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (status.Order == OrderType.Idle) { return; } if (UnitUtils.IsWatcher(status.Type) == false) { return; } // initial target.State = TargetState.None; var id = entityId.EntityId.Id; if (enemyPositionsContainer.ContainsKey(id) == false) { enemyPositionsContainer[id] = new List <FixedPointVector3>(); } var enemyPositions = enemyPositionsContainer[id]; enemyPositions.Clear(); var trans = EntityManager.GetComponentObject <Transform>(entity); var pos = trans.position; UnitInfo enemy = null; var sightRange = action.SightRange; var backBuffer = sightRange / 2; if (status.Type == UnitType.Commander) { backBuffer += RangeDictionary.AllyRange / 2; } // strategy target SetStrategyTarget(pos, backBuffer, ref sight, ref target); // keep logic if (status.Order == OrderType.Keep) { sightRange *= target.PowerRate; } enemy = getNearestEnemy(status.Side, pos, sightRange); if (enemy != null) { var tgtPos = sight.TargetPosition.ToWorkerPosition(this.Origin); var epos = enemy.pos.ToWorldPosition(this.Origin); if (Vector3.Dot(tgtPos - pos, enemy.pos - pos) > 0) { target.State = TargetState.ActionTarget; sight.TargetPosition = epos; sight.TargetSize = enemy.size; } enemyPositions.Add(epos); } float range; switch (target.State) { case TargetState.ActionTarget: range = action.AttackRange; range = AttackLogicDictionary.GetOrderRange(status.Order, range) * target.PowerRate; break; default: range = RangeDictionary.BodySize; break; } // set behind if (status.Type == UnitType.Commander) { var addRange = RangeDictionary.AllyRange / 2; range += AttackLogicDictionary.RankScaled(addRange, status.Rank); } sight.TargetRange = range; sight.State = target.State; }
private void Query(Transform trans, ref TurretHub.Component turret, ref BaseUnitStatus.Component status, ref HexFacility.Component hex, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsBuilding(status.Type) == false) { return; } var datas = turret.TurretsDatas; if (IsNeedRenewTurrets(datas) == false) { return; } var units = getAllUnits(trans.position, HexDictionary.HexEdgeLength, allowDead: true, GetSingleUnitTypes(UnitType.Turret)); removeKeys.Clear(); foreach (var k in datas.Keys) { removeKeys.Add(k); } bool changed = false; var hexIndex = hex.HexIndex; foreach (var u in units) { if (hexIndex != uint.MaxValue && HexUtils.IsInsideHex(this.Origin, hexIndex, u.pos, HexDictionary.HexEdgeLength) == false) { continue; } if (TryGetComponent <TurretComponent.Component>(u.id, out var comp) == false) { continue; } int masterId = comp.Value.MasterId; if (datas.ContainsKey(u.id)) { var val = datas[u.id]; if (CheckDiffTurretInfo(ref val, u.side, masterId, u.id)) { datas[u.id] = val; changed = true; } removeKeys.Remove(u.id); } else { datas[u.id] = new TurretInfo(u.side, masterId, u.id); changed = true; } } if (removeKeys.Count == 0 && changed == false) { return; } foreach (var k in removeKeys) { datas.Remove(k); } turret.TurretsDatas = datas; }
private void FactoryQuery(Unity.Entities.Entity entity, ref UnitFactory.Component factory, ref ResourceComponent.Component resource, ref BaseUnitStatus.Component status, ref Position.Component position, ref StrongholdSight.Component sight, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsBuilding(status.Type) == false) { return; } if (status.Order == OrderType.Idle) { return; } FollowerOrder?f_order = null; SuperiorOrder?s_order = null; TeamOrder? team_order = null; TurretOrder? turret_order = null; FactoryOrderType orderType = FactoryOrderType.None; if (factory.SuperiorOrders.Count > 0) { s_order = factory.SuperiorOrders[0]; orderType = FactoryOrderType.Superior; } else if (factory.FollowerOrders.Count > 0) { f_order = factory.FollowerOrders[0]; orderType = FactoryOrderType.Follower; } else if (factory.TeamOrders.Count > 0) { team_order = factory.TeamOrders[0]; orderType = FactoryOrderType.Team; } else if (factory.TurretOrders.Count > 0) { turret_order = factory.TurretOrders[0]; orderType = FactoryOrderType.Turret; } if (orderType == FactoryOrderType.None) { return; } // calc time cost int resourceCost; float timeCost; if (CalcOrderCost(out resourceCost, out timeCost, f_order, s_order, team_order) == false) { return; } //Debug.LogFormat("ResourceCost:{0} TimeCost:{1}", resourceCost, timeCost); if (factory.CurrentType == FactoryOrderType.None) { if (resource.Resource < resourceCost) { //Debug.LogFormat("ResourcePoor:{0}", resource.Resource); return; } factory.ProductInterval = IntervalCheckerInitializer.InitializedChecker(timeCost); factory.CurrentType = orderType; resource.Resource -= resourceCost; } factoryInter = factory.ProductInterval; if (CheckTime(ref factoryInter) == false) { return; } Coordinates?random = null; if (sight.StrategyVector.Side != UnitSide.None) { random = GetEmptyCoordinates(entityId.EntityId, position.Coords, sight.StrategyVector.Vector, height_buffer, factory.Containers); } if (random == null) { //Debug.LogFormat("There is no Empty"); return; } //Debug.LogFormat("CreateUnit!"); factory.ProductInterval = factoryInter; var coords = random.Value;//GetEmptyCoordinates(entityId.EntityId, position.Coords, height_buffer, factory.Containers); EntityTemplate template = null; bool finished = false; UnitType type = UnitType.None; if (s_order != null) { template = CreateSuperior(factory.SuperiorOrders, coords, out finished); type = UnitType.Commander; } else if (f_order != null) { template = CreateFollower(factory.FollowerOrders, coords, f_order.Value.Customer, out finished); type = UnitType.Soldier; } if (template != null) { var request = new WorldCommands.CreateEntity.Request ( template, context: new ProductOrderContext() { f_order = f_order, s_order = s_order, type = type, strongholdId = entityId.EntityId, container = new UnitContainer(coords.ToFixedPointVector3(), ContainerState.Created) } ); this.CommandSystem.SendCommand(request); } else if (team_order != null) { CreateTeam(factory.TeamOrders, status.Side, entityId.EntityId, coords, out finished); } else if (turret_order != null) { // todo turret } if (finished) { factory.CurrentType = FactoryOrderType.None; } }
private void Query(Entity entity, ref UnitActionData action, ref GunComponent.Component gun, ref PostureAnimation.Component anim, ref BaseUnitTarget.Component target, ref BaseUnitStatus.Component status, ref SpatialEntityId entityId) { if (status.State != UnitState.Alive) { return; } if (UnitUtils.IsOffensive(status.Type) == false) { return; } if (target.State != TargetState.ActionTarget) { return; } var current = Time.ElapsedTime; var id = entityId.EntityId.Id; if (this.EnemyPositionsContainer == null || this.EnemyPositionsContainer.TryGetValue(id, out var enemyPositions) == false) { return; } Vector3?epos = null; if (enemyPositions.Count > 0) { epos = enemyPositions[0].ToWorkerPosition(this.Origin); var container = EntityManager.GetComponentObject <PostureBoneContainer>(entity); Attack(container, current, epos.Value, entityId, ref gun); } var type = AnimTargetType.None; bool isDiff = false; if (epos != null) { isDiff = anim.AnimTarget.Position.ToWorkerPosition(this.Origin) != epos.Value; type = AnimTargetType.Position; } if (anim.AnimTarget.Type != type || isDiff) { var animTarget = anim.AnimTarget; animTarget.Type = type; if (epos != null) { animTarget.Position = epos.Value.ToWorldPosition(this.Origin); } anim.AnimTarget = animTarget; } }