[FEAT] APIs for Player Revive mod and Whitelist changes
This commit is contained in:
@@ -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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
|
||||
}
|
||||
|
@@ -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();
|
||||
|
||||
}
|
@@ -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) {}
|
||||
}
|
||||
|
||||
}
|
@@ -4,6 +4,8 @@
|
||||
"package": "com.hypherionmc.craterlib.mixin",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"mixins": [
|
||||
"events.StoredUserEntryAccessor",
|
||||
"events.WhitelistMixin"
|
||||
],
|
||||
"client": [
|
||||
"ChatInputSuggestorMixin",
|
||||
|
Reference in New Issue
Block a user