diff --git a/gradle.properties b/gradle.properties index 137b4f91..a224ba3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,11 +3,11 @@ org.gradle.jvmargs=-Xmx4G name=bbor buildVersion=2.6 # leave a space to reduce merge conflicts on version change -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.9 -loader_version=0.14.21 +minecraft_version=1.20.4 +yarn_mappings=1.20.4+build.3 +loader_version=0.15.2 #Fabric api -fabric_version=0.85.0+1.20.1 +fabric_version=0.91.3+1.20.4 modmenu_version=4.1.1 diff --git a/src/main/java/com/irtimaled/bbor/client/gui/AbstractSlider.java b/src/main/java/com/irtimaled/bbor/client/gui/AbstractSlider.java index 343f89a4..d652ffa3 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/AbstractSlider.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/AbstractSlider.java @@ -20,8 +20,8 @@ abstract class AbstractSlider extends AbstractControl { protected void renderBackground(DrawContext ctx) { // this.minecraft.getTextureManager().bindTexture(WIDGETS_TEXTURE); int hoverState = this.isSelected() ? 1 : 0; - ctx.drawTexture(WIDGETS_TEXTURE, this.getX() + (int) getProgressPercentage(), this.getY(), 0, 46 + hoverState * 20, 4, this.height); - ctx.drawTexture(WIDGETS_TEXTURE, this.getX() + (int) getProgressPercentage() + 4, this.getY(), 196, 46 + hoverState * 20, 4, 20); + // ctx.drawTexture(WIDGETS_TEXTURE, this.getX() + (int) getProgressPercentage(), this.getY(), 0, 46 + hoverState * 20, 4, this.height); FIX + // ctx.drawTexture(WIDGETS_TEXTURE, this.getX() + (int) getProgressPercentage() + 4, this.getY(), 196, 46 + hoverState * 20, 4, 20); } private double getProgressPercentage() { diff --git a/src/main/java/com/irtimaled/bbor/client/gui/ControlList.java b/src/main/java/com/irtimaled/bbor/client/gui/ControlList.java index 89155fa7..560c3e9b 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/ControlList.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/ControlList.java @@ -167,7 +167,7 @@ private int getScrollBarHeight() { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount) { + public boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount, double verticalAmount) { this.amountScrolled -= scrollAmount * 10; return true; } diff --git a/src/main/java/com/irtimaled/bbor/client/gui/IControlSet.java b/src/main/java/com/irtimaled/bbor/client/gui/IControlSet.java index 7da4f789..003fea1b 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/IControlSet.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/IControlSet.java @@ -41,9 +41,9 @@ default boolean mouseDragged(double mouseX, double mouseY, int button, double de return focused != null && this.isDragging() && button == 0 && focused.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } - default boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount) { + default boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount, double verticalAmount) { IControl focused = this.getFocused(); - return focused != null && focused.mouseScrolled(mouseX, mouseY, scrollAmount); + return focused != null && focused.mouseScrolled(mouseX, mouseY, scrollAmount, verticalAmount); } default boolean keyPressed(int key, int scanCode, int modifiers) { diff --git a/src/main/java/com/irtimaled/bbor/client/gui/ListScreen.java b/src/main/java/com/irtimaled/bbor/client/gui/ListScreen.java index 38108647..80127959 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/ListScreen.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/ListScreen.java @@ -55,10 +55,9 @@ public void render(DrawContext ctx, int mouseX, int mouseY, float unknown) { } - protected void render(DrawContext ctx, int mouseX, int mouseY) { RenderSystem.assertOnRenderThread(); - this.renderBackground(ctx); + this.renderBackground(ctx, mouseX, mouseY, 0); this.controlList.render(ctx, mouseX, mouseY); ctx.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 8, 16777215); @@ -72,7 +71,7 @@ protected void render(DrawContext ctx, int mouseX, int mouseY) { @Override public void tick() { - this.searchField.tick(); + // this.searchField.tick(); TODO fix } @Override @@ -86,8 +85,8 @@ public boolean charTyped(char character, int modifiers) { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount) { - return this.controlList.mouseScrolled(mouseX, mouseY, scrollAmount); + public boolean mouseScrolled(double mouseX, double mouseY, double scrollAmount, double verticalAmount) { + return this.controlList.mouseScrolled(mouseX, mouseY, scrollAmount, verticalAmount); } @Override diff --git a/src/main/java/com/irtimaled/bbor/client/gui/WorldSaveRow.java b/src/main/java/com/irtimaled/bbor/client/gui/WorldSaveRow.java index 118c6019..ba55bb2b 100644 --- a/src/main/java/com/irtimaled/bbor/client/gui/WorldSaveRow.java +++ b/src/main/java/com/irtimaled/bbor/client/gui/WorldSaveRow.java @@ -8,6 +8,7 @@ import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtSizeTracker; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.WorldSavePath; @@ -97,7 +98,7 @@ public void done() { e.printStackTrace(); } try { - long seed = NbtIo.readCompressed(new FileInputStream(worldInfo.getDirectory(WorldSavePath.LEVEL_DAT).toFile())) + long seed = NbtIo.readCompressed(worldInfo.getDirectory(WorldSavePath.LEVEL_DAT), NbtSizeTracker.ofUnlimitedBytes()) .getCompound("Data") .getCompound("WorldGenSettings").getLong("seed"); worldInfo.close(); diff --git a/src/main/java/com/irtimaled/bbor/common/BBORCustomPayload.java b/src/main/java/com/irtimaled/bbor/common/BBORCustomPayload.java new file mode 100644 index 00000000..f4b5d490 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/common/BBORCustomPayload.java @@ -0,0 +1,17 @@ +package com.irtimaled.bbor.common; + +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; + +public record BBORCustomPayload(PacketByteBuf byteBuf, Identifier id) implements CustomPayload { + + public BBORCustomPayload(Identifier identifier, PacketByteBuf buf) { + this(new PacketByteBuf(buf.readBytes(buf.readableBytes())), identifier); + } + + @Override + public void write(PacketByteBuf buf) { + buf.writeBytes(byteBuf); + } +} diff --git a/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java b/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java index 49600469..027e727e 100644 --- a/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java +++ b/src/main/java/com/irtimaled/bbor/common/interop/CommonInterop.java @@ -17,7 +17,7 @@ import com.irtimaled.bbor.common.models.AbstractBoundingBox; import com.irtimaled.bbor.common.models.DimensionId; import com.irtimaled.bbor.common.models.ServerPlayer; -import com.irtimaled.bbor.mixin.access.IServerPlayNetworkHandler; +import com.irtimaled.bbor.mixin.access.IServerCommonNetworkHandler; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.network.ClientConnection; @@ -103,7 +103,7 @@ public static void playerLoggedIn(ServerPlayerEntity player) { ServerPlayNetworkHandler connection = player.networkHandler; if (connection == null) return; - ClientConnection networkManager = ((IServerPlayNetworkHandler) connection).getConnection(); + ClientConnection networkManager = ((IServerCommonNetworkHandler) connection).getConnection(); if (networkManager.isLocal()) return; EventBus.publish(new PlayerLoggedIn(new ServerPlayer(player))); diff --git a/src/main/java/com/irtimaled/bbor/common/messages/PayloadBuilder.java b/src/main/java/com/irtimaled/bbor/common/messages/PayloadBuilder.java index 470cb255..a6820da5 100644 --- a/src/main/java/com/irtimaled/bbor/common/messages/PayloadBuilder.java +++ b/src/main/java/com/irtimaled/bbor/common/messages/PayloadBuilder.java @@ -2,11 +2,12 @@ import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.DimensionId; +import com.irtimaled.bbor.common.BBORCustomPayload; import io.netty.buffer.Unpooled; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; import net.minecraft.util.Identifier; import java.util.Map; @@ -17,11 +18,11 @@ public class PayloadBuilder { private static final Map packetNames = new ConcurrentHashMap<>(); public static PayloadBuilder clientBound(String name) { - return new PayloadBuilder(packetNames.computeIfAbsent(name, Identifier::new), CustomPayloadS2CPacket::new); + return new PayloadBuilder(packetNames.computeIfAbsent(name, Identifier::new), ((identifier, byteBuf) -> new CustomPayloadS2CPacket(new BBORCustomPayload(identifier, byteBuf)))); } public static PayloadBuilder serverBound(String name) { - return new PayloadBuilder(packetNames.computeIfAbsent(name, Identifier::new), CustomPayloadC2SPacket::new); + return new PayloadBuilder(packetNames.computeIfAbsent(name, Identifier::new), ((identifier, byteBuf) -> new CustomPayloadC2SPacket(new BBORCustomPayload(identifier, byteBuf)))); } private final Identifier name; diff --git a/src/main/java/com/irtimaled/bbor/common/messages/PayloadReader.java b/src/main/java/com/irtimaled/bbor/common/messages/PayloadReader.java index b8c03d59..62e39bc0 100644 --- a/src/main/java/com/irtimaled/bbor/common/messages/PayloadReader.java +++ b/src/main/java/com/irtimaled/bbor/common/messages/PayloadReader.java @@ -2,11 +2,16 @@ import com.irtimaled.bbor.common.models.Coords; import com.irtimaled.bbor.common.models.DimensionId; +import com.irtimaled.bbor.common.BBORCustomPayload; import net.minecraft.network.PacketByteBuf; public class PayloadReader { private final PacketByteBuf buffer; + public PayloadReader(BBORCustomPayload payload) { + this.buffer = payload.byteBuf(); + } + public PayloadReader(PacketByteBuf buffer) { this.buffer = buffer; } diff --git a/src/main/java/com/irtimaled/bbor/common/messages/protocols/PacketSplitter.java b/src/main/java/com/irtimaled/bbor/common/messages/protocols/PacketSplitter.java index 87fe751f..368d412d 100644 --- a/src/main/java/com/irtimaled/bbor/common/messages/protocols/PacketSplitter.java +++ b/src/main/java/com/irtimaled/bbor/common/messages/protocols/PacketSplitter.java @@ -7,6 +7,7 @@ package com.irtimaled.bbor.common.messages.protocols; +import com.irtimaled.bbor.common.BBORCustomPayload; import io.netty.buffer.Unpooled; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -14,8 +15,9 @@ import net.minecraft.network.PacketByteBuf; import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.listener.PacketListener; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.util.Identifier; import org.apache.commons.lang3.tuple.Pair; @@ -35,12 +37,12 @@ public class PacketSplitter { private static final Map, ReadingSession> readingSessions = new ConcurrentHashMap<>(); public static void send(ServerPlayNetworkHandler networkHandler, Identifier channel, PacketByteBuf packet) { - send(packet, MAX_PAYLOAD_PER_PACKET_S2C, buf -> networkHandler.sendPacket(new CustomPayloadS2CPacket(channel, buf))); + send(packet, MAX_PAYLOAD_PER_PACKET_S2C, buf -> networkHandler.sendPacket(new CustomPayloadS2CPacket(new BBORCustomPayload(channel, buf)))); } @Environment(EnvType.CLIENT) public static void send(ClientPlayNetworkHandler networkHandler, Identifier channel, PacketByteBuf packet) { - send(packet, MAX_PAYLOAD_PER_PACKET_C2S, buf -> networkHandler.sendPacket(new CustomPayloadC2SPacket(channel, buf))); + send(packet, MAX_PAYLOAD_PER_PACKET_C2S, buf -> networkHandler.sendPacket(new CustomPayloadC2SPacket(new BBORCustomPayload(channel, buf)))); } public static void send(PacketByteBuf packet, int payloadLimit, Consumer sender) { @@ -48,7 +50,7 @@ public static void send(PacketByteBuf packet, int payloadLimit, Consumer key = Pair.of(networkHandler, message.getChannel()); - return readingSessions.computeIfAbsent(key, ReadingSession::new).receive(message.getData(), maxLength); + if (message.payload() instanceof BBORCustomPayload payload) { + Pair key = Pair.of(networkHandler, payload.id()); + return readingSessions.computeIfAbsent(key, ReadingSession::new).receive(payload.byteBuf(), maxLength); + } + return null; } - public static PacketByteBuf receive(ClientPlayPacketListener networkHandler, CustomPayloadS2CPacket message) { + public static PacketByteBuf receive(ClientPlayPacketListener networkHandler, CustomPayload message) { return receive(networkHandler, message, DEFAULT_MAX_RECEIVE_SIZE_S2C); } - public static PacketByteBuf receive(ClientPlayPacketListener networkHandler, CustomPayloadS2CPacket message, int maxLength) { - Pair key = Pair.of(networkHandler, message.getChannel()); - return readingSessions.computeIfAbsent(key, ReadingSession::new).receive(message.getData(), maxLength); + public static PacketByteBuf receive(ClientPlayPacketListener networkHandler, CustomPayload message, int maxLength) { + if (message instanceof BBORCustomPayload payload) { + Pair key = Pair.of(networkHandler, payload.id()); + return readingSessions.computeIfAbsent(key, ReadingSession::new).receive(payload.byteBuf(), maxLength); + } + return null; } private static class ReadingSession { private final Pair key; private int expectedSize = -1; private PacketByteBuf received; + private ReadingSession(Pair key) { this.key = key; } diff --git a/src/main/java/com/irtimaled/bbor/common/messages/servux/RegistryUtil.java b/src/main/java/com/irtimaled/bbor/common/messages/servux/RegistryUtil.java index 0d4f1689..3243040d 100644 --- a/src/main/java/com/irtimaled/bbor/common/messages/servux/RegistryUtil.java +++ b/src/main/java/com/irtimaled/bbor/common/messages/servux/RegistryUtil.java @@ -21,9 +21,10 @@ import java.util.concurrent.Executors; public class RegistryUtil { - static final DynamicRegistryManager.Immutable REGISTRY_MANAGER; + static final DynamicRegistryManager.Immutable REGISTRY_MANAGER = null; // TODO fix static { + /* TODO fix final ExecutorService executorService = Executors.newSingleThreadExecutor(); try { @@ -53,6 +54,7 @@ public GeneratorOptionsHolder create(LifecycledResourceManager resourceManager, } finally { executorService.shutdown(); } + */ } record WorldCreationSettings(WorldGenSettings worldGenSettings, DataConfiguration dataConfiguration) { diff --git a/src/main/java/com/irtimaled/bbor/mixin/access/IServerPlayNetworkHandler.java b/src/main/java/com/irtimaled/bbor/mixin/access/IServerCommonNetworkHandler.java similarity index 60% rename from src/main/java/com/irtimaled/bbor/mixin/access/IServerPlayNetworkHandler.java rename to src/main/java/com/irtimaled/bbor/mixin/access/IServerCommonNetworkHandler.java index 8bc06789..50794b1b 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/access/IServerPlayNetworkHandler.java +++ b/src/main/java/com/irtimaled/bbor/mixin/access/IServerCommonNetworkHandler.java @@ -1,12 +1,12 @@ package com.irtimaled.bbor.mixin.access; import net.minecraft.network.ClientConnection; -import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerCommonNetworkHandler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(ServerPlayNetworkHandler.class) -public interface IServerPlayNetworkHandler { +@Mixin(ServerCommonNetworkHandler.class) +public interface IServerCommonNetworkHandler { @Accessor ClientConnection getConnection(); diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/network/common/MixinClientCommonNetworkHandler.java b/src/main/java/com/irtimaled/bbor/mixin/client/network/common/MixinClientCommonNetworkHandler.java new file mode 100644 index 00000000..9a4a98d5 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/client/network/common/MixinClientCommonNetworkHandler.java @@ -0,0 +1,31 @@ +package com.irtimaled.bbor.mixin.client.network.common; + +import com.irtimaled.bbor.client.interop.ClientInterop; +import com.irtimaled.bbor.common.BBORCustomPayload; +import com.irtimaled.bbor.common.EventBus; +import com.irtimaled.bbor.common.messages.AddBoundingBox; +import com.irtimaled.bbor.common.messages.InitializeClient; +import com.irtimaled.bbor.common.messages.PayloadReader; +import com.irtimaled.bbor.common.messages.StructureListSync; +import com.irtimaled.bbor.common.messages.SubscribeToServer; +import com.irtimaled.bbor.common.messages.protocols.PacketSplitter; +import com.irtimaled.bbor.common.messages.servux.ServuxStructurePackets; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientCommonNetworkHandler; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.NetworkThreadUtils; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientCommonNetworkHandler.class) +public class MixinClientCommonNetworkHandler { + + @Inject(method = "onDisconnect", at = @At("HEAD")) + private void onDisconnect(CallbackInfo ci) { + ClientInterop.disconnectedFromRemoteServer(); + } +} diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/network/play/MixinClientPlayNetHandler.java b/src/main/java/com/irtimaled/bbor/mixin/client/network/play/MixinClientPlayNetHandler.java index ebc5ecff..93d4714a 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/client/network/play/MixinClientPlayNetHandler.java +++ b/src/main/java/com/irtimaled/bbor/mixin/client/network/play/MixinClientPlayNetHandler.java @@ -2,31 +2,33 @@ import com.irtimaled.bbor.client.events.GameJoin; import com.irtimaled.bbor.client.interop.ClientInterop; +import com.irtimaled.bbor.common.BBORCustomPayload; import com.irtimaled.bbor.common.EventBus; +import com.irtimaled.bbor.common.messages.AddBoundingBox; +import com.irtimaled.bbor.common.messages.InitializeClient; +import com.irtimaled.bbor.common.messages.PayloadReader; +import com.irtimaled.bbor.common.messages.StructureListSync; +import com.irtimaled.bbor.common.messages.SubscribeToServer; +import com.irtimaled.bbor.common.messages.protocols.PacketSplitter; import com.irtimaled.bbor.common.messages.servux.ServuxStructurePackets; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; +import net.minecraft.network.NetworkThreadUtils; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.listener.ClientPlayPacketListener; +import net.minecraft.network.packet.CustomPayload; import net.minecraft.network.packet.s2c.play.UnloadChunkS2CPacket; 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(ClientPlayNetworkHandler.class) public class MixinClientPlayNetHandler { - @Shadow - private ClientWorld world; - - @Inject(method = "onDisconnect", at = @At("HEAD")) - private void onDisconnect(CallbackInfo ci) { - ClientInterop.disconnectedFromRemoteServer(); - } @Inject(method = "onUnloadChunk", at = @At("RETURN")) private void onChunkUnload(UnloadChunkS2CPacket packet, CallbackInfo ci) { - ClientInterop.unloadChunk(packet.getX(), packet.getZ()); + ClientInterop.unloadChunk(packet.pos().x, packet.pos().z); } // @Inject(method = "onSynchronizeTags", at = @At("RETURN")) @@ -39,9 +41,9 @@ private void onGameJoin(CallbackInfo ci) { EventBus.publish(new GameJoin()); } - @Inject(method = "onCustomPayload", at = @At(value = "CONSTANT", args = "stringValue=Unknown custom packed identifier: {}"), cancellable = true) - private void suppressWarning(CustomPayloadS2CPacket packet, CallbackInfo ci) { - if (packet.getChannel().equals(ServuxStructurePackets.CHANNEL)) ci.cancel(); + @Inject(method = "warnOnUnknownPayload", at = @At(value = "CONSTANT", args = "stringValue=Unknown custom packet payload: {}"), cancellable = true) + private void suppressWarning(CustomPayload payload, CallbackInfo ci) { + if (payload.id().equals(ServuxStructurePackets.CHANNEL)) ci.cancel(); } @@ -51,4 +53,38 @@ private void interceptSendCommand(String command, CallbackInfo ci) { ci.cancel(); } } + + @Inject(method = "onCustomPayload(Lnet/minecraft/network/packet/CustomPayload;)V", at = @At("HEAD"), cancellable = true) + private void onCustomPayload(CustomPayload customPayload, CallbackInfo ci) { + if (customPayload instanceof BBORCustomPayload payload) { + if (payload.id().getNamespace().equals("bbor")) { + PayloadReader reader = new PayloadReader(payload); + switch (payload.id().toString()) { + case InitializeClient.NAME -> { + EventBus.publish(InitializeClient.getEvent(reader)); + ((ClientPlayNetworkHandler) (Object) this).sendPacket(SubscribeToServer.getPayload().build()); + } + case AddBoundingBox.NAME -> { + EventBus.publish(AddBoundingBox.getEvent(reader)); + } + case StructureListSync.NAME -> { + StructureListSync.handleEvent(reader); + } + } + ci.cancel(); + } else if (payload.id().toString().equals("servux:structures")) { + PacketByteBuf data = null; + try { + data = PacketSplitter.receive((ClientPlayPacketListener) this, payload); + if (data != null) { + PayloadReader reader = new PayloadReader(data); + // ServuxStructurePackets.handleEvent(reader); TODO fix + } + } finally { + if (data != null) + data.release(); + } + } + } + } } diff --git a/src/main/java/com/irtimaled/bbor/mixin/client/world/MixinClientPlayNetworkHandler.java b/src/main/java/com/irtimaled/bbor/mixin/client/world/MixinClientPlayNetworkHandler.java index 27bf5fdf..3a959be7 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/client/world/MixinClientPlayNetworkHandler.java +++ b/src/main/java/com/irtimaled/bbor/mixin/client/world/MixinClientPlayNetworkHandler.java @@ -16,7 +16,7 @@ public class MixinClientPlayNetworkHandler { @Inject(method = "onChunkData", at = @At("RETURN")) private void onChunkLoad(ChunkDataS2CPacket packet, CallbackInfo ci) { - ClientWorldUpdateTracker.onChunkLoad(packet.getX(), packet.getZ()); + ClientWorldUpdateTracker.onChunkLoad(packet.getChunkX(), packet.getChunkZ()); } @Inject(method = "readLightData", at = @At("RETURN")) diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/common/c2s/MixinCCustomPayloadPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/c2s/MixinCCustomPayloadPacket.java new file mode 100644 index 00000000..1b253c10 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/c2s/MixinCCustomPayloadPacket.java @@ -0,0 +1,22 @@ +package com.irtimaled.bbor.mixin.network.common.c2s; + +import com.irtimaled.bbor.common.BBORCustomPayload; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(CustomPayloadC2SPacket.class) +public class MixinCCustomPayloadPacket { + + @Inject(method = "readPayload", at = @At(value = "HEAD"), cancellable = true) + private static void onOnCustomPayloadR(Identifier id, PacketByteBuf buf, CallbackInfoReturnable cir) { + if (id.getNamespace().equals("bbor")) { + cir.setReturnValue(new BBORCustomPayload(id, buf)); + } + } +} diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChatPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChatPacket.java similarity index 92% rename from src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChatPacket.java rename to src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChatPacket.java index 2266d191..11df55b1 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChatPacket.java +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChatPacket.java @@ -1,4 +1,4 @@ -package com.irtimaled.bbor.mixin.network.play.s2c; +package com.irtimaled.bbor.mixin.network.common.s2c; import com.irtimaled.bbor.client.interop.ClientInterop; import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket; diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChunkDataPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChunkDataPacket.java similarity index 93% rename from src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChunkDataPacket.java rename to src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChunkDataPacket.java index fca29f9b..23990a7b 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSChunkDataPacket.java +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSChunkDataPacket.java @@ -1,4 +1,4 @@ -package com.irtimaled.bbor.mixin.network.play.s2c; +package com.irtimaled.bbor.mixin.network.common.s2c; import com.irtimaled.bbor.client.interop.ClientInterop; import net.minecraft.network.listener.ClientPlayPacketListener; diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCommandListPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCommandListPacket.java similarity index 94% rename from src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCommandListPacket.java rename to src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCommandListPacket.java index 05c72473..a03eb9e6 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCommandListPacket.java +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCommandListPacket.java @@ -1,4 +1,4 @@ -package com.irtimaled.bbor.mixin.network.play.s2c; +package com.irtimaled.bbor.mixin.network.common.s2c; import com.irtimaled.bbor.client.interop.ClientInterop; import com.irtimaled.bbor.common.TypeHelper; diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCustomPayloadPlayPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCustomPayloadPlayPacket.java new file mode 100644 index 00000000..4a9bf170 --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSCustomPayloadPlayPacket.java @@ -0,0 +1,22 @@ +package com.irtimaled.bbor.mixin.network.common.s2c; + +import com.irtimaled.bbor.common.BBORCustomPayload; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(CustomPayloadS2CPacket.class) +public abstract class MixinSCustomPayloadPlayPacket { + + @Inject(method = "readPayload", at = @At(value = "HEAD"), cancellable = true) + private static void onOnCustomPayloadR(Identifier id, PacketByteBuf buf, CallbackInfoReturnable cir) { + if (id.getNamespace().equals("bbor") || id.toString().equals("servux:structures")) { + cir.setReturnValue(new BBORCustomPayload(id, buf)); + } + } +} diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSSpawnPositionPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSSpawnPositionPacket.java similarity index 93% rename from src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSSpawnPositionPacket.java rename to src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSSpawnPositionPacket.java index e1fc0dbc..a66cd989 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSSpawnPositionPacket.java +++ b/src/main/java/com/irtimaled/bbor/mixin/network/common/s2c/MixinSSpawnPositionPacket.java @@ -1,4 +1,4 @@ -package com.irtimaled.bbor.mixin.network.play.s2c; +package com.irtimaled.bbor.mixin.network.common.s2c; import com.irtimaled.bbor.client.interop.ClientInterop; import net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket; diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/c2s/MixinCCustomPayloadPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/play/c2s/MixinCCustomPayloadPacket.java deleted file mode 100644 index d1e2c711..00000000 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/c2s/MixinCCustomPayloadPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.irtimaled.bbor.mixin.network.play.c2s; - -import com.irtimaled.bbor.common.interop.CommonInterop; -import com.irtimaled.bbor.common.messages.PayloadReader; -import com.irtimaled.bbor.common.messages.SubscribeToServer; -import net.minecraft.network.listener.ServerPlayPacketListener; -import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; -import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.util.Identifier; -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.Redirect; - -@Mixin(CustomPayloadC2SPacket.class) -public class MixinCCustomPayloadPacket { - @Shadow - private Identifier channel; - - @Redirect(method = "apply", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/listener/ServerPlayPacketListener;onCustomPayload(Lnet/minecraft/network/packet/c2s/play/CustomPayloadC2SPacket;)V")) - private void processPacket(ServerPlayPacketListener netHandlerPlayServer, CustomPayloadC2SPacket packet) { - String channelName = channel.toString(); - if (channelName.startsWith("bbor:")) { - PayloadReader reader = new PayloadReader(packet.getData()); - switch (channelName) { - case SubscribeToServer.NAME -> { - CommonInterop.playerSubscribed(((ServerPlayNetworkHandler) netHandlerPlayServer).player); - } - } - } else { - netHandlerPlayServer.onCustomPayload(packet); - } - } -} diff --git a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCustomPayloadPlayPacket.java b/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCustomPayloadPlayPacket.java deleted file mode 100644 index 998024c6..00000000 --- a/src/main/java/com/irtimaled/bbor/mixin/network/play/s2c/MixinSCustomPayloadPlayPacket.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.irtimaled.bbor.mixin.network.play.s2c; - -import com.irtimaled.bbor.common.EventBus; -import com.irtimaled.bbor.common.messages.AddBoundingBox; -import com.irtimaled.bbor.common.messages.InitializeClient; -import com.irtimaled.bbor.common.messages.PayloadReader; -import com.irtimaled.bbor.common.messages.StructureListSync; -import com.irtimaled.bbor.common.messages.SubscribeToServer; -import com.irtimaled.bbor.common.messages.protocols.PacketSplitter; -import com.irtimaled.bbor.common.messages.servux.ServuxStructurePackets; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.NetworkThreadUtils; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Final; -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.Redirect; - -@Mixin(CustomPayloadS2CPacket.class) -public abstract class MixinSCustomPayloadPlayPacket { - @Shadow - private Identifier channel; - - @Shadow @Final private PacketByteBuf data; - - @Redirect(method = "apply", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/listener/ClientPlayPacketListener;onCustomPayload(Lnet/minecraft/network/packet/s2c/play/CustomPayloadS2CPacket;)V")) - private void processPacket(ClientPlayPacketListener netHandlerPlayClient, CustomPayloadS2CPacket packet) { - String channelName = channel.toString(); - if (channelName.startsWith("bbor:")) { - NetworkThreadUtils.forceMainThread(packet, netHandlerPlayClient, MinecraftClient.getInstance()); - PacketByteBuf data = null; - try { - data = packet.getData(); - PayloadReader reader = new PayloadReader(data); - switch (channelName) { - case InitializeClient.NAME -> { - EventBus.publish(InitializeClient.getEvent(reader)); - ((ClientPlayNetworkHandler) netHandlerPlayClient).sendPacket(SubscribeToServer.getPayload().build()); - } - case AddBoundingBox.NAME -> { - EventBus.publish(AddBoundingBox.getEvent(reader)); - } - case StructureListSync.NAME -> { - StructureListSync.handleEvent(reader); - } - } - } finally { - if (data != null) - data.release(); - } - return; - } else if (channelName.equals("servux:structures")) { - NetworkThreadUtils.forceMainThread(packet, netHandlerPlayClient, MinecraftClient.getInstance()); - - PacketByteBuf data = null; - try { - data = PacketSplitter.receive(netHandlerPlayClient, packet); - if (data != null) { - PayloadReader reader = new PayloadReader(data); - ServuxStructurePackets.handleEvent(reader); - } - } finally { - if (data != null) - data.release(); - } - } - netHandlerPlayClient.onCustomPayload(packet); - } -} diff --git a/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerList.java b/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerList.java index e59314c2..3b632aa2 100644 --- a/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerList.java +++ b/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerList.java @@ -4,6 +4,7 @@ import net.minecraft.network.ClientConnection; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -16,7 +17,7 @@ public abstract class MixinPlayerList { @Shadow public abstract MinecraftServer getServer(); @Inject(method = "onPlayerConnect", at = @At("RETURN")) - private void playerLoggedIn(ClientConnection netManager, ServerPlayerEntity player, CallbackInfo ci) { + private void playerLoggedIn(ClientConnection connection, ServerPlayerEntity player, ConnectedClientData clientData, CallbackInfo ci) { CommonInterop.playerLoggedIn(player); } diff --git a/src/main/java/com/irtimaled/bbor/mixin/server/network/MixinServerCommonNetworkHandler.java b/src/main/java/com/irtimaled/bbor/mixin/server/network/MixinServerCommonNetworkHandler.java new file mode 100644 index 00000000..5c140e6b --- /dev/null +++ b/src/main/java/com/irtimaled/bbor/mixin/server/network/MixinServerCommonNetworkHandler.java @@ -0,0 +1,32 @@ +package com.irtimaled.bbor.mixin.server.network; + +import com.irtimaled.bbor.common.BBORCustomPayload; +import com.irtimaled.bbor.common.interop.CommonInterop; +import com.irtimaled.bbor.common.messages.PayloadReader; +import com.irtimaled.bbor.common.messages.SubscribeToServer; +import net.minecraft.network.packet.c2s.common.CustomPayloadC2SPacket; +import net.minecraft.server.network.ServerCommonNetworkHandler; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ServerCommonNetworkHandler.class) +public class MixinServerCommonNetworkHandler { + + @Inject(method = "onCustomPayload", at = @At(value = "HEAD"), cancellable = true) + private void onCustomPayload(CustomPayloadC2SPacket packet, CallbackInfo ci) { + if (((Object) this) instanceof ServerPlayNetworkHandler handler) { + if (packet.payload() instanceof BBORCustomPayload payload) { + PayloadReader reader = new PayloadReader(payload); + switch (payload.id().toString()) { + case SubscribeToServer.NAME -> { + CommonInterop.playerSubscribed(handler.player); + } + } + ci.cancel(); + } + } + } +} diff --git a/src/main/resources/bbor.mixins.json b/src/main/resources/bbor.mixins.json index fb5012da..10061f58 100644 --- a/src/main/resources/bbor.mixins.json +++ b/src/main/resources/bbor.mixins.json @@ -7,13 +7,14 @@ "mixins": [ "access.IBeaconBlockEntity", "access.IBiome", - "access.IServerPlayNetworkHandler", + "access.IServerCommonNetworkHandler", "access.IStructureStart", - "network.play.c2s.MixinCCustomPayloadPacket", + "network.common.c2s.MixinCCustomPayloadPacket", "server.MixinDynamicRegistryManager", "server.MixinMinecraftServer", "server.MixinThreadedAnvilChunkStorage", "server.management.MixinPlayerList", + "server.network.MixinServerCommonNetworkHandler", "world.chunk.MixinPalettedContainer" ], "client": [ @@ -26,6 +27,7 @@ "client.access.IConduitBlockEntity", "client.gui.screen.MixinChatScreen", "client.gui.screen.MixinOptionsScreen", + "client.network.common.MixinClientCommonNetworkHandler", "client.network.login.MixinClientLoginNetHandler", "client.network.play.MixinClientPlayNetHandler", "client.renderer.MixinDebugHud", @@ -39,11 +41,11 @@ "client.world.extras.MixinBeaconBlockEntity", "client.world.extras.MixinConduitBlockEntity", "client.world.extras.MixinWorldRenderer", - "network.play.s2c.MixinSChatPacket", - "network.play.s2c.MixinSChunkDataPacket", - "network.play.s2c.MixinSCommandListPacket", - "network.play.s2c.MixinSCustomPayloadPlayPacket", - "network.play.s2c.MixinSSpawnPositionPacket" + "network.common.s2c.MixinSChatPacket", + "network.common.s2c.MixinSChunkDataPacket", + "network.common.s2c.MixinSCommandListPacket", + "network.common.s2c.MixinSCustomPayloadPlayPacket", + "network.common.s2c.MixinSSpawnPositionPacket" ], "server": [ "server.dedicated.MixinDedicatedServer"