Beispiel #1
0
        protected override void OnUpdate()
        {
            for (var i = 0; i < transformData.Length; i++)
            {
                var rigidbody = transformData.GameObjectRigidBody[i];
                var transform = transformData.Transform[i];

                var nativePosition = new Vector3(transform.Location.X, transform.Location.Y, transform.Location.Z);

                var positionDifference = (rigidbody.position - origin - nativePosition).sqrMagnitude;

                // Sync if sufficient difference or if sufficient time has passed
                if (positionDifference <= ToleranceMeters)
                {
                    var nativeRotation = new UnityEngine.Quaternion(transform.Rotation.X, transform.Rotation.Y,
                                                                    transform.Rotation.Z, transform.Rotation.W);
                    var rotationDifference = UnityEngine.Quaternion.Angle(rigidbody.rotation, nativeRotation);
                    if (rotationDifference <= ToleranceAngle)
                    {
                        var differencesGreaterThanZero = positionDifference == 0.0f && rotationDifference == 0.0f;
                        if (differencesGreaterThanZero || tickSystem.GlobalTick - transform.Tick < MaxTicksUntilSync)
                        {
                            continue;
                        }
                    }
                }

                var position = rigidbody.position - origin;
                var location = new Location {
                    X = position.x, Y = position.y, Z = position.z
                };
                var rotation = new Quaternion
                {
                    W = rigidbody.rotation.w,
                    X = rigidbody.rotation.x,
                    Y = rigidbody.rotation.y,
                    Z = rigidbody.rotation.z
                };

                var newTransform = new Transform.Component
                {
                    Location = location,
                    Rotation = rotation,
                    Tick     = tickSystem.GlobalTick
                };

                var newPosition = new Position.Component
                {
                    Coords = new Coordinates
                    {
                        X = newTransform.Location.X,
                        Y = newTransform.Location.Y,
                        Z = newTransform.Location.Z
                    }
                };

                transformData.Transform[i] = newTransform;
                transformData.Position[i]  = newPosition;
            }
        }
        private void UnitQuery(Entity entity,
                               ref BaseUnitStatus.Component status,
                               ref Position.Component position)
        {
            bool isActive = false;
            var  pos      = position.Coords.ToUnityVector() + this.Origin;

            foreach (var kvp in hexIndexes)
            {
                if (HexUtils.IsInsideHex(this.Origin, kvp.Key, pos) == false)
                {
                    continue;
                }

                isActive = kvp.Value.IsActive;
                break;
            }

            if (isActive)
            {
                if (status.State == UnitState.Sleep)
                {
                    status.State = UnitState.Alive;
                }
            }
            else
            {
                if (status.State == UnitState.Alive)
                {
                    status.State = UnitState.Sleep;
                }
            }
        }
Beispiel #3
0
        private void ResourceQuery(Entity entity,
                                   ref HexPowerResource.Component resource,
                                   ref Position.Component position)
        {
            var pos = position.Coords.ToUnityVector() + this.Origin;

            foreach (var kvp in this.HexDic)
            {
                var index = kvp.Key;
                if (HexUtils.IsInsideHex(this.Origin, index, pos, HexDictionary.HexEdgeLength) == false)
                {
                    continue;
                }

                resourceDictionary.TryGetValue(index, out var current);
                resourceDictionary[index] = current + resource.Level * HexDictionary.HexResourceRate;
            }
        }
        protected override void OnUpdate()
        {
            for (int i = 0; i < data.Length; ++i)
            {
                var t      = data.Transform[i];
                var coords = new Coordinates
                {
                    X = t.Location.X,
                    Y = t.Location.Y,
                    Z = t.Location.Z,
                };
                var position = new Position.Component
                {
                    Coords = coords
                };

                data.Position[i] = position;
            }
        }
        private void TowerQuery(Entity entity,
                                ref SymbolicTower.Component tower,
                                ref Position.Component position)
        {
            var settings = TowerDictionary.Get(tower.Side);

            if (settings == null)
            {
                Debug.LogErrorFormat("There is no Tower Settings. Side:{0}", tower.Side);
            }

            GameObject towerObj;

            if (towerObjDic.ContainsKey(tower.Side) == false)
            {
                towerObj = GameObject.Instantiate(settings.TowerObject);
                towerObj.transform.SetParent(rootObject.transform, false);
                towerObjDic[tower.Side] = towerObj;
            }
            else
            {
                towerObj = towerObjDic[tower.Side];
            }

            var t_pos  = position.Coords.ToUnityVector() + this.Origin;
            var diff   = t_pos - playerPosition.Value;
            var length = Mathf.Max(minLimitLength, diff.magnitude);

            if (minLength > length)
            {
                minLength = length;
            }

            var rate = Mathf.Min(1.0f, TowerDictionary.DispLength / length);

            var scaledPos = rate * diff + playerPosition.Value;

            towerObj.transform.localScale = Vector3.one * rate;
            towerObj.transform.position   = scaledPos;
        }
Beispiel #6
0
        private void Query(Entity entity,
                           ref HexBase.Component hex,
                           ref HexPower.Component power,
                           ref Position.Component position,
                           ref SpatialEntityId entityId)
        {
            if (hex.Attribute.IsTargetable() == false)
            {
                return;
            }

            if (hexDic.ContainsKey(hex.Index) == false)
            {
                hexDic[hex.Index] = new HexLocalInfo();
            }

            hexDic[hex.Index].Index    = hex.Index;
            hexDic[hex.Index].HexId    = hex.HexId;
            hexDic[hex.Index].Side     = hex.Side;
            hexDic[hex.Index].EntityId = entityId;
            hexDic[hex.Index].Powers   = power.SidePowers;
            hexDic[hex.Index].isActive = power.IsActive;
        }
        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;
            }
        }