From e173976cc5f2cfb6b9f06350145cb008d7c00288 Mon Sep 17 00:00:00 2001 From: Yancey <1709185482@qq.com> Date: Sun, 28 Apr 2024 18:43:44 +0800 Subject: [PATCH] version 2.1 --- build.gradle | 2 +- gradle.properties | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../openparticle/core/OpenParticle.java | 13 ++- .../core/client/OpenParticleClient.java | 15 ++- .../openparticle/core/command/CommandPar.java | 101 ++++-------------- .../core/core/OpenParticleCore.java | 15 ++- .../core/keys/KeyboardManager.java | 9 +- .../core/mixin/ParticleManagerMixin.java | 17 ++- .../core/network/KeyboardPayloadC2S.java | 41 +++++++ .../core/network/NetworkHandler.java | 86 --------------- .../core/network/RunTickPayloadS2C.java | 31 ++++++ src/main/resources/native/libOpenParticle.dll | Bin 298139 -> 297937 bytes 13 files changed, 144 insertions(+), 198 deletions(-) create mode 100644 src/main/java/yancey/openparticle/core/network/KeyboardPayloadC2S.java delete mode 100644 src/main/java/yancey/openparticle/core/network/NetworkHandler.java create mode 100644 src/main/java/yancey/openparticle/core/network/RunTickPayloadS2C.java diff --git a/build.gradle b/build.gradle index 68b485b..c47318a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.5.7' + id 'fabric-loom' version '1.6.5' id 'maven-publish' } diff --git a/gradle.properties b/gradle.properties index 510e250..0cda594 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,14 +3,14 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.3 -loader_version=0.15.6 +minecraft_version=1.20.5 +yarn_mappings=1.20.5+build.1 +loader_version=0.15.10 #Fabric api -fabric_version=0.95.0+1.20.4 +fabric_version=0.97.7+1.20.5 # Mod Properties - mod_version = 1.20.4-2.0 + mod_version = 1.20.5-2.1 maven_group = yancey.openparticle archives_base_name = OpenParticle diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3499ded..20db9ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/yancey/openparticle/core/OpenParticle.java b/src/main/java/yancey/openparticle/core/OpenParticle.java index b1f65f3..1e28ff0 100644 --- a/src/main/java/yancey/openparticle/core/OpenParticle.java +++ b/src/main/java/yancey/openparticle/core/OpenParticle.java @@ -3,6 +3,8 @@ import com.mojang.logging.LogUtils; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; import net.minecraft.client.MinecraftClient; import net.minecraft.registry.Registries; @@ -11,7 +13,7 @@ import org.slf4j.Logger; import yancey.openparticle.core.command.CommandPar; import yancey.openparticle.core.keys.KeyboardManager; -import yancey.openparticle.core.network.NetworkHandler; +import yancey.openparticle.core.network.KeyboardPayloadC2S; import java.net.URL; import java.nio.file.Files; @@ -21,7 +23,7 @@ public class OpenParticle implements ModInitializer { - public static final boolean isDebug = true; + public static final boolean isDebug = false; public static final String MOD_ID = "openparticle"; private static final Logger LOGGER = LogUtils.getLogger(); @@ -41,10 +43,13 @@ public void onInitialize() { } } System.load(dest.toString()); - NetworkHandler.initServer(); + PayloadTypeRegistry.playC2S().register(KeyboardPayloadC2S.ID, KeyboardPayloadC2S.CODEC); + ServerPlayNetworking.registerGlobalReceiver(KeyboardPayloadC2S.ID, (payload, context) -> + context.player().server.execute(() -> + KeyboardManager.runInServe(payload.idList(), context.player()))); KeyboardManager.init(false); Registry.register(Registries.PARTICLE_TYPE, new Identifier(MOD_ID, "better_particle"), FabricParticleTypes.simple()); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - CommandPar.init(dispatcher, true)); + CommandPar.init(dispatcher)); } } diff --git a/src/main/java/yancey/openparticle/core/client/OpenParticleClient.java b/src/main/java/yancey/openparticle/core/client/OpenParticleClient.java index e850116..1f907cf 100644 --- a/src/main/java/yancey/openparticle/core/client/OpenParticleClient.java +++ b/src/main/java/yancey/openparticle/core/client/OpenParticleClient.java @@ -1,15 +1,22 @@ package yancey.openparticle.core.client; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import yancey.openparticle.core.core.OpenParticleCore; import yancey.openparticle.core.keys.KeyboardManager; -import yancey.openparticle.core.network.NetworkHandler; +import yancey.openparticle.core.network.RunTickPayloadS2C; public class OpenParticleClient implements ClientModInitializer { @Override public void onInitializeClient() { - NetworkHandler.initClient(); + PayloadTypeRegistry.playS2C().register(RunTickPayloadS2C.ID, RunTickPayloadS2C.CODEC); + ClientPlayNetworking.registerGlobalReceiver(RunTickPayloadS2C.ID, (payload, context) -> { + if (context.player().getWorld() == null) { + return; + } + OpenParticleCore.runTick(payload.path(), payload.tick()); + }); KeyboardManager.init(true); -// ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> -// CommandPar.init(dispatcher, false)); } } diff --git a/src/main/java/yancey/openparticle/core/command/CommandPar.java b/src/main/java/yancey/openparticle/core/command/CommandPar.java index d6b8a1a..359238f 100644 --- a/src/main/java/yancey/openparticle/core/command/CommandPar.java +++ b/src/main/java/yancey/openparticle/core/command/CommandPar.java @@ -3,97 +3,36 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.command.CommandSource; -import net.minecraft.network.PacketByteBuf; +import com.mojang.brigadier.context.CommandContext; import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; import yancey.openparticle.core.core.OpenParticleCore; -import yancey.openparticle.core.network.NetworkHandler; -import java.util.function.Function; +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; public class CommandPar { - public static void init(CommandDispatcher dispatcher, boolean isInitInServer) { - if (isInitInServer) { - command(dispatcher, true, false); - } - command(dispatcher, isInitInServer, true); + public static void init(CommandDispatcher dispatcher) { + RequiredArgumentBuilder path = argument("path", StringArgumentType.greedyString()); + dispatcher.register(literal("par") + .requires(source -> source.hasPermissionLevel(2)) + .then(literal("loadAndRun").then(path.executes(context -> execute(context, true, true)))) + .then(literal("load").then(path.executes(context -> execute(context, true, false)))) + .then(literal("run").executes(context -> execute(context, false, true)))); } - private static void command(CommandDispatcher dispatcher, boolean isInitInServer, boolean isRunInClient) { - LiteralArgumentBuilder builder = LiteralArgumentBuilder.literal(isRunInClient ? "parc" : "par"); - Function> literal = LiteralArgumentBuilder::literal; - if (isInitInServer) { - builder.requires(source -> source.hasPermissionLevel(2)); - } else { - builder.then(literal.apply("stop").executes(context -> { - OpenParticleCore.stop(); - return 1; - })); - } - RequiredArgumentBuilder path = RequiredArgumentBuilder.argument("path", StringArgumentType.greedyString()); - Function> execute = identifier -> - path.executes(executeFile(identifier, isRunInClient)); - dispatcher.register(builder - .then(literal.apply("loadAndRun") - .then(execute.apply(NetworkHandler.ID_LOAD_AND_RUN))) - .then(literal.apply("load") - .then(execute.apply(NetworkHandler.ID_LOAD))) - .then(literal.apply("run") - .executes(executeFile(NetworkHandler.ID_RUN, isRunInClient))) - ); - } - - private static Command executeFile(Identifier identifier, boolean isRunInClient) { - return context -> { - String path = null; - if (identifier != NetworkHandler.ID_RUN) { - path = StringArgumentType.getString(context, "path"); - } - World world; - CommandSource source = context.getSource(); - if (source instanceof FabricClientCommandSource clientCommandSource) { - world = clientCommandSource.getWorld(); - } else if (source instanceof ServerCommandSource serverCommandSource) { - world = serverCommandSource.getWorld(); - if (isRunInClient) { - PacketByteBuf packetByteBuf = PacketByteBufs.create(); - if (path != null) { - packetByteBuf.writeString(path); - } - for (ServerPlayerEntity serverPlayerEntity : serverCommandSource.getServer().getPlayerManager().getPlayerList()) { - ServerPlayNetworking.send(serverPlayerEntity, identifier, packetByteBuf); - } - return 1; - } - } else { - throw new RuntimeException("unknown command source"); + public static int execute(CommandContext context, boolean isLoad, boolean isRun) { + if (isLoad) { + String path = StringArgumentType.getString(context, "path"); + if (!OpenParticleCore.loadFile(path)) { + return 2; } - if (world.isClient) { - return -1; - } - ServerWorld serverWorld = (ServerWorld) world; - boolean isSuccess = true; - if (identifier == NetworkHandler.ID_LOAD) { - isSuccess = OpenParticleCore.loadFile(path); - } else if (identifier == NetworkHandler.ID_RUN) { - OpenParticleCore.run(serverWorld); - } else if (identifier == NetworkHandler.ID_LOAD_AND_RUN) { - isSuccess = OpenParticleCore.loadAndRun(path, serverWorld); - } else { - throw new RuntimeException("unknown identifier -> " + identifier); - } - return isSuccess ? 1 : -1; - }; + } + if (isRun && !OpenParticleCore.run(context.getSource().getWorld())) { + return 3; + } + return Command.SINGLE_SUCCESS; } } diff --git a/src/main/java/yancey/openparticle/core/core/OpenParticleCore.java b/src/main/java/yancey/openparticle/core/core/OpenParticleCore.java index 82c4356..c89d358 100644 --- a/src/main/java/yancey/openparticle/core/core/OpenParticleCore.java +++ b/src/main/java/yancey/openparticle/core/core/OpenParticleCore.java @@ -3,12 +3,14 @@ import com.mojang.logging.LogUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.mixin.client.particle.ParticleManagerAccessor.SimpleSpriteProviderAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.particle.SpriteProvider; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.Camera; import net.minecraft.client.texture.Sprite; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.HoverEvent; import net.minecraft.text.Text; @@ -22,7 +24,7 @@ import yancey.openparticle.core.events.RunningEventManager; import yancey.openparticle.core.mixin.BufferBuilderAccessor; import yancey.openparticle.core.mixin.ParticleManagerAccessor; -import yancey.openparticle.core.network.NetworkHandler; +import yancey.openparticle.core.network.RunTickPayloadS2C; import java.io.PrintWriter; import java.io.StringWriter; @@ -60,6 +62,7 @@ public class OpenParticleCore { private OpenParticleCore() { } + private static float lastRunTick = -1; private static float lastTickDelta = -1; @@ -118,9 +121,12 @@ public static void stop() { RunningEventManager.INSTANCE.stop(); } - public static void run(ServerWorld world) { + public static boolean run(ServerWorld world) { if (openParticleProject != null) { run(openParticleProject.path, world); + return true; + } else { + return false; } } @@ -134,7 +140,10 @@ public static void run(String path, ServerWorld world) { stop(); return; } - NetworkHandler.runTick(world, path, nextTick++); + RunTickPayloadS2C payload = new RunTickPayloadS2C(path, nextTick++); + for (ServerPlayerEntity serverPlayerEntity : world.getServer().getPlayerManager().getPlayerList()) { + ServerPlayNetworking.send(serverPlayerEntity, payload); + } } finally { LOCK.unlock(); } diff --git a/src/main/java/yancey/openparticle/core/keys/KeyboardManager.java b/src/main/java/yancey/openparticle/core/keys/KeyboardManager.java index ba4571d..6bab255 100644 --- a/src/main/java/yancey/openparticle/core/keys/KeyboardManager.java +++ b/src/main/java/yancey/openparticle/core/keys/KeyboardManager.java @@ -3,12 +3,13 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import org.lwjgl.glfw.GLFW; import yancey.openparticle.core.core.OpenParticleCore; import yancey.openparticle.core.mixin.KeyBindingAccessor; -import yancey.openparticle.core.network.NetworkHandler; +import yancey.openparticle.core.network.KeyboardPayloadC2S; import java.util.ArrayList; import java.util.List; @@ -51,7 +52,7 @@ public static void init(boolean isClient) { } } if (idList != null) { - NetworkHandler.keyBoardToServer(idList); + ClientPlayNetworking.send(new KeyboardPayloadC2S(idList)); } }); } @@ -65,8 +66,8 @@ public static void register(boolean isClient, String description, int keyCode, b } } - public static void runInServe(int[] idList, ServerPlayerEntity entityPlayerMP) { - for (Integer id : idList) { + public static void runInServe(List idList, ServerPlayerEntity entityPlayerMP) { + for (int id : idList) { onKeyPressedListenerList.get(id).onKeyPressed(entityPlayerMP); } } diff --git a/src/main/java/yancey/openparticle/core/mixin/ParticleManagerMixin.java b/src/main/java/yancey/openparticle/core/mixin/ParticleManagerMixin.java index 85f7b95..e526b79 100644 --- a/src/main/java/yancey/openparticle/core/mixin/ParticleManagerMixin.java +++ b/src/main/java/yancey/openparticle/core/mixin/ParticleManagerMixin.java @@ -5,13 +5,13 @@ import net.minecraft.client.particle.ParticleTextureSheet; import net.minecraft.client.render.*; import net.minecraft.client.texture.TextureManager; -import net.minecraft.client.util.math.MatrixStack; 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.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import yancey.openparticle.core.core.OpenParticleCore; @Mixin(ParticleManager.class) @@ -22,14 +22,10 @@ public abstract class ParticleManagerMixin { private TextureManager textureManager; - @Inject(method = "renderParticles", at = @At(value = "HEAD")) - private void injectRenderParticles(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, LightmapTextureManager lightmapTextureManager, Camera camera, float tickDelta, CallbackInfo ci) { + @Inject(method = "renderParticles", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;depthMask(Z)V", shift = At.Shift.BEFORE)) + private void injectRenderParticles(LightmapTextureManager lightmapTextureManager, Camera camera, float tickDelta, CallbackInfo ci) { lightmapTextureManager.enable(); RenderSystem.enableDepthTest(); - MatrixStack matrixStack = RenderSystem.getModelViewStack(); - matrixStack.push(); - matrixStack.multiplyPositionMatrix(matrices.peek().getPositionMatrix()); - RenderSystem.applyModelViewMatrix(); RenderSystem.setShader(GameRenderer::getParticleProgram); Tessellator tessellator = Tessellator.getInstance(); @@ -38,8 +34,6 @@ private void injectRenderParticles(MatrixStack matrices, VertexConsumerProvider. OpenParticleCore.render(camera, tickDelta, bufferBuilder); ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT.draw(tessellator); - matrixStack.pop(); - RenderSystem.applyModelViewMatrix(); RenderSystem.depthMask(true); RenderSystem.disableBlend(); lightmapTextureManager.disable(); @@ -50,4 +44,9 @@ private void injectTick(CallbackInfo ci) { OpenParticleCore.tick(); } + @Inject(method = "getDebugString", at = @At(value = "RETURN"), cancellable = true) + private void injectGetDebugString(CallbackInfoReturnable cir) { + cir.setReturnValue(String.valueOf(Integer.parseInt(cir.getReturnValue()) + OpenParticleCore.getParticleSize())); + } + } \ No newline at end of file diff --git a/src/main/java/yancey/openparticle/core/network/KeyboardPayloadC2S.java b/src/main/java/yancey/openparticle/core/network/KeyboardPayloadC2S.java new file mode 100644 index 0000000..51ad1ee --- /dev/null +++ b/src/main/java/yancey/openparticle/core/network/KeyboardPayloadC2S.java @@ -0,0 +1,41 @@ +package yancey.openparticle.core.network; + +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; + +import java.util.ArrayList; +import java.util.List; + +import static yancey.openparticle.core.OpenParticle.MOD_ID; + +public record KeyboardPayloadC2S(List idList) implements CustomPayload { + + public static final CustomPayload.Id ID = new CustomPayload.Id<>(new Identifier(MOD_ID, "key_board")); + public static final PacketCodec CODEC = new PacketCodec<>() { + @Override + public KeyboardPayloadC2S decode(RegistryByteBuf buf) { + int size = buf.readInt(); + List idList = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + idList.add(buf.readInt()); + } + return new KeyboardPayloadC2S(idList); + } + + @Override + public void encode(RegistryByteBuf buf, KeyboardPayloadC2S value) { + buf.writeInt(value.idList.size()); + for (int j : value.idList) { + buf.writeInt(j); + } + } + }; + + @Override + public Id getId() { + return ID; + } + +} diff --git a/src/main/java/yancey/openparticle/core/network/NetworkHandler.java b/src/main/java/yancey/openparticle/core/network/NetworkHandler.java deleted file mode 100644 index 8cb1ffd..0000000 --- a/src/main/java/yancey/openparticle/core/network/NetworkHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package yancey.openparticle.core.network; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import yancey.openparticle.core.core.OpenParticleCore; -import yancey.openparticle.core.keys.KeyboardManager; - -import java.util.List; -import java.util.Objects; - -import static yancey.openparticle.core.OpenParticle.MOD_ID; - -public class NetworkHandler { - - public static final Identifier ID_KEY_BOARD = new Identifier(MOD_ID, "key_board"); - public static final Identifier ID_RUN_TICK = new Identifier(MOD_ID, "run_tick"); - public static final Identifier ID_LOAD = new Identifier(MOD_ID, "load_in_client"); - public static final Identifier ID_RUN = new Identifier(MOD_ID, "run_in_client"); - public static final Identifier ID_LOAD_AND_RUN = new Identifier(MOD_ID, "load_and_run_in_client"); - - public static void initServer() { - //执行按键的服务端事件 - ServerPlayNetworking.registerGlobalReceiver(ID_KEY_BOARD, (server, player, handler, buf, responseSender) -> { - int[] idList = new int[buf.readInt()]; - for (int i = 0; i < idList.length; i++) { - idList[i] = buf.readInt(); - } - server.execute(() -> KeyboardManager.runInServe(idList, player)); - }); - } - - @Environment(EnvType.CLIENT) - public static void initClient() { - //运行指定tick的粒子 - ClientPlayNetworking.registerGlobalReceiver(ID_RUN_TICK, (client, handler, buf, responseSender) -> { - if (handler.getWorld() != null) { - String path = buf.readString(); - int tick = buf.readInt(); - OpenParticleCore.runTick(path.isEmpty() ? null : path, tick); - } - }); - //加载并运行粒子文件 -// ClientPlayNetworking.registerGlobalReceiver(ID_LOAD_AND_RUN, (client, handler, buf, responseSender) -> { -// if (handler.getWorld() != null) { -// OpenParticleCore.loadAndRun(buf.readString(), handler.getWorld()); -// } -// }); - //加载粒子文件 -// ClientPlayNetworking.registerGlobalReceiver(ID_LOAD, (client, handler, buf, responseSender) -> -// OpenParticleCore.loadFile(buf.readString())); - //运行粒子文件 -// ClientPlayNetworking.registerGlobalReceiver(ID_RUN, (client, handler, buf, responseSender) -> { -// if (handler.getWorld() != null) { -// OpenParticleCore.run(OpenParticleCore.lastPath, handler.getWorld()); -// } -// }); - } - - @Environment(EnvType.CLIENT) - public static void keyBoardToServer(List idList) { - //执行按键的服务端事件 - PacketByteBuf buf = PacketByteBufs.create(); - buf.writeInt(idList.size()); - for (Integer id : idList) { - buf.writeInt(id); - } - ClientPlayNetworking.send(ID_KEY_BOARD, buf); - } - - public static void runTick(ServerWorld world, String path, int tick) { - //生成粒子 - PacketByteBuf packetByteBuf = PacketByteBufs.create(); - packetByteBuf.writeString(Objects.requireNonNullElse(path, "")); - packetByteBuf.writeInt(tick); - for (ServerPlayerEntity serverPlayerEntity : world.getServer().getPlayerManager().getPlayerList()) { - ServerPlayNetworking.send(serverPlayerEntity, ID_RUN_TICK, packetByteBuf); - } - } -} diff --git a/src/main/java/yancey/openparticle/core/network/RunTickPayloadS2C.java b/src/main/java/yancey/openparticle/core/network/RunTickPayloadS2C.java new file mode 100644 index 0000000..9014460 --- /dev/null +++ b/src/main/java/yancey/openparticle/core/network/RunTickPayloadS2C.java @@ -0,0 +1,31 @@ +package yancey.openparticle.core.network; + +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; + +import static yancey.openparticle.core.OpenParticle.MOD_ID; + +public record RunTickPayloadS2C(String path, int tick) implements CustomPayload { + + public static final CustomPayload.Id ID = new CustomPayload.Id<>(new Identifier(MOD_ID, "run_tick")); + public static final PacketCodec CODEC = new PacketCodec<>() { + @Override + public RunTickPayloadS2C decode(RegistryByteBuf buf) { + return new RunTickPayloadS2C(buf.readString(), buf.readInt()); + } + + @Override + public void encode(RegistryByteBuf buf, RunTickPayloadS2C value) { + buf.writeString(value.path); + buf.writeInt(value.tick); + } + }; + + @Override + public Id getId() { + return ID; + } + +} diff --git a/src/main/resources/native/libOpenParticle.dll b/src/main/resources/native/libOpenParticle.dll index 4be0b368cbac7762f46216d1917cde302ff522ac..8ad9e9d7a102be1e68cd1fec2d47b5ad1f740c4e 100644 GIT binary patch delta 30157 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 TSwe+dGXE1*da%Onx1IkBQdgQw delta 30330 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