diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerBleedOutEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerBleedOutEvent.java new file mode 100644 index 0000000..b8f7fb1 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerBleedOutEvent.java @@ -0,0 +1,12 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +@Getter +public class PlayerBleedOutEvent extends CraterEvent { + private final BridgedPlayer player; +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerRevivedEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerRevivedEvent.java new file mode 100644 index 0000000..909de16 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/events/compat/PlayerRevivedEvent.java @@ -0,0 +1,12 @@ +package com.hypherionmc.craterlib.api.events.compat; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +@Getter +public class PlayerRevivedEvent extends CraterEvent { + private final BridgedPlayer player; +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/api/events/server/WhitelistChangedEvent.java b/Common/src/main/java/com/hypherionmc/craterlib/api/events/server/WhitelistChangedEvent.java new file mode 100644 index 0000000..21c30dc --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/api/events/server/WhitelistChangedEvent.java @@ -0,0 +1,26 @@ +package com.hypherionmc.craterlib.api.events.server; + +import com.hypherionmc.craterlib.core.event.CraterEvent; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +public class WhitelistChangedEvent { + + @RequiredArgsConstructor + @Getter + public static final class EntryAdded extends CraterEvent { + + private final BridgedGameProfile profile; + + } + + @RequiredArgsConstructor + @Getter + public static final class EntryRemoved extends CraterEvent { + + private final BridgedGameProfile profile; + + } + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/platform/CompatUtils.java b/Common/src/main/java/com/hypherionmc/craterlib/core/platform/CompatUtils.java index fb745fc..015cebe 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/platform/CompatUtils.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/platform/CompatUtils.java @@ -9,5 +9,8 @@ public interface CompatUtils { boolean isPlayerActive(BridgedPlayer player); String getSkinUUID(BridgedPlayer player); + boolean isPlayerBleeding(BridgedPlayer player); + boolean playerBledOut(BridgedPlayer player); + boolean playerRevived(BridgedPlayer player); } diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/StoredUserEntryAccessor.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/StoredUserEntryAccessor.java new file mode 100644 index 0000000..28ff343 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/StoredUserEntryAccessor.java @@ -0,0 +1,14 @@ +package com.hypherionmc.craterlib.mixin.events; + +import net.minecraft.server.players.StoredUserEntry; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(StoredUserEntry.class) +public interface StoredUserEntryAccessor { + + @Accessor("user") + @Nullable T getUser(); + +} diff --git a/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/WhitelistMixin.java b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/WhitelistMixin.java new file mode 100644 index 0000000..f2e7d06 --- /dev/null +++ b/Common/src/main/java/com/hypherionmc/craterlib/mixin/events/WhitelistMixin.java @@ -0,0 +1,46 @@ +package com.hypherionmc.craterlib.mixin.events; + +import com.hypherionmc.craterlib.api.events.server.WhitelistChangedEvent; +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.authlib.BridgedGameProfile; +import com.mojang.authlib.GameProfile; +import net.minecraft.server.players.StoredUserEntry; +import net.minecraft.server.players.StoredUserList; +import net.minecraft.server.players.UserWhiteListEntry; +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; + +@SuppressWarnings({"unchecked", "rawtypes"}) +@Mixin(StoredUserList.class) +public abstract class WhitelistMixin> { + + @Shadow protected abstract boolean contains(K k0); + + @Inject(method = "add", at = @At("HEAD")) + private void injectAddEvent(V arg, CallbackInfo ci) { + try { + if (arg instanceof UserWhiteListEntry entry) { + StoredUserEntryAccessor entryAccessor = (StoredUserEntryAccessor) entry; + if (entryAccessor.getUser() != null && !contains((K) entryAccessor.getUser())) { + CraterEventBus.INSTANCE.postEvent(new WhitelistChangedEvent.EntryAdded(BridgedGameProfile.of((GameProfile) entryAccessor.getUser()))); + } + } + } catch (Exception ignored) {} + } + + @Inject(method = "remove(Lnet/minecraft/server/players/StoredUserEntry;)V", at = @At("HEAD")) + private void injectRemoveEvent(V arg, CallbackInfo ci) { + try { + if (arg instanceof UserWhiteListEntry entry) { + StoredUserEntryAccessor entryAccessor = (StoredUserEntryAccessor) entry; + if (entryAccessor.getUser() != null && contains((K) entryAccessor.getUser())) { + CraterEventBus.INSTANCE.postEvent(new WhitelistChangedEvent.EntryRemoved(BridgedGameProfile.of((GameProfile) entryAccessor.getUser()))); + } + } + } catch (Exception ignored) {} + } + +} diff --git a/Common/src/main/resources/craterlib.mixins.json b/Common/src/main/resources/craterlib.mixins.json index c910ed2..704d796 100644 --- a/Common/src/main/resources/craterlib.mixins.json +++ b/Common/src/main/resources/craterlib.mixins.json @@ -4,6 +4,8 @@ "package": "com.hypherionmc.craterlib.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "events.StoredUserEntryAccessor", + "events.WhitelistMixin" ], "client": [ "ChatInputSuggestorMixin", diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricCompatHelper.java b/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricCompatHelper.java index ce16da7..fa369b5 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricCompatHelper.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/common/FabricCompatHelper.java @@ -20,4 +20,19 @@ public class FabricCompatHelper implements CompatUtils { public String getSkinUUID(BridgedPlayer player) { return FabricTailor.getTailorSkin(player.toMojangServerPlayer()); } + + @Override + public boolean isPlayerBleeding(BridgedPlayer player) { + return false; + } + + @Override + public boolean playerBledOut(BridgedPlayer player) { + return false; + } + + @Override + public boolean playerRevived(BridgedPlayer player) { + return false; + } } diff --git a/Forge/build.gradle b/Forge/build.gradle index 6489d4c..1a198d7 100644 --- a/Forge/build.gradle +++ b/Forge/build.gradle @@ -6,6 +6,8 @@ dependencies { // NOT AVAILABLE ON FORGE modImplementation("maven.modrinth:vanishmod:${vanishmod}") modImplementation("me.shedaniel.cloth:cloth-config-forge:${cloth_config}") + modImplementation("unimaven.curseforge:playerrevive-266890:${player_revive}") + modImplementation("unimaven.curseforge:creativecore-257814:${creative_core}") // Do not edit or remove implementation project(":Common") diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/common/ForgeCompatHelper.java b/Forge/src/main/java/com/hypherionmc/craterlib/common/ForgeCompatHelper.java index f325837..2b19079 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/common/ForgeCompatHelper.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/common/ForgeCompatHelper.java @@ -2,6 +2,8 @@ package com.hypherionmc.craterlib.common; import com.hypherionmc.craterlib.core.platform.CompatUtils; import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; +import team.creative.playerrevive.api.IBleeding; +import team.creative.playerrevive.server.PlayerReviveServer; public class ForgeCompatHelper implements CompatUtils { @@ -14,4 +16,30 @@ public class ForgeCompatHelper implements CompatUtils { public String getSkinUUID(BridgedPlayer player) { return player.getStringUUID(); } + + @Override + public boolean isPlayerBleeding(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + return PlayerReviveServer.isBleeding(player.toMojangServerPlayer()); + } + + @Override + public boolean playerBledOut(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + IBleeding bleeding = PlayerReviveServer.getBleeding(player.toMojangServerPlayer()); + return bleeding != null && bleeding.bledOut(); + } + + @Override + public boolean playerRevived(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + IBleeding bleeding = PlayerReviveServer.getBleeding(player.toMojangServerPlayer()); + return bleeding != null && bleeding.revived(); + } } diff --git a/NeoForge/build.gradle b/NeoForge/build.gradle index 486d3f8..8c77aa8 100644 --- a/NeoForge/build.gradle +++ b/NeoForge/build.gradle @@ -8,6 +8,8 @@ dependencies { stupidRemapArch("dev.ftb.mods:ftb-ranks-neoforge:${ftb_ranks}") modImplementation("me.shedaniel.cloth:cloth-config-neoforge:${cloth_config}") + modImplementation("unimaven.curseforge:playerrevive-266890:${player_revive}") + modImplementation("unimaven.curseforge:creativecore-257814:${creative_core}") // Do not edit or remove implementation project(":Common") diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java index 566e4bf..bc95bce 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/CraterLib.java @@ -2,6 +2,7 @@ package com.hypherionmc.craterlib; import com.hypherionmc.craterlib.client.NeoForgeClientHelper; import com.hypherionmc.craterlib.common.NeoForgeServerEvents; +import com.hypherionmc.craterlib.compat.PlayerReviveEvents; import com.hypherionmc.craterlib.compat.Vanish; import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork; import com.hypherionmc.craterlib.core.networking.PacketRegistry; @@ -29,6 +30,10 @@ public class CraterLib { if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) { NeoForge.EVENT_BUS.register(new Vanish()); } + + if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) { + NeoForge.EVENT_BUS.register(new PlayerReviveEvents()); + } } public void commonSetup(FMLCommonSetupEvent evt) { diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java index a39412c..268e797 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/common/NeoForgeCompatHelper.java @@ -4,6 +4,8 @@ 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; +import team.creative.playerrevive.api.IBleeding; +import team.creative.playerrevive.server.PlayerReviveServer; public class NeoForgeCompatHelper implements CompatUtils { @@ -19,4 +21,30 @@ public class NeoForgeCompatHelper implements CompatUtils { public String getSkinUUID(BridgedPlayer player) { return player.getStringUUID(); } + + @Override + public boolean isPlayerBleeding(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + return PlayerReviveServer.isBleeding(player.toMojangServerPlayer()); + } + + @Override + public boolean playerBledOut(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + IBleeding bleeding = PlayerReviveServer.getBleeding(player.toMojangServerPlayer()); + return bleeding != null && bleeding.bledOut(); + } + + @Override + public boolean playerRevived(BridgedPlayer player) { + if (!ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) + return false; + + IBleeding bleeding = PlayerReviveServer.getBleeding(player.toMojangServerPlayer()); + return bleeding != null && bleeding.revived(); + } } diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/PlayerReviveEvents.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/PlayerReviveEvents.java new file mode 100644 index 0000000..ffe9623 --- /dev/null +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/compat/PlayerReviveEvents.java @@ -0,0 +1,23 @@ +package com.hypherionmc.craterlib.compat; + +import com.hypherionmc.craterlib.core.event.CraterEventBus; +import com.hypherionmc.craterlib.nojang.world.entity.player.BridgedPlayer; +import lombok.NoArgsConstructor; +import net.neoforged.bus.api.SubscribeEvent; +import team.creative.playerrevive.api.event.PlayerBleedOutEvent; +import team.creative.playerrevive.api.event.PlayerRevivedEvent; + +@NoArgsConstructor +public class PlayerReviveEvents { + + @SubscribeEvent + public void playerRevived(PlayerRevivedEvent event) { + CraterEventBus.INSTANCE.postEvent(com.hypherionmc.craterlib.api.events.compat.PlayerRevivedEvent.of(BridgedPlayer.of(event.getEntity()))); + } + + @SubscribeEvent + public void playerBledOutEvent(PlayerBleedOutEvent event) { + CraterEventBus.INSTANCE.postEvent(com.hypherionmc.craterlib.api.events.compat.PlayerRevivedEvent.of(BridgedPlayer.of(event.getEntity()))); + } + +} diff --git a/Paper/src/main/java/com/hypherionmc/craterlib/common/PaperCompatHelper.java b/Paper/src/main/java/com/hypherionmc/craterlib/common/PaperCompatHelper.java index 484a849..bc3a2b2 100644 --- a/Paper/src/main/java/com/hypherionmc/craterlib/common/PaperCompatHelper.java +++ b/Paper/src/main/java/com/hypherionmc/craterlib/common/PaperCompatHelper.java @@ -75,4 +75,18 @@ public class PaperCompatHelper implements CompatUtils { return false; } + @Override + public boolean isPlayerBleeding(BridgedPlayer player) { + return false; + } + + @Override + public boolean playerBledOut(BridgedPlayer player) { + return false; + } + + @Override + public boolean playerRevived(BridgedPlayer player) { + return false; + } } diff --git a/build.gradle b/build.gradle index 25ede52..ce18835 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,10 @@ subprojects { includeGroup "maven.modrinth" } } + + maven { + url = "https://unimaven.cc" + } } configurations { diff --git a/changelog.md b/changelog.md index c4a47e5..1e6ff6e 100644 --- a/changelog.md +++ b/changelog.md @@ -6,4 +6,7 @@ **New Features**: - Swapped Built In Config screen for a Cloth Config System, so client side mods can have in-game configs -- Added new APIs for Simple RPC (V4 rewrite) \ No newline at end of file +- Added new APIs for Simple RPC (V4 rewrite) +- Added new APIs for getting player information from Commands +- Added Compat API for Player Revive Mod +- Added new APIs to know when the Minecraft Whitelist changes \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c4e7992..83f4345 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=3 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -39,6 +39,8 @@ vanishmod=1.1.12.1 vanishmod_neo=puxrKAMr ftb_essentials=2101.1.0 ftb_ranks=2101.1.1 +player_revive=6119534 +creative_core=6113754 # Publishing curse_id=867099