diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureBlockUpdateTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureBlockUpdateTranslator.java index 215ece945..84b7ffdd2 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureBlockUpdateTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureBlockUpdateTranslator.java @@ -27,17 +27,13 @@ package org.geysermc.geyser.translator.protocol.bedrock; import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockAction; import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockMode; -import com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror; -import com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetStructureBlockPacket; -import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.structure.StructureBlockType; import org.cloudburstmc.protocol.bedrock.data.structure.StructureEditorData; -import org.cloudburstmc.protocol.bedrock.data.structure.StructureSettings; import org.cloudburstmc.protocol.bedrock.packet.StructureBlockUpdatePacket; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.geyser.util.StructureBlockUtils; @Translator(packet = StructureBlockUpdatePacket.class) public class BedrockStructureBlockUpdateTranslator extends PacketTranslator { @@ -45,7 +41,6 @@ public class BedrockStructureBlockUpdateTranslator extends PacketTranslator UpdateStructureBlockMode.SAVE; }; - StructureMirror mirror = switch (data.getSettings().getMirror()) { - case X -> StructureMirror.FRONT_BACK; - case Z -> StructureMirror.LEFT_RIGHT; - default -> StructureMirror.NONE; - }; - - StructureRotation rotation = switch (settings.getRotation()) { - case ROTATE_90 -> StructureRotation.CLOCKWISE_90; - case ROTATE_180 -> StructureRotation.CLOCKWISE_180; - case ROTATE_270 -> StructureRotation.COUNTERCLOCKWISE_90; - default -> StructureRotation.NONE; - }; - - Vector3i offset = settings.getOffset(); - if (session.getStructureBlockCache().getBedrockOffset() != null) { - offset = settings.getOffset().sub(session.getStructureBlockCache().getBedrockOffset()); - } - - ServerboundSetStructureBlockPacket structureBlockPacket = new ServerboundSetStructureBlockPacket( - packet.getBlockPosition(), - action, - mode, - data.getName(), - offset, - settings.getSize(), - mirror, - rotation, - "", - settings.getIntegrityValue(), - settings.getIntegritySeed(), - settings.isIgnoringEntities(), - false, - data.isBoundingBoxVisible() - ); - + StructureBlockUtils.sendJavaStructurePacket(session, packet.getBlockPosition(), data.getSettings().getSize(), mode, action, data.getSettings(), + data.isBoundingBoxVisible(), data.getName()); session.getStructureBlockCache().clear(); - session.sendDownstreamPacket(structureBlockPacket); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureTemplateDataRequestTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureTemplateDataRequestTranslator.java index b23c46660..947946f36 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureTemplateDataRequestTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/BedrockStructureTemplateDataRequestTranslator.java @@ -27,14 +27,10 @@ package org.geysermc.geyser.translator.protocol.bedrock; import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockAction; import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockMode; -import com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror; -import com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation; -import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetStructureBlockPacket; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.data.structure.StructureSettings; import org.cloudburstmc.protocol.bedrock.data.structure.StructureTemplateRequestOperation; import org.cloudburstmc.protocol.bedrock.packet.StructureTemplateDataRequestPacket; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; @@ -79,41 +75,15 @@ public class BedrockStructureTemplateDataRequestTranslator extends PacketTransla // See the block entity translator for more info session.getStructureBlockCache().setCurrentStructureBlock(packet.getPosition()); - StructureRotation rotation = switch (settings.getRotation()) { - case ROTATE_90 -> StructureRotation.CLOCKWISE_90; - case ROTATE_180 -> StructureRotation.CLOCKWISE_180; - case ROTATE_270 -> StructureRotation.COUNTERCLOCKWISE_90; - default -> StructureRotation.NONE; - }; - - StructureMirror mirror = switch (settings.getMirror()) { - case X -> StructureMirror.FRONT_BACK; - case Z -> StructureMirror.LEFT_RIGHT; - default -> StructureMirror.NONE; - }; - - Vector3i offset = settings.getOffset(); - if (currentStructureName != null && session.getStructureBlockCache().getBedrockOffset() != null) { - offset = offset.sub(session.getStructureBlockCache().getBedrockOffset()); - } - - ServerboundSetStructureBlockPacket structureBlockPacket = new ServerboundSetStructureBlockPacket( + StructureBlockUtils.sendJavaStructurePacket(session, packet.getPosition(), - UpdateStructureBlockAction.LOAD_STRUCTURE, + Vector3i.ZERO, // We expect the Java server to tell us the size UpdateStructureBlockMode.LOAD, - packet.getName(), - offset, - Vector3i.ZERO, // We expect the Java server to tell us the correct size - mirror, - rotation, - "", - settings.getIntegrityValue(), - settings.getIntegritySeed(), - settings.isIgnoringEntities(), - false, - true + UpdateStructureBlockAction.LOAD_STRUCTURE, + settings, + true, + packet.getName() ); - session.sendDownstreamPacket(structureBlockPacket); } else { StructureBlockUtils.sendEmptyStructureData(session); } diff --git a/core/src/main/java/org/geysermc/geyser/util/StructureBlockUtils.java b/core/src/main/java/org/geysermc/geyser/util/StructureBlockUtils.java index 1ecdee48f..9b3cfb53f 100644 --- a/core/src/main/java/org/geysermc/geyser/util/StructureBlockUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/StructureBlockUtils.java @@ -25,6 +25,9 @@ package org.geysermc.geyser.util; +import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockAction; +import com.github.steveice10.mc.protocol.data.game.inventory.UpdateStructureBlockMode; +import com.github.steveice10.mc.protocol.packet.ingame.serverbound.inventory.ServerboundSetStructureBlockPacket; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.nbt.NbtList; import org.cloudburstmc.nbt.NbtMap; @@ -32,6 +35,7 @@ import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.protocol.bedrock.data.structure.StructureMirror; import org.cloudburstmc.protocol.bedrock.data.structure.StructureRotation; +import org.cloudburstmc.protocol.bedrock.data.structure.StructureSettings; import org.cloudburstmc.protocol.bedrock.data.structure.StructureTemplateResponseType; import org.cloudburstmc.protocol.bedrock.packet.StructureTemplateDataResponsePacket; import org.geysermc.geyser.session.GeyserSession; @@ -82,7 +86,7 @@ public class StructureBlockUtils { switch (structureMirror) { case NONE -> newOffsetX -= sizeZ - 1; case X -> { - newOffsetZ -= sizeZ; + newOffsetZ -= sizeX - 1; newOffsetX -= sizeZ - 1; } } @@ -116,4 +120,45 @@ public class StructureBlockUtils { return Vector3i.from(newOffsetX, 0, newOffsetZ); } + + public static void sendJavaStructurePacket(GeyserSession session, Vector3i blockPosition, Vector3i size, UpdateStructureBlockMode mode, UpdateStructureBlockAction action, + StructureSettings settings, boolean boundingBoxVisible, String structureName) { + + com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror mirror = switch (settings.getMirror()) { + case X -> com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror.FRONT_BACK; + case Z -> com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror.LEFT_RIGHT; + default -> com.github.steveice10.mc.protocol.data.game.level.block.StructureMirror.NONE; + }; + + com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation rotation = switch (settings.getRotation()) { + case ROTATE_90 -> com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation.CLOCKWISE_90; + case ROTATE_180 -> com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation.CLOCKWISE_180; + case ROTATE_270 -> com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation.COUNTERCLOCKWISE_90; + default -> com.github.steveice10.mc.protocol.data.game.level.block.StructureRotation.NONE; + }; + + Vector3i offset = settings.getOffset(); + if (session.getStructureBlockCache().getBedrockOffset() != null) { + offset = settings.getOffset().sub(session.getStructureBlockCache().getBedrockOffset()); + } + + ServerboundSetStructureBlockPacket structureBlockPacket = new ServerboundSetStructureBlockPacket( + blockPosition, + action, + mode, + structureName, + offset, + settings.getSize(), + mirror, + rotation, + "", + settings.getIntegrityValue(), + settings.getIntegritySeed(), + settings.isIgnoringEntities(), + false, + boundingBoxVisible + ); + + session.sendDownstreamPacket(structureBlockPacket); + } }