diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 139d24511..bce8d79ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -161,16 +161,17 @@ public class BukkitNetworkManager implements NetworkManager, Listener { this.onlineUsers.remove(player.getUniqueId()); } + // for mod @EventHandler public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) { - if (!event.getChannel().equals("craftengine:payload")) return; + if (!event.getChannel().equals(MOD_CHANNEL)) return; Player player = event.getPlayer(); NetWorkUser user = getUser(player); if (user == null) return; - user.setUsingClientMod(true); + user.setClientModState(true); int blockRegistrySize = RegistryUtils.currentBlockRegistrySize(); byte[] payload = ("cp:" + blockRegistrySize).getBytes(StandardCharsets.UTF_8); - player.sendPluginMessage(plugin.bootstrap(), "craftengine:payload", payload); + player.sendPluginMessage(plugin.bootstrap(), MOD_CHANNEL, payload); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 28dcf9ef2..51dc3732e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -69,37 +69,7 @@ public class PacketConsumers { public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { try { - if (!user.usingClientMod()) { - BukkitServerPlayer player = (BukkitServerPlayer) user; - Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); - byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); - ByteBuf buf = Unpooled.copiedBuffer(buffer); - FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); - FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); - for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { - try { - MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); - mcSection.readPacket(friendlyByteBuf); - PalettedContainer container = mcSection.blockStateContainer(); - Palette palette = container.data().palette(); - if (palette.canRemap()) { - palette.remap(PacketConsumers::remap); - } else { - for (int j = 0; j < 4096; j++) { - int state = container.get(j); - int newState = remap(state); - if (newState != state) { - container.set(j, newState); - } - } - } - mcSection.writePacket(newBuf); - } catch (Exception e) { - break; - } - } - Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); - } else { + if (user.clientModEnabled()) { BukkitServerPlayer player = (BukkitServerPlayer) user; Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); @@ -129,6 +99,36 @@ public class PacketConsumers { } } Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } else { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); + byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); + ByteBuf buf = Unpooled.copiedBuffer(buffer); + FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); + FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { + try { + MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); + mcSection.readPacket(friendlyByteBuf); + PalettedContainer container = mcSection.blockStateContainer(); + Palette palette = container.data().palette(); + if (palette.canRemap()) { + palette.remap(PacketConsumers::remap); + } else { + for (int j = 0; j < 4096; j++) { + int state = container.get(j); + int newState = remap(state); + if (newState != state) { + container.set(j, newState); + } + } + } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; + } + } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e); @@ -137,7 +137,7 @@ public class PacketConsumers { public static final BiConsumer SECTION_BLOCK_UPDATE = (user, event) -> { try { - if (!user.usingClientMod()) { + if (user.clientModEnabled()) { FriendlyByteBuf buf = event.getBuffer(); long pos = buf.readLong(); int blocks = buf.readVarInt(); @@ -146,7 +146,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - states[i] = remap((int) (k >>> 12)); + states[i] = remapMOD((int) (k >>> 12)); } buf.clear(); buf.writeVarInt(event.packetID()); @@ -165,7 +165,7 @@ public class PacketConsumers { for (int i = 0; i < blocks; i++) { long k = buf.readVarLong(); positions[i] = (short) ((int) (k & 4095L)); - states[i] = remapMOD((int) (k >>> 12)); + states[i] = remap((int) (k >>> 12)); } buf.clear(); buf.writeVarInt(event.packetID()); @@ -186,7 +186,7 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); BlockPos pos = buf.readBlockPos(buf); int before = buf.readVarInt(); - if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(before)) { + if (user.clientModEnabled() && !BlockStateUtils.isVanillaBlock(before)) { return; } int state = remap(before); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 90180937c..84698bc75 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -63,9 +63,9 @@ public class BukkitServerPlayer extends Player { private Key lastUsedRecipe = null; - private boolean usingClientMod = false; - - private Map> furnitureView = new ConcurrentHashMap<>(); + private boolean hasClientMod = false; + // for better fake furniture visual sync + private final Map> furnitureView = new ConcurrentHashMap<>(); public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { this.channel = channel; @@ -619,11 +619,11 @@ public class BukkitServerPlayer extends Player { this.lastUsedRecipe = lastUsedRecipe; } - public boolean usingClientMod() { - return this.usingClientMod; + public boolean clientModEnabled() { + return this.hasClientMod; } - public void setUsingClientMod(boolean usingClientMod) { - this.usingClientMod = usingClientMod; + public void setClientModState(boolean enable) { + this.hasClientMod = enable; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index cb80057c8..4844ff92d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -37,7 +37,7 @@ public interface NetWorkUser { Map> furnitureView(); - boolean usingClientMod(); + boolean clientModEnabled(); - void setUsingClientMod(boolean usingClientMod); + void setClientModState(boolean enable); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java index 2a8341e1f..4b0a0dc77 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -6,6 +6,8 @@ import net.momirealms.craftengine.core.entity.player.Player; import java.util.Collection; public interface NetworkManager { + String MOD_CHANNEL = "craftengine:payload"; + void setUser(Channel channel, NetWorkUser user); NetWorkUser getUser(Channel channel); diff --git a/gradle.properties b/gradle.properties index 31fb8339e..54d75bea8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,6 +49,11 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 +# Ignite Dependencies +mixinextras_version=0.4.1 +mixin_version=0.15.2+mixin.0.8.7 +ignite_version=1.1.0 +tiny_remapper_version=0.10.4 # Fabric Dependencies fabric_version=0.119.2+1.21.4 yarn_mappings=1.21.4+build.8 diff --git a/server-mod/build.gradle.kts b/server-mod/build.gradle.kts index cb3c3b595..f407dd6fe 100644 --- a/server-mod/build.gradle.kts +++ b/server-mod/build.gradle.kts @@ -14,11 +14,11 @@ repositories { dependencies { implementation(project(":shared")) - remapper("net.fabricmc:tiny-remapper:0.10.4:fat") - paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:1.21.4-R0.1-SNAPSHOT") - compileOnly("space.vectrix.ignite:ignite-api:1.1.0") - compileOnly("net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7") - compileOnly("io.github.llamalad7:mixinextras-common:0.4.1") + remapper("net.fabricmc:tiny-remapper:${rootProject.properties["tiny_remapper_version"]}:fat") + paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:${property("latest_minecraft_version")}-R0.1-SNAPSHOT") + compileOnly("space.vectrix.ignite:ignite-api:${rootProject.properties["ignite_version"]}") + compileOnly("net.fabricmc:sponge-mixin:${rootProject.properties["mixin_version"]}") + compileOnly("io.github.llamalad7:mixinextras-common:${rootProject.properties["mixinextras_version"]}") } java {