{
BEDROCK_TRANSLATOR.translators.put(targetPacket, translator);
} else {
- GeyserConnector.getInstance().getLogger().error("Class " + clazz.getCanonicalName() + " is annotated as a translator but has an invalid target packet.");
+ GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.invalid_target", clazz.getCanonicalName()));
}
} catch (InstantiationException | IllegalAccessException e) {
- GeyserConnector.getInstance().getLogger().error("Could not instantiate annotated translator " + clazz.getCanonicalName() + ".");
+ GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.failed", clazz.getCanonicalName()));
}
}
@@ -97,7 +98,7 @@ public boolean translate(Class extends P> clazz, P packet, Geyse
GeyserConnector.getInstance().getLogger().debug("Could not find packet for " + (packet.toString().length() > 25 ? packet.getClass().getSimpleName() : packet));
}
} catch (Throwable ex) {
- GeyserConnector.getInstance().getLogger().error("Could not translate packet " + packet.getClass().getSimpleName(), ex);
+ GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.packet.failed", packet.getClass().getSimpleName()), ex);
ex.printStackTrace();
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
index 2c44e4fdbea..dfd49f2ee1a 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockActionTranslator.java
@@ -25,15 +25,6 @@
package org.geysermc.connector.network.translators.bedrock;
-import java.util.concurrent.TimeUnit;
-
-import com.nukkitx.protocol.bedrock.data.LevelEventType;
-import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
-import org.geysermc.connector.entity.Entity;
-import org.geysermc.connector.network.session.GeyserSession;
-import org.geysermc.connector.network.translators.PacketTranslator;
-import org.geysermc.connector.network.translators.Translator;
-
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerAction;
import com.github.steveice10.mc.protocol.data.game.entity.player.PlayerState;
@@ -41,10 +32,18 @@
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerActionPacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerStatePacket;
import com.nukkitx.math.vector.Vector3i;
+import com.nukkitx.protocol.bedrock.data.LevelEventType;
+import com.nukkitx.protocol.bedrock.packet.LevelEventPacket;
import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket;
import com.nukkitx.protocol.bedrock.packet.PlayerActionPacket;
+import org.geysermc.connector.entity.Entity;
+import org.geysermc.connector.network.session.GeyserSession;
+import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.network.translators.Translator;
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
+import java.util.concurrent.TimeUnit;
+
@Translator(packet = PlayerActionPacket.class)
public class BedrockActionTranslator extends PacketTranslator {
@@ -113,8 +112,8 @@ public void translate(PlayerActionPacket packet, GeyserSession session) {
break;
case CONTINUE_BREAK:
LevelEventPacket continueBreakPacket = new LevelEventPacket();
- continueBreakPacket.setType(LevelEventType.PUNCH_BLOCK);
- continueBreakPacket.setData(BlockTranslator.getBedrockBlockId(session.getBreakingBlock() == null ? BlockTranslator.AIR : session.getBreakingBlock()));
+ continueBreakPacket.setType(LevelEventType.PARTICLE_CRACK_BLOCK);
+ continueBreakPacket.setData(BlockTranslator.getBedrockBlockId(session.getBreakingBlock()));
continueBreakPacket.setPosition(packet.getBlockPosition().toFloat());
session.sendUpstreamPacket(continueBreakPacket);
break;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAdventureSettingsTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAdventureSettingsTranslator.java
index 75a1547f508..e741ca35c13 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAdventureSettingsTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockAdventureSettingsTranslator.java
@@ -28,6 +28,7 @@
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerAbilitiesPacket;
+import com.nukkitx.protocol.bedrock.data.AdventureSetting;
import com.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.PacketTranslator;
@@ -40,11 +41,11 @@ public class BedrockAdventureSettingsTranslator extends PacketTranslator lines.length - 1) {
- break;
- }
- newMessage = new StringBuilder();
- } else newMessage.append(character);
- }
- // Put the final line on since it isn't done in the for loop
- if (iterator < lines.length) lines[iterator] = newMessage.toString();
- ClientUpdateSignPacket clientUpdateSignPacket = new ClientUpdateSignPacket(pos, lines);
- session.sendDownstreamPacket(clientUpdateSignPacket);
- //TODO (potentially): originally I was going to update the sign blocks so Bedrock and Java users would match visually
- // However Java can still store a lot per-line and visuals are still messed up so that doesn't work
-
- // We remove the sign position from map to indicate there is no work-in-progress sign
- lastMessages.remove(pos);
+ NbtMap tag = packet.getData();
+ if (tag.getString("id").equals("Sign")) {
+ // This is the reason why this all works - Bedrock sends packets every time you update the sign, Java only wants the final packet
+ // But Bedrock sends one final packet when you're done editing the sign, which should be equal to the last message since there's no edits
+ // So if the latest update does not match the last cached update then it's still being edited
+ Position pos = new Position(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"));
+ if (!tag.getString("Text").equals(lastMessages.get(pos))) {
+ lastMessages.put(pos, tag.getString("Text"));
+ return;
+ }
+ // Otherwise the two messages are identical and we can get to work deconstructing
+ StringBuilder newMessage = new StringBuilder();
+ // While Bedrock's sign lines are one string, Java's is an array of each line
+ // (Initialized all with empty strings because it complains about null)
+ String[] lines = new String[] {"", "", "", ""};
+ int iterator = 0;
+ // This converts the message into the array'd message Java wants
+ for (char character : tag.getString("Text").toCharArray()) {
+ // If we get a return in Bedrock, that signals to use the next line.
+ if (character == '\n') {
+ lines[iterator] = newMessage.toString();
+ iterator++;
+ // Bedrock, for whatever reason, can hold a message out of bounds
+ // We don't care about that so we discard that
+ if (iterator > lines.length - 1) {
+ break;
+ }
+ newMessage = new StringBuilder();
+ } else newMessage.append(character);
}
+ // Put the final line on since it isn't done in the for loop
+ if (iterator < lines.length) lines[iterator] = newMessage.toString();
+ ClientUpdateSignPacket clientUpdateSignPacket = new ClientUpdateSignPacket(pos, lines);
+ session.sendDownstreamPacket(clientUpdateSignPacket);
+ //TODO (potentially): originally I was going to update the sign blocks so Bedrock and Java users would match visually
+ // However Java can still store a lot per-line and visuals are still messed up so that doesn't work
+
+ // We remove the sign position from map to indicate there is no work-in-progress sign
+ lastMessages.remove(pos);
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestPacketTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestPacketTranslator.java
index 04fe8dbf3be..297db702cb5 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestPacketTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestPacketTranslator.java
@@ -26,7 +26,6 @@
package org.geysermc.connector.network.translators.bedrock;
-import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientMoveItemToHotbarPacket;
import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.protocol.bedrock.packet.BlockPickRequestPacket;
@@ -45,10 +44,10 @@ public class BedrockBlockPickRequestPacketTranslator extends PacketTranslator
@Override
public void translate(InteractPacket packet, GeyserSession session) {
- Entity entity = session.getEntityCache().getEntityByGeyserId(packet.getRuntimeEntityId());
+ Entity entity;
+ if (packet.getRuntimeEntityId() == session.getPlayerEntity().getGeyserId()) {
+ //Player is not in entity cache
+ entity = session.getPlayerEntity();
+ } else {
+ entity = session.getEntityCache().getEntityByGeyserId(packet.getRuntimeEntityId());
+ }
if (entity == null)
return;
@@ -56,12 +64,12 @@ public void translate(InteractPacket packet, GeyserSession session) {
break;
}
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
- InteractAction.INTERACT, Hand.MAIN_HAND);
+ InteractAction.INTERACT, Hand.MAIN_HAND, session.isSneaking());
session.sendDownstreamPacket(interactPacket);
break;
case DAMAGE:
ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
- InteractAction.ATTACK, Hand.MAIN_HAND);
+ InteractAction.ATTACK, Hand.MAIN_HAND, session.isSneaking());
session.sendDownstreamPacket(attackPacket);
break;
case LEAVE_VEHICLE:
@@ -126,6 +134,14 @@ public void translate(InteractPacket packet, GeyserSession session) {
}
}
break;
+ case OPEN_INVENTORY:
+ ContainerOpenPacket containerOpenPacket = new ContainerOpenPacket();
+ containerOpenPacket.setId((byte) 0);
+ containerOpenPacket.setType(ContainerType.INVENTORY);
+ containerOpenPacket.setUniqueEntityId(-1);
+ containerOpenPacket.setBlockPosition(entity.getPosition().toInt());
+ session.sendUpstreamPacket(containerOpenPacket);
+ break;
}
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
index 777d4d9e3bd..25e1c54e2a5 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
@@ -36,7 +36,6 @@
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerInteractEntityPacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerPlaceBlockPacket;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerUseItemPacket;
-import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.data.LevelEventType;
@@ -83,9 +82,9 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
session.getEntityCache().getEntityByJavaId(ItemFrameEntity.getItemFrameEntityId(session, packet.getBlockPosition())) != null) {
Vector3f vector = packet.getClickPosition();
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) ItemFrameEntity.getItemFrameEntityId(session, packet.getBlockPosition()),
- InteractAction.INTERACT, Hand.MAIN_HAND);
+ InteractAction.INTERACT, Hand.MAIN_HAND, session.isSneaking());
ClientPlayerInteractEntityPacket interactAtPacket = new ClientPlayerInteractEntityPacket((int) ItemFrameEntity.getItemFrameEntityId(session, packet.getBlockPosition()),
- InteractAction.INTERACT_AT, vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND);
+ InteractAction.INTERACT_AT, vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND, session.isSneaking());
session.sendDownstreamPacket(interactPacket);
session.sendDownstreamPacket(interactAtPacket);
break;
@@ -93,7 +92,7 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
ClientPlayerPlaceBlockPacket blockPacket = new ClientPlayerPlaceBlockPacket(
new Position(packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ()),
- BlockFace.values()[packet.getFace()],
+ BlockFace.values()[packet.getBlockFace()],
Hand.MAIN_HAND,
packet.getClickPosition().getX(), packet.getClickPosition().getY(), packet.getClickPosition().getZ(),
false);
@@ -107,7 +106,7 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
Vector3i blockPos = packet.getBlockPosition();
// TODO: Find a better way to do this?
- switch (packet.getFace()) {
+ switch (packet.getBlockFace()) {
case 0:
blockPos = blockPos.sub(0, 1, 0);
break;
@@ -146,14 +145,14 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
session.setLastInteractionPosition(packet.getBlockPosition());
break;
case 2:
- BlockState blockState = session.getConnector().getWorldManager().getBlockAt(session, packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
- double blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(blockState.getId());
+ int blockState = session.getConnector().getWorldManager().getBlockAt(session, packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
+ double blockHardness = BlockTranslator.JAVA_RUNTIME_ID_TO_HARDNESS.get(blockState);
if (session.getGameMode() == GameMode.CREATIVE || (session.getConnector().getConfig().isCacheChunks() && blockHardness == 0)) {
session.setLastBlockPlacedId(null);
session.setLastBlockPlacePosition(null);
LevelEventPacket blockBreakPacket = new LevelEventPacket();
- blockBreakPacket.setType(LevelEventType.DESTROY);
+ blockBreakPacket.setType(LevelEventType.PARTICLE_DESTROY_BLOCK);
blockBreakPacket.setPosition(packet.getBlockPosition().toFloat());
blockBreakPacket.setData(BlockTranslator.getBedrockBlockId(blockState));
session.sendUpstreamPacket(blockBreakPacket);
@@ -162,14 +161,14 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
if (ItemFrameEntity.positionContainsItemFrame(session, packet.getBlockPosition()) &&
session.getEntityCache().getEntityByJavaId(ItemFrameEntity.getItemFrameEntityId(session, packet.getBlockPosition())) != null) {
ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) ItemFrameEntity.getItemFrameEntityId(session, packet.getBlockPosition()),
- InteractAction.ATTACK);
+ InteractAction.ATTACK, session.isSneaking());
session.sendDownstreamPacket(attackPacket);
break;
}
PlayerAction action = session.getGameMode() == GameMode.CREATIVE ? PlayerAction.START_DIGGING : PlayerAction.FINISH_DIGGING;
Position pos = new Position(packet.getBlockPosition().getX(), packet.getBlockPosition().getY(), packet.getBlockPosition().getZ());
- ClientPlayerActionPacket breakPacket = new ClientPlayerActionPacket(action, pos, BlockFace.values()[packet.getFace()]);
+ ClientPlayerActionPacket breakPacket = new ClientPlayerActionPacket(action, pos, BlockFace.values()[packet.getBlockFace()]);
session.sendDownstreamPacket(breakPacket);
break;
}
@@ -192,9 +191,9 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
case 0: //Interact
Vector3f vector = packet.getClickPosition();
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
- InteractAction.INTERACT, Hand.MAIN_HAND);
+ InteractAction.INTERACT, Hand.MAIN_HAND, session.isSneaking());
ClientPlayerInteractEntityPacket interactAtPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
- InteractAction.INTERACT_AT, vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND);
+ InteractAction.INTERACT_AT, vector.getX(), vector.getY(), vector.getZ(), Hand.MAIN_HAND, session.isSneaking());
session.sendDownstreamPacket(interactPacket);
session.sendDownstreamPacket(interactAtPacket);
@@ -206,7 +205,7 @@ public void translate(InventoryTransactionPacket packet, GeyserSession session)
break;
case 1: //Attack
ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
- InteractAction.ATTACK);
+ InteractAction.ATTACK, session.isSneaking());
session.sendDownstreamPacket(attackPacket);
break;
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockItemFrameDropItemTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockItemFrameDropItemTranslator.java
index 73939894242..168e552b65f 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockItemFrameDropItemTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockItemFrameDropItemTranslator.java
@@ -50,7 +50,7 @@ public void translate(ItemFrameDropItemPacket packet, GeyserSession session) {
}
Vector3i position = Vector3i.from(packet.getBlockPosition().getX(), y, packet.getBlockPosition().getZ());
ClientPlayerInteractEntityPacket interactPacket = new ClientPlayerInteractEntityPacket((int) ItemFrameEntity.getItemFrameEntityId(session, position),
- InteractAction.ATTACK, Hand.MAIN_HAND);
+ InteractAction.ATTACK, Hand.MAIN_HAND, session.isSneaking());
session.sendDownstreamPacket(interactPacket);
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMapInfoRequestTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMapInfoRequestTranslator.java
index 3c7efa18bf0..11dfe46e091 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMapInfoRequestTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMapInfoRequestTranslator.java
@@ -25,6 +25,7 @@
package org.geysermc.connector.network.translators.bedrock;
+import com.nukkitx.protocol.bedrock.packet.ClientboundMapItemDataPacket;
import com.nukkitx.protocol.bedrock.packet.MapInfoRequestPacket;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession;
@@ -43,8 +44,10 @@ public void translate(MapInfoRequestPacket packet, GeyserSession session) {
if (session.getStoredMaps().containsKey(mapID)) {
// Delay the packet 100ms to prevent the client from ignoring the packet
GeyserConnector.getInstance().getGeneralThreadPool().schedule(() -> {
- session.sendUpstreamPacket(session.getStoredMaps().get(mapID));
- session.getStoredMaps().remove(mapID);
+ ClientboundMapItemDataPacket mapPacket = session.getStoredMaps().remove(mapID);
+ if (mapPacket != null) {
+ session.sendUpstreamPacket(mapPacket);
+ }
}, 100, TimeUnit.MILLISECONDS);
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMobEquipmentTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMobEquipmentTranslator.java
index 1dfa27743f0..02835151a7c 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMobEquipmentTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMobEquipmentTranslator.java
@@ -30,7 +30,7 @@
import org.geysermc.connector.network.translators.Translator;
import com.github.steveice10.mc.protocol.packet.ingame.client.player.ClientPlayerChangeHeldItemPacket;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
import com.nukkitx.protocol.bedrock.packet.MobEquipmentPacket;
import org.geysermc.connector.utils.CooldownUtils;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
index 14d597fd58c..0abf8150571 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockMovePlayerTranslator.java
@@ -26,7 +26,7 @@
package org.geysermc.connector.network.translators.bedrock;
import com.nukkitx.math.vector.Vector3d;
-import org.geysermc.common.ChatColor;
+import org.geysermc.connector.common.ChatColor;
import org.geysermc.connector.entity.Entity;
import org.geysermc.connector.entity.PlayerEntity;
import org.geysermc.connector.entity.type.EntityType;
@@ -137,7 +137,7 @@ public void recalculatePosition(GeyserSession session, Entity entity, Vector3f c
movePlayerPacket.setRuntimeEntityId(entity.getGeyserId());
movePlayerPacket.setPosition(entity.getPosition());
movePlayerPacket.setRotation(entity.getBedrockRotation());
- movePlayerPacket.setMode(MovePlayerPacket.Mode.RESET);
+ movePlayerPacket.setMode(MovePlayerPacket.Mode.RESPAWN);
session.sendUpstreamPacket(movePlayerPacket);
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPacketViolationWarningTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPacketViolationWarningTranslator.java
new file mode 100644
index 00000000000..5e4633ea550
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPacketViolationWarningTranslator.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.connector.network.translators.bedrock;
+
+import com.nukkitx.protocol.bedrock.packet.PacketViolationWarningPacket;
+import org.geysermc.connector.network.session.GeyserSession;
+import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.network.translators.Translator;
+
+@Translator(packet = PacketViolationWarningPacket.class)
+public class BedrockPacketViolationWarningTranslator extends PacketTranslator {
+
+ @Override
+ public void translate(PacketViolationWarningPacket packet, GeyserSession session) {
+ // Not translated since this is something that the developers need to know
+ session.getConnector().getLogger().error("Packet violation warning sent from client! " + packet.toString());
+ }
+}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPositionTrackingDBClientRequestTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPositionTrackingDBClientRequestTranslator.java
new file mode 100644
index 00000000000..41b6246c9a8
--- /dev/null
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockPositionTrackingDBClientRequestTranslator.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @author GeyserMC
+ * @link https://github.com/GeyserMC/Geyser
+ *
+ */
+
+package org.geysermc.connector.network.translators.bedrock;
+
+import com.nukkitx.nbt.NbtMap;
+import com.nukkitx.nbt.NbtMapBuilder;
+import com.nukkitx.nbt.NbtType;
+import com.nukkitx.protocol.bedrock.packet.PositionTrackingDBClientRequestPacket;
+import com.nukkitx.protocol.bedrock.packet.PositionTrackingDBServerBroadcastPacket;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
+import org.geysermc.connector.network.session.GeyserSession;
+import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.network.translators.Translator;
+import org.geysermc.connector.utils.DimensionUtils;
+import org.geysermc.connector.utils.LoadstoneTracker;
+
+@Translator(packet = PositionTrackingDBClientRequestPacket.class)
+public class BedrockPositionTrackingDBClientRequestTranslator extends PacketTranslator {
+
+ @Override
+ public void translate(PositionTrackingDBClientRequestPacket packet, GeyserSession session) {
+ PositionTrackingDBServerBroadcastPacket broadcastPacket = new PositionTrackingDBServerBroadcastPacket();
+ broadcastPacket.setTrackingId(packet.getTrackingId());
+
+ // Fetch the stored Loadstone
+ LoadstoneTracker.LoadstonePos pos = LoadstoneTracker.getPos(packet.getTrackingId());
+
+ // If we don't have data for that ID tell the client its not found
+ if (pos == null) {
+ broadcastPacket.setAction(PositionTrackingDBServerBroadcastPacket.Action.NOT_FOUND);
+ session.sendUpstreamPacket(broadcastPacket);
+ return;
+ }
+
+ broadcastPacket.setAction(PositionTrackingDBServerBroadcastPacket.Action.UPDATE);
+
+ // Build the nbt data for the update
+ NbtMapBuilder builder = NbtMap.builder();
+ builder.putInt("dim", DimensionUtils.javaToBedrock(pos.getDimension()));
+ builder.putString("id", String.format("%08X", packet.getTrackingId()));
+
+ builder.putByte("version", (byte) 1); // Not sure what this is for
+ builder.putByte("status", (byte) 0); // Not sure what this is for
+
+ // Build the position for the update
+ IntList posList = new IntArrayList();
+ posList.add(pos.getX());
+ posList.add(pos.getY());
+ posList.add(pos.getZ());
+ builder.putList("pos", NbtType.INT, posList);
+ broadcastPacket.setTag(builder.build());
+
+ session.sendUpstreamPacket(broadcastPacket);
+ }
+}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockRespawnTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockRespawnTranslator.java
index 8fc377ab50b..14bc1507e16 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockRespawnTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockRespawnTranslator.java
@@ -25,14 +25,13 @@
package org.geysermc.connector.network.translators.bedrock;
-import org.geysermc.connector.network.session.GeyserSession;
-import org.geysermc.connector.network.translators.PacketTranslator;
-import org.geysermc.connector.network.translators.Translator;
-
import com.github.steveice10.mc.protocol.data.game.ClientRequest;
import com.github.steveice10.mc.protocol.packet.ingame.client.ClientRequestPacket;
import com.nukkitx.math.vector.Vector3f;
import com.nukkitx.protocol.bedrock.packet.RespawnPacket;
+import org.geysermc.connector.network.session.GeyserSession;
+import org.geysermc.connector.network.translators.PacketTranslator;
+import org.geysermc.connector.network.translators.Translator;
@Translator(packet = RespawnPacket.class)
public class BedrockRespawnTranslator extends PacketTranslator {
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/effect/EffectRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/effect/EffectRegistry.java
index 50888090fcf..0a3b01ef83d 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/effect/EffectRegistry.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/effect/EffectRegistry.java
@@ -35,6 +35,7 @@
import lombok.NonNull;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.utils.FileUtils;
+import org.geysermc.connector.utils.LanguageUtils;
import java.io.InputStream;
import java.util.HashMap;
@@ -80,7 +81,7 @@ public static void init() {
+ entry.getValue().asText()
+ ", it will take effect.");
} catch (IllegalArgumentException e2){
- GeyserConnector.getInstance().getLogger().warning("Fail to map particle " + entry.getKey() + "=>" + entry.getValue().asText());
+ GeyserConnector.getInstance().getLogger().warning(LanguageUtils.getLocaleStringLog("geyser.particle.failed_map", entry.getKey(), entry.getValue().asText()));
}
}
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/AnvilInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/AnvilInventoryTranslator.java
index f301d2b5d22..c780038a0c7 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/AnvilInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/AnvilInventoryTranslator.java
@@ -26,18 +26,18 @@
package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
-import com.github.steveice10.mc.protocol.data.message.Message;
+import com.github.steveice10.mc.protocol.data.message.MessageSerializer;
+import com.github.steveice10.mc.protocol.data.message.TextMessage;
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientRenameItemPacket;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
-import com.nukkitx.protocol.bedrock.data.ItemData;
+import com.nukkitx.nbt.NbtMap;
+import com.nukkitx.protocol.bedrock.data.inventory.*;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.updater.CursorInventoryUpdater;
import java.util.List;
+import java.util.stream.Collectors;
public class AnvilInventoryTranslator extends BlockInventoryTranslator {
public AnvilInventoryTranslator() {
@@ -46,7 +46,7 @@ public AnvilInventoryTranslator() {
@Override
public int bedrockSlotToJava(InventoryActionData action) {
- if (action.getSource().getContainerId() == ContainerId.CURSOR) {
+ if (action.getSource().getContainerId() == ContainerId.UI) {
switch (action.getSlot()) {
case 1:
return 0;
@@ -56,6 +56,9 @@ public int bedrockSlotToJava(InventoryActionData action) {
return 2;
}
}
+ if (action.getSource().getContainerId() == ContainerId.ANVIL_RESULT) {
+ return 2;
+ }
return super.bedrockSlotToJava(action);
}
@@ -101,7 +104,7 @@ public void translateActions(GeyserSession session, Inventory inventory, List strippedActions = actions.stream()
+ .filter(action -> action.getSource().getContainerId() == ContainerId.ANVIL_RESULT
+ || (action.getSource().getType() == InventorySource.Type.CONTAINER
+ && !(action.getSource().getContainerId() == ContainerId.UI && action.getSlot() != 0)))
+ .collect(Collectors.toList());
+ super.translateActions(session, inventory, strippedActions);
return;
}
@@ -120,7 +129,7 @@ public void translateActions(GeyserSession session, Inventory inventory, List= 0 && slot <= 2) {
+ if (slot == 0) {
ItemStack item = inventory.getItem(slot);
if (item != null) {
String rename;
@@ -129,7 +138,7 @@ public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
CompoundTag displayTag = tag.get("display");
if (displayTag != null) {
String itemName = displayTag.get("Name").getValue().toString();
- Message message = Message.fromString(itemName);
+ TextMessage message = (TextMessage) MessageSerializer.fromString(itemName);
rename = message.getText();
} else {
rename = "";
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BaseInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BaseInventoryTranslator.java
index 5deb0370a14..6f00fc4d773 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BaseInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BaseInventoryTranslator.java
@@ -25,8 +25,8 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.action.InventoryActionDataTranslator;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BlockInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BlockInventoryTranslator.java
index ab410ea8b7f..4b8b57e8fa6 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BlockInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BlockInventoryTranslator.java
@@ -25,8 +25,7 @@
package org.geysermc.connector.network.translators.inventory;
-import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
@@ -40,7 +39,7 @@ public class BlockInventoryTranslator extends BaseInventoryTranslator {
public BlockInventoryTranslator(int size, String javaBlockIdentifier, ContainerType containerType, InventoryUpdater updater) {
super(size);
- BlockState javaBlockState = BlockTranslator.getJavaBlockState(javaBlockIdentifier);
+ int javaBlockState = BlockTranslator.getJavaBlockState(javaBlockIdentifier);
int blockId = BlockTranslator.getBedrockBlockId(javaBlockState);
this.holder = new BlockInventoryHolder(blockId, containerType);
this.updater = updater;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BrewingInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BrewingInventoryTranslator.java
index acda7c918cb..89cdbe8d742 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BrewingInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/BrewingInventoryTranslator.java
@@ -25,8 +25,8 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
import com.nukkitx.protocol.bedrock.packet.ContainerSetDataPacket;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/ChestInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/ChestInventoryTranslator.java
index 13684a609fb..152f4a85274 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/ChestInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/ChestInventoryTranslator.java
@@ -25,7 +25,7 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.updater.ChestInventoryUpdater;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/CraftingInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/CraftingInventoryTranslator.java
index e31eb1e3688..afcb321a416 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/CraftingInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/CraftingInventoryTranslator.java
@@ -26,10 +26,10 @@
package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
-import com.nukkitx.protocol.bedrock.data.InventorySource;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.InventorySource;
import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
@@ -39,52 +39,17 @@
import java.util.List;
-public class CraftingInventoryTranslator extends BaseInventoryTranslator {
- private final InventoryUpdater updater;
-
+public class CraftingInventoryTranslator extends BlockInventoryTranslator {
public CraftingInventoryTranslator() {
- super(10);
- this.updater = new CursorInventoryUpdater();
- }
-
- @Override
- public void prepareInventory(GeyserSession session, Inventory inventory) {
- //
- }
-
- @Override
- public void openInventory(GeyserSession session, Inventory inventory) {
- ContainerOpenPacket containerOpenPacket = new ContainerOpenPacket();
- containerOpenPacket.setWindowId((byte) inventory.getId());
- containerOpenPacket.setType((byte) ContainerType.WORKBENCH.id());
- containerOpenPacket.setBlockPosition(inventory.getHolderPosition());
- containerOpenPacket.setUniqueEntityId(inventory.getHolderId());
- session.sendUpstreamPacket(containerOpenPacket);
- }
-
- @Override
- public void closeInventory(GeyserSession session, Inventory inventory) {
- //
- }
-
- @Override
- public void updateInventory(GeyserSession session, Inventory inventory) {
- updater.updateInventory(this, session, inventory);
- }
-
- @Override
- public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
- updater.updateSlot(this, session, inventory, slot);
+ super(10, "minecraft:crafting_table", ContainerType.WORKBENCH, new CursorInventoryUpdater());
}
@Override
public int bedrockSlotToJava(InventoryActionData action) {
- if (action.getSource().getContainerId() == ContainerId.CURSOR) {
+ if (action.getSource().getContainerId() == ContainerId.UI) {
int slotnum = action.getSlot();
if (slotnum >= 32 && 42 >= slotnum) {
return slotnum - 31;
- } else if (slotnum == 50) {
- return 0;
}
}
return super.bedrockSlotToJava(action);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/DoubleChestInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/DoubleChestInventoryTranslator.java
index 6d6cadd7d1a..1183b21da75 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/DoubleChestInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/DoubleChestInventoryTranslator.java
@@ -26,25 +26,22 @@
package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
-import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
import com.nukkitx.math.vector.Vector3i;
-import com.nukkitx.nbt.tag.CompoundTag;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
+import com.nukkitx.nbt.NbtMap;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
import com.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket;
import com.nukkitx.protocol.bedrock.packet.ContainerOpenPacket;
import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.world.block.BlockTranslator;
-import org.geysermc.connector.network.translators.inventory.updater.ChestInventoryUpdater;
-import org.geysermc.connector.network.translators.inventory.updater.InventoryUpdater;
public class DoubleChestInventoryTranslator extends ChestInventoryTranslator {
private final int blockId;
public DoubleChestInventoryTranslator(int size) {
super(size, 54);
- BlockState javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]");
+ int javaBlockState = BlockTranslator.getJavaBlockState("minecraft:chest[facing=north,type=single,waterlogged=false]");
this.blockId = BlockTranslator.getBedrockBlockId(javaBlockState);
}
@@ -60,14 +57,14 @@ public void prepareInventory(GeyserSession session, Inventory inventory) {
blockPacket.getFlags().addAll(UpdateBlockPacket.FLAG_ALL_PRIORITY);
session.sendUpstreamPacket(blockPacket);
- CompoundTag tag = CompoundTag.builder()
- .stringTag("id", "Chest")
- .intTag("x", position.getX())
- .intTag("y", position.getY())
- .intTag("z", position.getZ())
- .intTag("pairx", pairPosition.getX())
- .intTag("pairz", pairPosition.getZ())
- .stringTag("CustomName", inventory.getTitle()).buildRootTag();
+ NbtMap tag = NbtMap.builder()
+ .putString("id", "Chest")
+ .putInt("x", position.getX())
+ .putInt("y", position.getY())
+ .putInt("z", position.getZ())
+ .putInt("pairx", pairPosition.getX())
+ .putInt("pairz", pairPosition.getZ())
+ .putString("CustomName", inventory.getTitle()).build();
BlockEntityDataPacket dataPacket = new BlockEntityDataPacket();
dataPacket.setData(tag);
dataPacket.setBlockPosition(position);
@@ -80,14 +77,14 @@ public void prepareInventory(GeyserSession session, Inventory inventory) {
blockPacket.getFlags().addAll(UpdateBlockPacket.FLAG_ALL_PRIORITY);
session.sendUpstreamPacket(blockPacket);
- tag = CompoundTag.builder()
- .stringTag("id", "Chest")
- .intTag("x", pairPosition.getX())
- .intTag("y", pairPosition.getY())
- .intTag("z", pairPosition.getZ())
- .intTag("pairx", position.getX())
- .intTag("pairz", position.getZ())
- .stringTag("CustomName", inventory.getTitle()).buildRootTag();
+ tag = NbtMap.builder()
+ .putString("id", "Chest")
+ .putInt("x", pairPosition.getX())
+ .putInt("y", pairPosition.getY())
+ .putInt("z", pairPosition.getZ())
+ .putInt("pairx", position.getX())
+ .putInt("pairz", position.getZ())
+ .putString("CustomName", inventory.getTitle()).build();
dataPacket = new BlockEntityDataPacket();
dataPacket.setData(tag);
dataPacket.setBlockPosition(pairPosition);
@@ -99,8 +96,8 @@ public void prepareInventory(GeyserSession session, Inventory inventory) {
@Override
public void openInventory(GeyserSession session, Inventory inventory) {
ContainerOpenPacket containerOpenPacket = new ContainerOpenPacket();
- containerOpenPacket.setWindowId((byte) inventory.getId());
- containerOpenPacket.setType((byte) ContainerType.CONTAINER.id());
+ containerOpenPacket.setId((byte) inventory.getId());
+ containerOpenPacket.setType(ContainerType.CONTAINER);
containerOpenPacket.setBlockPosition(inventory.getHolderPosition());
containerOpenPacket.setUniqueEntityId(inventory.getHolderId());
session.sendUpstreamPacket(containerOpenPacket);
@@ -110,7 +107,7 @@ public void openInventory(GeyserSession session, Inventory inventory) {
public void closeInventory(GeyserSession session, Inventory inventory) {
Vector3i holderPos = inventory.getHolderPosition();
Position pos = new Position(holderPos.getX(), holderPos.getY(), holderPos.getZ());
- BlockState realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ());
+ int realBlock = session.getConnector().getWorldManager().getBlockAt(session, pos.getX(), pos.getY(), pos.getZ());
UpdateBlockPacket blockPacket = new UpdateBlockPacket();
blockPacket.setDataLayer(0);
blockPacket.setBlockPosition(holderPos);
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/EnchantmentInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/EnchantmentInventoryTranslator.java
index ba7f8cc7a7e..c8e9ed18690 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/EnchantmentInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/EnchantmentInventoryTranslator.java
@@ -25,7 +25,7 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.updater.ContainerInventoryUpdater;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/FurnaceInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/FurnaceInventoryTranslator.java
index 5c6de0e8a5d..1f148e02402 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/FurnaceInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/FurnaceInventoryTranslator.java
@@ -26,7 +26,7 @@
package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.window.WindowType;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
import com.nukkitx.protocol.bedrock.packet.ContainerSetDataPacket;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GrindstoneInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GrindstoneInventoryTranslator.java
index 174cfbc1180..4b4a12465e1 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GrindstoneInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/GrindstoneInventoryTranslator.java
@@ -25,8 +25,9 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
import org.geysermc.connector.network.translators.inventory.updater.CursorInventoryUpdater;
public class GrindstoneInventoryTranslator extends BlockInventoryTranslator {
@@ -38,7 +39,7 @@ public GrindstoneInventoryTranslator() {
@Override
public int bedrockSlotToJava(InventoryActionData action) {
final int slot = super.bedrockSlotToJava(action);
- if (action.getSource().getContainerId() == 124) {
+ if (action.getSource().getContainerId() == ContainerId.UI) {
switch (slot) {
case 16:
return 0;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java
index 975949070cb..7d06aed1404 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/InventoryTranslator.java
@@ -26,8 +26,8 @@
package org.geysermc.connector.network.translators.inventory;
import com.github.steveice10.mc.protocol.data.game.window.WindowType;
-import com.nukkitx.protocol.bedrock.data.ContainerType;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerType;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
import lombok.AllArgsConstructor;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
@@ -55,6 +55,7 @@ public abstract class InventoryTranslator {
put(WindowType.CRAFTING, new CraftingInventoryTranslator());
put(WindowType.GRINDSTONE, new GrindstoneInventoryTranslator());
put(WindowType.MERCHANT, new MerchantInventoryTranslator());
+ put(WindowType.SMITHING, new SmithingInventoryTranslator());
//put(WindowType.ENCHANTMENT, new EnchantmentInventoryTranslator()); //TODO
InventoryTranslator furnace = new FurnaceInventoryTranslator();
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
index 3f7636b9e5d..37c84e28a7f 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
@@ -26,9 +26,9 @@
package org.geysermc.connector.network.translators.inventory;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
-import com.nukkitx.protocol.bedrock.data.InventorySource;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.InventorySource;
import org.geysermc.connector.inventory.Inventory;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.inventory.updater.CursorInventoryUpdater;
@@ -60,7 +60,7 @@ public int javaSlotToBedrock(int slot) {
@Override
public int bedrockSlotToJava(InventoryActionData action) {
- if (action.getSource().getContainerId() == ContainerId.CURSOR) {
+ if (action.getSource().getContainerId() == ContainerId.UI) {
switch (action.getSlot()) {
case 4:
return 0;
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/PlayerInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/PlayerInventoryTranslator.java
index 28986e58cef..7d7673c4ef2 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/PlayerInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/PlayerInventoryTranslator.java
@@ -28,10 +28,10 @@
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
import com.github.steveice10.mc.protocol.packet.ingame.client.window.ClientCreativeInventoryActionPacket;
-import com.nukkitx.protocol.bedrock.data.ContainerId;
-import com.nukkitx.protocol.bedrock.data.InventoryActionData;
-import com.nukkitx.protocol.bedrock.data.InventorySource;
-import com.nukkitx.protocol.bedrock.data.ItemData;
+import com.nukkitx.protocol.bedrock.data.inventory.ContainerId;
+import com.nukkitx.protocol.bedrock.data.inventory.InventoryActionData;
+import com.nukkitx.protocol.bedrock.data.inventory.InventorySource;
+import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
import com.nukkitx.protocol.bedrock.packet.InventoryContentPacket;
import com.nukkitx.protocol.bedrock.packet.InventorySlotPacket;
import org.geysermc.connector.inventory.Inventory;
@@ -39,12 +39,12 @@
import org.geysermc.connector.network.translators.inventory.action.InventoryActionDataTranslator;
import org.geysermc.connector.network.translators.item.ItemTranslator;
import org.geysermc.connector.utils.InventoryUtils;
+import org.geysermc.connector.utils.LanguageUtils;
import java.util.List;
public class PlayerInventoryTranslator extends InventoryTranslator {
- private static final ItemData UNUSUABLE_CRAFTING_SPACE_BLOCK = InventoryUtils.createUnusableSpaceBlock(
- "The creative crafting grid is\nunavailable in Java Edition");
+ private static final ItemData UNUSUABLE_CRAFTING_SPACE_BLOCK = InventoryUtils.createUnusableSpaceBlock(LanguageUtils.getLocaleStringLog("geyser.inventory.unusable_item.creative"));
public PlayerInventoryTranslator() {
super(46);
@@ -94,7 +94,7 @@ public static void updateCraftingGrid(GeyserSession session, Inventory inventory
// Crafting grid
for (int i = 1; i < 5; i++) {
InventorySlotPacket slotPacket = new InventorySlotPacket();
- slotPacket.setContainerId(ContainerId.CURSOR);
+ slotPacket.setContainerId(ContainerId.UI);
slotPacket.setSlot(i + 27);
if (session.getGameMode() == GameMode.CREATIVE) {
@@ -122,7 +122,7 @@ public void updateSlot(GeyserSession session, Inventory inventory, int slot) {
slotPacket.setContainerId(ContainerId.ARMOR);
slotPacket.setSlot(slot - 5);
} else {
- slotPacket.setContainerId(ContainerId.CURSOR);
+ slotPacket.setContainerId(ContainerId.UI);
slotPacket.setSlot(slot + 27);
}
slotPacket.setItem(ItemTranslator.translateToBedrock(session, inventory.getItem(slot)));
@@ -156,13 +156,13 @@ public int bedrockSlotToJava(InventoryActionData action) {
break;
case ContainerId.OFFHAND:
return 45;
- case ContainerId.CURSOR:
+ case ContainerId.UI:
if (slotnum >= 28 && 31 >= slotnum) {
return slotnum - 27;
- } else if (slotnum == 50) {
- return 0;
}
break;
+ case ContainerId.CRAFTING_RESULT:
+ return 0;
}
return slotnum;
}
@@ -184,7 +184,7 @@ public void translateActions(GeyserSession session, Inventory inventory, List= 28 && 31 >= action.getSlot())) {
+ if (action.getSource().getContainerId() == ContainerId.UI && (action.getSlot() >= 28 && 31 >= action.getSlot())) {
updateInventory(session, inventory);
InventoryUtils.updateCursor(session);
return;
@@ -207,7 +207,7 @@ public void translateActions(GeyserSession session, Inventory inventory, List creativeItems = new ArrayList<>();
@@ -153,7 +153,7 @@ public static void init() {
byte[] bytes = Base64.getDecoder().decode(itemNode.get("nbt_b64").asText());
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
try {
- com.nukkitx.nbt.tag.CompoundTag tag = (com.nukkitx.nbt.tag.CompoundTag) NbtUtils.createReaderLE(bais).readTag();
+ NbtMap tag = (NbtMap) NbtUtils.createReaderLE(bais).readTag();
creativeItems.add(ItemData.of(itemNode.get("id").asInt(), damage, 1, tag));
} catch (IOException e) {
e.printStackTrace();
@@ -195,7 +195,10 @@ public static ItemEntry getItem(ItemData data) {
}
}
- GeyserConnector.getInstance().getLogger().debug("Missing mapping for bedrock item " + data.getId() + ":" + data.getDamage());
+ // This will hide the message when the player clicks with an empty hand
+ if (data.getId() != 0 && data.getDamage() != 0) {
+ GeyserConnector.getInstance().getLogger().debug("Missing mapping for bedrock item " + data.getId() + ":" + data.getDamage());
+ }
return ItemEntry.AIR;
}
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java
index 1962f62ecbd..fde799fe497 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java
@@ -27,17 +27,22 @@
package org.geysermc.connector.network.translators.item;
import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
-import com.github.steveice10.mc.protocol.data.message.Message;
+import com.github.steveice10.mc.protocol.data.message.MessageSerializer;
import com.github.steveice10.opennbt.tag.builtin.*;
-import com.nukkitx.nbt.CompoundTagBuilder;
-import com.nukkitx.nbt.tag.CompoundTag;
-import com.nukkitx.nbt.tag.Tag;
-import com.nukkitx.protocol.bedrock.data.ItemData;
+import com.nukkitx.nbt.NbtList;
+import com.nukkitx.nbt.NbtMap;
+import com.nukkitx.nbt.NbtMapBuilder;
+import com.nukkitx.nbt.NbtType;
+import com.nukkitx.protocol.bedrock.data.inventory.ItemData;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import net.kyori.adventure.text.TextComponent;
+import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.connector.network.translators.ItemRemapper;
+import org.geysermc.connector.utils.LanguageUtils;
import org.geysermc.connector.utils.MessageUtils;
import org.reflections.Reflections;
@@ -77,14 +82,13 @@ public static void init() {
for (ItemEntry item : appliedItems) {
ItemTranslator registered = ITEM_STACK_TRANSLATORS.get(item.getJavaId());
if (registered != null) {
- GeyserConnector.getInstance().getLogger().error("Could not instantiate annotated item translator " + clazz.getCanonicalName() + "." +
- " Item translator " + registered.getClass().getCanonicalName() + " is already registered for the item " + item.getJavaIdentifier());
+ GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.item.already_registered", clazz.getCanonicalName(), registered.getClass().getCanonicalName(), item.getJavaIdentifier()));
continue;
}
ITEM_STACK_TRANSLATORS.put(item.getJavaId(), itemStackTranslator);
}
} catch (InstantiationException | IllegalAccessException e) {
- GeyserConnector.getInstance().getLogger().error("Could not instantiate annotated item translator " + clazz.getCanonicalName() + ".");
+ GeyserConnector.getInstance().getLogger().error(LanguageUtils.getLocaleStringLog("geyser.network.translator.item.failed", clazz.getCanonicalName()));
}
}
@@ -150,27 +154,33 @@ public static ItemData translateToBedrock(GeyserSession session, ItemStack stack
// Get the display name of the item
- CompoundTag tag = itemData.getTag();
+ NbtMap tag = itemData.getTag();
if (tag != null) {
- CompoundTag display = tag.getCompound("display");
+ NbtMap display = tag.getCompound("display");
if (display != null) {
String name = display.getString("Name");
+ // If its not a message convert it
+ if (!MessageUtils.isMessage(name)) {
+ TextComponent component = LegacyComponentSerializer.legacy().deserialize(name);
+ name = GsonComponentSerializer.gson().serialize(component);
+ }
+
// Check if its a message to translate
if (MessageUtils.isMessage(name)) {
// Get the translated name
- name = MessageUtils.getTranslatedBedrockMessage(Message.fromString(name), session.getClientData().getLanguageCode());
+ name = MessageUtils.getTranslatedBedrockMessage(MessageSerializer.fromString(name), session.getClientData().getLanguageCode());
// Build the new display tag
- CompoundTagBuilder displayBuilder = display.toBuilder();
- displayBuilder.stringTag("Name", name);
+ NbtMapBuilder displayBuilder = display.toBuilder();
+ displayBuilder.putString("Name", name);
// Build the new root tag
- CompoundTagBuilder builder = tag.toBuilder();
- builder.tag(displayBuilder.build("display"));
+ NbtMapBuilder builder = tag.toBuilder();
+ builder.put("display", displayBuilder.build());
// Create a new item with the original data + updated name
- itemData = ItemData.of(itemData.getId(), itemData.getDamage(), itemData.getCount(), builder.buildRootTag());
+ itemData = ItemData.of(itemData.getId(), itemData.getDamage(), itemData.getCount(), builder.build());
}
}
}
@@ -200,108 +210,101 @@ public ItemStack translateToJava(ItemData itemData, ItemEntry itemEntry) {
if (itemData.getTag() == null) {
return new ItemStack(itemEntry.getJavaId(), itemData.getCount(), new com.github.steveice10.opennbt.tag.builtin.CompoundTag(""));
}
- return new ItemStack(itemEntry.getJavaId(), itemData.getCount(), this.translateToJavaNBT(itemData.getTag()));
+ return new ItemStack(itemEntry.getJavaId(), itemData.getCount(), this.translateToJavaNBT("", itemData.getTag()));
}
public abstract List getAppliedItems();
- public CompoundTag translateNbtToBedrock(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag) {
- Map> javaValue = new HashMap<>();
+ public NbtMap translateNbtToBedrock(com.github.steveice10.opennbt.tag.builtin.CompoundTag tag) {
+ Map javaValue = new HashMap<>();
if (tag.getValue() != null && !tag.getValue().isEmpty()) {
for (String str : tag.getValue().keySet()) {
com.github.steveice10.opennbt.tag.builtin.Tag javaTag = tag.get(str);
- com.nukkitx.nbt.tag.Tag> translatedTag = translateToBedrockNBT(javaTag);
+ Object translatedTag = translateToBedrockNBT(javaTag);
if (translatedTag == null)
continue;
- javaValue.put(translatedTag.getName(), translatedTag);
+ javaValue.put(javaTag.getName(), translatedTag);
}
}
-
- return new CompoundTag(tag.getName(), javaValue);
+ NbtMapBuilder builder = NbtMap.builder();
+ javaValue.forEach(builder::put);
+ return builder.build();
}
- private Tag> translateToBedrockNBT(com.github.steveice10.opennbt.tag.builtin.Tag tag) {
+ private Object translateToBedrockNBT(com.github.steveice10.opennbt.tag.builtin.Tag tag) {
if (tag instanceof ByteArrayTag) {
- ByteArrayTag byteArrayTag = (ByteArrayTag) tag;
- return new com.nukkitx.nbt.tag.ByteArrayTag(byteArrayTag.getName(), byteArrayTag.getValue());
+ return ((ByteArrayTag) tag).getValue();
}
if (tag instanceof ByteTag) {
- ByteTag byteTag = (ByteTag) tag;
- return new com.nukkitx.nbt.tag.ByteTag(byteTag.getName(), byteTag.getValue());
+ return ((ByteTag) tag).getValue();
}
if (tag instanceof DoubleTag) {
- DoubleTag doubleTag = (DoubleTag) tag;
- return new com.nukkitx.nbt.tag.DoubleTag(doubleTag.getName(), doubleTag.getValue());
+ return ((DoubleTag) tag).getValue();
}
if (tag instanceof FloatTag) {
- FloatTag floatTag = (FloatTag) tag;
- return new com.nukkitx.nbt.tag.FloatTag(floatTag.getName(), floatTag.getValue());
+ return ((FloatTag) tag).getValue();
}
if (tag instanceof IntArrayTag) {
- IntArrayTag intArrayTag = (IntArrayTag) tag;
- return new com.nukkitx.nbt.tag.IntArrayTag(intArrayTag.getName(), intArrayTag.getValue());
+ return ((IntArrayTag) tag).getValue();
}
if (tag instanceof IntTag) {
- IntTag intTag = (IntTag) tag;
- return new com.nukkitx.nbt.tag.IntTag(intTag.getName(), intTag.getValue());
+ return ((IntTag) tag).getValue();
}
if (tag instanceof LongArrayTag) {
- LongArrayTag longArrayTag = (LongArrayTag) tag;
- return new com.nukkitx.nbt.tag.LongArrayTag(longArrayTag.getName(), longArrayTag.getValue());
+ //Long array tag does not exist in BE
+ //LongArrayTag longArrayTag = (LongArrayTag) tag;
+ //return new com.nukkitx.nbt.tag.LongArrayTag(longArrayTag.getName(), longArrayTag.getValue());
+ return null;
}
if (tag instanceof LongTag) {
- LongTag longTag = (LongTag) tag;
- return new com.nukkitx.nbt.tag.LongTag(longTag.getName(), longTag.getValue());
+ return ((LongTag) tag).getValue();
}
if (tag instanceof ShortTag) {
- ShortTag shortTag = (ShortTag) tag;
- return new com.nukkitx.nbt.tag.ShortTag(shortTag.getName(), shortTag.getValue());
+ return ((ShortTag) tag).getValue();
}
if (tag instanceof StringTag) {
- StringTag stringTag = (StringTag) tag;
- return new com.nukkitx.nbt.tag.StringTag(stringTag.getName(), stringTag.getValue());
+ return ((StringTag) tag).getValue();
}
if (tag instanceof ListTag) {
ListTag listTag = (ListTag) tag;
- List> tagList = new ArrayList<>();
+ List