[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",