private static object DeserializeAsteroidDesc(StreamBuffer inStream, short length)
        {
            AsteroidDesc o = new AsteroidDesc();

            lock (memAsteroidDesc)
            {
                inStream.Read(memAsteroidDesc, 0, 4 * 10);
                int index = 0;
                Protocol.Deserialize(out o.Id, memAsteroidDesc, ref index);       //4
                Protocol.Deserialize(out o.Index, memAsteroidDesc, ref index);    //4
                var position = new Vector3();
                Protocol.Deserialize(out position.x, memAsteroidDesc, ref index); //4
                Protocol.Deserialize(out position.y, memAsteroidDesc, ref index); //4
                Protocol.Deserialize(out position.z, memAsteroidDesc, ref index); //4
                o.Position = position;

                var rotation = new Quaternion();

                Protocol.Deserialize(out rotation.x, memAsteroidDesc, ref index);  //4
                Protocol.Deserialize(out rotation.y, memAsteroidDesc, ref index);  //4
                Protocol.Deserialize(out rotation.z, memAsteroidDesc, ref index);  //4
                Protocol.Deserialize(out rotation.w, memAsteroidDesc, ref index);  //4

                o.Rotation = rotation;

                Protocol.Deserialize(out o.Speed, memAsteroidDesc, ref index);  //4
            }

            return(o);
        }
        public void Run()
        {
            var time = Time.realtimeSinceStartup;
            var diff = time - LastDump;

            if (diff > _gameConfig.AsteroidDumpInterval)
            {
                LastDump = time;
                var asteroidsAmount = _asteroids.EntitiesCount;
                var asteroids       = new AsteroidDesc[asteroidsAmount];
                for (var i = 0; i < asteroidsAmount; i++)
                {
                    var asteroidDesc   = new AsteroidDesc();
                    var asteroidEntity = _asteroids.Entities[i];
                    asteroidDesc.Id       = _asteroids.Components1[i].Id;
                    asteroidDesc.Index    = _asteroids.Components1[i].Index;
                    asteroidDesc.Position = _world.GetComponent <Position> (asteroidEntity).value;
                    asteroidDesc.Rotation = _world.GetComponent <Rotation> (asteroidEntity).value;
                    asteroidDesc.Speed    = _world.GetComponent <Speed> (asteroidEntity).value;
                    asteroids[i]          = asteroidDesc;
                }
                _hashtable.Clear();
                _hashtable[RoomDataConstants.Asteroids] = asteroids;
                _photonServer.CurrentRoom.SetCustomProperties(_hashtable);
            }
        }
        public void Run()
        {
            var time = Time.realtimeSinceStartup;
            var lastGenerationTime     = GameState.lastGenerationTime;
            var timeFromLastGeneration = time - lastGenerationTime;

            if (timeFromLastGeneration > GameConfig.GenerationInterval)
            {
                var lastId = photonServer.CurrentRoom.CustomProperties.ContainsKey(RoomDataConstants.LastGeneratedId) ? (int)photonServer.CurrentRoom.CustomProperties[RoomDataConstants.LastGeneratedId] : 0;

                GameState.lastGenerationTime = Time.realtimeSinceStartup;
                var asteroidAmount = Random.Range(GameConfig.MinAsteroidPerGeneration, GameConfig.MaxAsteroidsPerGeneration);
                _asteroids.Clear();
                for (int i = 0; i < asteroidAmount; i++)
                {
                    lastId++;
                    Vector3 shipPosition = sceneDescription.Ship.transform.position;
                    var     position     = shipPosition + Random.onUnitSphere * Random.Range(GameConfig.MinGenerationRadius, GameConfig.MaxGenerationRadius);

                    var direction     = Quaternion.LookRotation(shipPosition - position);
                    var speed         = Random.Range(GameConfig.MinAsteroidSpeed, GameConfig.MaxAsteroidSpeed);
                    var asteroidIndex = Random.Range(0, GameConfig.AsteroidsPrefabs.Length);

                    var asteroidDesc = new AsteroidDesc();
                    asteroidDesc.Id       = lastId;
                    asteroidDesc.Position = position;
                    asteroidDesc.Rotation = direction;
                    asteroidDesc.Speed    = speed;
                    asteroidDesc.Index    = asteroidIndex;
                    _asteroids.Add(asteroidDesc);
                }
                Debug.Log($"Want generate: {_asteroids.Count}");
                _hashtable.Clear();
                _hashtable[RoomDataConstants.LastGeneratedId] = lastId;
                photonServer.CurrentRoom.SetCustomProperties(_hashtable);
                photonServer.OpRaiseEvent(GameEventCode.SpawnAsteroids, _asteroids.ToArray(), true, All);
            }
        }
        private static short SerializeAsteroidDesc(StreamBuffer outStream, object customobject)
        {
            AsteroidDesc o = (AsteroidDesc)customobject;

            lock (memAsteroidDesc)
            {
                byte[] bytes = memAsteroidDesc;
                int    index = 0;
                Protocol.Serialize(o.Id, bytes, ref index);         //4
                Protocol.Serialize(o.Index, bytes, ref index);      //4
                Protocol.Serialize(o.Position.x, bytes, ref index); //4
                Protocol.Serialize(o.Position.y, bytes, ref index); //4
                Protocol.Serialize(o.Position.z, bytes, ref index); //4
                Protocol.Serialize(o.Rotation.x, bytes, ref index); //4
                Protocol.Serialize(o.Rotation.y, bytes, ref index); //4
                Protocol.Serialize(o.Rotation.z, bytes, ref index); //4
                Protocol.Serialize(o.Rotation.w, bytes, ref index); //4
                Protocol.Serialize(o.Speed, bytes, ref index);      //4
                outStream.Write(bytes, 0, 4 * 10);
            }

            return(4 * 10);
        }