package jk_5.nailed.plugins.commands; import jk_5.nailed.api.command.CommandCallable; import jk_5.nailed.api.command.CommandException; import jk_5.nailed.api.command.Description; import jk_5.nailed.api.command.SettableDescription; import jk_5.nailed.api.command.context.CommandLocals; import jk_5.nailed.api.command.sender.AnalogContext; import jk_5.nailed.api.command.util.auth.AuthorizationException; import net.minecraft.command.*; import net.minecraft.entity.Entity; import net.minecraft.util.BlockPos; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Iterator; import java.util.List; public class VanillaCommand implements CommandCallable { private static final Logger logger = LogManager.getLogger(); private final CommandBase wrapped; private final Description description = new SettableDescription(); public VanillaCommand(CommandBase wrapped) { this.wrapped = wrapped; } @Override public boolean call(String arguments, CommandLocals locals, String[] parentCommands) throws CommandException, AuthorizationException { String[] split = arguments.split(" ", -1); AnalogContext analog = locals.get(AnalogContext.class); int usernameIndex = getUsernameIndex(split); ICommandSender sender = locals.get(ICommandSender.class); String input = (String) locals.get("CMD_INPUT"); int value = 0; if(usernameIndex > -1){ //Has username index String selector = split[usernameIndex]; List selected = PlayerSelector.matchEntities(sender, selector, Entity.class); sender.setCommandStat(CommandResultStats.Type.AFFECTED_ENTITIES, selected.size()); Iterator it = selected.iterator(); while(it.hasNext()){ Entity entity = (Entity) it.next(); split[usernameIndex] = entity.getUniqueID().toString(); if(execute(sender, split, input)){ value += 1; } } }else{ //No username index sender.setCommandStat(CommandResultStats.Type.AFFECTED_ENTITIES, 1); if(execute(sender, split, input)){ value += 1; } } if(analog != null){ analog.setPower(value); } sender.setCommandStat(CommandResultStats.Type.SUCCESS_COUNT, value); return true; } private boolean execute(ICommandSender sender, String[] args, String input){ try{ wrapped.processCommand(sender, args); return true; }catch(WrongUsageException e) { IChatComponent comp = new ChatComponentTranslation("commands.generic.usage", new ChatComponentTranslation(e.getMessage()), e.getErrorObjects()); comp.getChatStyle().setColor(EnumChatFormatting.RED); sender.addChatMessage(comp); }catch(net.minecraft.command.CommandException e) { IChatComponent comp = new ChatComponentTranslation(e.getMessage(), e.getErrorObjects()); comp.getChatStyle().setColor(EnumChatFormatting.RED); sender.addChatMessage(comp); }catch(Throwable t){ IChatComponent comp = new ChatComponentTranslation("commands.generic.exception"); comp.getChatStyle().setColor(EnumChatFormatting.RED); sender.addChatMessage(comp); logger.error("Couldn\'t process command: \'" + input + "\'", t); } return false; } @Override public Description getDescription() { return description; } @Override public boolean testPermission(CommandLocals locals) { return wrapped.canCommandSenderUseCommand(locals.get(ICommandSender.class)); } @Override public List<String> getSuggestions(String arguments, CommandLocals locals) throws CommandException { return (List<String>) wrapped.addTabCompletionOptions(locals.get(ICommandSender.class), arguments.split(" ", -1), BlockPos.ORIGIN); } private int getUsernameIndex(String[] args){ for(int i = 0; i < args.length; i++){ if(wrapped.isUsernameIndex(args, i) && PlayerSelector.matchesMultiplePlayers(args[i])){ return i; } } return -1; } }