try to fix server-side crashes

This commit is contained in:
2026-04-01 11:34:50 +02:00
parent 56efa4d814
commit 62325b5b34
6 changed files with 92 additions and 50 deletions
@@ -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);
}
}
@@ -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<ResourceLocation> unlocked,
Iterable<ResourceLocation> 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);
}
}
@@ -38,14 +38,18 @@ public class SkilltreeClientState {
return unlocked.contains(id);
}
public static void setUnlocked(Set<ResourceLocation> ids) {
public static void setUnlocked(Iterable<ResourceLocation> ids) {
unlocked.clear();
unlocked.addAll(ids);
for (ResourceLocation id : ids) {
unlocked.add(id);
}
}
public static void setUnlockedAbilities(Set<ResourceLocation> abilities) {
public static void setUnlockedAbilities(Iterable<ResourceLocation> abilities) {
unlockedAbilities.clear();
unlockedAbilities.addAll(abilities);
for (ResourceLocation ability : abilities) {
unlockedAbilities.add(ability);
}
}
public static void setCurrentSkillPoints(int points) {
@@ -31,20 +31,17 @@ public class ClientboundNodeUnlockedPacket {
public static void handle(ClientboundNodeUnlockedPacket msg, Supplier<NetworkEvent.Context> 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);
}
}
}
@@ -27,13 +27,15 @@ public class ClientboundSyncCooldownPacket {
}
public static void handle(ClientboundSyncCooldownPacket msg, Supplier<NetworkEvent.Context> 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);
}
}
}
@@ -64,17 +64,16 @@ public class ClientboundSyncSkillsPacket {
public static void handle(ClientboundSyncSkillsPacket msg, Supplier<NetworkEvent.Context> 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);
}
}
}