Implement events required by Simple Discord Link

This commit is contained in:
2023-05-28 20:15:51 +02:00
parent 2a027e5a1e
commit e8aa4aade7
17 changed files with 446 additions and 4 deletions

View File

@@ -0,0 +1,30 @@
package com.hypherionmc.craterlib.api.event.common;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
public class CraterLivingDeathEvent extends CraterEvent {
private final DamageSource damageSource;
private final LivingEntity entity;
public CraterLivingDeathEvent(LivingEntity entity, DamageSource source) {
this.entity = entity;
this.damageSource = source;
}
public LivingEntity getEntity() {
return entity;
}
public DamageSource getDamageSource() {
return damageSource;
}
@Override
public boolean canCancel() {
return true;
}
}

View File

@@ -0,0 +1,29 @@
package com.hypherionmc.craterlib.api.event.server;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import net.minecraft.advancements.Advancement;
import net.minecraft.world.entity.player.Player;
public class CraterAdvancementEvent extends CraterEvent {
private final Advancement advancement;
private final Player player;
public CraterAdvancementEvent(Player player, Advancement advancement) {
this.player = player;
this.advancement = advancement;
}
public Advancement getAdvancement() {
return advancement;
}
public Player getPlayer() {
return player;
}
@Override
public boolean canCancel() {
return false;
}
}

View File

@@ -0,0 +1,46 @@
package com.hypherionmc.craterlib.api.event.server;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.mojang.brigadier.ParseResults;
import net.minecraft.commands.CommandSourceStack;
public class CraterCommandEvent extends CraterEvent {
private ParseResults<CommandSourceStack> parseResults;
private Throwable exception;
private String command;
public CraterCommandEvent(ParseResults<CommandSourceStack> parseResults, String command) {
this.parseResults = parseResults;
this.command = command;
}
public ParseResults<CommandSourceStack> getParseResults() {
return parseResults;
}
public void setParseResults(ParseResults<CommandSourceStack> parseResults) {
this.parseResults = parseResults;
}
public Throwable getException() {
return exception;
}
public void setException(Throwable exception) {
this.exception = exception;
}
public String getCommand() {
return command;
}
public void setCommand(String command) {
this.command = command;
}
@Override
public boolean canCancel() {
return true;
}
}

View File

@@ -0,0 +1,42 @@
package com.hypherionmc.craterlib.api.event.server;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.mojang.authlib.GameProfile;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;
import java.net.SocketAddress;
public class CraterPlayerEvent extends CraterEvent {
private final Player player;
public CraterPlayerEvent(Player player) {
this.player = player;
}
public Player getPlayer() {
return player;
}
@Override
public boolean canCancel() {
return false;
}
public static class PlayerLoggedIn extends CraterPlayerEvent {
public PlayerLoggedIn(Player player) {
super(player);
}
}
public static class PlayerLoggedOut extends CraterPlayerEvent {
public PlayerLoggedOut(Player player) {
super(player);
}
}
}

View File

@@ -0,0 +1,44 @@
package com.hypherionmc.craterlib.api.event.server;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
public class CraterServerChatEvent extends CraterEvent {
private final String message, username;
private final ServerPlayer player;
private Component component;
public CraterServerChatEvent(ServerPlayer player, String message, Component component) {
this.message = message;
this.player = player;
this.username = player.getGameProfile().getName();
this.component = component;
}
public void setComponent(Component component) {
this.component = component;
}
public Component getComponent() {
return component;
}
public String getUsername() {
return username;
}
public ServerPlayer getPlayer() {
return player;
}
public String getMessage() {
return message;
}
@Override
public boolean canCancel() {
return true;
}
}

View File

@@ -0,0 +1,40 @@
package com.hypherionmc.craterlib.api.event.server;
import com.hypherionmc.craterlib.core.event.CraterEvent;
import com.mojang.authlib.GameProfile;
import net.minecraft.network.chat.Component;
import java.net.SocketAddress;
public class PlayerPreLoginEvent extends CraterEvent {
private final SocketAddress address;
private final GameProfile gameProfile;
private Component message;
public PlayerPreLoginEvent(SocketAddress address, GameProfile profile) {
this.address = address;
this.gameProfile = profile;
}
public Component getMessage() {
return message;
}
public void setMessage(Component message) {
this.message = message;
}
public GameProfile getGameProfile() {
return gameProfile;
}
public SocketAddress getAddress() {
return address;
}
@Override
public boolean canCancel() {
return false;
}
}

View File

@@ -2,6 +2,7 @@ package com.hypherionmc.craterlib.core.config;
import com.hypherionmc.craterlib.CraterConstants;
import me.hypherionmc.moonconfig.core.file.FileWatcher;
import org.jetbrains.annotations.ApiStatus;
import java.io.Serializable;
import java.util.HashMap;
@@ -22,7 +23,8 @@ public final class ConfigController implements Serializable {
*
* @param config - The config class to register and watch
*/
static void register_config(ModuleConfig config) {
@ApiStatus.Internal
public static void register_config(ModuleConfig config) {
if (monitoredConfigs.containsKey(config)) {
CraterConstants.LOG.error("Failed to register " + config.getConfigPath().getName() + ". Config already registered");
} else {

View File

@@ -0,0 +1,37 @@
package com.hypherionmc.craterlib.mixin.events;
import com.google.common.base.Throwables;
import com.hypherionmc.craterlib.api.event.server.CraterCommandEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.mojang.brigadier.ParseResults;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(Commands.class)
public class CommandMixin {
@Inject(method = "performCommand",
at = @At(value = "INVOKE",
target = "Lcom/mojang/brigadier/CommandDispatcher;execute(Lcom/mojang/brigadier/ParseResults;)I",
shift = At.Shift.BEFORE
), cancellable = true
)
private void injectCommandEvent(ParseResults<CommandSourceStack> stackParseResults, String command, CallbackInfoReturnable<Integer> cir) {
CraterCommandEvent commandEvent = new CraterCommandEvent(stackParseResults, command);
CraterEventBus.INSTANCE.postEvent(commandEvent);
if (commandEvent.wasCancelled()) {
cir.setReturnValue(1);
return;
}
if (commandEvent.getException() != null) {
Throwables.throwIfUnchecked(commandEvent.getException());
cir.setReturnValue(1);
}
}
}

View File

@@ -0,0 +1,23 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.common.CraterLivingDeathEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LivingEntity.class)
public class LivingEntityMixin {
@Inject(method = "die", at = @At("HEAD"), cancellable = true)
private void injectPlayerDeathEvent(DamageSource damageSource, CallbackInfo ci) {
CraterLivingDeathEvent event = new CraterLivingDeathEvent(((LivingEntity)(Object) this), damageSource);
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -0,0 +1,27 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.server.CraterAdvancementEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.advancements.Advancement;
import net.minecraft.server.PlayerAdvancements;
import net.minecraft.server.level.ServerPlayer;
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.CallbackInfoReturnable;
@Mixin(PlayerAdvancements.class)
public class PlayerAdvancementsMixin {
@Shadow private ServerPlayer player;
@Inject(method = "award", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/AdvancementRewards;grant(Lnet/minecraft/server/level/ServerPlayer;)V", shift = At.Shift.AFTER))
private void injectAdvancementEvent(Advancement advancement, String $$1, CallbackInfoReturnable<Boolean> cir) {
CraterAdvancementEvent event = new CraterAdvancementEvent(this.player, advancement);
if (advancement.getDisplay() != null && advancement.getDisplay().shouldAnnounceChat()) {
CraterEventBus.INSTANCE.postEvent(event);
}
}
}

View File

@@ -0,0 +1,42 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.server.CraterPlayerEvent;
import com.hypherionmc.craterlib.api.event.server.PlayerPreLoginEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.mojang.authlib.GameProfile;
import net.minecraft.network.Connection;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.PlayerList;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.net.SocketAddress;
@Mixin(PlayerList.class)
public class PlayerListMixin {
@Inject(method = "placeNewPlayer", at = @At("TAIL"))
private void injectPlayerLoginEvent(Connection connection, ServerPlayer serverPlayer, CallbackInfo ci) {
CraterPlayerEvent.PlayerLoggedIn loggedIn = new CraterPlayerEvent.PlayerLoggedIn(serverPlayer);
CraterEventBus.INSTANCE.postEvent(loggedIn);
}
@Inject(method = "remove", at = @At("HEAD"))
private void injectPlayerLogoutEvent(ServerPlayer player, CallbackInfo ci) {
CraterPlayerEvent.PlayerLoggedOut loggedOut = new CraterPlayerEvent.PlayerLoggedOut(player);
CraterEventBus.INSTANCE.postEvent(loggedOut);
}
@Inject(method = "canPlayerLogin", at = @At("HEAD"), cancellable = true)
private void injectPreLoginEvent(SocketAddress address, GameProfile gameProfile, CallbackInfoReturnable<Component> cir) {
PlayerPreLoginEvent event = new PlayerPreLoginEvent(address, gameProfile);
CraterEventBus.INSTANCE.postEvent(event);
if (event.getMessage() != null) {
cir.setReturnValue(event.getMessage());
}
}
}

View File

@@ -0,0 +1,23 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.common.CraterLivingDeathEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.player.Player;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Player.class)
public class PlayerMixin {
@Inject(method = "die", at = @At("HEAD"), cancellable = true)
private void injectPlayerDeathEvent(DamageSource damageSource, CallbackInfo ci) {
CraterLivingDeathEvent event = new CraterLivingDeathEvent(((Player)(Object) this), damageSource);
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -0,0 +1,27 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.server.CraterServerChatEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
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;
@Mixin(ServerGamePacketListenerImpl.class)
public class ServerGamePacketListenerImplMixin {
@Shadow public ServerPlayer player;
@Inject(method = "broadcastChatMessage", at = @At("HEAD"), cancellable = true)
private void injectChatEvent(PlayerChatMessage chatMessage, CallbackInfo ci) {
CraterServerChatEvent event = new CraterServerChatEvent(this.player, chatMessage.decoratedContent().getString(), chatMessage.decoratedContent());
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -0,0 +1,23 @@
package com.hypherionmc.craterlib.mixin.events;
import com.hypherionmc.craterlib.api.event.common.CraterLivingDeathEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.damagesource.DamageSource;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ServerPlayer.class)
public class ServerPlayerMixin {
@Inject(method = "die", at = @At("HEAD"), cancellable = true)
private void injectPlayerDeathEvent(DamageSource damageSource, CallbackInfo ci) {
CraterLivingDeathEvent event = new CraterLivingDeathEvent(((ServerPlayer)(Object) this), damageSource);
CraterEventBus.INSTANCE.postEvent(event);
if (event.wasCancelled())
ci.cancel();
}
}

View File

@@ -7,9 +7,16 @@
],
"client": [
"colors.BlockColorsMixin",
"colors.ItemColorsMixin"
"colors.ItemColorsMixin",
"events.PlayerMixin"
],
"server": [
"events.CommandMixin",
"events.PlayerAdvancementsMixin",
"events.LivingEntityMixin",
"events.PlayerListMixin",
"events.ServerPlayerMixin",
"events.ServerGamePacketListenerImplMixin"
],
"injectors": {
"defaultRequire": 1

View File

@@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(Minecraft.class)
public class MinecraftMixin {
public class FabricMinecraftMixin {
@Inject(method = "<init>", at = @At("RETURN"))
private void injectCraterLateInit(GameConfig gameConfig, CallbackInfo ci) {

View File

@@ -6,7 +6,7 @@
"mixins": [
],
"client": [
"MinecraftMixin"
"FabricMinecraftMixin"
],
"server": [
],