[FEAT] APIs for Player Revive mod and Whitelist changes

This commit is contained in:
2025-02-01 15:30:30 +02:00
parent 74701a7817
commit a4aa7108e5
202 changed files with 2410 additions and 96 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 {
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,7 @@ package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.ForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -37,5 +38,9 @@ public class CraterLib {
if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) {
MinecraftForge.EVENT_BUS.register(new Vanish());
}
if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) {
MinecraftForge.EVENT_BUS.register(new PlayerReviveEvents());
}
}
}

View File

@@ -3,6 +3,8 @@ 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 team.creative.playerrevive.api.IBleeding;
import team.creative.playerrevive.server.PlayerReviveServer;
import redstonedubstep.mods.vanishmod.VanishUtil;
public class ForgeCompatHelper implements CompatUtils {
@@ -19,4 +21,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

@@ -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.minecraftforge.eventbus.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.getPlayer())));
}
@SubscribeEvent
public void playerBledOutEvent(PlayerBleedOutEvent event) {
CraterEventBus.INSTANCE.postEvent(com.hypherionmc.craterlib.api.events.compat.PlayerRevivedEvent.of(BridgedPlayer.of(event.getPlayer())));
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -49,6 +49,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
@@ -29,6 +29,8 @@ discord_formatter=2.0.0
cloth_config=6.5.102
# Mod Dependencies
player_revive=5335413
creative_core=5335387
ftb_ranks=1802.1.11-build.71
ftb_essentials=1802.2.2-build.83
fabrictailor=1.9.0+1.18.2

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

@@ -9,6 +9,8 @@ dependencies {
stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}")
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,7 @@ package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.ForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -37,5 +38,9 @@ public class CraterLib {
if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) {
MinecraftForge.EVENT_BUS.register(new Vanish());
}
if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) {
MinecraftForge.EVENT_BUS.register(new PlayerReviveEvents());
}
}
}

View File

@@ -3,6 +3,8 @@ 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 team.creative.playerrevive.api.IBleeding;
import team.creative.playerrevive.server.PlayerReviveServer;
import redstonedubstep.mods.vanishmod.VanishUtil;
public class ForgeCompatHelper implements CompatUtils {
@@ -19,4 +21,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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -49,6 +49,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
@@ -29,6 +29,8 @@ discord_formatter=2.0.0
cloth_config=8.3.134
# Mod Dependencies
player_revive=5491953
creative_core=5491926
ftb_ranks=1902.1.16-build.114
ftb_essentials=1902.3.5-build.135
fabrictailor=2.0.1

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

@@ -9,6 +9,8 @@ dependencies {
stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}")
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,7 @@ package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.ForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -37,5 +38,9 @@ public class CraterLib {
if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) {
MinecraftForge.EVENT_BUS.register(new Vanish());
}
if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) {
MinecraftForge.EVENT_BUS.register(new PlayerReviveEvents());
}
}
}

View File

@@ -3,6 +3,8 @@ 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 team.creative.playerrevive.api.IBleeding;
import team.creative.playerrevive.server.PlayerReviveServer;
import redstonedubstep.mods.vanishmod.VanishUtil;
public class ForgeCompatHelper implements CompatUtils {
@@ -19,4 +21,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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

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

@@ -49,6 +49,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
@@ -29,6 +29,8 @@ discord_formatter=2.0.0
cloth_config=9.1.104
# Mod Dependencies
player_revive=4353422
creative_core=4407520
ftb_ranks=1904.1.1-build.82
ftb_essentials=1904.1.0-build.81-SNAPSHOT
fabrictailor=2.0.2

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

@@ -9,6 +9,8 @@ dependencies {
stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}")
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,7 @@ package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.ForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -37,5 +38,9 @@ public class CraterLib {
if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) {
MinecraftForge.EVENT_BUS.register(new Vanish());
}
if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) {
MinecraftForge.EVENT_BUS.register(new PlayerReviveEvents());
}
}
}

View File

@@ -3,6 +3,8 @@ 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 team.creative.playerrevive.api.IBleeding;
import team.creative.playerrevive.server.PlayerReviveServer;
import redstonedubstep.mods.vanishmod.VanishUtil;
public class ForgeCompatHelper implements CompatUtils {
@@ -19,4 +21,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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

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

@@ -49,6 +49,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
@@ -29,6 +29,8 @@ discord_formatter=2.0.0
cloth_config=12.0.137
# Mod Dependencies
player_revive=4785938
creative_core=4796447
ftb_ranks=2001.1.3
ftb_essentials=2001.2.2
fabrictailor=2.2.1

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

@@ -10,6 +10,10 @@ dependencies {
modImplementation("me.shedaniel.cloth:cloth-config-forge:${cloth_config}")
// NOT AVAILABLE FOR FORGE
//modImplementation("unimaven.curseforge:playerrevive-266890:5019850")
//modImplementation("unimaven.curseforge:creativecore-257814:5140174")
// Do not edit or remove
implementation project(":Common")
}

View File

@@ -19,4 +19,23 @@ public class ForgeCompatHelper implements CompatUtils {
public String getSkinUUID(BridgedPlayer player) {
return player.getStringUUID();
}
@Override
public boolean isPlayerBleeding(BridgedPlayer player) {
return false;
}
@Override
public boolean playerBledOut(BridgedPlayer player) {
return false;
}
@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.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.NeoForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -32,6 +33,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

@@ -49,6 +49,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
@@ -37,6 +37,8 @@ vanish=1.5.4+1.20.4
mod_menu_version=9.2.0-beta.2
vanishmod=1.1.15
vanishmod_neo=puxrKAMr
player_revive=5019850
creative_core=5140174
ftb_ranks=2004.2.0
ftb_essentials=2004.1.3

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

@@ -9,6 +9,8 @@ dependencies {
stupidRemapArch("dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}")
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,7 @@ package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.api.events.client.LateInitEvent;
import com.hypherionmc.craterlib.common.ForgeServerEvents;
import com.hypherionmc.craterlib.compat.PlayerReviveEvents;
import com.hypherionmc.craterlib.compat.Vanish;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
@@ -37,5 +38,9 @@ public class CraterLib {
if (ModloaderEnvironment.INSTANCE.isModLoaded("vmod")) {
MinecraftForge.EVENT_BUS.register(new Vanish());
}
if (ModloaderEnvironment.INSTANCE.isModLoaded("playerrevive")) {
MinecraftForge.EVENT_BUS.register(new PlayerReviveEvents());
}
}
}

View File

@@ -3,6 +3,8 @@ 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 team.creative.playerrevive.api.IBleeding;
import team.creative.playerrevive.server.PlayerReviveServer;
import redstonedubstep.mods.vanishmod.VanishUtil;
public class ForgeCompatHelper implements CompatUtils {
@@ -19,4 +21,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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

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

@@ -48,6 +48,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

Some files were not shown because too many files have changed in this diff Show More