SuperLeadRope/src/main/java/top/r3944realms/superleadrope/compat/LuckPermsCompat.java
3944Realms 014e97662a 做了LuckPerms适配
补充了下指令文档
2025-12-01 17:29:58 +08:00

96 lines
3.4 KiB
Java

package top.r3944realms.superleadrope.compat;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.context.*;
import net.luckperms.api.node.Node;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.fml.ModList;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import top.r3944realms.superleadrope.SuperLeadRope;
import top.r3944realms.superleadrope.util.capability.LeashDataInnerAPI;
import java.util.Objects;
public class LuckPermsCompat {
public final static boolean isModLoaded = ModList.get().isLoaded("luckperms");
public static volatile ILPC instance;
public interface ILPC {
void init();
default boolean isLeashedBypass(Entity player) { return false; }
}
@Contract(" -> new")
public static @NotNull ILPC getOrCreateLPC() {
if (instance == null) {
synchronized (LuckPermsCompat.class) {
if (instance == null) {
if (!isModLoaded) {
instance = new DummyLPC();
} else instance = new RealLPC();
}
}
}
return instance;
}
// 空实现
private static class DummyLPC implements ILPC {
@Override
public void init() {}
}
// 真实实现(只有在模组加载时才被初始化)
private static class RealLPC implements ILPC {
private boolean isInitialized;
private LuckPerms luckPerms ;
private final Node LeashBypass = Node.builder(SuperLeadRope.MOD_ID + ".leash.bypass").build();
public RealLPC() {
isInitialized = false;
init();
}
@Override
public void init() {
try {
luckPerms = LuckPermsProvider.get();
luckPerms.getContextManager().registerCalculator(new LeashCalculator());
isInitialized = true;
} catch (IllegalStateException e) {
SuperLeadRope.logger.error("LuckPermsCompat failed to initialize", e);
}
}
@Override
public boolean isLeashedBypass(Entity player) {
if (!(player instanceof Player)) return false;
return isInitialized && luckPerms.getUserManager().isLoaded(player.getUUID()) &&
Objects.requireNonNull(luckPerms.getUserManager().getUser(player.getUUID()))
.getNodes()
.stream()
.filter(i -> i.equals(LeashBypass))
.findFirst()
.map(Node::getValue)
.orElse(false);
}
public static class LeashCalculator implements ContextCalculator<Player> {
@Override
public void calculate(@NotNull Player target, ContextConsumer contextConsumer) {
contextConsumer.accept("isLeashed", String.valueOf(LeashDataInnerAPI.QueryOperations.hasLeash(target)));
}
@Override
public @NotNull ContextSet estimatePotentialContexts() {
ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
builder.add("isLeashed", "false");
builder.add("isLeashed", "true");
return builder.build();
}
}
}
}