예제 #1
0
    public override void OnBeforeMoveTile(Position movingTo)
    {
        // Inform the server i moved
        UnityClient.TcpClient.Send(new EntityMovePacket()
        {
            UID = UnityClient.Player.UID,
            To  = movingTo
        });

        var playerPos = UnityClient.Player.Position;

        var currentChunk = UnityClient.Map.GetChunkByTilePosition(playerPos.X, playerPos.Y);
        var newChunk     = UnityClient.Map.GetChunkByTilePosition(movingTo.X, movingTo.Y);

        if (currentChunk.x != newChunk.x || currentChunk.y != newChunk.y)
        {
            var currentChunkX = playerPos.X >> 4;
            var currentChunkY = playerPos.Y >> 4;

            var newChunkX = movingTo.X >> 4;
            var newChunkY = movingTo.Y >> 4;

            var currentChunkParents = PositionExtensions.GetSquared3x3Around(new Position(currentChunkX, currentChunkY)).ToList();
            var newChunkParents     = PositionExtensions.GetSquared3x3Around(new Position(newChunkX, newChunkY)).ToList();

            foreach (var cc in currentChunkParents.Except(newChunkParents))
            {
                var chunk = UnityClient.Map.GetChunkByChunkPosition(cc.X, cc.Y);
                if (chunk != null)
                {
                    chunk.GameObject.SetActive(false);
                }
            }

            foreach (var nc in newChunkParents.Except(currentChunkParents))
            {
                var chunk = UnityClient.Map.GetChunkByChunkPosition(nc.X, nc.Y);
                if (chunk != null)
                {
                    chunk.GameObject.SetActive(true);
                }
            }
        }
    }
예제 #2
0
        public static List <OnlinePlayer> GetPlayersNear(this Entity player)
        {
            List <OnlinePlayer> near = new List <OnlinePlayer>();
            var chunk  = player.GetChunk();
            var radius = PositionExtensions.GetSquared3x3Around(new Position(chunk.x, chunk.y));

            foreach (var position in radius)
            {
                var chunkThere = Server.Map.GetChunkByChunkPosition(position.X, position.Y);
                if (chunkThere != null)
                {
                    foreach (var playerInChunk in chunkThere.EntitiesInChunk[EntityType.PLAYER])
                    {
                        if (playerInChunk.UID != player.UID)
                        {
                            near.Add((OnlinePlayer)playerInChunk);
                        }
                    }
                }
            }
            return(near);
        }
예제 #3
0
        public static void CheckChunks(this OnlinePlayer player)
        {
            var client = player.Tcp;

            if (client.OnlinePlayer != null && client.OnlinePlayer.AssetsReady)
            {
                var chunkX = client.OnlinePlayer.Position.X >> 4;
                var chunkY = client.OnlinePlayer.Position.Y >> 4;

                var shouldBeLoaded = PositionExtensions.GetSquared3x3Around(new Position(chunkX, chunkY));

                foreach (var position in shouldBeLoaded)
                {
                    var chunkKey = $"{position.X}_{position.Y}";
                    if (!client.ChunksLoaded.Contains(chunkKey))
                    {
                        if (Server.Map.Chunks.ContainsKey(chunkKey))
                        {
                            client.ChunksLoaded.Add(chunkKey);
                            var chunk = Server.Map.Chunks[chunkKey];
                            client.Send(new ChunkPacket()
                            {
                                X         = position.X,
                                Y         = position.Y,
                                ChunkData = chunk.TilePacketData
                            });

                            foreach (var entity in chunk.EntitiesInChunk[EntityType.MONSTER])
                            {
                                var monsterInstance = (Monster)entity;
                                client.Send(monsterInstance.ToPacket());
                            }
                        }
                    }
                }
            }
        }