Beispiel #1
0
        private GameEvent GetCurrentGameEvent(Channel channel)
        {
            var player = channel.Player;

            var gameEvent = new GameEvent()
            {
                EntityInfos = new List <EntityData>()
            };

            foreach (var entity in _entities)
            {
                if (entity != player)
                {
                    gameEvent.EntityInfos.Add(new EntityData {
                        PositionData = entity.PositionData, ModelIndex = entity.ModelIndex
                    });
                }
            }

            if (player.PositionData != null)
            {
                var playerChunkPos = (ChunkPos)player.PositionData.Placement.Pos;

                int chunksInPacket = 0;

                ChunkPos.IterateOutwards(
                    playerChunkPos,
                    ChunkViewRadiusXZ,
                    ChunkViewRadiusY,
                    chunkPos =>
                {
                    if (!channel.SentChunks.ContainsKey(chunkPos))
                    {
                        var chunk = _startWorld.GetChunk(chunkPos);

                        if (chunksInPacket < 5 && chunk.IsCreated)
                        {
                            channel.SentChunks[chunkPos] = true;

                            if (chunk != null)
                            {
                                if (gameEvent.ChunkDataList == null)
                                {
                                    gameEvent.ChunkDataList = new List <ChunkData>();
                                }

                                gameEvent.ChunkDataList.Add(chunk.GetChunkData());
                                ++chunksInPacket;
                            }
                        }
                    }
                });
            }

            if (channel.SentBlockUpdates != _blockUpdates.Count)
            {
                gameEvent.BlockUpdates   = _blockUpdates.GetRange(channel.SentBlockUpdates, _blockUpdates.Count - channel.SentBlockUpdates);
                channel.SentBlockUpdates = _blockUpdates.Count;
            }

            return(gameEvent);
        }
Beispiel #2
0
        private static bool AllPassable(World world, BlockPos block0, BlockPos block1)
        {
            for (int x = block0.X; x <= block1.X; ++x)
            {
                for (int y = block0.Y; y <= block1.Y; ++y)
                {
                    for (int z = block0.Z; z <= block1.Z; ++z)
                    {
                        var blockPos = new BlockPos(x, y, z);
                        var chunk = world.GetChunk((ChunkPos)blockPos);

                        if (!chunk.IsCreated) return false;

                        if (world[blockPos] != 0)
                        {
                            return false;
                        }
                    }
                }
            }

            return true;
        }