EventBus.subscribe(InitializeClientReceived.class, this::onInitializeClientReceived);
EventBus.subscribe(AddBoundingBoxReceived.class, this::addBoundingBox);
EventBus.subscribe(RemoveBoundingBoxReceived.class, this::onRemoveBoundingBoxReceived);
+ EventBus.subscribe(UpdateWorldSpawnReceived.class, this::onUpdateWorldSpawnReceived);
renderer = new ClientRenderer(this::getCache);
KeyListener.init();
setWorldData(seed, spawnX, spawnZ);
}
+ private void onUpdateWorldSpawnReceived(UpdateWorldSpawnReceived event) {
+ int spawnX = event.getSpawnX();
+ int spawnZ = event.getSpawnZ();
+ setWorldSpawn(spawnX, spawnZ);
+ }
+
@Override
protected void setWorldData(long seed, int spawnX, int spawnZ) {
super.setWorldData(seed, spawnX, spawnZ);
renderer.setWorldData(seed, spawnX, spawnZ);
ready = true;
}
+
+ @Override
+ protected void setWorldSpawn(int spawnX, int spawnZ) {
+ super.setWorldSpawn(spawnX, spawnZ);
+ renderer.setWorldSpawn(spawnX, spawnZ);
+ }
}
spawnChunkBoundingBoxes = getSpawnChunkBoundingBoxes(spawnX, spawnZ);
}
+ void setWorldSpawn(int spawnX, int spawnZ) {
+ spawnChunkBoundingBoxes = getSpawnChunkBoundingBoxes(spawnX, spawnZ);
+ }
+
private Set<AbstractBoundingBox> getSpawnChunkBoundingBoxes(int spawnX, int spawnZ) {
Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
boundingBoxes.add(getWorldSpawnBoundingBox(spawnX, spawnZ));
--- /dev/null
+package com.irtimaled.bbor.client.events;
+
+public class UpdateWorldSpawnReceived {
+ private final int spawnX;
+ private final int spawnZ;
+
+ public UpdateWorldSpawnReceived(int spawnX, int spawnZ) {
+ this.spawnX = spawnX;
+ this.spawnZ = spawnZ;
+ }
+
+ public int getSpawnX() {
+ return spawnX;
+ }
+
+ public int getSpawnZ() {
+ return spawnZ;
+ }
+}
worldData = new WorldData(seed, spawnX, spawnZ);
}
+ protected void setWorldSpawn(int spawnX, int spawnZ) {
+ worldData = new WorldData(worldData.getSeed(), spawnX, spawnZ);
+ }
+
private void worldLoaded(WorldLoaded event) {
int dimensionId = event.getDimensionId();
long seed = event.getSeed();
--- /dev/null
+package com.irtimaled.bbor.mixin.network.play.server;
+
+import com.irtimaled.bbor.client.events.UpdateWorldSpawnReceived;
+import com.irtimaled.bbor.common.EventBus;
+import net.minecraft.network.play.server.SPacketSpawnPosition;
+import net.minecraft.util.math.BlockPos;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+@Mixin(SPacketSpawnPosition.class)
+public abstract class MixinSPacketSpawnPosition {
+ @Shadow
+ private BlockPos spawnBlockPos;
+
+ @Inject(method = "processPacket", at = @At("RETURN"))
+ private void afterProcessPacket(CallbackInfo ci) {
+ EventBus.publish(new UpdateWorldSpawnReceived(spawnBlockPos.getX(), spawnBlockPos.getZ()));
+ }
+}
"client.gui.MixinGuiOptions",
"client.renderer.MixinEntityRenderer",
"network.play.server.MixinSPacketCustomPayload",
+ "network.play.server.MixinSPacketSpawnPosition",
"client.multiplayer.MixinWorldClient",
"client.network.MixinNetHandlerLoginClient",
"client.network.MixinNetHandlerPlayClient",