diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java b/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java index 68cf7e891..440a16767 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java +++ b/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java @@ -27,7 +27,7 @@ import java.util.HashMap; public class Slot { final Item item; - final HashMap enchantments = new HashMap<>(); + final HashMap enchantments = new HashMap<>(); final ArrayList lore = new ArrayList<>(); int itemCount; short itemMetadata; @@ -90,11 +90,11 @@ public class Slot { if (nbt.containsKey("Enchantments")) { for (CompoundTag enchantment : nbt.getListTag("Enchantments").getValue()) { String[] spilittedIdentifier = enchantment.getStringTag("id").getValue().split(":"); - enchantments.put(new Enchantment(spilittedIdentifier[0], spilittedIdentifier[1]), enchantment.getShortTag("lvl").getValue()); + enchantments.put(new Enchantment(spilittedIdentifier[0], spilittedIdentifier[1]), enchantment.getNumberTag("lvl").getAsInt()); } } else if (nbt.containsKey("ench")) { for (CompoundTag enchantment : nbt.getListTag("ench").getValue()) { - enchantments.put(mapping.getEnchantmentById(enchantment.getShortTag("id").getValue()), enchantment.getShortTag("lvl").getValue()); + enchantments.put(mapping.getEnchantmentById(enchantment.getNumberTag("id").getAsInt()), enchantment.getNumberTag("lvl").getAsInt()); } } } @@ -130,7 +130,7 @@ public class Slot { enchantments.forEach((id, level) -> { CompoundTag tag = new CompoundTag(); tag.writeTag("id", new StringTag(id.toString())); - tag.writeTag("lvl", new ShortTag(level)); + tag.writeTag("lvl", new ShortTag(level.shortValue())); enchantmentList.getValue().add(tag); }); nbt.writeTag("Enchantments", enchantmentList); @@ -139,7 +139,7 @@ public class Slot { enchantments.forEach((id, level) -> { CompoundTag tag = new CompoundTag(); tag.writeTag("id", new ShortTag((short) (int) mapping.getIdByEnchantment(id))); - tag.writeTag("lvl", new ShortTag(level)); + tag.writeTag("lvl", new ShortTag(level.shortValue())); enchantmentList.getValue().add(tag); }); nbt.writeTag("ench", enchantmentList); @@ -257,7 +257,7 @@ public class Slot { return BitByte.isBitSet(hideFlags, 6); } - public HashMap getEnchantments() { + public HashMap getEnchantments() { return enchantments; } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java index 78e019b4f..e6f3fe0d9 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Blocks.java @@ -21,7 +21,6 @@ import de.bixilon.minosoft.config.StaticConfiguration; import java.util.HashSet; public class Blocks { - public static final Block nullBlock = new Block("air"); public static HashBiMap load(String mod, JsonObject json, boolean metaData) { HashBiMap versionMapping = HashBiMap.create(); diff --git a/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java b/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java index fbc4df388..a374ccbed 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java +++ b/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java @@ -55,7 +55,13 @@ public class ChunkSection { public void setBlock(InChunkSectionLocation location, Block block) { Block current = blocks.get(location); - if (current == null || current.equals(block)) { + if (block == null) { + blocks.remove(location); + blockEntityMeta.remove(location); + return; + } + if (current.equals(block)) { + blockEntityMeta.remove(location); return; } blocks.put(location, block); diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.java b/src/main/java/de/bixilon/minosoft/data/world/World.java index 3707d4a5a..401dda0c9 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.java +++ b/src/main/java/de/bixilon/minosoft/data/world/World.java @@ -17,8 +17,8 @@ import de.bixilon.minosoft.data.entities.block.BlockEntityMetaData; import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.Dimension; import de.bixilon.minosoft.data.mappings.blocks.Block; -import de.bixilon.minosoft.data.mappings.blocks.Blocks; +import javax.annotation.Nullable; import java.util.HashMap; /** @@ -35,12 +35,13 @@ public class World { return chunks; } + @Nullable public Block getBlock(BlockPosition pos) { ChunkLocation loc = pos.getChunkLocation(); if (getChunk(loc) != null) { return getChunk(loc).getBlock(pos.getInChunkLocation()); } - return Blocks.nullBlock; + return null; } public Chunk getChunk(ChunkLocation loc) { 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 3b158ceaf..5d7a2e9a8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -18,7 +18,6 @@ import de.bixilon.minosoft.config.ConfigurationPaths; import de.bixilon.minosoft.data.GameModes; import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity; -import de.bixilon.minosoft.data.mappings.blocks.Blocks; import de.bixilon.minosoft.data.mappings.recipes.Recipes; import de.bixilon.minosoft.data.mappings.versions.Version; import de.bixilon.minosoft.data.mappings.versions.Versions; @@ -247,7 +246,11 @@ public class PacketHandler { if (connection.fireEvent(event)) { return; } - Log.game("[CHAT] " + event.getMessage()); + Log.game(switch (pkg.getPosition()) { + case SYSTEM_MESSAGE -> "[SYSTEM] "; + case ABOVE_HOTBAR -> "[HOTBAR] "; + default -> "[CHAT] "; + } + event.getMessage()); } public void handle(PacketDisconnect pkg) { @@ -553,7 +556,7 @@ public class PacketHandler { int y = ((int) pkg.getLocation().getY()) + record[1]; int z = ((int) pkg.getLocation().getZ()) + record[2]; BlockPosition blockPosition = new BlockPosition(x, (short) y, z); - connection.getPlayer().getWorld().setBlock(blockPosition, Blocks.nullBlock); + connection.getPlayer().getWorld().setBlock(blockPosition, null); } // ToDo: motion support } diff --git a/src/main/java/de/bixilon/minosoft/util/ChunkUtil.java b/src/main/java/de/bixilon/minosoft/util/ChunkUtil.java index dcb2779d4..7ace9c9d1 100644 --- a/src/main/java/de/bixilon/minosoft/util/ChunkUtil.java +++ b/src/main/java/de/bixilon/minosoft/util/ChunkUtil.java @@ -14,7 +14,6 @@ package de.bixilon.minosoft.util; import de.bixilon.minosoft.data.mappings.blocks.Block; -import de.bixilon.minosoft.data.mappings.blocks.Blocks; import de.bixilon.minosoft.data.world.Chunk; import de.bixilon.minosoft.data.world.ChunkSection; import de.bixilon.minosoft.data.world.InChunkSectionLocation; @@ -76,11 +75,12 @@ public final class ChunkUtil { } } // ToDo light, biome - Block block = buffer.getConnection().getMapping().getBlockById((singeBlockId << 4) | singleMeta); - if (block.equals(Blocks.nullBlock)) { + int fullBlockId = (singeBlockId << 4) | singleMeta; + if (fullBlockId == ProtocolDefinition.NULL_BLOCK_ID) { arrayPos++; continue; } + Block block = buffer.getConnection().getMapping().getBlockById(fullBlockId); blockMap.put(new InChunkSectionLocation(nibbleX, nibbleY, nibbleZ), block); arrayPos++; } @@ -129,7 +129,7 @@ public final class ChunkUtil { Log.warn("Unknown block: %d", blockId); } */ - if (block == null || block.equals(Blocks.nullBlock)) { + if (block == null) { arrayPos++; continue; } @@ -177,6 +177,9 @@ public final class ChunkUtil { Block block = palette.byId(blockId); if (block == null) { + if (blockId == ProtocolDefinition.NULL_BLOCK_ID) { + continue; + } String blockName; if (buffer.getVersionId() <= ProtocolDefinition.FLATTING_VERSION_ID) { blockName = String.format("%d:%d", blockId >> 4, blockId & 0xF); @@ -186,9 +189,6 @@ public final class ChunkUtil { Log.warn(String.format("Server sent unknown block: %s", blockName)); continue; } - if (block.equals(Blocks.nullBlock)) { - continue; - } blockMap.put(new InChunkSectionLocation(nibbleX, nibbleY, nibbleZ), block); } } diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/ByteTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/ByteTag.java index fffc5161a..6aee53701 100644 --- a/src/main/java/de/bixilon/minosoft/util/nbt/tag/ByteTag.java +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/ByteTag.java @@ -16,7 +16,7 @@ package de.bixilon.minosoft.util.nbt.tag; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; -public class ByteTag extends NBTTag { +public class ByteTag extends NumberTag { final byte value; public ByteTag(byte value) { @@ -49,4 +49,9 @@ public class ByteTag extends NBTTag { public String toString() { return value + "b"; } + + @Override + public long getAsLong() { + return value; + } } diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/CompoundTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/CompoundTag.java index ed0fc0da4..afe0e4b0f 100644 --- a/src/main/java/de/bixilon/minosoft/util/nbt/tag/CompoundTag.java +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/CompoundTag.java @@ -133,6 +133,10 @@ public class CompoundTag extends NBTTag { return (CompoundTag) data.get(key); } + public NumberTag getNumberTag(String key) { + return (NumberTag) data.get(key); + } + public NBTTag getTag(String key) { return data.get(key); } diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/IntTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/IntTag.java index 080b14001..07e9d7f28 100644 --- a/src/main/java/de/bixilon/minosoft/util/nbt/tag/IntTag.java +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/IntTag.java @@ -16,7 +16,7 @@ package de.bixilon.minosoft.util.nbt.tag; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; -public class IntTag extends NBTTag { +public class IntTag extends NumberTag { final int value; public IntTag(int value) { @@ -45,4 +45,9 @@ public class IntTag extends NBTTag { public String toString() { return String.valueOf(value); } + + @Override + public long getAsLong() { + return value; + } } diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/LongTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/LongTag.java index 10ca9cb10..a0350231f 100644 --- a/src/main/java/de/bixilon/minosoft/util/nbt/tag/LongTag.java +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/LongTag.java @@ -16,7 +16,7 @@ package de.bixilon.minosoft.util.nbt.tag; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; -public class LongTag extends NBTTag { +public class LongTag extends NumberTag { final long value; public LongTag(long value) { @@ -45,4 +45,9 @@ public class LongTag extends NBTTag { public String toString() { return value + "l"; } + + @Override + public long getAsLong() { + return value; + } } diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/NumberTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/NumberTag.java new file mode 100644 index 000000000..83f61fdb0 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/NumberTag.java @@ -0,0 +1,43 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.util.nbt.tag; + +public abstract class NumberTag extends NBTTag { + + public byte getAsByte() { + return (byte) getAsLong(); + } + + public short getAsShort() { + return (short) getAsLong(); + } + + public int getAsInt() { + return (int) getAsLong(); + } + + public abstract long getAsLong(); + + public int getAsUnsignedByte() { + return getAsShort(); + } + + public int getAsUnsignedShort() { + return getAsShort(); + } + + public long getAsUnsignedInt() { + return getAsInt(); + } +} diff --git a/src/main/java/de/bixilon/minosoft/util/nbt/tag/ShortTag.java b/src/main/java/de/bixilon/minosoft/util/nbt/tag/ShortTag.java index 96830a44a..42e6a2da7 100644 --- a/src/main/java/de/bixilon/minosoft/util/nbt/tag/ShortTag.java +++ b/src/main/java/de/bixilon/minosoft/util/nbt/tag/ShortTag.java @@ -16,7 +16,7 @@ package de.bixilon.minosoft.util.nbt.tag; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; -public class ShortTag extends NBTTag { +public class ShortTag extends NumberTag { final short value; public ShortTag(short value) { @@ -45,4 +45,9 @@ public class ShortTag extends NBTTag { public String toString() { return value + "s"; } + + @Override + public long getAsLong() { + return value; + } }