From d50e891872e86a14d236661fd88ec250f431c8e4 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 16 Jul 2013 17:00:49 +1200 Subject: [PATCH] Added command to disguise in a radius --- plugin.yml | 10 +- .../Commands/DisguiseRadiusCommand.java | 183 ++++++++++++++++++ .../Commands/UndisguiseRadiusCommand.java | 49 +++++ 3 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 src/me/libraryaddict/disguise/Commands/DisguiseRadiusCommand.java create mode 100644 src/me/libraryaddict/disguise/Commands/UndisguiseRadiusCommand.java diff --git a/plugin.yml b/plugin.yml index e1ed28f5..bf1a3a6c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -11,4 +11,12 @@ commands: disguiseplayer: aliases: [dplayer, displayer] undisguiseplayer: - aliases: [undisplayer] \ No newline at end of file + aliases: [undisplayer] + disguiseentity: + aliases: [dentity, disentity] + undisguiseentity: + aliases: [undisentity] + disguiseradius: + aliases: [disradius, dradius] + undisguiseradius: + aliases: [undisradius] \ No newline at end of file diff --git a/src/me/libraryaddict/disguise/Commands/DisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/Commands/DisguiseRadiusCommand.java new file mode 100644 index 00000000..34b15a12 --- /dev/null +++ b/src/me/libraryaddict/disguise/Commands/DisguiseRadiusCommand.java @@ -0,0 +1,183 @@ +package me.libraryaddict.disguise.Commands; + +import java.util.ArrayList; +import java.util.Collections; + +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.DisguiseTypes.Disguise; +import me.libraryaddict.disguise.DisguiseTypes.DisguiseType; +import me.libraryaddict.disguise.DisguiseTypes.MiscDisguise; +import me.libraryaddict.disguise.DisguiseTypes.MobDisguise; +import me.libraryaddict.disguise.DisguiseTypes.PlayerDisguise; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +public class DisguiseRadiusCommand implements CommandExecutor { + + private ArrayList allowedDisguises(CommandSender sender) { + ArrayList names = new ArrayList(); + for (DisguiseType type : DisguiseType.values()) { + String name = type.name().toLowerCase(); + if (sender.hasPermission("libsdisguises.disguiseradius." + name)) + names.add(name); + } + Collections.sort(names, String.CASE_INSENSITIVE_ORDER); + return names; + } + + private ArrayList forbiddenDisguises(CommandSender sender) { + ArrayList names = new ArrayList(); + for (DisguiseType type : DisguiseType.values()) { + String name = type.name().toLowerCase(); + if (!sender.hasPermission("libsdisguises.disguiseradius." + name)) + names.add(name); + } + Collections.sort(names, String.CASE_INSENSITIVE_ORDER); + return names; + } + + private boolean isNumeric(String string) { + try { + Integer.parseInt(string); + return true; + } catch (Exception ex) { + return false; + } + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (sender.getName().equals("CONSOLE")) { + sender.sendMessage(ChatColor.RED + "You may not use this command from the console!"); + return true; + } + // What disguises can he use + ArrayList allowedDisguises = allowedDisguises(sender); + // If he owns at least one disguise + if (allowedDisguises.size() > 0) { + // Get his forbidden disguises (Disguises he can't use) for later use + ArrayList forbiddenDisguises = forbiddenDisguises(sender); + // If he is attempting to do something + if (args.length > 0) {// Better go check that its a proper radius + if (!isNumeric(args[0])) {// Radius doesn't exist. Knew it! + sender.sendMessage(ChatColor.RED + "Error! Radius " + ChatColor.GREEN + args[0] + ChatColor.RED + + " isn't a number!"); + return true; + } + if (args.length > 1) { + // If he owns the disguise + if (allowedDisguises.contains(args[1].toLowerCase())) { + // He can use the disguise huh. + int radius = Integer.parseInt(args[0]); + if (radius > 30) { + sender.sendMessage(ChatColor.RED + "Limited radius to 30! Don't want to make too much lag right?"); + radius = 30; + } + Disguise disguise = null; + // Time to start constructing the disguise. + // We will need to check between all 3 kinds of disguises + if (args[1].equalsIgnoreCase("player")) { // If he is doing a player disguise + // Did he give enough args? + if (args.length == 2) { + // He needs to give the player name + sender.sendMessage(ChatColor.RED + "Error! You need to give a player name!"); + return true; + } else { + // Construct the player disguise + disguise = new PlayerDisguise(ChatColor.translateAlternateColorCodes('&', args[2])); + } + } else { + // Grab the disguise type so we know what constructor to use + DisguiseType disguiseType = DisguiseType.valueOf(args[1].toUpperCase()); + if (disguiseType.isMob()) { // Its a mob, use the mob constructor + boolean adult = true; + if (args.length > 2) { + // Seems they want to make this a baby disguise! + if (!args[2].equalsIgnoreCase("false") && !args[2].equalsIgnoreCase("true")) { + sender.sendMessage(ChatColor.RED + "Error! " + ChatColor.GREEN + args[2] + ChatColor.RED + + " isn't true or false!"); + return true; + } + adult = args[1].equalsIgnoreCase("false"); + } + disguise = new MobDisguise(disguiseType, adult); + } else if (disguiseType.isMisc()) { + // Its a misc, we are going to use the MiscDisguise constructor. + int miscId = -1; + int miscData = -1; + if (args.length > 2) { + // They have defined more arguements! + // If the first arg is a number + if (isNumeric(args[2])) { + miscId = Integer.parseInt(args[2]); + } else { + // Send them a error + sender.sendMessage(ChatColor.RED + "Error! " + ChatColor.GREEN + args[2] + ChatColor.RED + + " is not a number!"); + return true; + } + // If they also defined a data value + if (args.length > 3) { + if (isNumeric(args[3])) { + miscData = Integer.parseInt(args[3]); + } else { + // Send them a error + sender.sendMessage(ChatColor.RED + "Error! " + ChatColor.GREEN + args[3] + + ChatColor.RED + " is not a number!"); + return true; + } + } + } + // Construct the disguise + disguise = new MiscDisguise(disguiseType, true, miscId, miscData); + } + } + // Alright. We've constructed our disguise. + // Time to use it! + int disguisedEntitys = 0; + for (Entity entity : ((Player) sender).getNearbyEntities(radius, radius, radius)) { + DisguiseAPI.disguiseToAll(entity, disguise); + disguisedEntitys++; + } + sender.sendMessage(ChatColor.RED + "Successfully disguised " + disguisedEntitys + " entities!"); + } else { + // He doesn't. Either tell him its incorrect or he isn't allowed to use it + if (forbiddenDisguises.contains(args[0].toLowerCase())) { + // He isn't allowed to use it.. + sender.sendMessage(ChatColor.RED + "You are forbidden to use this disguise!"); + } else { + sender.sendMessage(ChatColor.RED + "Error! The disguise " + ChatColor.GREEN + args[0] + ChatColor.RED + + " doesn't exist!"); + } + } + } else + sender.sendMessage(ChatColor.RED + "Error! You need to state a disguise!"); + } else { + // Just send the disguises information. + sendDisguises(sender, allowedDisguises, forbiddenDisguises); + } + } else + sender.sendMessage(ChatColor.RED + "You are forbidden to use this command!"); + return true; + } + + /** + * Send the player the information + */ + private void sendDisguises(CommandSender sender, ArrayList allowedDisguises, ArrayList forbiddenDisguises) { + sender.sendMessage(ChatColor.DARK_GREEN + "Disguise all entities in a radius! Caps at 30 blocks!"); + sender.sendMessage(ChatColor.DARK_GREEN + "You can use the disguises: " + ChatColor.GREEN + + StringUtils.join(allowedDisguises, ChatColor.RED + ", " + ChatColor.GREEN)); + if (allowedDisguises.contains("player")) + sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseradius player "); + sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseradius "); + if (allowedDisguises.contains("dropped_item") || allowedDisguises.contains("falling_block")) + sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseradius "); + } +} diff --git a/src/me/libraryaddict/disguise/Commands/UndisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/Commands/UndisguiseRadiusCommand.java new file mode 100644 index 00000000..f656b960 --- /dev/null +++ b/src/me/libraryaddict/disguise/Commands/UndisguiseRadiusCommand.java @@ -0,0 +1,49 @@ +package me.libraryaddict.disguise.Commands; + +import me.libraryaddict.disguise.DisguiseAPI; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +public class UndisguiseRadiusCommand implements CommandExecutor { + + private boolean isNumeric(String string) { + try { + Integer.parseInt(string); + return true; + } catch (Exception ex) { + return false; + } + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + if (sender.getName().equals("CONSOLE")) { + sender.sendMessage(ChatColor.RED + "You may not use this command from the console!"); + return true; + } + if (sender.hasPermission("libsdisguises.undisguiseradius")) { + int radius = 30; + if (args.length > 0) { + if (!isNumeric(args[0])) { + sender.sendMessage(ChatColor.RED + "Error! " + ChatColor.GREEN + args[0] + ChatColor.RED + + " is not a number!"); + return true; + } + radius = Integer.parseInt(args[0]); + } + int disguisedEntitys = 0; + for (Entity entity : ((Player) sender).getNearbyEntities(radius, radius, radius)) { + DisguiseAPI.undisguiseToAll(entity); + disguisedEntitys++; + } + sender.sendMessage(ChatColor.RED + "Successfully undisguised " + disguisedEntitys + " entities!"); + } else + sender.sendMessage(ChatColor.RED + "You are forbidden to use this command!"); + return true; + } +}