diff --git a/1.18.2/Common/build.gradle b/1.18.2/Common/build.gradle index a8e4f79..af5315c 100644 --- a/1.18.2/Common/build.gradle +++ b/1.18.2/Common/build.gradle @@ -1,6 +1,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } diff --git a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..ca1fd4b --- /dev/null +++ b/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.INSTANCE.getManager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.INSTANCE.getManager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.18.2/build.gradle b/1.18.2/build.gradle index fbe3bec..a911062 100644 --- a/1.18.2/build.gradle +++ b/1.18.2/build.gradle @@ -72,6 +72,7 @@ subprojects { shade "net.kyori:adventure-text-minimessage:${adventure}" stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") compileOnly 'net.luckperms:api:5.4' compileOnly("org.projectlombok:lombok:${lombok}") diff --git a/1.18.2/changelog.md b/1.18.2/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.18.2/changelog.md +++ b/1.18.2/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.18.2/gradle.properties b/1.18.2/gradle.properties index ad3c439..b690303 100644 --- a/1.18.2/gradle.properties +++ b/1.18.2/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -28,6 +28,7 @@ rpc_sdk=1.0 discord_formatter=2.0.0 # Mod Dependencies +ftb_ranks=1802.1.11-build.71 ftb_essentials=1802.2.2-build.83 fabrictailor=1.9.0+1.18.2 vanish=1.1.0 diff --git a/1.19.2/Common/build.gradle b/1.19.2/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.19.2/Common/build.gradle +++ b/1.19.2/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..ca1fd4b --- /dev/null +++ b/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.INSTANCE.getManager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.INSTANCE.getManager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.19.2/Fabric/build.gradle b/1.19.2/Fabric/build.gradle index 4067f50..6596fbe 100644 --- a/1.19.2/Fabric/build.gradle +++ b/1.19.2/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.19.2/Forge/build.gradle b/1.19.2/Forge/build.gradle index d9fe734..cc27bca 100644 --- a/1.19.2/Forge/build.gradle +++ b/1.19.2/Forge/build.gradle @@ -6,6 +6,8 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod}") stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") + // Do not edit or remove implementation project(":Common") } diff --git a/1.19.2/changelog.md b/1.19.2/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.19.2/changelog.md +++ b/1.19.2/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.19.2/gradle.properties b/1.19.2/gradle.properties index aa962a1..814d16f 100644 --- a/1.19.2/gradle.properties +++ b/1.19.2/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -28,6 +28,7 @@ rpc_sdk=1.0 discord_formatter=2.0.0 # Mod Dependencies +ftb_ranks=1902.1.16-build.114 ftb_essentials=1902.3.5-build.135 fabrictailor=2.0.1 vanish=1.3.2 diff --git a/1.19.3/Common/build.gradle b/1.19.3/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.19.3/Common/build.gradle +++ b/1.19.3/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.19.3/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.19.3/Fabric/build.gradle b/1.19.3/Fabric/build.gradle index 18cf7f3..730454c 100644 --- a/1.19.3/Fabric/build.gradle +++ b/1.19.3/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.19.3/Forge/build.gradle b/1.19.3/Forge/build.gradle index 8f027ab..fe2ce6b 100644 --- a/1.19.3/Forge/build.gradle +++ b/1.19.3/Forge/build.gradle @@ -6,6 +6,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod}") stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.19.3/changelog.md b/1.19.3/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.19.3/changelog.md +++ b/1.19.3/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.19.3/gradle.properties b/1.19.3/gradle.properties index 580f17b..36af91b 100644 --- a/1.19.3/gradle.properties +++ b/1.19.3/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -28,6 +28,7 @@ rpc_sdk=1.0 discord_formatter=2.0.0 # Mod Dependencies +ftb_ranks=1904.1.1-build.82 ftb_essentials=1904.1.0-build.81-SNAPSHOT fabrictailor=2.0.2 vanish=1.4.0+1.19.3 diff --git a/1.20.2/Common/build.gradle b/1.20.2/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.20.2/Common/build.gradle +++ b/1.20.2/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.20.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.20.2/Fabric/build.gradle b/1.20.2/Fabric/build.gradle index af41957..f305cd3 100644 --- a/1.20.2/Fabric/build.gradle +++ b/1.20.2/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.20.2/Forge/build.gradle b/1.20.2/Forge/build.gradle index ad7c988..2181003 100644 --- a/1.20.2/Forge/build.gradle +++ b/1.20.2/Forge/build.gradle @@ -6,6 +6,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod}") stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.20.2/changelog.md b/1.20.2/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.20.2/changelog.md +++ b/1.20.2/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.20.2/gradle.properties b/1.20.2/gradle.properties index 9df3f61..8870e69 100644 --- a/1.20.2/gradle.properties +++ b/1.20.2/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -28,6 +28,7 @@ rpc_sdk=1.0 discord_formatter=2.0.0 # Mod Dependencies +ftb_ranks=2001.1.3 ftb_essentials=2001.2.2 fabrictailor=2.2.1 vanish=1.5.0+1.20.2 diff --git a/1.20.4/Common/build.gradle b/1.20.4/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.20.4/Common/build.gradle +++ b/1.20.4/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.20.4/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.20.4/Fabric/build.gradle b/1.20.4/Fabric/build.gradle index 7ce8c69..571ddd8 100644 --- a/1.20.4/Fabric/build.gradle +++ b/1.20.4/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.20.4/Forge/build.gradle b/1.20.4/Forge/build.gradle index 28df2c5..d878cc2 100644 --- a/1.20.4/Forge/build.gradle +++ b/1.20.4/Forge/build.gradle @@ -6,6 +6,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod}") stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.20.4/NeoForge/build.gradle b/1.20.4/NeoForge/build.gradle index 0931e82..e69de29 100644 --- a/1.20.4/NeoForge/build.gradle +++ b/1.20.4/NeoForge/build.gradle @@ -1,117 +0,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { - // Compat - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") - - // Do not edit or remove - implementation project(":Common") -} - -shadowJar { - from sourceSets.main.output - configurations = [project.configurations.shade] - - dependencies { - exclude(dependency('com.google.code.gson:.*')) - - relocate 'me.hypherionmc.moonconfig', 'shadow.hypherionmc.moonconfig' - relocate 'me.hypherionmc.mcdiscordformatter', 'shadow.hypherionmc.mcdiscordformatter' - relocate 'net.kyori', 'shadow.kyori' - } - - setArchiveClassifier('dev-shadow') - mergeServiceFiles() -} - -/** - * =============================================================================== - * = DO NOT EDIT BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING = - * =============================================================================== - */ - -unimined.minecraft { - neoForged { - loader neoforge_version - mixinConfig("${mod_id}.mixins.json", "${mod_id}.neoforge.mixins.json") - } -} - -remapJar { - inputFile.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier.set null -} - -jar { - archiveClassifier.set "dev" -} - -processResources { - from project(":Common").sourceSets.main.resources - def buildProps = project.properties.clone() - - filesMatching("META-INF/mods.toml") { - expand buildProps - } -} - -compileTestJava.enabled = false - -tasks.withType(JavaCompile).configureEach { - source(project(":Common").sourceSets.main.allSource) -} - -/** - * Publishing Config - */ -publishing { - publications { - mavenJava(MavenPublication) { - artifactId project.archivesBaseName - from components.java - - artifact(remapJar) { - builtBy remapJar - } - - pom.withXml { - Node pomNode = asNode() - pomNode.dependencies.'*'.findAll() { - it.artifactId.text() == 'regutils-joined-fabric' || - it.artifactId.text() == 'core' || - it.artifactId.text() == 'toml' - }.each() { - it.parent().remove(it) - } - } - } - } - - repositories { - maven rootProject.orion.getPublishingMaven() - } -} - -publisher { - apiKeys { - modrinth(System.getenv("MODRINTH_TOKEN")) - curseforge(System.getenv("CURSE_TOKEN")) - nightbloom(System.getenv("PLATFORM_KEY")) - } - - setCurseID(curse_id) - setModrinthID(modrinth_id) - setNightbloomID("craterlib") - setVersionType("release") - setChangelog(rootProject.file("changelog.md")) - setProjectVersion("${minecraft_version}-${project.version}") - setDisplayName("[NeoForge 1.20.4] CraterLib - ${project.version}") - setGameVersions("1.20.4") - setLoaders("neoforge") - setArtifact(remapJar) - setCurseEnvironment("both") - setIsManualRelease(true) -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java index 6f8c155..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java @@ -1,44 +0,0 @@ -package com.hypherionmc.craterlib; - -import com.hypherionmc.craterlib.api.events.client.LateInitEvent; -import com.hypherionmc.craterlib.common.NeoForgeServerEvents; -import com.hypherionmc.craterlib.compat.Vanish; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; -import com.hypherionmc.craterlib.core.networking.PacketRegistry; -import com.hypherionmc.craterlib.core.networking.data.PacketSide; -import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment; -import com.hypherionmc.craterlib.network.CraterNeoForgeNetworkHandler; -import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft; -import com.hypherionmc.craterlib.nojang.client.BridgedOptions; -import net.minecraft.client.Minecraft; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.common.Mod; -import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.neoforge.common.NeoForge; - -@Mod(CraterConstants.MOD_ID) -public class CraterLib { - - private final PacketRegistry handler; - - public CraterLib(IEventBus eventBus) { - NeoForge.EVENT_BUS.register(new NeoForgeServerEvents()); - eventBus.addListener(this::commonSetup); - handler = new CraterNeoForgeNetworkHandler(FMLLoader.getDist().isClient() ? PacketSide.CLIENT : PacketSide.SERVER); - - if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) { - NeoForge.EVENT_BUS.register(new Vanish()); - } - } - - public void commonSetup(FMLCommonSetupEvent evt) { - new CraterPacketNetwork(handler); - if (FMLEnvironment.dist.isClient()) { - LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(Minecraft.getInstance().options)); - CraterEventBus.INSTANCE.postEvent(event); - } - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java index 04ccf1d..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientEvents.java @@ -1,25 +0,0 @@ -package com.hypherionmc.craterlib.client; - -import com.hypherionmc.craterlib.CraterConstants; -import com.hypherionmc.craterlib.api.events.client.CraterClientTickEvent; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel; -import net.minecraft.client.Minecraft; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.event.TickEvent; - -@Mod.EventBusSubscriber(modid = CraterConstants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) -public class NeoForgeClientEvents { - - @SubscribeEvent - public static void clientTick(TickEvent.LevelTickEvent event) { - if (Minecraft.getInstance().level == null) - return; - - CraterClientTickEvent craterClientTickEvent = new CraterClientTickEvent(BridgedClientLevel.of(Minecraft.getInstance().level)); - CraterEventBus.INSTANCE.postEvent(craterClientTickEvent); - } - -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java index d6c2ef7..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java @@ -1,40 +0,0 @@ -package com.hypherionmc.craterlib.client; - -import com.hypherionmc.craterlib.core.platform.ClientPlatform; -import com.hypherionmc.craterlib.nojang.client.BridgedMinecraft; -import com.hypherionmc.craterlib.nojang.client.multiplayer.BridgedClientLevel; -import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; -import net.minecraft.client.Minecraft; -import net.minecraft.network.Connection; - -import java.util.Objects; - -/** - * @author HypherionSA - */ -public class NeoForgeClientHelper implements ClientPlatform { - - public NeoForgeClientHelper() { - } - - @Override - public BridgedMinecraft getClientInstance() { - return new BridgedMinecraft(); - } - - @Override - public BridgedPlayer getClientPlayer() { - return BridgedPlayer.of(Minecraft.getInstance().player); - } - - @Override - public BridgedClientLevel getClientLevel() { - return BridgedClientLevel.of(Minecraft.getInstance().level); - } - - @Override - public Connection getClientConnection() { - Objects.requireNonNull(Minecraft.getInstance().getConnection(), "Cannot send packets when not in game!"); - return Minecraft.getInstance().getConnection().getConnection(); - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java index 50622a8..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCommonHelper.java @@ -1,19 +0,0 @@ -package com.hypherionmc.craterlib.common; - -import com.hypherionmc.craterlib.core.platform.CommonPlatform; -import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer; -import net.neoforged.neoforge.server.ServerLifecycleHooks; - -/** - * @author HypherionSA - */ -public class NeoForgeCommonHelper implements CommonPlatform { - - public NeoForgeCommonHelper() { - } - - @Override - public BridgedMinecraftServer getMCServer() { - return BridgedMinecraftServer.of(ServerLifecycleHooks.getCurrentServer()); - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java index a39412c..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java @@ -1,22 +0,0 @@ -package com.hypherionmc.craterlib.common; - -import com.hypherionmc.craterlib.core.platform.CompatUtils; -import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment; -import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; -import redstonedubstep.mods.vanishmod.VanishUtil; - -public class NeoForgeCompatHelper implements CompatUtils { - - @Override - public boolean isPlayerActive(BridgedPlayer player) { - if (!ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) - return true; - - return !VanishUtil.isVanished(player.toMojangServerPlayer()); - } - - @Override - public String getSkinUUID(BridgedPlayer player) { - return player.getStringUUID(); - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeLoaderHelper.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeLoaderHelper.java index 6fc2925..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeLoaderHelper.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeLoaderHelper.java @@ -1,79 +0,0 @@ -package com.hypherionmc.craterlib.common; - -import com.hypherionmc.craterlib.core.platform.Environment; -import com.hypherionmc.craterlib.core.platform.LoaderType; -import com.hypherionmc.craterlib.core.platform.ModloaderEnvironment; -import net.minecraft.SharedConstants; -import net.minecraft.client.Minecraft; -import net.neoforged.fml.ModList; -import net.neoforged.fml.loading.FMLLoader; -import net.neoforged.fml.loading.FMLPaths; - -import java.io.File; - -/** - * @author HypherionSA - */ -public class NeoForgeLoaderHelper implements ModloaderEnvironment { - - public NeoForgeLoaderHelper() { - } - - @Override - public boolean isFabric() { - return false; - } - - @Override - public LoaderType getLoaderType() { - return LoaderType.NEOFORGE; - } - - @Override - public String getGameVersion() { - return SharedConstants.VERSION_STRING; - } - - @Override - public File getGameFolder() { - return Minecraft.getInstance().gameDirectory; - } - - @Override - public File getConfigFolder() { - return FMLPaths.CONFIGDIR.get().toFile(); - } - - @Override - public File getModsFolder() { - return FMLPaths.MODSDIR.get().toFile(); - } - - @Override - public Environment getEnvironment() { - switch (FMLLoader.getDist()) { - case CLIENT -> { - return Environment.CLIENT; - } - case DEDICATED_SERVER -> { - return Environment.SERVER; - } - } - return Environment.UNKNOWN; - } - - @Override - public boolean isModLoaded(String modid) { - return ModList.get().isLoaded(modid); - } - - @Override - public boolean isDevEnv() { - return !FMLLoader.isProduction(); - } - - @Override - public int getModCount() { - return ModList.get().size(); - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeServerEvents.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeServerEvents.java index 868b89f..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeServerEvents.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeServerEvents.java @@ -1,41 +0,0 @@ -package com.hypherionmc.craterlib.common; - -import com.hypherionmc.craterlib.api.events.server.CraterRegisterCommandEvent; -import com.hypherionmc.craterlib.api.events.server.CraterServerLifecycleEvent; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.nojang.server.BridgedMinecraftServer; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.neoforge.event.RegisterCommandsEvent; -import net.neoforged.neoforge.event.server.ServerStartedEvent; -import net.neoforged.neoforge.event.server.ServerStartingEvent; -import net.neoforged.neoforge.event.server.ServerStoppedEvent; -import net.neoforged.neoforge.event.server.ServerStoppingEvent; - -public class NeoForgeServerEvents { - - @SubscribeEvent - public void serverStarting(ServerStartingEvent event) { - CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Starting(BridgedMinecraftServer.of(event.getServer()))); - } - - @SubscribeEvent - public void serverStarted(ServerStartedEvent event) { - CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Started(BridgedMinecraftServer.of(event.getServer()))); - } - - @SubscribeEvent - public void serverStopping(ServerStoppingEvent event) { - CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopping(BridgedMinecraftServer.of(event.getServer()))); - } - - @SubscribeEvent - public void serverStopped(ServerStoppedEvent event) { - CraterEventBus.INSTANCE.postEvent(new CraterServerLifecycleEvent.Stopped(BridgedMinecraftServer.of(event.getServer()))); - } - - @SubscribeEvent - public void onCommandRegister(RegisterCommandsEvent event) { - CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent(event.getDispatcher())); - } - -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/Vanish.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/Vanish.java index 8d19f4c..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/Vanish.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/Vanish.java @@ -1,24 +0,0 @@ -package com.hypherionmc.craterlib.compat; - -import com.hypherionmc.craterlib.api.events.server.CraterPlayerEvent; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; -import net.neoforged.bus.api.SubscribeEvent; -import redstonedubstep.mods.vanishmod.api.PlayerVanishEvent; - -public class Vanish { - - public Vanish() { - - } - - @SubscribeEvent - public void vanishevent(PlayerVanishEvent event) { - if (event.isVanished()) { - CraterEventBus.INSTANCE.postEvent(new CraterPlayerEvent.PlayerLoggedOut(BridgedPlayer.of(event.getEntity()), true)); - } else { - CraterEventBus.INSTANCE.postEvent(new CraterPlayerEvent.PlayerLoggedIn(BridgedPlayer.of(event.getEntity()), true)); - } - } - -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java index 619565c..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java @@ -1,44 +0,0 @@ -package com.hypherionmc.craterlib.mixin; - -import com.hypherionmc.craterlib.client.gui.config.CraterConfigScreen; -import com.hypherionmc.craterlib.core.config.AbstractConfig; -import com.hypherionmc.craterlib.core.config.ConfigController; -import com.hypherionmc.craterlib.core.config.ModuleConfig; -import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; -import net.neoforged.neoforge.client.ConfigScreenHandler; -import net.neoforged.neoforgespi.language.IModInfo; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Optional; -import java.util.function.BiFunction; - -/** - * @author HypherionSA - */ -@Mixin(ConfigScreenHandler.class) -public class ConfigScreenHandlerMixin { - - /** - * Inject Auto Generated config Screens into forge - * - */ - @Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false) - private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable>> cir) { - ConfigController.getWatchedConfigs().forEach((conf, watcher) -> { - if (!conf.getClass().isAnnotationPresent(NoConfigScreen.class)) { - AbstractConfig config = watcher.getLeft(); - if (config.getModId().equals(selectedMod.getModId())) { - cir.setReturnValue( - Optional.of((minecraft, screen) -> new CraterConfigScreen(config, screen)) - ); - } - } - }); - } - -} \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerGamePacketListenerImplMixin.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerGamePacketListenerImplMixin.java index 8a0fcfb..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerGamePacketListenerImplMixin.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerGamePacketListenerImplMixin.java @@ -1,37 +0,0 @@ -package com.hypherionmc.craterlib.mixin; - -import com.hypherionmc.craterlib.api.events.server.CraterServerChatEvent; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; -import com.hypherionmc.craterlib.utils.ChatUtils; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.PlayerChatMessage; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.FilteredText; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -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; - -@Mixin(value = ServerGamePacketListenerImpl.class, priority = Integer.MIN_VALUE) -public class ServerGamePacketListenerImplMixin { - - @Shadow - public ServerPlayer player; - - @Inject( - method = "lambda$handleChat$6", - at = @At("HEAD"), - cancellable = true - ) - private void injectChatEvent(Component component, PlayerChatMessage arg, FilteredText p_296589_, CallbackInfo ci) { - Component finalcomp = component == null ? arg.decoratedContent() : component; - CraterServerChatEvent event = new CraterServerChatEvent(BridgedPlayer.of(this.player), finalcomp.getString(), ChatUtils.mojangToAdventure(finalcomp)); - CraterEventBus.INSTANCE.postEvent(event); - if (event.wasCancelled()) - ci.cancel(); - } - -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerStatusPacketListenerMixin.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerStatusPacketListenerMixin.java index cb697db..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerStatusPacketListenerMixin.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/mixin/ServerStatusPacketListenerMixin.java @@ -1,53 +0,0 @@ -package com.hypherionmc.craterlib.mixin; - -import com.hypherionmc.craterlib.api.events.server.ServerStatusEvent; -import com.hypherionmc.craterlib.core.event.CraterEventBus; -import com.hypherionmc.craterlib.utils.ChatUtils; -import net.minecraft.network.Connection; -import net.minecraft.network.protocol.status.ClientboundStatusResponsePacket; -import net.minecraft.network.protocol.status.ServerStatus; -import net.minecraft.network.protocol.status.ServerboundStatusRequestPacket; -import net.minecraft.server.network.ServerStatusPacketListenerImpl; -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; - -@Mixin(ServerStatusPacketListenerImpl.class) -public class ServerStatusPacketListenerMixin { - - @Shadow - @Final - private ServerStatus status; - - @Shadow @Final private Connection connection; - - @Inject(method = "handleStatusRequest", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/network/Connection;send(Lnet/minecraft/network/protocol/Packet;)V", - shift = At.Shift.BEFORE), - cancellable = true - ) - private void injectHandleStatusRequest(ServerboundStatusRequestPacket arg, CallbackInfo ci) { - ServerStatusEvent.StatusRequestEvent event = new ServerStatusEvent.StatusRequestEvent(ChatUtils.mojangToAdventure(status.description())); - CraterEventBus.INSTANCE.postEvent(event); - - if (event.getNewStatus() != null) { - ci.cancel(); - this.connection.send(new ClientboundStatusResponsePacket( - new ServerStatus(ChatUtils.adventureToMojang( - event.getNewStatus()), - status.players(), - status.version(), - status.favicon(), - status.enforcesSecureChat(), - status.isModded() - ) - )); - } - } - -} \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java index a4f2450..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/CraterNeoForgeNetworkHandler.java @@ -1,116 +0,0 @@ -package com.hypherionmc.craterlib.network; - -import com.hypherionmc.craterlib.CraterConstants; -import com.hypherionmc.craterlib.core.networking.PacketRegistry; -import com.hypherionmc.craterlib.core.networking.data.PacketContext; -import com.hypherionmc.craterlib.core.networking.data.PacketHolder; -import com.hypherionmc.craterlib.core.networking.data.PacketSide; -import com.hypherionmc.craterlib.nojang.network.BridgedFriendlyByteBuf; -import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.entity.player.Player; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.LogicalSide; -import net.neoforged.neoforge.network.PacketDistributor; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; -import net.neoforged.neoforge.network.handling.IPayloadHandler; -import net.neoforged.neoforge.network.registration.IPayloadRegistrar; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -/** - * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 - */ -public class CraterNeoForgeNetworkHandler extends PacketRegistry { - - private final Map, NeoForgePacketContainer> PACKETS = new HashMap<>(); - - public CraterNeoForgeNetworkHandler(PacketSide side) { - super(side); - } - - @SubscribeEvent - public void register(final RegisterPayloadHandlerEvent event) { - if (!PACKETS.isEmpty()) { - PACKETS.forEach((type, container) -> { - final IPayloadRegistrar registrar = event.registrar(container.packetId().getNamespace()); - registrar.common( - container.packetId(), - container.decoder(), - container.handler()); - }); - } - } - - protected void registerPacket(PacketHolder container) { - if (PACKETS.get(container.messageType()) == null) { - var packetContainer = new NeoForgePacketContainer<>( - container.messageType(), - container.type().toMojang(), - this.mojangEncoder(container.encoder()), - decoder(this.mojangDecoder(container.decoder())), - buildHandler(container.handler()) - ); - - PACKETS.put(container.messageType(), packetContainer); - } - } - - private FriendlyByteBuf.Reader> decoder(Function decoder) { - return (buf -> { - T packet = decoder.apply(buf); - return new NeoForgePacket(PACKETS.get(packet.getClass()), packet); - }); - } - - public void sendToServer(T packet) { - this.sendToServer(packet, false); - } - - public void sendToServer(T packet, boolean ignoreCheck) { - NeoForgePacketContainer container = PACKETS.get(packet.getClass()); - try { - PacketDistributor.SERVER.noArg().send(new NeoForgePacket<>(container, packet)); - } catch (Throwable t) { - CraterConstants.LOG.error("{} packet not registered on the client, this is needed.", packet.getClass(), t); - } - } - - public void sendToClient(T packet, BridgedPlayer player) { - NeoForgePacketContainer container = PACKETS.get(packet.getClass()); - try { - if (player.getConnection() == null) - return; - - if (player.getConnection().isConnected(container.packetId())) { - PacketDistributor.PLAYER.with(player.toMojangServerPlayer()).send(new NeoForgePacket<>(container, packet)); - } - } catch (Throwable t) { - CraterConstants.LOG.error("{} packet not registered on the server, this is needed.", packet.getClass(), t); - } - } - - private > IPayloadHandler buildHandler(Consumer> handler) { - return (payload, ctx) -> { - try { - PacketSide side = ctx.flow().getReceptionSide().equals(LogicalSide.SERVER) ? PacketSide.SERVER : PacketSide.CLIENT; - Player player = ctx.player().orElse(null); - handler.accept(new PacketContext<>(BridgedPlayer.of(player), payload.packet(), side)); - } catch (Throwable t) { - CraterConstants.LOG.error("Error handling packet: {} -> ", payload.packet().getClass(), t); - } - }; - } - - private Function mojangDecoder(Function handler) { - return (byteBuf) -> handler.apply(BridgedFriendlyByteBuf.of(byteBuf)); - } - - private BiConsumer mojangEncoder(BiConsumer handler) { - return (t, byteBuf) -> handler.accept(t, BridgedFriendlyByteBuf.of(byteBuf)); - } -} diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java index 77775fc..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacket.java @@ -1,21 +0,0 @@ -package com.hypherionmc.craterlib.network; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; - -/** - * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 - */ -public record NeoForgePacket(NeoForgePacketContainer container, T packet) implements CustomPacketPayload { - - @Override - public void write(FriendlyByteBuf buff) { - container().encoder().accept(packet(), buff); - } - - @Override - public ResourceLocation id() { - return container().packetId(); - } -} \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java index cddddb6..e69de29 100644 --- a/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java +++ b/1.20.4/NeoForge/src/main/java/com/hypherionmc/craterlib/network/NeoForgePacketContainer.java @@ -1,16 +0,0 @@ -package com.hypherionmc.craterlib.network; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.network.handling.IPayloadHandler; - -import java.util.function.BiConsumer; - -/** - * Based on https://github.com/mysticdrew/common-networking/tree/1.20.4 - */ -public record NeoForgePacketContainer(Class messageType, - ResourceLocation packetId, - BiConsumer encoder, - FriendlyByteBuf.Reader> decoder, - IPayloadHandler> handler) { } \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/META-INF/mods.toml b/1.20.4/NeoForge/src/main/resources/META-INF/mods.toml index 519dde3..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/META-INF/mods.toml +++ b/1.20.4/NeoForge/src/main/resources/META-INF/mods.toml @@ -1,33 +0,0 @@ -modLoader = "javafml" -loaderVersion = "[1,)" -license = "MIT" -issueTrackerURL = "https://github.com/firstdarkdev/craterLib/issues" - -[[mods]] - modId = "${mod_id}" - version = "${version}" - displayName = "${mod_name}" - displayURL = "https://modrinth.com/mod/craterlib" - logoFile = "craterlib_logo.png" - #credits="Thanks for this example mod goes to Java" - authors = "${mod_author}, Zenith" - description = ''' - A library mod used by First Dark Development and HypherionSA Mods - ''' - displayTest = "NONE" - -[[dependencies.${ mod_id }]] - modId = "neoforge" - type="required" - required=true - versionRange = "[20.4,)" - ordering = "NONE" - side = "BOTH" - -[[dependencies.${ mod_id }]] - modId = "minecraft" - type="required" - required=true - versionRange = "[1.20.4,1.20.5)" - ordering = "NONE" - side = "BOTH" \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ClientPlatform b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ClientPlatform index 5bd719f..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ClientPlatform +++ b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ClientPlatform @@ -1 +0,0 @@ -com.hypherionmc.craterlib.client.NeoForgeClientHelper \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CommonPlatform b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CommonPlatform index 6cb6efb..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CommonPlatform +++ b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CommonPlatform @@ -1 +0,0 @@ -com.hypherionmc.craterlib.common.NeoForgeCommonHelper \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CompatUtils b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CompatUtils index 9475f11..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CompatUtils +++ b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.CompatUtils @@ -1 +0,0 @@ -com.hypherionmc.craterlib.common.NeoForgeCompatHelper \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ModloaderEnvironment b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ModloaderEnvironment index 9a41f05..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ModloaderEnvironment +++ b/1.20.4/NeoForge/src/main/resources/META-INF/services/com.hypherionmc.craterlib.core.platform.ModloaderEnvironment @@ -1 +0,0 @@ -com.hypherionmc.craterlib.common.NeoForgeLoaderHelper \ No newline at end of file diff --git a/1.20.4/NeoForge/src/main/resources/craterlib.neoforge.mixins.json b/1.20.4/NeoForge/src/main/resources/craterlib.neoforge.mixins.json index 892f6d7..e69de29 100644 --- a/1.20.4/NeoForge/src/main/resources/craterlib.neoforge.mixins.json +++ b/1.20.4/NeoForge/src/main/resources/craterlib.neoforge.mixins.json @@ -1,18 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "com.hypherionmc.craterlib.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - ], - "client": [ - "ConfigScreenHandlerMixin" - ], - "server": [ - "ServerGamePacketListenerImplMixin", - "ServerStatusPacketListenerMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/1.20.4/NeoForge/src/main/resources/craterlib_logo.png b/1.20.4/NeoForge/src/main/resources/craterlib_logo.png index ce0159c..e69de29 100644 Binary files a/1.20.4/NeoForge/src/main/resources/craterlib_logo.png and b/1.20.4/NeoForge/src/main/resources/craterlib_logo.png differ diff --git a/1.20.4/changelog.md b/1.20.4/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.20.4/changelog.md +++ b/1.20.4/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.20.4/gradle.properties b/1.20.4/gradle.properties index e7ddc8c..65cb3f9 100644 --- a/1.20.4/gradle.properties +++ b/1.20.4/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -36,6 +36,7 @@ vanish=1.5.4+1.20.4 mod_menu_version=9.2.0-beta.2 vanishmod=1.1.15 vanishmod_neo=puxrKAMr +ftb_ranks=2004.2.0 ftb_essentials=2004.1.3 # Publishing diff --git a/1.20/Common/build.gradle b/1.20/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.20/Common/build.gradle +++ b/1.20/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.20/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.20/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.20/Fabric/build.gradle b/1.20/Fabric/build.gradle index fd59e31..e7c944b 100644 --- a/1.20/Fabric/build.gradle +++ b/1.20/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.20/Forge/build.gradle b/1.20/Forge/build.gradle index cb78650..a580c64 100644 --- a/1.20/Forge/build.gradle +++ b/1.20/Forge/build.gradle @@ -6,6 +6,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod}") stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.20/changelog.md b/1.20/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.20/changelog.md +++ b/1.20/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.20/gradle.properties b/1.20/gradle.properties index ace17ba..67c9e83 100644 --- a/1.20/gradle.properties +++ b/1.20/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -28,6 +28,7 @@ rpc_sdk=1.0 discord_formatter=2.0.0 # Mod Dependencies +ftb_ranks=2001.1.3 ftb_essentials=2001.2.2 fabrictailor=2.2.1 vanish=1.5.4+1.20.1 diff --git a/1.21.2/Common/build.gradle b/1.21.2/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.21.2/Common/build.gradle +++ b/1.21.2/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.21.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.21.2/Fabric/build.gradle b/1.21.2/Fabric/build.gradle index d14e5d4..b3da913 100644 --- a/1.21.2/Fabric/build.gradle +++ b/1.21.2/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.21.2/Forge/src/main/resources/craterlib_logo.png b/1.21.2/Forge/src/main/resources/craterlib_logo.png new file mode 100644 index 0000000..ce0159c Binary files /dev/null and b/1.21.2/Forge/src/main/resources/craterlib_logo.png differ diff --git a/1.21.2/NeoForge/build.gradle b/1.21.2/NeoForge/build.gradle index e243512..3e43053 100644 --- a/1.21.2/NeoForge/build.gradle +++ b/1.21.2/NeoForge/build.gradle @@ -5,6 +5,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.21.2/changelog.md b/1.21.2/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.21.2/changelog.md +++ b/1.21.2/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.21.2/gradle.properties b/1.21.2/gradle.properties index ed1c80c..f8e5f0f 100644 --- a/1.21.2/gradle.properties +++ b/1.21.2/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -37,6 +37,7 @@ mod_menu_version=10.0.0-beta.1 vanishmod=1.1.12.1 vanishmod_neo=puxrKAMr ftb_essentials=2101.1.0 +ftb_ranks=2101.1.1 # Publishing curse_id=867099 diff --git a/1.21/Common/build.gradle b/1.21/Common/build.gradle index 15a4dec..81fbb3f 100644 --- a/1.21/Common/build.gradle +++ b/1.21/Common/build.gradle @@ -2,6 +2,7 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") } shadowJar { diff --git a/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java b/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java new file mode 100644 index 0000000..777e43c --- /dev/null +++ b/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/FTBRankEvents.java @@ -0,0 +1,56 @@ +// @excludeplugin +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.compat.ftbranks.BridgedRank; +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.Getter; + +public class FTBRankEvents { + + @Getter + public static class RankAddedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankAddedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankAddedEvent of(GameProfile profile, Rank rank) { + return new RankAddedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankRemovedEvent extends CraterEvent { + private final BridgedGameProfile gameProfile; + private final BridgedRank rank; + + private RankRemovedEvent(BridgedGameProfile gameProfile, BridgedRank rank) { + this.gameProfile = gameProfile; + this.rank = rank; + } + + public static RankRemovedEvent of(GameProfile profile, Rank rank) { + return new RankRemovedEvent(BridgedGameProfile.of(profile), BridgedRank.of(rank)); + } + } + + @Getter + public static class RankDeletedEvent extends CraterEvent { + private final BridgedRank rank; + + private RankDeletedEvent(BridgedRank rank) { + this.rank = rank; + } + + public static RankDeletedEvent of(Rank rank) { + return new RankDeletedEvent(BridgedRank.of(rank)); + } + } + +} diff --git a/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java b/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java new file mode 100644 index 0000000..69e75ad --- /dev/null +++ b/1.21/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/LuckPermsCompatEvents.java @@ -0,0 +1,32 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.RequiredArgsConstructor; + +import java.util.UUID; + +public class LuckPermsCompatEvents { + + @RequiredArgsConstructor(staticName = "of") + public static class GroupAddedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } + + @RequiredArgsConstructor(staticName = "of") + public static class GroupRemovedEvent extends CraterEvent { + private final String identifier; + private final UUID uuid; + private final String username; + + public BridgedGameProfile toProfile() { + return BridgedGameProfile.mojang(uuid, username); + } + } +} diff --git a/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java index a77e1f4..686f500 100644 --- a/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java +++ b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/LuckPermsCompat.java @@ -1,20 +1,102 @@ package com.hypherionmc.craterlib.compat; +import com.hypherionmc.craterlib.api.events.compat.LuckPermsCompatEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; import net.luckperms.api.LuckPerms; import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeMutateEvent; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; import net.minecraft.server.level.ServerPlayer; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + public class LuckPermsCompat { public static final LuckPermsCompat INSTANCE = new LuckPermsCompat(); private final LuckPerms luckPerms = LuckPermsProvider.get(); - LuckPermsCompat() {} + LuckPermsCompat() { + EventBus bus = luckPerms.getEventBus(); + + bus.subscribe(NodeMutateEvent.class, e -> { + if (!e.isUser()) + return; + + User user = (User) e.getTarget(); + + Set addedInheritance = e.getDataAfter().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataBefore().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + Set removedInheritance = e.getDataBefore().stream() + .filter(node -> node.getType() == NodeType.INHERITANCE && !e.getDataAfter().contains(node)) + .map(NodeType.INHERITANCE::cast) + .collect(Collectors.toSet()); + + if(addedInheritance.isEmpty() && removedInheritance.isEmpty()) return; + + addedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupAddedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + + removedInheritance.forEach(node -> { + CraterEventBus.INSTANCE.postEvent(LuckPermsCompatEvents.GroupRemovedEvent.of(node.getGroupName(), user.getUniqueId(), user.getUsername())); + }); + }); + } public boolean hasPermission(ServerPlayer player, String perm) { User luckPermsUser = luckPerms.getPlayerAdapter(ServerPlayer.class).getUser(player); return luckPermsUser.getCachedData().getPermissionData().checkPermission(perm).asBoolean(); } + public boolean hasGroup(UUID uuid, String group) { + return getUserGroups(uuid).stream().anyMatch(g -> g.equalsIgnoreCase(group)); + } + + public Set getUserGroups(UUID uuid) { + User user = luckPerms.getUserManager().getUser(uuid); + if (user == null) + return new HashSet<>(); + + return user.getNodes(NodeType.INHERITANCE).stream().map(InheritanceNode::getGroupName).collect(Collectors.toSet()); + } + + public boolean addGroupToUser(UUID uuid, String group) { + AtomicBoolean added = new AtomicBoolean(false); + + Group g = luckPerms.getGroupManager().getGroup(group); + if (g == null) { + return false; + } + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().add(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + added.set(true); + }); + + return added.get(); + } + + public boolean removeGroupFromUser(UUID uuid, String group) { + AtomicBoolean removed = new AtomicBoolean(false); + + luckPerms.getUserManager().loadUser(uuid).thenAcceptAsync(user -> { + if (user == null) return; + user.data().remove(InheritanceNode.builder(group).build()); + luckPerms.getUserManager().saveUser(user); + removed.set(true); + }); + + return removed.get(); + } } diff --git a/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java new file mode 100644 index 0000000..e429fce --- /dev/null +++ b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/BridgedRank.java @@ -0,0 +1,24 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import dev.ftb.mods.ftbranks.api.Rank; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class BridgedRank { + + private final Rank internal; + + public String name() { + return internal.getName(); + } + + public String id() { + return internal.getId(); + } + + public Rank toFtb() { + return internal; + } + +} diff --git a/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java new file mode 100644 index 0000000..c9d16a3 --- /dev/null +++ b/1.21/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java @@ -0,0 +1,83 @@ +// @excludeplugin +package com.hypherionmc.craterlib.compat.ftbranks; + +import com.hypherionmc.craterlib.api.events.compat.FTBRankEvents; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import dev.ftb.mods.ftbranks.api.FTBRanksAPI; +import dev.ftb.mods.ftbranks.api.event.PlayerAddedToRankEvent; +import dev.ftb.mods.ftbranks.api.event.PlayerRemovedFromRankEvent; +import dev.ftb.mods.ftbranks.api.event.RankDeletedEvent; +import dev.ftb.mods.ftbranks.api.event.RankEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class FTBRanks { + + public static final FTBRanks INSTANCE = new FTBRanks(); + + private FTBRanks() { + registerEvents(); + } + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); + FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + + public boolean hasRank(BridgedGameProfile profile, String rank) { + return getPlayerRanks(profile).stream().anyMatch(r -> r.toFtb().getName().equalsIgnoreCase(rank) || r.toFtb().getId().equalsIgnoreCase(rank)); + } + + public boolean addRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); + + return didAddRank.get(); + } + + public boolean removeRank(BridgedGameProfile profile, String rank) { + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); + FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); + + return didRemoveRank.get(); + } + + public void registerEvents() { + RankEvent.ADD_PLAYER.register(this::playerAddedToRank); + RankEvent.REMOVE_PLAYER.register(this::playerRemovedFromRank); + RankEvent.DELETED.register(this::rankDeleted); + } + + private void rankDeleted(RankDeletedEvent rankDeletedEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankDeletedEvent.of(rankDeletedEvent.getRank())); + } + + private void playerRemovedFromRank(PlayerRemovedFromRankEvent playerRemovedFromRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankRemovedEvent.of(playerRemovedFromRankEvent.getPlayer(), playerRemovedFromRankEvent.getRank())); + } + + private void playerAddedToRank(PlayerAddedToRankEvent playerAddedToRankEvent) { + CraterEventBus.INSTANCE.postEvent(FTBRankEvents.RankAddedEvent.of(playerAddedToRankEvent.getPlayer(), playerAddedToRankEvent.getRank())); + } + +} diff --git a/1.21/Fabric/build.gradle b/1.21/Fabric/build.gradle index 5a0f1ae..b8ced84 100644 --- a/1.21/Fabric/build.gradle +++ b/1.21/Fabric/build.gradle @@ -10,6 +10,7 @@ dependencies { } stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" diff --git a/1.21/Forge/src/main/resources/craterlib_logo.png b/1.21/Forge/src/main/resources/craterlib_logo.png new file mode 100644 index 0000000..ce0159c Binary files /dev/null and b/1.21/Forge/src/main/resources/craterlib_logo.png differ diff --git a/1.21/NeoForge/build.gradle b/1.21/NeoForge/build.gradle index e602557..4339fd1 100644 --- a/1.21/NeoForge/build.gradle +++ b/1.21/NeoForge/build.gradle @@ -5,6 +5,7 @@ dependencies { modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") diff --git a/1.21/changelog.md b/1.21/changelog.md index c66ef9b..4ecb3ae 100644 --- a/1.21/changelog.md +++ b/1.21/changelog.md @@ -1,6 +1,7 @@ **New Features**: - Paper Support. Currently only available on Modrinth and NightBloom +- Added API's for working with FTB Ranks and LuckPerms groups **Bug Fixes**: diff --git a/1.21/gradle.properties b/1.21/gradle.properties index ede1bbc..1a7e91c 100644 --- a/1.21/gradle.properties +++ b/1.21/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=2 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -37,6 +37,7 @@ mod_menu_version=10.0.0-beta.1 vanishmod=1.1.12.1 vanishmod_neo=puxrKAMr ftb_essentials=2101.1.0 +ftb_ranks=2101.1.1 # Publishing curse_id=867099 diff --git a/commit.sha b/commit.sha index b348b0f..a8a2fd9 100644 --- a/commit.sha +++ b/commit.sha @@ -1 +1 @@ -cc26cd450d2ed828eeb7d937a8b5eb92e97afef9 \ No newline at end of file +d2aca8ffa956fda73ffda2ff8ddf70ce861018e9 \ No newline at end of file diff --git a/patches/1.18.2/Common/build.gradle.patch b/patches/1.18.2/Common/build.gradle.patch index b3b155f..b2dbdc3 100644 --- a/patches/1.18.2/Common/build.gradle.patch +++ b/patches/1.18.2/Common/build.gradle.patch @@ -1,10 +1,11 @@ --- a/Common/build.gradle +++ b/Common/build.gradle -@@ -1,7 +1,7 @@ +@@ -1,8 +1,8 @@ archivesBaseName = "${mod_name.replace(" ", "")}-Common-${minecraft_version}" dependencies { - stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") + } diff --git a/patches/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch b/patches/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch new file mode 100644 index 0000000..f65a55d --- /dev/null +++ b/patches/1.18.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch @@ -0,0 +1,36 @@ +--- a/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java ++++ b/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java +@@ -24,13 +24,13 @@ + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); +- FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); ++ FTBRanksAPI.INSTANCE.getManager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); +- FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); ++ FTBRanksAPI.INSTANCE.getManager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + +@@ -42,7 +42,7 @@ + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); +- FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { ++ FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); +@@ -54,7 +54,7 @@ + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); +- FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { ++ FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); diff --git a/patches/1.18.2/Fabric/build.gradle.patch b/patches/1.18.2/Fabric/build.gradle.patch index cb867d5..3a928b6 100644 --- a/patches/1.18.2/Fabric/build.gradle.patch +++ b/patches/1.18.2/Fabric/build.gradle.patch @@ -1,15 +1,16 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -9,8 +9,6 @@ +@@ -9,9 +9,6 @@ exclude(group: "net.fabricmc.fabric-api") } - stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") - modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" -@@ -115,8 +113,8 @@ +@@ -116,8 +113,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.18.2/NeoForge/build.gradle.patch b/patches/1.18.2/NeoForge/build.gradle.patch index 5cfba59..921f670 100644 --- a/patches/1.18.2/NeoForge/build.gradle.patch +++ b/patches/1.18.2/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ /dev/null -@@ -1,122 +1,0 @@ +@@ -1,123 +1,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { @@ -8,6 +8,7 @@ - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") - - // Do not edit or remove - implementation project(":Common") diff --git a/patches/1.18.2/build.gradle.patch b/patches/1.18.2/build.gradle.patch index e3c14d1..738c4ad 100644 --- a/patches/1.18.2/build.gradle.patch +++ b/patches/1.18.2/build.gradle.patch @@ -40,7 +40,7 @@ maven { name = "Modrinth" -@@ -73,11 +66,13 @@ +@@ -73,11 +66,14 @@ shade "me.hypherionmc.moon-config:toml:${moon_config}" shade "me.hypherionmc.moon-config:json:${moon_config}" shade "com.hypherionmc:rpcsdk:${rpc_sdk}" @@ -51,11 +51,12 @@ shade "net.kyori:adventure-text-minimessage:${adventure}" + stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") + compileOnly 'net.luckperms:api:5.4' compileOnly("org.projectlombok:lombok:${lombok}") annotationProcessor("org.projectlombok:lombok:${lombok}") -@@ -124,7 +119,7 @@ +@@ -124,7 +120,7 @@ tasks.withType(JavaCompile).configureEach { it.options.encoding = 'UTF-8' diff --git a/patches/1.18.2/gradle.properties.patch b/patches/1.18.2/gradle.properties.patch index 5c10b7f..7d86d47 100644 --- a/patches/1.18.2/gradle.properties.patch +++ b/patches/1.18.2/gradle.properties.patch @@ -23,7 +23,7 @@ # Dependencies moon_config=1.0.10 -@@ -31,17 +28,16 @@ +@@ -31,18 +28,17 @@ discord_formatter=2.0.0 # Mod Dependencies @@ -33,6 +33,8 @@ -vanishmod=1.1.12.1 -vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=1802.1.11-build.71 +ftb_essentials=1802.2.2-build.83 +fabrictailor=1.9.0+1.18.2 +vanish=1.1.0 diff --git a/patches/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch b/patches/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch new file mode 100644 index 0000000..f65a55d --- /dev/null +++ b/patches/1.19.2/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java.patch @@ -0,0 +1,36 @@ +--- a/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java ++++ b/Common/src/main/java/com/hypherionmc/craterlib/compat/ftbranks/FTBRanks.java +@@ -24,13 +24,13 @@ + + public List getPlayerRanks(BridgedGameProfile profile) { + List ranks = new ArrayList<>(); +- FTBRanksAPI.manager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); ++ FTBRanksAPI.INSTANCE.getManager().getAddedRanks(profile.toMojang()).forEach(rank -> ranks.add(BridgedRank.of(rank))); + return ranks; + } + + public List getAllRanks() { + List ranks = new ArrayList<>(); +- FTBRanksAPI.manager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); ++ FTBRanksAPI.INSTANCE.getManager().getAllRanks().forEach(r -> ranks.add(BridgedRank.of(r))); + return ranks; + } + +@@ -42,7 +42,7 @@ + rank = rank.toLowerCase(); + + AtomicBoolean didAddRank = new AtomicBoolean(false); +- FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { ++ FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.add(profile.toMojang()); + didAddRank.set(true); + }); +@@ -54,7 +54,7 @@ + rank = rank.toLowerCase(); + + AtomicBoolean didRemoveRank = new AtomicBoolean(false); +- FTBRanksAPI.manager().getRank(rank).ifPresent(r -> { ++ FTBRanksAPI.INSTANCE.getManager().getRank(rank).ifPresent(r -> { + r.remove(profile.toMojang()); + didRemoveRank.set(true); + }); diff --git a/patches/1.19.2/Fabric/build.gradle.patch b/patches/1.19.2/Fabric/build.gradle.patch index 8254280..1cbe39f 100644 --- a/patches/1.19.2/Fabric/build.gradle.patch +++ b/patches/1.19.2/Fabric/build.gradle.patch @@ -1,14 +1,14 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -10,7 +10,6 @@ - } +@@ -11,7 +11,6 @@ stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") - modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" -@@ -115,8 +114,8 @@ +@@ -116,8 +115,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.19.2/Forge/build.gradle.patch b/patches/1.19.2/Forge/build.gradle.patch index 3b91653..df5402e 100644 --- a/patches/1.19.2/Forge/build.gradle.patch +++ b/patches/1.19.2/Forge/build.gradle.patch @@ -1,17 +1,18 @@ --- a/Forge/build.gradle +++ b/Forge/build.gradle -@@ -3,8 +3,9 @@ +@@ -3,7 +3,10 @@ dependencies { // Compat - // NOT AVAILABLE ON FORGE modImplementation("maven.modrinth:vanishmod:${vanishmod}") + modImplementation("maven.modrinth:vanishmod:${vanishmod}") - ++ + stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") + // Do not edit or remove implementation project(":Common") - } -@@ -107,8 +108,8 @@ +@@ -107,8 +110,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.19.2/NeoForge/build.gradle.patch b/patches/1.19.2/NeoForge/build.gradle.patch index 5cfba59..921f670 100644 --- a/patches/1.19.2/NeoForge/build.gradle.patch +++ b/patches/1.19.2/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ /dev/null -@@ -1,122 +1,0 @@ +@@ -1,123 +1,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { @@ -8,6 +8,7 @@ - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") - - // Do not edit or remove - implementation project(":Common") diff --git a/patches/1.19.2/gradle.properties.patch b/patches/1.19.2/gradle.properties.patch index 53d0a96..45c1fa0 100644 --- a/patches/1.19.2/gradle.properties.patch +++ b/patches/1.19.2/gradle.properties.patch @@ -23,7 +23,7 @@ # Dependencies moon_config=1.0.10 -@@ -31,17 +28,16 @@ +@@ -31,18 +28,17 @@ discord_formatter=2.0.0 # Mod Dependencies @@ -33,6 +33,8 @@ -vanishmod=1.1.12.1 -vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=1902.1.16-build.114 +ftb_essentials=1902.3.5-build.135 +fabrictailor=2.0.1 +vanish=1.3.2 diff --git a/patches/1.19.3/Fabric/build.gradle.patch b/patches/1.19.3/Fabric/build.gradle.patch index 2340ce3..0add004 100644 --- a/patches/1.19.3/Fabric/build.gradle.patch +++ b/patches/1.19.3/Fabric/build.gradle.patch @@ -1,14 +1,14 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -10,7 +10,6 @@ - } +@@ -11,7 +11,6 @@ stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") - modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" -@@ -115,8 +114,8 @@ +@@ -116,8 +115,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.19.3/Forge/build.gradle.patch b/patches/1.19.3/Forge/build.gradle.patch index f03b8ed..0ff1595 100644 --- a/patches/1.19.3/Forge/build.gradle.patch +++ b/patches/1.19.3/Forge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Forge/build.gradle +++ b/Forge/build.gradle -@@ -3,7 +3,9 @@ +@@ -3,7 +3,10 @@ dependencies { // Compat @@ -8,10 +8,11 @@ + modImplementation("maven.modrinth:vanishmod:${vanishmod}") + + stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") -@@ -107,8 +109,8 @@ +@@ -107,8 +110,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.19.3/NeoForge/build.gradle.patch b/patches/1.19.3/NeoForge/build.gradle.patch index 5cfba59..921f670 100644 --- a/patches/1.19.3/NeoForge/build.gradle.patch +++ b/patches/1.19.3/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ /dev/null -@@ -1,122 +1,0 @@ +@@ -1,123 +1,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { @@ -8,6 +8,7 @@ - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") - - // Do not edit or remove - implementation project(":Common") diff --git a/patches/1.19.3/gradle.properties.patch b/patches/1.19.3/gradle.properties.patch index 4b737c3..25ca512 100644 --- a/patches/1.19.3/gradle.properties.patch +++ b/patches/1.19.3/gradle.properties.patch @@ -23,7 +23,7 @@ # Dependencies moon_config=1.0.10 -@@ -31,17 +28,16 @@ +@@ -31,18 +28,17 @@ discord_formatter=2.0.0 # Mod Dependencies @@ -33,6 +33,8 @@ -vanishmod=1.1.12.1 -vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=1904.1.1-build.82 +ftb_essentials=1904.1.0-build.81-SNAPSHOT +fabrictailor=2.0.2 +vanish=1.4.0+1.19.3 diff --git a/patches/1.20.2/Fabric/build.gradle.patch b/patches/1.20.2/Fabric/build.gradle.patch index 9bacec7..869384e 100644 --- a/patches/1.20.2/Fabric/build.gradle.patch +++ b/patches/1.20.2/Fabric/build.gradle.patch @@ -1,14 +1,14 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -10,7 +10,6 @@ - } +@@ -11,7 +11,6 @@ stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") - modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" -@@ -115,8 +114,8 @@ +@@ -116,8 +115,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20.2/Forge/build.gradle.patch b/patches/1.20.2/Forge/build.gradle.patch index 85edc53..9cb11ed 100644 --- a/patches/1.20.2/Forge/build.gradle.patch +++ b/patches/1.20.2/Forge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Forge/build.gradle +++ b/Forge/build.gradle -@@ -3,7 +3,9 @@ +@@ -3,7 +3,10 @@ dependencies { // Compat @@ -8,10 +8,11 @@ + modImplementation("maven.modrinth:vanishmod:${vanishmod}") + + stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") -@@ -107,8 +109,8 @@ +@@ -107,8 +110,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20.2/NeoForge/build.gradle.patch b/patches/1.20.2/NeoForge/build.gradle.patch index 5cfba59..921f670 100644 --- a/patches/1.20.2/NeoForge/build.gradle.patch +++ b/patches/1.20.2/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ /dev/null -@@ -1,122 +1,0 @@ +@@ -1,123 +1,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { @@ -8,6 +8,7 @@ - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") - - // Do not edit or remove - implementation project(":Common") diff --git a/patches/1.20.2/gradle.properties.patch b/patches/1.20.2/gradle.properties.patch index 8df9577..9551e00 100644 --- a/patches/1.20.2/gradle.properties.patch +++ b/patches/1.20.2/gradle.properties.patch @@ -23,7 +23,7 @@ # Dependencies moon_config=1.0.10 -@@ -31,17 +28,16 @@ +@@ -31,18 +28,17 @@ discord_formatter=2.0.0 # Mod Dependencies @@ -33,6 +33,8 @@ -vanishmod=1.1.12.1 -vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=2001.1.3 +ftb_essentials=2001.2.2 +fabrictailor=2.2.1 +vanish=1.5.0+1.20.2 diff --git a/patches/1.20.4/Fabric/build.gradle.patch b/patches/1.20.4/Fabric/build.gradle.patch index e1d6355..5243cd1 100644 --- a/patches/1.20.4/Fabric/build.gradle.patch +++ b/patches/1.20.4/Fabric/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -115,8 +115,8 @@ +@@ -116,8 +116,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20.4/Forge/build.gradle.patch b/patches/1.20.4/Forge/build.gradle.patch index 5cbb069..b84d05b 100644 --- a/patches/1.20.4/Forge/build.gradle.patch +++ b/patches/1.20.4/Forge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Forge/build.gradle +++ b/Forge/build.gradle -@@ -3,7 +3,9 @@ +@@ -3,7 +3,10 @@ dependencies { // Compat @@ -8,10 +8,11 @@ + modImplementation("maven.modrinth:vanishmod:${vanishmod}") + + stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") -@@ -107,8 +109,8 @@ +@@ -107,8 +110,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20.4/NeoForge/build.gradle.patch b/patches/1.20.4/NeoForge/build.gradle.patch index 1b92ada..adb602a 100644 --- a/patches/1.20.4/NeoForge/build.gradle.patch +++ b/patches/1.20.4/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ b/NeoForge/build.gradle -@@ -34,12 +34,7 @@ +@@ -35,12 +35,7 @@ unimined.minecraft { neoForged { @@ -14,7 +14,7 @@ mixinConfig("${mod_id}.mixins.json", "${mod_id}.neoforge.mixins.json") } } -@@ -58,7 +53,7 @@ +@@ -59,7 +54,7 @@ from project(":Common").sourceSets.main.resources def buildProps = project.properties.clone() @@ -23,7 +23,7 @@ expand buildProps } } -@@ -113,8 +108,8 @@ +@@ -114,8 +109,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20.4/gradle.properties.patch b/patches/1.20.4/gradle.properties.patch index 5043931..a0bceae 100644 --- a/patches/1.20.4/gradle.properties.patch +++ b/patches/1.20.4/gradle.properties.patch @@ -24,7 +24,7 @@ # Dependencies moon_config=1.0.10 -@@ -32,16 +32,16 @@ +@@ -32,17 +32,17 @@ # Mod Dependencies fabrictailor=2.3.1 @@ -36,6 +36,8 @@ +vanishmod=1.1.15 vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=2004.2.0 +ftb_essentials=2004.1.3 # Publishing diff --git a/patches/1.20/Fabric/build.gradle.patch b/patches/1.20/Fabric/build.gradle.patch index d92f870..23e967b 100644 --- a/patches/1.20/Fabric/build.gradle.patch +++ b/patches/1.20/Fabric/build.gradle.patch @@ -1,14 +1,14 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -10,7 +10,6 @@ - } +@@ -11,7 +11,6 @@ stupidRemapArch("dev.ftb.mods:ftb-essentials:${ftb_essentials}") + stupidRemapArch("dev.ftb.mods:ftb-ranks:${ftb_ranks}") - modImplementation "maven.modrinth:fabrictailor:${fabrictailor}" modImplementation "maven.modrinth:vanish:${vanish}" -@@ -115,8 +114,8 @@ +@@ -116,8 +115,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20/Forge/build.gradle.patch b/patches/1.20/Forge/build.gradle.patch index fe5c46c..575fd7c 100644 --- a/patches/1.20/Forge/build.gradle.patch +++ b/patches/1.20/Forge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Forge/build.gradle +++ b/Forge/build.gradle -@@ -3,7 +3,9 @@ +@@ -3,7 +3,10 @@ dependencies { // Compat @@ -8,10 +8,11 @@ + modImplementation("maven.modrinth:vanishmod:${vanishmod}") + + stupidRemapArch("dev.ftb.mods:ftb-essentials-forge:${ftb_essentials}") ++ stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}") // Do not edit or remove implementation project(":Common") -@@ -107,8 +109,8 @@ +@@ -107,8 +110,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.20/NeoForge/build.gradle.patch b/patches/1.20/NeoForge/build.gradle.patch index 5cfba59..921f670 100644 --- a/patches/1.20/NeoForge/build.gradle.patch +++ b/patches/1.20/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ /dev/null -@@ -1,122 +1,0 @@ +@@ -1,123 +1,0 @@ -archivesBaseName = "${mod_name.replace(" ", "")}-NeoForge-${minecraft_version}" - -dependencies { @@ -8,6 +8,7 @@ - modImplementation("maven.modrinth:vanishmod:${vanishmod_neo}") - - stupidRemapArch("dev.ftb.mods:ftb-essentials-neoforge:${ftb_essentials}") +- stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") - - // Do not edit or remove - implementation project(":Common") diff --git a/patches/1.20/gradle.properties.patch b/patches/1.20/gradle.properties.patch index 3319fe2..dbb345b 100644 --- a/patches/1.20/gradle.properties.patch +++ b/patches/1.20/gradle.properties.patch @@ -23,7 +23,7 @@ # Dependencies moon_config=1.0.10 -@@ -31,17 +28,16 @@ +@@ -31,18 +28,17 @@ discord_formatter=2.0.0 # Mod Dependencies @@ -33,6 +33,8 @@ -vanishmod=1.1.12.1 -vanishmod_neo=puxrKAMr -ftb_essentials=2101.1.0 +-ftb_ranks=2101.1.1 ++ftb_ranks=2001.1.3 +ftb_essentials=2001.2.2 +fabrictailor=2.2.1 +vanish=1.5.4+1.20.1 diff --git a/patches/1.21.2/NeoForge/build.gradle.patch b/patches/1.21.2/NeoForge/build.gradle.patch index cd02ee7..80ab582 100644 --- a/patches/1.21.2/NeoForge/build.gradle.patch +++ b/patches/1.21.2/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ b/NeoForge/build.gradle -@@ -34,12 +34,7 @@ +@@ -35,12 +35,7 @@ unimined.minecraft { neoForged { diff --git a/patches/1.21.2/gradle.properties.patch b/patches/1.21.2/gradle.properties.patch index f12c59e..29fc292 100644 --- a/patches/1.21.2/gradle.properties.patch +++ b/patches/1.21.2/gradle.properties.patch @@ -1,6 +1,6 @@ --- a/gradle.properties +++ b/gradle.properties -@@ -41,7 +41,7 @@ +@@ -42,7 +42,7 @@ # Publishing curse_id=867099 modrinth_id=Nn8Wasaq diff --git a/patches/1.21/Fabric/build.gradle.patch b/patches/1.21/Fabric/build.gradle.patch index b7b790f..7b7f743 100644 --- a/patches/1.21/Fabric/build.gradle.patch +++ b/patches/1.21/Fabric/build.gradle.patch @@ -1,6 +1,6 @@ --- a/Fabric/build.gradle +++ b/Fabric/build.gradle -@@ -115,8 +115,8 @@ +@@ -116,8 +116,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.21/NeoForge/build.gradle.patch b/patches/1.21/NeoForge/build.gradle.patch index 8638f0d..5c92e87 100644 --- a/patches/1.21/NeoForge/build.gradle.patch +++ b/patches/1.21/NeoForge/build.gradle.patch @@ -1,6 +1,6 @@ --- a/NeoForge/build.gradle +++ b/NeoForge/build.gradle -@@ -34,12 +34,7 @@ +@@ -35,12 +35,7 @@ unimined.minecraft { neoForged { @@ -14,7 +14,7 @@ mixinConfig("${mod_id}.mixins.json", "${mod_id}.neoforge.mixins.json") } } -@@ -113,8 +108,8 @@ +@@ -114,8 +109,8 @@ setVersionType("release") setChangelog(rootProject.file("changelog.md")) setProjectVersion("${minecraft_version}-${project.version}") diff --git a/patches/1.21/gradle.properties.patch b/patches/1.21/gradle.properties.patch index fef6430..9e1e589 100644 --- a/patches/1.21/gradle.properties.patch +++ b/patches/1.21/gradle.properties.patch @@ -16,7 +16,7 @@ # Forge forge_version=50.0.6 -@@ -41,7 +41,7 @@ +@@ -42,7 +42,7 @@ # Publishing curse_id=867099 modrinth_id=Nn8Wasaq