From 62325b5b34a2a14b4b3b544ca1d5c726495be57e Mon Sep 17 00:00:00 2001 From: fretuks Date: Wed, 1 Apr 2026 11:34:50 +0200 Subject: [PATCH] try to fix server-side crashes --- .../skillengine/api/SkillEngineAPI.java | 29 ++++++------- .../client/ClientSkillEngineBridge.java | 43 +++++++++++++++++++ .../client/SkilltreeClientState.java | 14 +++--- .../ClientboundNodeUnlockedPacket.java | 21 ++++----- .../ClientboundSyncCooldownPacket.java | 16 ++++--- .../network/ClientboundSyncSkillsPacket.java | 19 ++++---- 6 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 src/main/java/net/fretux/skillengine/client/ClientSkillEngineBridge.java diff --git a/src/main/java/net/fretux/skillengine/api/SkillEngineAPI.java b/src/main/java/net/fretux/skillengine/api/SkillEngineAPI.java index 6cd5094..332dc28 100644 --- a/src/main/java/net/fretux/skillengine/api/SkillEngineAPI.java +++ b/src/main/java/net/fretux/skillengine/api/SkillEngineAPI.java @@ -3,6 +3,7 @@ package net.fretux.skillengine.api; import net.fretux.skillengine.SkillEngine; import net.fretux.skillengine.capability.PlayerSkillData; import net.fretux.skillengine.capability.SkillEngineCapabilities; +import net.fretux.skillengine.client.ClientSkillEngineBridge; import net.fretux.skillengine.skilltree.AbilityNode; import net.fretux.skillengine.skilltree.AbilityNodeRegistry; import net.fretux.skillengine.skilltree.SkillLogic; @@ -11,6 +12,7 @@ import net.fretux.skillengine.skilltree.SkillNodeRegistry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.loading.FMLEnvironment; import java.util.List; @@ -131,28 +133,23 @@ public final class SkillEngineAPI { } public static boolean clientHasSkill(ResourceLocation id) { - return FMLEnvironment.dist == Dist.CLIENT && ClientAccess.clientHasSkill(id); + if (FMLEnvironment.dist != Dist.CLIENT) { + return false; + } + return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> ClientSkillEngineBridge.clientHasSkill(id)); } public static int clientGetAbilitySlot(ResourceLocation id) { - return FMLEnvironment.dist == Dist.CLIENT ? ClientAccess.clientGetAbilitySlot(id) : -1; + if (FMLEnvironment.dist != Dist.CLIENT) { + return -1; + } + return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> ClientSkillEngineBridge.clientGetAbilitySlot(id)); } public static ResourceLocation[] clientGetAbilitySlots() { - return FMLEnvironment.dist == Dist.CLIENT ? ClientAccess.clientGetAbilitySlots() : new ResourceLocation[3]; - } - - private static final class ClientAccess { - private static boolean clientHasSkill(ResourceLocation id) { - return net.fretux.skillengine.client.SkilltreeClientState.isUnlocked(id); - } - - private static int clientGetAbilitySlot(ResourceLocation id) { - return net.fretux.skillengine.client.SkilltreeClientState.getSlotOfAbility(id); - } - - private static ResourceLocation[] clientGetAbilitySlots() { - return net.fretux.skillengine.client.SkilltreeClientState.getAbilitySlots(); + if (FMLEnvironment.dist != Dist.CLIENT) { + return new ResourceLocation[3]; } + return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientSkillEngineBridge::clientGetAbilitySlots); } } diff --git a/src/main/java/net/fretux/skillengine/client/ClientSkillEngineBridge.java b/src/main/java/net/fretux/skillengine/client/ClientSkillEngineBridge.java new file mode 100644 index 0000000..d43dd77 --- /dev/null +++ b/src/main/java/net/fretux/skillengine/client/ClientSkillEngineBridge.java @@ -0,0 +1,43 @@ +package net.fretux.skillengine.client; + +import net.minecraft.resources.ResourceLocation; + +public final class ClientSkillEngineBridge { + + private ClientSkillEngineBridge() {} + + public static boolean clientHasSkill(ResourceLocation id) { + return SkilltreeClientState.isUnlocked(id); + } + + public static int clientGetAbilitySlot(ResourceLocation id) { + return SkilltreeClientState.getSlotOfAbility(id); + } + + public static ResourceLocation[] clientGetAbilitySlots() { + return SkilltreeClientState.getAbilitySlots(); + } + + public static void handleNodeUnlocked(ResourceLocation id, int newSkillPoints, boolean isAbility) { + if (isAbility) { + SkilltreeClientState.unlockAbility(id); + } else { + SkilltreeClientState.unlockNode(id); + } + SkilltreeClientState.setCurrentSkillPoints(newSkillPoints); + } + + public static void handleSkillsSync(Iterable unlocked, + Iterable unlockedAbilities, + int skillPoints, + ResourceLocation[] abilitySlots) { + SkilltreeClientState.setUnlocked(unlocked); + SkilltreeClientState.setUnlockedAbilities(unlockedAbilities); + SkilltreeClientState.setCurrentSkillPoints(skillPoints); + SkilltreeClientState.setAbilitySlots(abilitySlots); + } + + public static void handleCooldownSync(int slot, int cooldown) { + SkilltreeClientState.updateCooldown(slot, cooldown); + } +} diff --git a/src/main/java/net/fretux/skillengine/client/SkilltreeClientState.java b/src/main/java/net/fretux/skillengine/client/SkilltreeClientState.java index 6292e59..7beb2d8 100644 --- a/src/main/java/net/fretux/skillengine/client/SkilltreeClientState.java +++ b/src/main/java/net/fretux/skillengine/client/SkilltreeClientState.java @@ -38,14 +38,18 @@ public class SkilltreeClientState { return unlocked.contains(id); } - public static void setUnlocked(Set ids) { + public static void setUnlocked(Iterable ids) { unlocked.clear(); - unlocked.addAll(ids); + for (ResourceLocation id : ids) { + unlocked.add(id); + } } - public static void setUnlockedAbilities(Set abilities) { + public static void setUnlockedAbilities(Iterable abilities) { unlockedAbilities.clear(); - unlockedAbilities.addAll(abilities); + for (ResourceLocation ability : abilities) { + unlockedAbilities.add(ability); + } } public static void setCurrentSkillPoints(int points) { @@ -92,4 +96,4 @@ public class SkilltreeClientState { public static ResourceLocation[] getAbilitySlots() { return Arrays.copyOf(abilitySlots, abilitySlots.length); } -} \ No newline at end of file +} diff --git a/src/main/java/net/fretux/skillengine/network/ClientboundNodeUnlockedPacket.java b/src/main/java/net/fretux/skillengine/network/ClientboundNodeUnlockedPacket.java index ad006eb..779faaa 100644 --- a/src/main/java/net/fretux/skillengine/network/ClientboundNodeUnlockedPacket.java +++ b/src/main/java/net/fretux/skillengine/network/ClientboundNodeUnlockedPacket.java @@ -31,20 +31,17 @@ public class ClientboundNodeUnlockedPacket { public static void handle(ClientboundNodeUnlockedPacket msg, Supplier ctx) { ctx.get().enqueueWork(() -> { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(msg)); + boolean isAbility = AbilityNodeRegistry.get(msg.id) != null; + DistExecutor.unsafeRunWhenOn( + Dist.CLIENT, + () -> () -> net.fretux.skillengine.client.ClientSkillEngineBridge.handleNodeUnlocked( + msg.id, + msg.newSkillPoints, + isAbility + ) + ); }); ctx.get().setPacketHandled(true); } - - private static final class ClientHandler { - private static void handle(ClientboundNodeUnlockedPacket msg) { - if (AbilityNodeRegistry.get(msg.id) != null) { - net.fretux.skillengine.client.SkilltreeClientState.unlockAbility(msg.id); - } else { - net.fretux.skillengine.client.SkilltreeClientState.unlockNode(msg.id); - } - net.fretux.skillengine.client.SkilltreeClientState.setCurrentSkillPoints(msg.newSkillPoints); - } - } } diff --git a/src/main/java/net/fretux/skillengine/network/ClientboundSyncCooldownPacket.java b/src/main/java/net/fretux/skillengine/network/ClientboundSyncCooldownPacket.java index f3a59cd..4ca0419 100644 --- a/src/main/java/net/fretux/skillengine/network/ClientboundSyncCooldownPacket.java +++ b/src/main/java/net/fretux/skillengine/network/ClientboundSyncCooldownPacket.java @@ -27,13 +27,15 @@ public class ClientboundSyncCooldownPacket { } public static void handle(ClientboundSyncCooldownPacket msg, Supplier ctx) { - ctx.get().enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(msg))); + ctx.get().enqueueWork(() -> + DistExecutor.unsafeRunWhenOn( + Dist.CLIENT, + () -> () -> net.fretux.skillengine.client.ClientSkillEngineBridge.handleCooldownSync( + msg.slot, + msg.cooldown + ) + ) + ); ctx.get().setPacketHandled(true); } - - private static final class ClientHandler { - private static void handle(ClientboundSyncCooldownPacket msg) { - net.fretux.skillengine.client.SkilltreeClientState.updateCooldown(msg.slot, msg.cooldown); - } - } } diff --git a/src/main/java/net/fretux/skillengine/network/ClientboundSyncSkillsPacket.java b/src/main/java/net/fretux/skillengine/network/ClientboundSyncSkillsPacket.java index 3819022..c6719a0 100644 --- a/src/main/java/net/fretux/skillengine/network/ClientboundSyncSkillsPacket.java +++ b/src/main/java/net/fretux/skillengine/network/ClientboundSyncSkillsPacket.java @@ -64,17 +64,16 @@ public class ClientboundSyncSkillsPacket { public static void handle(ClientboundSyncSkillsPacket msg, Supplier ctx) { ctx.get().enqueueWork(() -> { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ClientHandler.handle(msg)); + DistExecutor.unsafeRunWhenOn( + Dist.CLIENT, + () -> () -> net.fretux.skillengine.client.ClientSkillEngineBridge.handleSkillsSync( + msg.unlocked, + msg.unlockedAbilities, + msg.skillPoints, + msg.abilitySlots + ) + ); }); ctx.get().setPacketHandled(true); } - - private static final class ClientHandler { - private static void handle(ClientboundSyncSkillsPacket msg) { - net.fretux.skillengine.client.SkilltreeClientState.setUnlocked(msg.unlocked); - net.fretux.skillengine.client.SkilltreeClientState.setUnlockedAbilities(msg.unlockedAbilities); - net.fretux.skillengine.client.SkilltreeClientState.setCurrentSkillPoints(msg.skillPoints); - net.fretux.skillengine.client.SkilltreeClientState.setAbilitySlots(msg.abilitySlots); - } - } }