From ac516fa59cae7ecdb616bf66cbcb8e37db562a8f Mon Sep 17 00:00:00 2001 From: bixilon Date: Fri, 5 Jun 2020 03:59:02 +0200 Subject: [PATCH] minimal internal restructuring (world now a object of player), Chunk::setBlock function, correct chunk data storage, save data of join packet --- .../minosoft/game/datatypes/Chunk.java | 13 +++----- .../minosoft/game/datatypes/ChunkNibble.java | 4 +++ .../minosoft/game/datatypes/World.java | 33 +++++++++++++++++++ .../de/bixilon/minosoft/objects/Player.java | 29 ++++++++++++++++ .../minosoft/protocol/network/Connection.java | 6 ---- .../clientbound/play/PacketJoinGame.java | 30 ++++++++++++++++- ...java => PacketPluginMessageReceiving.java} | 2 +- ...d.java => PacketPluginMessageSending.java} | 4 +-- .../protocol/protocol/PacketHandler.java | 11 ++++--- .../minosoft/protocol/protocol/Protocol.java | 2 +- 10 files changed, 110 insertions(+), 24 deletions(-) rename src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/{PacketPluginMessageReceived.java => PacketPluginMessageReceiving.java} (93%) rename src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/{PacketPluginMessageSended.java => PacketPluginMessageSending.java} (88%) diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java index 6a39c7714..b6bb3c618 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java @@ -19,15 +19,10 @@ public class Chunk { throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z)); } byte section = (byte) (y / 16); - if (section == 0) { - return Block.COBBLESTONE; - } else if (section == 1) { - return Block.DIRT; - } else { - return Block.AIR; - } - //ToDo - //return chunks.get(section).getBlock(x, y % 16,z); + return chunks.get(section).getBlock(x, y % 16, z); } + public void setBlock(int x, int y, int z, Block block) { + chunks.get(y / 16).setBlock(x, y % 16, z, block); + } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java index 8747c801a..2462175e7 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java @@ -21,4 +21,8 @@ public class ChunkNibble { public Block getBlock(int x, int y, int z) { return getBlock(new ChunkNibbleLocation(x, y, z)); } + + public void setBlock(int x, int y, int z, Block block) { + blocks.replace(new ChunkNibbleLocation(x, y, z), block); + } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java index c895e1d30..9b1037d5b 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java @@ -3,6 +3,7 @@ package de.bixilon.minosoft.game.datatypes; import de.bixilon.minosoft.game.datatypes.blocks.Block; import java.util.HashMap; +import java.util.Map; /** * Collection of ChunkColumns @@ -10,6 +11,7 @@ import java.util.HashMap; public class World { public final HashMap chunks; final String name; + boolean hardcore; public World(String name) { this.name = name; @@ -32,4 +34,35 @@ public class World { } return Block.AIR; } + + public void setBlock(BlockPosition pos, Block block) { + if (getChunk(pos.getChunkLocation()) != null) { + getChunk(pos.getChunkLocation()).setBlock(pos.getX() % 16, pos.getX(), pos.getZ() % 16, block); + } else { + //throw new IllegalAccessException("Chunk is not loaded!"); + // ToDo + } + } + + public void unloadChunk(ChunkLocation location) { + chunks.remove(location); + } + + public void setChunk(ChunkLocation location, Chunk chunk) { + chunks.replace(location, chunk); + } + + public void setChunks(HashMap chunkMap) { + for (Map.Entry set : chunkMap.entrySet()) { + chunks.replace(set.getKey(), set.getValue()); + } + } + + public boolean isHardcore() { + return hardcore; + } + + public void setHardcore(boolean hardcore) { + this.hardcore = hardcore; + } } diff --git a/src/main/java/de/bixilon/minosoft/objects/Player.java b/src/main/java/de/bixilon/minosoft/objects/Player.java index 4ec5ccd04..b7659576d 100644 --- a/src/main/java/de/bixilon/minosoft/objects/Player.java +++ b/src/main/java/de/bixilon/minosoft/objects/Player.java @@ -1,5 +1,7 @@ package de.bixilon.minosoft.objects; +import de.bixilon.minosoft.game.datatypes.GameMode; +import de.bixilon.minosoft.game.datatypes.World; import de.bixilon.minosoft.game.datatypes.player.Location; import java.util.UUID; @@ -10,6 +12,9 @@ public class Player { short food; float saturation; Location spawnLocation; + int entityId; + GameMode gameMode; + World world = new World("world"); public Player(Account acc) { this.acc = acc; @@ -48,6 +53,10 @@ public class Player { this.saturation = saturation; } + public float getSaturation() { + return saturation; + } + public Location getSpawnLocation() { return spawnLocation; } @@ -55,4 +64,24 @@ public class Player { public void setSpawnLocation(Location spawnLocation) { this.spawnLocation = spawnLocation; } + + public GameMode getGameMode() { + return gameMode; + } + + public void setGameMode(GameMode gameMode) { + this.gameMode = gameMode; + } + + public int getEntityId() { + return entityId; + } + + public void setEntityId(int entityId) { + this.entityId = entityId; + } + + public World getWorld() { + return world; + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java index 5225da15c..ae569dd4c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -1,7 +1,6 @@ package de.bixilon.minosoft.protocol.network; import de.bixilon.minosoft.Config; -import de.bixilon.minosoft.game.datatypes.World; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.objects.Account; import de.bixilon.minosoft.objects.Player; @@ -25,7 +24,6 @@ public class Connection { private final PacketHandler handler; private final ArrayList handlingQueue; private Player player = new Player(new Account(Config.username, Config.password)); - private World world = new World("world"); private ConnectionState state = ConnectionState.DISCONNECTED; private boolean onlyPing; @@ -135,8 +133,4 @@ public class Connection { }); handleThread.start(); } - - public World getWorld() { - return this.world; - } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java index 187e8e6d3..f8ce3ce06 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java @@ -43,11 +43,39 @@ public class PacketJoinGame implements ClientboundPacket { @Override public void log() { - Log.protocol(String.format("Receiving join game packet (entityId=%s, gameMode=%s, dimension=%s, difficulty=%s)", entityId, gameMode.name(), dimension.name(), difficulty.name())); + Log.protocol(String.format("Receiving join game packet (entityId=%s, gameMode=%s, dimension=%s, difficulty=%s, hardcore=%s)", entityId, gameMode.name(), dimension.name(), difficulty.name(), hardcore)); } @Override public void handle(PacketHandler h) { h.handle(this); } + + public boolean isHardcore() { + return hardcore; + } + + public int getEntityId() { + return entityId; + } + + public GameMode getGameMode() { + return gameMode; + } + + public int getMaxPlayers() { + return maxPlayers; + } + + public LevelType getLevelType() { + return levelType; + } + + public Difficulty getDifficulty() { + return difficulty; + } + + public Dimension getDimension() { + return dimension; + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceived.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java similarity index 93% rename from src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceived.java rename to src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java index 89a13e8d0..82e1f4ded 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceived.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java @@ -6,7 +6,7 @@ import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; -public class PacketPluginMessageReceived implements ClientboundPacket { +public class PacketPluginMessageReceiving implements ClientboundPacket { String channel; byte[] data; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSended.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSending.java similarity index 88% rename from src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSended.java rename to src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSending.java index 6c9d56d56..056518f34 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSended.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPluginMessageSending.java @@ -6,12 +6,12 @@ import de.bixilon.minosoft.protocol.protocol.OutPacketBuffer; import de.bixilon.minosoft.protocol.protocol.Packets; import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; -public class PacketPluginMessageSended implements ServerboundPacket { +public class PacketPluginMessageSending implements ServerboundPacket { public final String channel; public final byte[] data; - public PacketPluginMessageSended(String channel, byte[] data) { + public PacketPluginMessageSending(String channel, byte[] data) { this.channel = channel; this.data = data; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index 896d7ee0b..f3e25a121 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -10,7 +10,7 @@ import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketKeepAliveResponse; -import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPluginMessageSended; +import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPluginMessageSending; import javax.crypto.SecretKey; import java.math.BigInteger; @@ -51,6 +51,9 @@ public class PacketHandler { } public void handle(PacketJoinGame pkg) { + connection.getPlayer().setGameMode(pkg.getGameMode()); + connection.getPlayer().setEntityId(pkg.getEntityId()); + connection.getPlayer().getWorld().setHardcore(pkg.isHardcore()); } public void handle(PacketLoginDisconnect pkg) { @@ -69,7 +72,7 @@ public class PacketHandler { } public void handle(PacketChunkBulk pkg) { - //ToDo + connection.getPlayer().getWorld().setChunks(pkg.getChunkMap()); } public void handle(PacketUpdateHealth pkg) { @@ -78,14 +81,14 @@ public class PacketHandler { connection.getPlayer().setSaturation(pkg.getSaturation()); } - public void handle(PacketPluginMessageReceived pkg) { + public void handle(PacketPluginMessageReceiving pkg) { if (pkg.getChannel().equals("MC|Brand")) { // server brand received Log.info(String.format("Server is running %s on version %s", new String(pkg.getData()), connection.getVersion().getName())); // send back own brand // ToDo option to toggle for minosoft or original minecraft - connection.sendPacket(new PacketPluginMessageSended("MC|Brand", "Minosoft".getBytes())); + connection.sendPacket(new PacketPluginMessageSending("MC|Brand", "Minosoft".getBytes())); } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index c3ec8b98f..3d3d3aaaa 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -42,7 +42,7 @@ public interface Protocol { packetClassMapping.put(Packets.Clientbound.PLAY_KEEP_ALIVE, PacketKeepAlive.class); packetClassMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, PacketChunkBulk.class); packetClassMapping.put(Packets.Clientbound.PLAY_UPDATE_HEALTH, PacketUpdateHealth.class); - packetClassMapping.put(Packets.Clientbound.PLAY_PLUGIN_MESSAGE, PacketPluginMessageReceived.class); + packetClassMapping.put(Packets.Clientbound.PLAY_PLUGIN_MESSAGE, PacketPluginMessageReceiving.class); packetClassMapping.put(Packets.Clientbound.PLAY_SPAWN_POSITION, PacketSpawnLocation.class); packetClassMapping.put(Packets.Clientbound.PLAY_CHAT_MESSAGE, PacketChatMessage.class); packetClassMapping.put(Packets.Clientbound.PLAY_DISCONNECT, PacketDisconnect.class);