[FEAT] APIs for Player Revive mod and Whitelist changes

This commit is contained in:
2025-02-01 14:06:08 +02:00
parent 4c3cc6b034
commit 7f9ff38768
18 changed files with 243 additions and 2 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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<T> {
@Accessor("user")
@Nullable T getUser();
}

View File

@@ -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<K, V extends StoredUserEntry<K>> {
@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) {}
}
}

View File

@@ -4,6 +4,8 @@
"package": "com.hypherionmc.craterlib.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"events.StoredUserEntryAccessor",
"events.WhitelistMixin"
],
"client": [
"ChatInputSuggestorMixin",

View File

@@ -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;
}
}

View File

@@ -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")

View File

@@ -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();
}
}

View File

@@ -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")

View File

@@ -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) {

View File

@@ -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();
}
}

View File

@@ -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())));
}
}

View File

@@ -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;
}
}

View File

@@ -56,6 +56,10 @@ subprojects {
includeGroup "maven.modrinth"
}
}
maven {
url = "https://unimaven.cc"
}
}
configurations {

View File

@@ -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)
- 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

View File

@@ -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