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 extends BlockAction> 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()));
}
}