diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BeaconAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BeaconAction.java index 4d1d5f8e1..4681e0892 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BeaconAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BeaconAction.java @@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.mappings.blocks.actions; public class BeaconAction implements BlockAction { - public BeaconAction(byte status, byte ignored) { + public BeaconAction(short status, short ignored) { // only 1 action (id 1) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BellAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BellAction.java new file mode 100644 index 000000000..9a18f0bc7 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/BellAction.java @@ -0,0 +1,33 @@ +/* + * 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.data.mappings.blocks.actions; + +import com.sun.javafx.scene.traversal.Direction; + +public class BellAction implements BlockAction { + private final Direction direction; + + public BellAction(short unused, short direction) { + this.direction = Direction.values()[direction]; + } + + public Direction getDirection() { + return direction; + } + + @Override + public String toString() { + return String.format("BELL_HIT_%s", direction); + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/ChestAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/ChestAction.java index 23413031a..fc9e1efa3 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/ChestAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/ChestAction.java @@ -14,9 +14,9 @@ package de.bixilon.minosoft.data.mappings.blocks.actions; public class ChestAction implements BlockAction { - final byte playersLookingInChest; + final short playersLookingInChest; - public ChestAction(byte unused, byte playersLookingInChest) { + public ChestAction(short unused, short playersLookingInChest) { this.playersLookingInChest = playersLookingInChest; } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/EndGatewayAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/EndGatewayAction.java index 98b1f3f39..2e2a93b41 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/EndGatewayAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/EndGatewayAction.java @@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.mappings.blocks.actions; public class EndGatewayAction implements BlockAction { - public EndGatewayAction(byte status, byte ignored) { + public EndGatewayAction(short status, short ignored) { // only 1 action (id 1) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/MobSpawnerAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/MobSpawnerAction.java index 125ac6593..1dfe1d783 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/MobSpawnerAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/MobSpawnerAction.java @@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.mappings.blocks.actions; public class MobSpawnerAction implements BlockAction { - public MobSpawnerAction(byte status, byte ignored) { + public MobSpawnerAction(short status, short ignored) { // only 1 action (id 1) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/NoteBlockAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/NoteBlockAction.java index fd5978df7..30189ba35 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/NoteBlockAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/NoteBlockAction.java @@ -15,9 +15,9 @@ package de.bixilon.minosoft.data.mappings.blocks.actions; public class NoteBlockAction implements BlockAction { final Instruments instrument; - final byte pitch; + final short pitch; - public NoteBlockAction(byte instrument, byte pitch) { + public NoteBlockAction(short instrument, short pitch) { this.instrument = Instruments.byId(instrument); this.pitch = pitch; } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/PistonAction.java b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/PistonAction.java index cc6ba468f..c17c87627 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/PistonAction.java +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/actions/PistonAction.java @@ -19,7 +19,7 @@ public class PistonAction implements BlockAction { final PistonStates status; final Directions direction; - public PistonAction(byte status, byte direction) { + public PistonAction(short status, short direction) { this.status = PistonStates.byId(status); this.direction = Directions.byId(direction); } diff --git a/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.java b/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.java index f5e3c4a5c..993a6949a 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.java +++ b/src/main/java/de/bixilon/minosoft/data/text/BaseComponent.java @@ -157,6 +157,10 @@ public class BaseComponent implements ChatComponent { thisTextComponent = new TextComponent(text, color, formattingCodes); } + if (thisTextComponent != null) { + parts.add(thisTextComponent); + } + if (json.has("extra")) { JsonArray extras = json.getAsJsonArray("extra"); TextComponent finalThisChatPart = thisTextComponent; @@ -166,10 +170,6 @@ public class BaseComponent implements ChatComponent { if (json.has("translate")) { parts.add(new TranslatableComponent(json.get("translate").getAsString(), json.getAsJsonArray("with"))); } - - if (thisTextComponent != null) { - parts.add(thisTextComponent); - } } @Override diff --git a/src/main/java/de/bixilon/minosoft/data/text/ChatColors.java b/src/main/java/de/bixilon/minosoft/data/text/ChatColors.java index 8a9f7c9eb..c1f203e6e 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/ChatColors.java +++ b/src/main/java/de/bixilon/minosoft/data/text/ChatColors.java @@ -51,7 +51,11 @@ public final class ChatColors { } public static RGBColor getColorByFormattingChar(char c) { - return colors[Character.digit(c, 16)]; + try { + return colors[Character.digit(c, 16)]; + } catch (IndexOutOfBoundsException e) { + return null; + } } public static RGBColor getColorById(int id) { diff --git a/src/main/java/de/bixilon/minosoft/data/world/Chunk.java b/src/main/java/de/bixilon/minosoft/data/world/Chunk.java index 6b3a5b522..42fcef1e4 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/data/world/Chunk.java @@ -37,6 +37,9 @@ public class Chunk { throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z)); } byte section = (byte) (y / 16); + if (!sections.containsKey(section)) { + return null; + } return sections.get(section).getBlock(x, y % 16, z); } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java index 383650b0b..795fa4413 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java @@ -21,8 +21,6 @@ import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.PacketHandler; -import java.lang.reflect.InvocationTargetException; - public class PacketBlockAction implements ClientboundPacket { BlockPosition position; BlockAction data; @@ -35,26 +33,19 @@ public class PacketBlockAction implements ClientboundPacket { } else { position = buffer.readPosition(); } - byte byte1 = buffer.readByte(); - byte byte2 = buffer.readByte(); - Class clazz; + short byte1 = buffer.readUnsignedByte(); + short byte2 = buffer.readUnsignedByte(); BlockId blockId = buffer.getConnection().getMapping().getBlockIdById(buffer.readVarInt()); - // beacon - // end gateway - clazz = switch (blockId.getIdentifier()) { - case "noteblock" -> NoteBlockAction.class; // ToDo: was replaced in 17w47a (346) with the block id - case "sticky_piston", "piston" -> PistonAction.class; - case "chest", "ender_chest", "trapped_chest", "white_shulker_box", "shulker_box", "orange_shulker_box", "magenta_shulker_box", "light_blue_shulker_box", "yellow_shulker_box", "lime_shulker_box", "pink_shulker_box", "gray_shulker_box", "silver_shulker_box", "cyan_shulker_box", "purple_shulker_box", "blue_shulker_box", "brown_shulker_box", "green_shulker_box", "red_shulker_box", "black_shulker_box" -> ChestAction.class; - case "beacon" -> BeaconAction.class; - case "mob_spawner" -> MobSpawnerAction.class; - case "end_gateway" -> EndGatewayAction.class; - default -> throw new IllegalStateException(String.format("Unexpected block action (blockId=%s)", blockId)); + + data = switch (blockId.getIdentifier()) { + case "noteblock" -> new NoteBlockAction(byte1, byte2); // ToDo: was replaced in 17w47a (346) with the block id + case "sticky_piston", "piston" -> new PistonAction(byte1, byte2); + case "chest", "ender_chest", "trapped_chest", "white_shulker_box", "shulker_box", "orange_shulker_box", "magenta_shulker_box", "light_blue_shulker_box", "yellow_shulker_box", "lime_shulker_box", "pink_shulker_box", "gray_shulker_box", "silver_shulker_box", "cyan_shulker_box", "purple_shulker_box", "blue_shulker_box", "brown_shulker_box", "green_shulker_box", "red_shulker_box", "black_shulker_box" -> new ChestAction(byte1, byte2); + case "beacon" -> new BeaconAction(byte1, byte2); + case "mob_spawner" -> new MobSpawnerAction(byte1, byte2); + case "end_gateway" -> new EndGatewayAction(byte1, byte2); + default -> null; }; - try { - data = clazz.getConstructor(byte.class, byte.class).newInstance(byte1, byte2); - } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { - e.printStackTrace(); - } return true; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java index 4e38bb274..783023121 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java @@ -50,18 +50,18 @@ public class PacketChangeGameState implements ClientboundPacket { } public enum Reason { - INVALID_BED(new MapSet[]{new MapSet<>(0, 0)}), - END_RAIN(new MapSet[]{new MapSet<>(0, 1), new MapSet<>(498, 2), new MapSet<>(578, 1)}), // ToDo: when exactly did these 2 switch? - START_RAIN(new MapSet[]{new MapSet<>(0, 2), new MapSet<>(498, 1), new MapSet<>(578, 2)}), + NO_RESPAWN_BLOCK_AVAILABLE(new MapSet[]{new MapSet<>(0, 0)}), + START_RAINING(new MapSet[]{new MapSet<>(0, 1), new MapSet<>(498, 2), new MapSet<>(578, 1)}), // ToDo: when exactly did these 2 switch? + STOP_RAINING(new MapSet[]{new MapSet<>(0, 2), new MapSet<>(498, 1), new MapSet<>(578, 2)}), CHANGE_GAMEMODE(new MapSet[]{new MapSet<>(0, 3)}), ENTER_CREDITS(new MapSet[]{new MapSet<>(0, 4)}), DEMO_MESSAGES(new MapSet[]{new MapSet<>(0, 5)}), ARROW_HITTING_PLAYER(new MapSet[]{new MapSet<>(0, 6)}), - FADE_VALUE(new MapSet[]{new MapSet<>(0, 7)}), - FADE_TIME(new MapSet[]{new MapSet<>(0, 8)}), - PLAY_PUFFERFISH_STING_SOUND(new MapSet[]{new MapSet<>(0, 9)}), - PLAY_ELDER_GUARDIAN_MOB_APPEARANCE(new MapSet[]{new MapSet<>(0, 10)}), - ENABLE_RESPAWN_SCREEN(new MapSet[]{new MapSet<>(552, 11)}); + RAIN_LEVEL_CHANGE(new MapSet[]{new MapSet<>(0, 7)}), + THUNDER_LEVEL_CHANGE(new MapSet[]{new MapSet<>(0, 8)}), + PUFFERFISH_STING(new MapSet[]{new MapSet<>(0, 9)}), + GUARDIAN_ELDER_EFFECT(new MapSet[]{new MapSet<>(0, 10)}), + IMMEDIATE_RESPAWN(new MapSet[]{new MapSet<>(552, 11)}); final VersionValueMap valueMap; diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java index 2bfb53832..c5867857b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java @@ -21,6 +21,7 @@ import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.util.nbt.tag.CompoundTag; public class PacketRespawn implements ClientboundPacket { Dimension dimension; @@ -40,8 +41,11 @@ public class PacketRespawn implements ClientboundPacket { } else { dimension = buffer.getConnection().getMapping().getDimensionById(buffer.readInt()); } - } else { + } else if (buffer.getVersionId() < 748) { dimension = buffer.getConnection().getMapping().getDimensionByIdentifier(buffer.readString()); + } else { + CompoundTag tag = (CompoundTag) buffer.readNBT(); + dimension = buffer.getConnection().getMapping().getDimensionByIdentifier(tag.getStringTag("effects").getValue()); //ToDo } if (buffer.getVersionId() < 464) { difficulty = Difficulties.byId(buffer.readByte()); 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 6cd699129..96403cf03 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -277,15 +277,15 @@ public class PacketHandler { } Log.game(switch (pkg.getReason()) { - case START_RAIN -> "Received weather packet: Starting rain..."; - case END_RAIN -> "Received weather packet: Stopping rain..."; + case STOP_RAINING -> "Received weather packet: Starting rain..."; + case START_RAINING -> "Received weather packet: Stopping rain..."; case CHANGE_GAMEMODE -> String.format("Received game mode change: Now in %s", GameModes.byId(pkg.getValue().intValue())); default -> ""; }); switch (pkg.getReason()) { - case START_RAIN -> connection.getPlayer().getWorld().setRaining(true); - case END_RAIN -> connection.getPlayer().getWorld().setRaining(false); + case STOP_RAINING -> connection.getPlayer().getWorld().setRaining(true); + case START_RAINING -> connection.getPlayer().getWorld().setRaining(false); case CHANGE_GAMEMODE -> connection.getPlayer().setGameMode(GameModes.byId(pkg.getValue().intValue())); } }