This commit is contained in:
onebeastchris 2024-04-13 04:50:52 +02:00
parent aeb1e3ed4a
commit 2b97b2f157
4 changed files with 30 additions and 21 deletions

View file

@ -39,8 +39,6 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import java.util.Objects;
@Translator(packet = StructureBlockUpdatePacket.class)
public class BedrockStructureBlockUpdateTranslator extends PacketTranslator<StructureBlockUpdatePacket> {
@ -78,7 +76,10 @@ public class BedrockStructureBlockUpdateTranslator extends PacketTranslator<Stru
default -> StructureRotation.NONE;
};
Vector3i offset = settings.getOffset().sub(Objects.requireNonNull(session.getStructureBlockCache().getBedrockOffset()));
Vector3i offset = settings.getOffset();
if (session.getStructureBlockCache().getBedrockOffset() != null) {
offset = settings.getOffset().sub(session.getStructureBlockCache().getBedrockOffset());
}
ServerboundSetStructureBlockPacket structureBlockPacket = new ServerboundSetStructureBlockPacket(
packet.getBlockPosition(),

View file

@ -66,10 +66,10 @@ public class BedrockStructureTemplateDataRequestTranslator extends PacketTransla
settings.getSize().getX(), settings.getSize().getZ());
session.getStructureBlockCache().setBedrockOffset(offset);
session.getStructureBlockCache().setCurrentStructure(packet.getName());
StructureBlockUtils.sendStructureData(session, size.getX(), size.getY(), size.getZ(), packet.getName());
StructureBlockUtils.sendStructureData(session, size, packet.getName());
return;
} else if (packet.getName().equals(currentStructureName)) {
StructureBlockUtils.sendStructureData(session, size.getX(), size.getY(), size.getZ(), packet.getName());
StructureBlockUtils.sendStructureData(session, size, packet.getName());
return;
}
}

View file

@ -129,23 +129,23 @@ public class JavaBlockEntityDataTranslator extends PacketTranslator<ClientboundB
default -> StructureRotation.NONE;
};
// The "positions" are also offsets on Java
int posX = getOrDefault(map.get("posX"), 0);
int posZ = getOrDefault(map.get("posZ"), 0);
String name = getOrDefault(map.get("name"), "");
int sizeX = getOrDefault(map.get("sizeX"), 0);
int sizeY = getOrDefault(map.get("sizeY"), 0);
int sizeZ = getOrDefault(map.get("sizeZ"), 0);
Vector3i offset = StructureBlockUtils.calculateOffset(bedrockRotation, bedrockMirror,
sizeX, sizeZ);
String name = getOrDefault(map.get("name"), "");
session.getStructureBlockCache().setCurrentStructureBlock(null);
session.getStructureBlockCache().setCurrentStructure(name);
session.getStructureBlockCache().setBedrockOffset(offset);
StructureBlockUtils.sendStructureData(session, sizeX, sizeY, sizeZ, name);
Vector3i size = Vector3i.from(sizeX, sizeY, sizeZ);
if (size.equals(Vector3i.ZERO)) {
return;
}
Vector3i offset = StructureBlockUtils.calculateOffset(bedrockRotation, bedrockMirror,
sizeX, sizeZ);
session.getStructureBlockCache().setBedrockOffset(offset);
StructureBlockUtils.sendStructureData(session, size, name);
}
}

View file

@ -54,19 +54,27 @@ public class StructureBlockUtils {
}
public static void sendEmptyStructureData(GeyserSession session, StructureTemplateDataRequestPacket packet) {
sendStructureData(session, packet.getSettings().getSize().getX(),
packet.getSettings().getSize().getY(),
packet.getSettings().getSize().getZ(),
packet.getName());
StructureTemplateDataResponsePacket responsePacket = new StructureTemplateDataResponsePacket();
responsePacket.setName(packet.getName());
responsePacket.setSave(true);
responsePacket.setTag(EMPTY_STRUCTURE_DATA.toBuilder()
// Bedrock does not like negative sizes here
.putList("size", NbtType.INT,
packet.getSettings().getSize().getX(),
packet.getSettings().getSize().getY(),
packet.getSettings().getSize().getZ())
.build());
responsePacket.setType(StructureTemplateResponseType.NONE);
session.sendUpstreamPacket(responsePacket);
}
public static void sendStructureData(GeyserSession session, int x, int y, int z, String name) {
public static void sendStructureData(GeyserSession session,Vector3i size, String name) {
StructureTemplateDataResponsePacket responsePacket = new StructureTemplateDataResponsePacket();
responsePacket.setName(name);
responsePacket.setSave(true);
responsePacket.setTag(EMPTY_STRUCTURE_DATA.toBuilder()
// Bedrock does not like negative sizes here
.putList("size", NbtType.INT, Math.abs(x), y, Math.abs(z))
.putList("size", NbtType.INT, Math.abs(size.getX()), size.getY(), Math.abs(size.getZ()))
.build());
responsePacket.setType(StructureTemplateResponseType.QUERY);
session.sendUpstreamPacket(responsePacket);