package kamkeel.npcs.command; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import noppes.npcs.controllers.CustomEffectController; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.data.CustomEffect; import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.scripted.event.player.PlayerEvent.EffectEvent.ExpirationType; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import static kamkeel.npcs.util.ColorUtil.sendError; import static kamkeel.npcs.util.ColorUtil.sendResult; public class EffectCommand extends CommandKamkeelBase { @Override public String getDescription() { return "Custom Effect operations"; } @Override public String getCommandName() { return "effect"; } // List command with pagination @SubCommand(desc = "Lists all Effects", usage = "[page]") public void list(ICommandSender sender, String[] args) throws CommandException { CustomEffectController controller = CustomEffectController.getInstance(); if (controller.indexMapper.isEmpty()) { sendError(sender, "No effects found."); return; } // Flatten effects into a list List effectsList = new ArrayList<>(); for (Map.Entry> entry : controller.indexMapper.entrySet()) { int idx = entry.getKey(); Map effects = entry.getValue(); if (effects == null || effects.isEmpty()) continue; for (Map.Entry effectEntry : effects.entrySet()) { int id = effectEntry.getKey(); CustomEffect effect = effectEntry.getValue(); effectsList.add(new EffectEntry(idx, id, effect)); } } // Sort by index then by effect ID Collections.sort(effectsList, Comparator.comparingInt((EffectEntry e) -> e.index) .thenComparingInt(e -> e.id)); // Determine page number int page = 1; if (args.length > 0) { try { page = Integer.parseInt(args[0]); } catch (NumberFormatException e) { // default to page 1 } } int perPage = 10; int total = effectsList.size(); int totalPages = (int) Math.ceil(total / (double) perPage); if (page < 1) page = 1; if (page > totalPages) page = totalPages; int startIndex = (page - 1) * perPage; int endIndex = Math.min(startIndex + perPage, total); sendResult(sender, "--------------------"); sendResult(sender, "Effects (Page " + page + "/" + totalPages + "):"); for (int i = startIndex; i < endIndex; i++) { EffectEntry entry = effectsList.get(i); sendResult(sender, String.format("\u00a7b%s \u00a77(ID: %d, INDEX: %d)", entry.effect.getName(), entry.id, entry.index)); } sendResult(sender, "--------------------"); } // Give effect by name. // Usage: