Untitled

 avatar
unknown
plain_text
a year ago
17 kB
17
Indexable
package me.spin.pixelchat.handlers;

import com.pixelmonmod.pixelmon.api.pokemon.Element;
import com.pixelmonmod.pixelmon.api.pokemon.Nature;
import com.pixelmonmod.pixelmon.api.pokemon.Pokemon;
import com.pixelmonmod.pixelmon.api.pokemon.stats.BattleStatsType;
import com.pixelmonmod.pixelmon.api.pokemon.stats.EVStore;
import me.spin.pixelchat.extras.PixelmonUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.Items;
import net.minecraftforge.event.ServerChatEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@EventBusSubscriber
public class PixelmonChatEventHandler {

    @SubscribeEvent
    public static void onServerChat(ServerChatEvent event) {
        ServerPlayer player = event.getPlayer();
        String message = event.getMessage().getString();
        Pattern pattern = Pattern.compile("(?i)\\{(pixelmon|moves|party)([1-6])?\\}");
        Matcher matcher = pattern.matcher(message);

        MutableComponent newMessage = Component.empty();
        int lastEnd = 0;

        while (matcher.find()) {
            String command = matcher.group(1).toLowerCase();
            int slot = matcher.group(2) != null ? Integer.parseInt(matcher.group(2)) : -1;

            String placeholder = message.substring(matcher.start(), matcher.end());
            Component displayText = processCommand(player, command, slot, placeholder);

            newMessage.append(Component.literal(message.substring(lastEnd, matcher.start())));
            newMessage.append(displayText);
            lastEnd = matcher.end();
        }

        newMessage.append(Component.literal(message.substring(lastEnd)));
        player.displayClientMessage(newMessage, false);
        event.setCanceled(true);
    }

    private static Component processCommand(ServerPlayer player, String command, int slot, String placeholder) {
        if ("party".equals(command) && slot == -1) {
            String partyInfo = formatPlayerParty(player);
            return createHoverableComponent("§8§l[§a§lParty§8§l]", partyInfo);
        } else if ("pixelmon".equals(command) && slot != -1) {
            Pokemon pokemon = PixelmonUtils.getPokemon(player, slot);
            if (pokemon != null) {
                String info = formatPokemonInfo(pokemon);
                return createHoverableComponent("§8§l[§a§l" + pokemon.getSpecies().getName() + "§8§l]", info);
            } else {
                return Component.literal("No Pokémon in slot " + slot);
            }
        } else if ("moves".equals(command) && slot != -1) {
            Pokemon movesPokemon = PixelmonUtils.getPokemon(player, slot);
            if (movesPokemon != null) {
                String movesInfo = formatPokemonMoves(movesPokemon);
                return createHoverableComponent("§8§l[§a§lMoves§8§l]", movesInfo);
            } else {
                return Component.literal("No Pokémon in slot " + slot);
            }
        } else {
            return Component.literal(placeholder);
        }
    }

    private static Component createHoverableComponent(String text, String hoverText) {
        Component hoverComponent = Component.literal(hoverText.replaceAll("§", "\u00A7"));
        return Component.literal(text.replaceAll("§", "\u00A7"))
                .setStyle(Style.EMPTY.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverComponent)));
    }



    private static String formatPokemonInfo(Pokemon pokemon) {
        StringBuilder info = new StringBuilder();
        String name = pokemon.getNickname().isEmpty() ? pokemon.getSpecies().getName() : pokemon.getNickname();
        info.append("§a").append(name).append(pokemon.isShiny() ? " §6★" : "").append("\n\n");
        info.append("§aLevel: §d").append(pokemon.getPokemonLevel()).append("\n");
        info.append("§aTypes: ").append(formatPokemonTypes(pokemon)).append("\n");
        info.append("§aNature: §d").append(formatNature(pokemon.getNature())).append("\n");
        info.append("§aGrowth: §d").append(pokemon.getGrowth().getLocalizedName()).append("\n");
        info.append("§aAbility: §d").append(pokemon.getAbility().getName()).append("\n");
        info.append("§aOT: §d").append(pokemon.getOriginalTrainer()).append("\n");
        if (!pokemon.getHeldItem().isEmpty()) {
            info.append("§aItem: §d").append(pokemon.getHeldItem().getDisplayName().getString()).append("\n");
        }
        String pokeballColor = getPokeballColor(pokemon.getBall().getLocalizedName());
        System.out.println("Pokeball Color Code: " + pokeballColor); // Debug log
        info.append("§aPokeball: ").append(pokeballColor).append(pokemon.getBall().getLocalizedName()).append("\n\n");
        info.append("§bIVs: §d").append(pokemon.getIVs().getTotal()).append("/").append(186).append(" §a(").append(pokemon.getIVs().getPercentageString(2)).append("%)\n");
        info.append("§6HP: ").append(pokemon.getIVs().getStat(BattleStatsType.HP)).append("§8/§cAtk: ").append(pokemon.getIVs().getStat(BattleStatsType.ATTACK)).append("§8/§eDef: ").append(pokemon.getIVs().getStat(BattleStatsType.DEFENSE)).append("\n");
        info.append("§9SpA: ").append(pokemon.getIVs().getStat(BattleStatsType.SPECIAL_ATTACK)).append("§8/§aSpD: ").append(pokemon.getIVs().getStat(BattleStatsType.SPECIAL_DEFENSE)).append("§8/§dSpe: ").append(pokemon.getIVs().getStat(BattleStatsType.SPEED)).append("\n");
        info.append("§bEVs: §d").append(pokemon.getEVs().getTotal()).append("/").append(510).append("\n");
        info.append("§6HP: ").append(pokemon.getEVs().getStat(BattleStatsType.HP)).append("§8/§cAtk: ").append(pokemon.getEVs().getStat(BattleStatsType.ATTACK)).append("§8/§eDef: ").append(pokemon.getEVs().getStat(BattleStatsType.DEFENSE)).append("\n");
        info.append("§9SpA: ").append(pokemon.getEVs().getStat(BattleStatsType.SPECIAL_ATTACK)).append("§8/§aSpD: ").append(pokemon.getEVs().getStat(BattleStatsType.SPECIAL_DEFENSE)).append("§8/§dSpe: ").append(pokemon.getEVs().getStat(BattleStatsType.SPEED));

        return info.toString().replaceAll("§", "\u00A7");
    }

    private static String getPokeballColor(String pokeballName) {
        String lowercaseName = pokeballName.toLowerCase().replace(" ", "_");
        System.out.println("Pokeball Name: " + lowercaseName); // Debug log
        switch (lowercaseName) {
            case "poke_ball":
                return "§c"; // Red
            case "great_ball":
                return "§9"; // Blue
            case "ultra_ball":
                return "§e"; // Yellow
            case "master_ball":
                return "§5"; // Purple
            case "safari_ball":
                return "§2"; // Green
            case "premier_ball":
                return "§f"; // White
            case "net_ball":
                return "§3"; // Teal
            case "dive_ball":
                return "§1"; // Dark Blue
            case "luxury_ball":
                return "§6"; // Gold
            case "heal_ball":
                return "§d"; // Pink
            case "quick_ball":
                return "§b"; // Light Blue
            case "timer_ball":
                return "§8"; // Grey
            case "dusk_ball":
                return "§0"; // Black
            case "cherish_ball":
                return "§4"; // Dark Red
            case "repeat_ball":
                return "§c"; // Red
            case "nest_ball":
                return "§a"; // Light Green
            case "level_ball":
                return "§6"; // Brown
            case "lure_ball":
                return "§9"; // Blue
            case "moon_ball":
                return "§5"; // Purple
            case "friend_ball":
                return "§2"; // Green
            case "love_ball":
                return "§d"; // Pink
            case "heavy_ball":
                return "§8"; // Grey
            case "fast_ball":
                return "§c"; // Red
            case "sport_ball":
                return "§6"; // Brown
            case "beast_ball":
                return "§a"; // Green
            default:
                return "§f";
        }
    }

    private static String formatNature(Nature nature) {
        BattleStatsType increasedStat = nature.getIncreasedStat();
        BattleStatsType decreasedStat = nature.getDecreasedStat();

        String increasedStatName = getStatName(increasedStat);
        String decreasedStatName = getStatName(decreasedStat);

        return "§d" + nature.getLocalizedName() + " §8(§a+" + increasedStatName + "§8/§c-" + decreasedStatName + "§8)";
    }


    private static String getStatName(BattleStatsType statType) {
        switch (statType) {
            case ATTACK:
                return "Attack";
            case DEFENSE:
                return "Defense";
            case SPECIAL_ATTACK:
                return "Special Attack";
            case SPECIAL_DEFENSE:
                return "Special Defense";
            case SPEED:
                return "Speed";
            case NONE:
                return "None";
            default:
                return "Unknown";
        }
    }
    private static String formatPokemonMoves(Pokemon pokemon) {
        StringBuilder movesInfo = new StringBuilder();
        String pokemonName = pokemon.getNickname().isEmpty() ? pokemon.getSpecies().getName() : pokemon.getNickname();
        movesInfo.append("§a").append(pokemonName).append(pokemon.isShiny() ? " §6★" : "").append("\n\n");

        int moveCount = 0;
        for (var move : pokemon.getMoveset()) {
            if (move != null) {
                if (moveCount > 0 && moveCount % 2 == 0) {
                    movesInfo.append("\n");
                } else if (moveCount > 0) {
                    movesInfo.append(" §8| ");
                }
                String moveTypeColor = getMoveTypeColor(move.getMove().getAttackType());
                movesInfo.append(moveTypeColor).append(move.getMove().getLocalizedName());
                moveCount++;
            }
        }
        return movesInfo.toString().trim();
    }
    private static String getMoveTypeColor(Element moveType) {
        switch (moveType) {
            case FIRE:
                return "§c"; // Red for Fire
            case WATER:
                return "§9"; // Blue for Water
            case GRASS:
                return "§2"; // Green for Grass
            case ELECTRIC:
                return "§e"; // Yellow for Electric
            case PSYCHIC:
                return "§d"; // Pink for Psychic
            case ICE:
                return "§b"; // Light Blue for Ice
            case DRAGON:
                return "§5"; // Purple for Dragon
            case DARK:
                return "§8"; // Dark Grey for Dark
            case FAIRY:
                return "§f"; // White for Fairy
            case NORMAL:
                return "§7"; // Silver/Grey for Normal
            case FIGHTING:
                return "§6"; // Orange/Brown for Fighting
            case POISON:
                return "§d"; // Pink for Poison
            case GROUND:
                return "§8"; // Dark Grey for Ground
            case FLYING:
                return "§f"; // White for Flying
            case BUG:
                return "§a"; // Light Green for Bug
            case ROCK:
                return "§8"; // Grey for Rock
            case GHOST:
                return "§5"; // Dark Purple for Ghost
            case STEEL:
                return "§7"; // Light Grey for Steel
            default:
                return "§7";
        }
    }
    private static String formatPokemonTypes(Pokemon pokemon) {
        StringBuilder typesInfo = new StringBuilder();
        var types = pokemon.getForm().getTypes();
        for (int i = 0; i < types.size(); i++) {
            if (i > 0) {
                typesInfo.append(" §8| ");
            }
            Element type = types.get(i);
            String typeColor = getMoveTypeColor(type);
            typesInfo.append(typeColor).append(type.getLocalizedName());
        }
        return typesInfo.toString().trim();
    }

    private static String formatPlayerParty(ServerPlayer player) {
        StringBuilder partyInfo = new StringBuilder("Player's Party:\n");
        Pokemon[] party = PixelmonUtils.getPlayerParty(player);

        if (party.length == 0) {
            return "No Pokémon in Party.";
        }

        for (Pokemon pokemon : party) {
            if (pokemon != null) {
                String pokemonName = pokemon.getNickname().isEmpty() ? pokemon.getSpecies().getName() : pokemon.getNickname();
                partyInfo.append("§a").append(pokemonName).append(" - Lvl: ").append(pokemon.getPokemonLevel()).append("\n");
            }
        }
        return partyInfo.toString();
    }

}





package me.spin.pixelchat.extras;

import com.pixelmonmod.pixelmon.api.pokemon.Pokemon;
import com.pixelmonmod.pixelmon.api.storage.PlayerPartyStorage;
import com.pixelmonmod.pixelmon.api.command.PixelmonCommandUtils;
import net.minecraft.server.level.ServerPlayer;

public class PixelmonUtils {

    public static Pokemon getPokemon(ServerPlayer player, int slot) {
        PlayerPartyStorage partyStorage = PixelmonCommandUtils.getPlayerStorage(player);

        if (partyStorage != null) {
            return partyStorage.get(slot - 1);
        }

        return null;
    }

    public static Pokemon[] getPlayerParty(ServerPlayer player) {
        PlayerPartyStorage partyStorage = PixelmonCommandUtils.getPlayerStorage(player);

        if (partyStorage != null) {
            return partyStorage.getAll();
        }

        return new Pokemon[0];
    }
}




package me.spin.pixelchat.listener;

import com.pixelmonmod.pixelmon.api.pokemon.Pokemon;
import me.spin.pixelchat.extras.PixelmonUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.event.ServerChatEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber
public class ChatListener {

    @SubscribeEvent
    public static void onChat(ServerChatEvent event) {
        Component originalMessage = event.getMessage();
        String messageStr = originalMessage.getString();
        ServerPlayer player = event.getPlayer();

        if (messageStr.matches("\\{pixelmon[1-6]\\}")) {
            int slot = Integer.parseInt(messageStr.replaceAll("\\D+", ""));
            String pokemonInfo = processPokemonInfo(player, slot);
            
            event.setMessage(Component.literal(pokemonInfo));
        }
    }

    private static String processPokemonInfo(ServerPlayer player, int slot) {
        try {
            Pokemon pokemon = PixelmonUtils.getPokemon(player, slot);
            if (pokemon != null) {
                return formatPokemonInfo(pokemon);
            } else {
                return "No Pokemon in slot " + slot;
            }
        } catch (Exception e) {
            return "Error processing Pokemon info";
        }
    }

    private static String formatPokemonInfo(Pokemon pokemon) {
        StringBuilder info = new StringBuilder();
        info.append("Name: ").append(pokemon.getSpecies().getName()).append("\n");
        info.append("Nature: ").append(pokemon.getNature().getLocalizedName()).append("\n");
        info.append("IVs: ").append(pokemon.getIVs().toString()).append("\n");
        info.append("EVs: ").append(pokemon.getEVs().toString()).append("\n");
        info.append("Pokeball: ").append(pokemon.getBall().getLocalizedName()).append("\n");
        info.append("Growth: ").append(pokemon.getGrowth().getLocalizedName()).append("\n");
        info.append("Ability: ").append(pokemon.getAbility().getLocalizedName()).append("\n");
        info.append("Trainer: ").append(pokemon.getOriginalTrainer()).append("\n");
        info.append("Level: ").append(pokemon.getPokemonLevel()).append("\n");
        

        return info.toString();
    }
}
Editor is loading...
Leave a Comment