/// <summary>
        ///     Deserializes an IMapManager and ITileDefinitionManager from a properly formatted NetMessage.
        /// </summary>
        /// <param name="message">The message containing a serialized map and tileDefines.</param>
        private void HandleTileMap(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            var mapIndex = message.MapIndex;

            _defManager.RegisterServerTileMapping(message);

            var chunkSize  = message.ChunkSize;
            var chunkCount = message.ChunkDefs.Length;

            if (!_mapManager.TryGetGrid(mapIndex, out IMapGrid grid))
            {
                grid = _mapManager.CreateGrid(mapIndex, chunkSize);
            }

            for (var i = 0; i < chunkCount; ++i)
            {
                var chunkPos = new MapGrid.Indices(message.ChunkDefs[i].X, message.ChunkDefs[i].Y);
                var chunk    = grid.GetChunk(chunkPos);

                var counter = 0;
                for (ushort x = 0; x < chunk.ChunkSize; x++)
                {
                    for (ushort y = 0; y < chunk.ChunkSize; y++)
                    {
                        chunk.SetTile(x, y, (Tile)message.ChunkDefs[i].Tiles[counter]);
                        counter++;
                    }
                }
            }
        }
Exemplo n.º 2
0
        private void HandleNetworkMessage(MsgMap message)
        {
            switch (message.MessageType)
            {
            case MapMessage.TurfClick:
                HandleTurfClick(message);
                break;

            case MapMessage.TurfUpdate:
                HandleTileUpdate(message);
                break;

            case MapMessage.SendTileMap:
                HandleTileMap(message);
                break;

            case MapMessage.SendMapInfo:
                CollectMapInfo(message);
                break;

            case MapMessage.CreateMap:
                CreateMap(message.MapIndex);
                break;

            case MapMessage.DeleteMap:
                DeleteMap(message.MapIndex);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(message));
            }
        }
Exemplo n.º 3
0
 private void HandleTurfClick(MsgMap message)
 {
     /*
      * // Who clicked and on what tile.
      * Atom.Atom clicker = SS13Server.Singleton.playerManager.GetSessionByConnection(message.SenderConnection).attachedAtom;
      * short x = message.ReadInt16();
      * short y = message.ReadInt16();
      * if (Vector2.Distance(clicker.position, new Vector2(x * tileSpacing + (tileSpacing / 2), y * tileSpacing + (tileSpacing / 2))) > 96)
      * {
      *  return; // They were too far away to click us!
      * }
      * bool Update = false;
      * if (IsSaneArrayPosition(x, y))
      * {
      *  Update = tileArray[x, y].ClickedBy(clicker);
      *  if (Update)
      *  {
      *      if (tileArray[x, y].tileState == TileState.Dead)
      *      {
      *          Tiles.Atmos.GasCell g = tileArray[x, y].gasCell;
      *          Tiles.Tile t = GenerateNewTile(x, y, tileArray[x, y].tileType);
      *          tileArray[x, y] = t;
      *          tileArray[x, y].gasCell = g;
      *      }
      *      NetworkUpdateTile(x, y);
      *  }
      * }
      */
 }
Exemplo n.º 4
0
        /// <summary>
        ///     Deserializes an IMapManager and ITileDefinitionManager from a properly formatted NetMessage.
        /// </summary>
        /// <param name="message">The message containing a serialized map and tileDefines.</param>
        private void HandleTileMap(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            _gridsReceived++;

            var mapIndex  = message.MapIndex;
            var gridIndex = message.GridIndex;

            var chunkSize  = message.ChunkSize;
            var chunkCount = message.ChunkDefs.Length;

            if (!TryGetMap(mapIndex, out var map))
            {
                map = CreateMap(mapIndex);
            }

            if (!map.GridExists(gridIndex))
            {
                GetMap(mapIndex).CreateGrid(gridIndex, chunkSize);
            }

            var grid = GetMap(mapIndex).GetGrid(gridIndex);

            SuppressOnTileChanged = true;
            var modified = new List <(int x, int y, Tile tile)>();

            for (var i = 0; i < chunkCount; ++i)
            {
                var chunkPos = new MapGrid.Indices(message.ChunkDefs[i].X, message.ChunkDefs[i].Y);
                var chunk    = grid.GetChunk(chunkPos);

                var counter = 0;
                for (ushort x = 0; x < chunk.ChunkSize; x++)
                {
                    for (ushort y = 0; y < chunk.ChunkSize; y++)
                    {
                        var tile = (Tile)message.ChunkDefs[i].Tiles[counter];
                        if (chunk.GetTile(x, y).Tile != tile)
                        {
                            chunk.SetTile(x, y, tile);
                            modified.Add((x + chunk.X * chunk.ChunkSize, y + chunk.Y * chunk.ChunkSize, tile));
                        }
                        counter++;
                    }
                }
            }

            SuppressOnTileChanged = false;
            if (modified.Count != 0)
            {
                GridChanged?.Invoke(this, new GridChangedEventArgs(grid, modified));
            }

            if (_gridsReceived == _gridsToReceive)
            {
                IoCManager.Resolve <IEntityManager>().MapsInitialized = true;
            }
        }
Exemplo n.º 5
0
        private void CollectMapInfo(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            _gridsToReceive = message.MapGridsToSend;

            if (_gridsReceived == _gridsToReceive)
            {
                IoCManager.Resolve <IEntityManager>().MapsInitialized = true;
            }
        }
Exemplo n.º 6
0
        /// <summary>
        ///     Updates a single tile from the network message.
        /// </summary>
        /// <param name="message">The message containing the info.</param>
        private void HandleTileUpdate(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            var x    = message.SingleTurf.X;
            var y    = message.SingleTurf.Y;
            var tile = (Tile)message.SingleTurf.Tile;

            var pos = new LocalCoordinates(x, y, message.GridIndex, message.MapIndex);

            pos.Grid.SetTile(pos, tile);
        }
Exemplo n.º 7
0
        public void HandleNetworkMessage(MsgMap message)
        {
            switch (message.MessageType)
            {
            case MapMessage.TurfClick:
                //HandleTurfClick(message);
                break;

            default:
                break;
            }
        }
        /// <summary>
        ///     Deserializes an IMapManager and ITileDefinitionManager from a properly formatted NetMessage.
        /// </summary>
        /// <param name="message">The message containing a serialized map and tileDefines.</param>
        private void HandleTileMap(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            _gridsReceived++;

            var mapIndex  = message.MapIndex;
            var gridIndex = message.GridIndex;

            _defManager.RegisterServerTileMapping(message);

            var chunkSize  = message.ChunkSize;
            var chunkCount = message.ChunkDefs.Length;

            if (!TryGetMap(mapIndex, out var map))
            {
                map = CreateMap(mapIndex);
            }

            if (!map.GridExists(gridIndex))
            {
                GetMap(mapIndex).CreateGrid(gridIndex, chunkSize);
            }

            var grid = GetMap(mapIndex).GetGrid(gridIndex);

            SuppressOnTileChanged = true;

            for (var i = 0; i < chunkCount; ++i)
            {
                var chunkPos = new MapGrid.Indices(message.ChunkDefs[i].X, message.ChunkDefs[i].Y);
                var chunk    = grid.GetChunk(chunkPos);

                var counter = 0;
                for (ushort x = 0; x < chunk.ChunkSize; x++)
                {
                    for (ushort y = 0; y < chunk.ChunkSize; y++)
                    {
                        chunk.SetTile(x, y, (Tile)message.ChunkDefs[i].Tiles[counter]);
                        counter++;
                    }
                }
            }

            SuppressOnTileChanged = false;
            GridChanged?.Invoke(this, new GridChangedEventArgs(grid));

            if (_gridsReceived == _gridsToReceive)
            {
                IoCManager.Resolve <IEntityManager>().MapsInitialized = true;
            }
        }
        /// <summary>
        ///     Updates a single tile from the network message.
        /// </summary>
        /// <param name="message">The message containing the info.</param>
        private void HandleTileUpdate(MsgMap message)
        {
            Debug.Assert(_netManager.IsClient, "Why is the server calling this?");

            var x    = message.SingleTurf.X;
            var y    = message.SingleTurf.Y;
            var tile = (Tile)message.SingleTurf.Tile;

            //TODO: This should be a part of the network message, so that multiple maps(z-levels) are possible.
            const int MAP_INDEX = 0;

            _mapManager.GetGrid(MAP_INDEX).SetTile(x, y, tile);
        }
Exemplo n.º 10
0
        public void RegisterServerTileMapping(MsgMap message)
        {
            foreach (var tileDef in _tileDefs)
            {
                tileDef.InvalidateTileId();
            }

            _tileDefs.Clear();
            _tileIds.Clear();

            for (var i = 0; i < message.TileDefs.Length; ++i)
            {
                var tileName = message.TileDefs[i].Name;
                var tileDef  = this[tileName];

                _tileDefs.Add(tileDef);
                _tileIds[tileDef] = (ushort)i;
            }
        }
Exemplo n.º 11
0
        /// <inheritdoc />
        public void HandleNetworkMessage(MsgMap message)
        {
            switch (message.MessageType)
            {
            case MapMessage.TurfClick:
                HandleTurfClick(message);
                break;

            case MapMessage.TurfUpdate:
                HandleTileUpdate(message);
                break;

            case MapMessage.SendTileMap:
                HandleTileMap(message);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(message));
            }
        }