示例#1
0
        protected override void OnInitialize()
        {
            basePriority     = Agent.Body.Priority;
            searchCount      = LSUtility.GetRandom(SearchRate) + 1;
            attackCount      = 0;
            Target           = null;
            IsAttackMoving   = false;
            inRange          = false;
            isFocused        = false;
            CycleCount       = 0;
            this.Destination = Vector2d.zero;
            repathTimer.Reset(repathInterval);
            repathRandom = LSUtility.GetRandom(repathInterval);

            //caching parameters
            var spawnVersion = Agent.SpawnVersion;
            var controller   = Agent.Controller;

            CachedOnHit = (target) => OnHit(target, spawnVersion, controller);

            if ((Agent as RTSAgent).GetCommander() && loadedSavedValues && loadedTargetId >= 0)
            {
                RTSAgent obj = (Agent as RTSAgent).GetCommander().GetObjectForId(loadedTargetId);
                if (obj.MyAgentType == AgentType.Unit || obj.MyAgentType == AgentType.Building)
                {
                    Target = (LSAgent)obj;
                }
            }
        }
示例#2
0
        static IEnumerator send(byte[] data)
        {
            yield return(LSUtility.WaitRealTime(UnityEngine.Random.Range(Latency, Latency + Jitter)));

            ClientManager.HandleFrameData(data);
            yield break;
        }
示例#3
0
        protected override void OnInitialize()
        {
            basePriority   = Agent.Body.Priority;
            constructCount = 0;
            CurrentProject = null;
            IsBuilding     = false;
            IsBuildMoving  = false;
            inRange        = false;
            IsFocused      = false;

            repathTimer.Reset(repathInterval);
            repathRandom = LSUtility.GetRandom(repathInterval);

            //caching parameters
            var spawnVersion = Agent.SpawnVersion;
            var controller   = Agent.Controller;

            if (Agent.GetCommander() && loadedSavedValues && loadedProjectId >= 0)
            {
                RTSAgent obj = Agent.GetCommander().GetObjectForId(loadedProjectId);
                if (obj.MyAgentType == AgentType.Building)
                {
                    CurrentProject = obj;
                }
            }
        }
示例#4
0
        static IEnumerator receive(byte[] data)
        {
            yield return(LSUtility.WaitRealTime(UnityEngine.Random.Range(Latency, Latency + Jitter)));

            receivedBytes.AddRange(data);
            yield break;
        }
示例#5
0
        protected override void OnInitialize()
        {
            basePriority    = Agent.Body.Priority;
            harvestCount    = 0;
            IsHarvesting    = false;
            IsHarvestMoving = false;
            inRange         = false;
            IsFocused       = false;

            repathTimer.Reset(repathInterval);
            repathRandom = LSUtility.GetRandom(repathInterval);

            //caching parameters
            var spawnVersion = Agent.SpawnVersion;
            var controller   = Agent.Controller;

            if (Agent.GetCommander() && loadedSavedValues && loadedDepositId >= 0)
            {
                RTSAgent obj = Agent.GetCommander().GetObjectForId(loadedDepositId);
                if (obj.MyAgentType == AgentType.Resource)
                {
                    resourceTarget = obj;
                }
            }
            else
            {
                HarvestType = ResourceType.Unknown;
            }
        }
示例#6
0
        public virtual void OnInitialize()
        {
            cachedBody   = cachedAgent.Body;
            cachedHealth = cachedAgent.GetAbility <Health>();
            cachedMove   = cachedAgent.GetAbility <Move>();
            cachedTurn   = cachedAgent.GetAbility <Turn>();

            searchCount = LSUtility.GetRandom(SearchRate) + 1;
        }
示例#7
0
        internal static void Initialize(ILockstepEventsHandler[] helpers, NetworkHelper networkHelper)
        {
            PlayRate = FixedMath.One;
            //PauseCount = 0;

            if (!Loaded)
            {
                Setup();
                Loaded = true;
            }

            DefaultMessageRaiser.EarlyInitialize();

            LSDatabaseManager.Initialize();
            LSUtility.Initialize(1);
            InfluenceCount = 0;
            Time.timeScale = 1f;

            Stalled = true;

            FrameCount          = 0;
            InfluenceFrameCount = 0;
            MainNetworkHelper   = networkHelper;

            AgentController.Initialize();

            ClientManager.Initialize(MainNetworkHelper);

            BehaviourHelperManager.Initialize(helpers);

            GridManager.Initialize();

            CoroutineManager.Initialize();
            FrameManager.Initialize();

            CommandManager.Initialize();


            PhysicsManager.Initialize();
            PlayerManager.Initialize();

            //   GridBuilder.Initialize();

            //Initialized in UserInputHelper
            //	SelectionManager.Initialize ();
            InfluenceManager.Initialize();
            ProjectileManager.Initialize();

            DefaultMessageRaiser.LateInitialize();
            BehaviourHelperManager.LateInitialize();
            if (onInitialize != null)
            {
                onInitialize();
            }
        }
        public static int GetStateHash()
        {
            int hash = LSUtility.PeekRandom(int.MaxValue);

            hash += 1;
            hash ^= AgentController.GetStateHash();
            hash += 1;
            hash ^= ProjectileManager.GetStateHash();
            hash += 1;
            return(hash);
        }
示例#9
0
 static IEnumerator Tick()
 {
     while (true)
     {
         if (IsSimulating && LockstepManager.GameStarted)
         {
             bufferBytes.FastClear();
             bufferBytes.AddRange(BitConverter.GetBytes(InfluenceFrameCount));
             InfluenceFrameCount++;
             bufferBytes.AddRange(receivedBytes);
             receivedBytes.FastClear();
             Send(bufferBytes.ToArray());
         }
         yield return(LSUtility.WaitRealTime(LockstepManager.DeltaTimeF * LockstepManager.InfluenceResolution));
     }
 }
        public static Vector2d GenerateRandomPointOnCircle(bool evenDistribution = false)
        {
            long angle    = LSUtility.GetRandomOne().Mul(FixedMath.TwoPi);
            long distance = LSUtility.GetRandomOne();

            if (evenDistribution)
            {
                distance = FixedMath.Sqrt(distance);
            }

            Vector2d randomOffset = new Vector2d(
                FixedMath.Trig.Cos(angle),
                FixedMath.Trig.Sin(angle)
                ) * distance;

            return(randomOffset);
        }
        public static int GetStateHash()
        {
            int operationToggle = 0;
            int hash            = LSUtility.PeekRandom(int.MaxValue);

            for (int i = 0; i < PeakGlobalID; i++)
            {
                if (GlobalAgentActive[i])
                {
                    RTSAgent agent = GlobalAgents[i];
                    int      n1    = agent.Body._position.GetHashCode() + agent.Body._rotation.GetHashCode();
                    switch (operationToggle)
                    {
                    case 0:
                        hash ^= n1;
                        break;

                    case 1:
                        hash += n1;
                        break;

                    default:
                        hash ^= n1 * 3;
                        break;
                    }
                    operationToggle++;
                    if (operationToggle >= 2)
                    {
                        operationToggle = 0;
                    }
                }
            }


            return(hash);
        }
示例#12
0
        private void DistributeCollision()
        {
            if (!DoPhysics)
            {
                return;
            }

            switch (LeCollisionType)
            {
            case CollisionType.Circle_Circle:
                DistX = Body1._position.x - Body2._position.x;
                DistY = Body1._position.y - Body2._position.y;
                dist  = FixedMath.Sqrt((DistX * DistX + DistY * DistY) >> FixedMath.SHIFT_AMOUNT);

                if (dist == 0)
                {
                    //If objects are on the same position, give them push in random direction
                    const long randomMax = FixedMath.One / 32;
                    Body1._position.x    += LSUtility.GetRandomLong(randomMax) - randomMax / 2;
                    Body1._position.y    += LSUtility.GetRandomLong(randomMax) - randomMax / 2;
                    Body1.PositionChanged = true;
                    Body2._position.x    += LSUtility.GetRandomLong(randomMax) - randomMax / 2;
                    Body2._position.y    += LSUtility.GetRandomLong(randomMax) - randomMax / 2;
                    Body2.PositionChanged = true;
                    return;
                }


                depth = (Body1.Radius + Body2.Radius - dist);

                if (depth <= 0)
                {
                    return;
                }
                DistX = (DistX * depth / dist);
                DistY = (DistY * depth / dist);

                //Resolving collision


                if (Body1.Immovable || (Body2.Immovable == false && Body1.Priority > Body2.Priority))
                {
                    DistX *= -1;
                    DistY *= -1;
                    DistributeCircle_CirclePriority(Body1, Body2);
                }
                else if (Body2.Immovable || Body2.Priority > Body1.Priority)
                {
                    DistributeCircle_CirclePriority(Body2, Body1);
                }
                else
                {
                    DistX /= 2;
                    DistY /= 2;
                    DistributeCircle(Body1);
                    DistX *= -1;
                    DistY *= -1;
                    DistributeCircle(Body2);
                }
                break;

            case CollisionType.Circle_AABox:
                if (Body1.Shape == ColliderType.AABox)
                {
                    DistributeCircle_Box(Body1, Body2);
                }
                else
                {
                    DistributeCircle_Box(Body2, Body1);
                }
                break;

            case CollisionType.Circle_Polygon:
                if (Body1.Shape == ColliderType.Circle)
                {
                    this.DistributeCircle_Poly(Body1, Body2);
                }
                else
                {
                    this.DistributeCircle_Poly(Body2, Body1);
                }
                break;
            }
        }
        // public static string[] AvatarCodes;

        #endregion

        #region MonoBehavior
        public static void Setup()
        {
            IAgentDataProvider agentDatabase;

            if (LSDatabaseManager.TryGetDatabase <IAgentDataProvider>(out agentDatabase))
            {
                AgentData  = agentDatabase.AgentData;
                AgentCodes = new string[AgentData.Length];

                AgentController.CachedAgents = new Dictionary <string, FastStack <LSAgent> >(AgentData.Length);

                OrganizerObject = LSUtility.CreateEmpty().transform;
                OrganizerObject.gameObject.name = "OrganizerObject";
                OrganizerObject.gameObject.SetActive(false);

                GameObject.DontDestroyOnLoad(OrganizerObject);
                for (int i = 0; i < AgentData.Length; i++)
                {
                    IAgentData interfacer = AgentData[i];
                    string     agentCode  = interfacer.Name;
                    AgentCodes[i] = agentCode;

                    AgentController.CachedAgents.Add(agentCode, new FastStack <LSAgent>(2));
                    AgentCodeInterfacerMap.Add(agentCode, interfacer);
                    AgentCodeIndexMap.Add(agentCode, (ushort)i);
                }
            }
            else
            {
                Debug.Log("Database does not provide AgentData. Make sure it implements IAgentDataProvider.");
            }

            IWorldObjectDataProvider worldObjectDatabase;

            if (LSDatabaseManager.TryGetDatabase <IWorldObjectDataProvider>(out worldObjectDatabase))
            {
                WorldObjectData  = worldObjectDatabase.WorldObjectData;
                WorldObjectCodes = new string[AgentData.Length];

                for (int i = 0; i < WorldObjectData.Length; i++)
                {
                    IWorldObjectData interfacer      = WorldObjectData[i];
                    string           worldObjectCode = interfacer.Name;
                    WorldObjectCodes[i] = worldObjectCode;

                    WorldObjectCodeInterfacerMap.Add(worldObjectCode, interfacer);
                }
            }
            else
            {
                Debug.Log("Database does not provide WorldObjectData. Make sure it implements IWorldObjectDataProvider.");
            }

            IAvatarDataProvider avatarDatabase;

            if (LSDatabaseManager.TryGetDatabase <IAvatarDataProvider>(out avatarDatabase))
            {
                AvatarData = avatarDatabase.AvatarData;
                Avatars    = new Texture2D[AvatarData.Length];

                for (int i = 0; i < AvatarData.Length; i++)
                {
                    IAvatarData interfacer = AvatarData[i];
                    Texture2D   avatar     = interfacer.GetAvatar();
                    //  AvatarCodes[i] = avatarCode;
                    Avatars[i] = avatar;
                    // AvatarCodeInterfacerMap.Add(avatarCode, interfacer);
                }
            }
            else
            {
                Debug.Log("Database does not provide WorldObjectData. Make sure it implements IWorldObjectDataProvider.");
            }
        }