package com.github.theword.queqiao;
import com.github.theword.queqiao.tool.GlobalContext;
import com.github.theword.queqiao.tool.event.*;
import com.github.theword.queqiao.tool.event.model.PlayerModel;
import com.github.theword.queqiao.tool.event.model.achievement.AchievementModel;
import com.github.theword.queqiao.tool.event.model.death.DeathModel;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.advancements.Advancement;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.network.chat.contents.TranslatableContents;
import net.minecraftforge.event.CommandEvent;
import net.minecraftforge.event.ServerChatEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.player.AdvancementEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import static com.github.theword.queqiao.QueQiao.minecraftServer;
import java.util.Arrays;
import static com.github.theword.queqiao.tool.utils.Tool.*;
import static com.github.theword.queqiao.utils.ForgeTool.getForgeAchievement;
import static com.github.theword.queqiao.utils.ForgeTool.getForgePlayer;
public class EventProcessor {
@SubscribeEvent
public void onServerChat(ServerChatEvent event) {
if (event.isCanceled() || !GlobalContext.getConfig().getSubscribeEvent().isPlayerChat()) return;
PlayerModel player = getForgePlayer(event.getPlayer());
String message = event.getMessage().getString();
String rawMessage = Component.Serializer.toJson(event.getMessage(), minecraftServer.registryAccess());
PlayerChatEvent forgeServerChatEvent = new PlayerChatEvent(player, "", rawMessage, message);
GlobalContext.sendEvent(forgeServerChatEvent);
}
@SubscribeEvent
public void onPlayerJoin(PlayerLoggedInEvent event) {
if (event.isCanceled() || !GlobalContext.getConfig().getSubscribeEvent().isPlayerJoin()) return;
PlayerModel player = getForgePlayer((ServerPlayer) event.getEntity());
PlayerJoinEvent forgePlayerLoggedInEvent = new PlayerJoinEvent(player);
GlobalContext.sendEvent(forgePlayerLoggedInEvent);
}
@SubscribeEvent
public void onPlayerQuit(PlayerLoggedOutEvent event) {
if (event.isCanceled() || !GlobalContext.getConfig().getSubscribeEvent().isPlayerQuit()) return;
PlayerModel player = getForgePlayer((ServerPlayer) event.getEntity());
PlayerQuitEvent forgePlayerLoggedOutEvent = new PlayerQuitEvent(player);
GlobalContext.sendEvent(forgePlayerLoggedOutEvent);
}
@SubscribeEvent
public void onPlayerCommand(CommandEvent event) {
if (event.isCanceled() || !GlobalContext.getConfig().getSubscribeEvent().isPlayerCommand()) return;
if (!event.getParseResults().getContext().getSource().isPlayer()) return;
String command = isIgnoredCommand(event.getParseResults().getReader().getString());
String rawMessage = event.getParseResults().getContext().toString();
if (command.isEmpty()) return;
PlayerModel player;
try {
player = getForgePlayer(event.getParseResults().getContext().getSource().getPlayerOrException());
} catch (CommandSyntaxException e) {
return;
}
PlayerCommandEvent forgeCommandEvent = new PlayerCommandEvent(player, "", rawMessage, command);
GlobalContext.sendEvent(forgeCommandEvent);
}
@SubscribeEvent
public void onPlayerDeath(LivingDeathEvent event) {
if (event.isCanceled() || !GlobalContext.getConfig().getSubscribeEvent().isPlayerDeath()) return;
DeathModel deathModel = new DeathModel();
if (!(event.getEntity() instanceof ServerPlayer)) return;
PlayerModel player = getForgePlayer((ServerPlayer) event.getEntity());
LivingEntity entity = event.getEntity();
Component localizedDeathMessage = event.getSource().getLocalizedDeathMessage(entity);
if (localizedDeathMessage instanceof TranslatableContents) {
TranslatableContents translationTextComponent = (TranslatableContents) localizedDeathMessage;
deathModel.setKey(translationTextComponent.getKey());
String[] args = Arrays.stream(translationTextComponent.getArgs())
.map(arg -> {
if (arg instanceof Component) {
return ((Component) arg).getString();
} else {
return String.valueOf(arg);
}
})
.toArray(String[]::new);
deathModel.setArgs(args);
}
deathModel.setText(localizedDeathMessage.getString());
PlayerDeathEvent forgeCommandEvent = new PlayerDeathEvent(player, deathModel);
GlobalContext.sendEvent(forgeCommandEvent);
}
@SubscribeEvent
public void onPlayerAdvancement(AdvancementEvent.AdvancementEarnEvent event) {
if (!GlobalContext.getConfig().getSubscribeEvent().isPlayerAdvancement()) return;
Advancement advancement = event.getAdvancement().value();
if (advancement.display().isEmpty() || !advancement.display().get().shouldAnnounceChat()) return;
PlayerModel player = getForgePlayer((ServerPlayer) event.getEntity());
AchievementModel achievementModel = getForgeAchievement(advancement);
if (advancement.name().isEmpty()) return;
String advancementText = achievementModel.pattern(achievementModel.getDisplay().getFrame(), player.getNickname(), advancement.name().get().getString());
achievementModel.setText(advancementText);
PlayerAchievementEvent forgeAdvancementEvent = new PlayerAchievementEvent(player, achievementModel);
GlobalContext.sendEvent(forgeAdvancementEvent);
}
}