Add Disguise Clone command to clone a entity to look like them

This commit is contained in:
libraryaddict 2014-06-02 04:08:54 +12:00
parent fb1f7a698c
commit 4262221133
6 changed files with 124 additions and 19 deletions

View File

@ -22,4 +22,6 @@ commands:
undisguiseplayer:
aliases: [undisplayer, undplayer]
undisguiseradius:
aliases: [undisradius, undradius]
aliases: [undisradius, undradius]
disguiseclone:
aliases: [disguisec, disc, disclone, dclone, clonedisguise, clonedis, cdisguise, cdis]

View File

@ -30,8 +30,9 @@ import org.bukkit.scheduler.BukkitRunnable;
public class DisguiseListener implements Listener {
private String currentVersion;
private HashMap<String, Boolean[]> disguiseClone = new HashMap<String, Boolean[]>();
private HashMap<String, Disguise> disguiseEntity = new HashMap<String, Disguise>();
private HashMap<String, BukkitRunnable> disguiseRunnable = new HashMap<String, BukkitRunnable>();
private HashMap<String, Disguise> disguiseSlap = new HashMap<String, Disguise>();
private String latestVersion;
private LibsDisguises plugin;
private String updateMessage = ChatColor.RED + "[LibsDisguises] " + ChatColor.DARK_RED
@ -120,10 +121,9 @@ public class DisguiseListener implements Listener {
@EventHandler
public void onRightClick(PlayerInteractEntityEvent event) {
if (disguiseSlap.containsKey(event.getPlayer().getName())) {
if (disguiseEntity.containsKey(event.getPlayer().getName()) || disguiseClone.containsKey(event.getPlayer().getName())) {
Player p = event.getPlayer();
event.setCancelled(true);
Disguise disguise = disguiseSlap.remove(p.getName());
disguiseRunnable.remove(p.getName()).cancel();
Entity entity = event.getRightClicked();
String entityName = "";
@ -138,21 +138,36 @@ public class DisguiseListener implements Listener {
}
}
}
Disguise disguise = null;
Entity disguiseTarget = null;
if (disguiseClone.containsKey(p.getName())) {
Boolean[] options = disguiseClone.remove(p.getName());
disguiseTarget = p;
disguise = DisguiseAPI.getDisguise(p, entity);
if (disguise == null) {
disguise = DisguiseAPI.constructDisguise(entity, options[0], options[1], options[2]);
} else {
disguise = disguise.clone();
}
} else if (disguiseEntity.containsKey(p.getName())) {
disguiseTarget = entity;
disguise = disguiseEntity.remove(p.getName());
}
if (disguise != null) {
if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled()
&& entity instanceof LivingEntity) {
&& disguiseTarget instanceof LivingEntity) {
p.sendMessage(ChatColor.RED
+ "Can't disguise a living entity as a misc disguise. This has been disabled in the config!");
} else {
if (entity instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) {
if (disguiseTarget instanceof Player && DisguiseConfig.isNameOfPlayerShownAboveDisguise()) {
if (disguise.getWatcher() instanceof LivingWatcher) {
((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) entity).getDisplayName());
((LivingWatcher) disguise.getWatcher()).setCustomName(((Player) disguiseTarget).getDisplayName());
if (DisguiseConfig.isNameAboveHeadAlwaysVisible()) {
((LivingWatcher) disguise.getWatcher()).setCustomNameVisible(true);
}
}
}
DisguiseAPI.disguiseToAll(entity, disguise);
DisguiseAPI.disguiseToAll(disguiseTarget, disguise);
String disguiseName = "a ";
if (disguise instanceof PlayerDisguise) {
disguiseName = "the player " + ((PlayerDisguise) disguise).getName();
@ -165,8 +180,13 @@ public class DisguiseListener implements Listener {
}
}
}
p.sendMessage(ChatColor.RED + "Disguised " + (entity instanceof Player ? "" : "the ") + entityName + " as "
+ disguiseName + "!");
if (disguiseTarget == p) {
p.sendMessage(ChatColor.RED + "Disguised yourself" + " as " + (entity instanceof Player ? "" : "a ")
+ entityName + "!");
} else {
p.sendMessage(ChatColor.RED + "Disguised " + (entity instanceof Player ? "" : "the ") + entityName
+ " as " + disguiseName + "!");
}
}
} else {
if (DisguiseAPI.isDisguised(entity)) {
@ -222,20 +242,38 @@ public class DisguiseListener implements Listener {
}
}
public void setSlap(final String player, Disguise disguise) {
if (disguiseSlap.containsKey(player)) {
disguiseSlap.remove(player);
disguiseRunnable.remove(player).cancel();
public void setDisguiseClone(final String player, Boolean[] options) {
if (disguiseRunnable.containsKey(player)) {
BukkitRunnable run = disguiseRunnable.remove(player);
run.cancel();
run.run();
}
BukkitRunnable runnable = new BukkitRunnable() {
public void run() {
disguiseSlap.remove(player);
disguiseClone.remove(player);
disguiseRunnable.remove(player);
}
};
runnable.runTaskLater(plugin, 20 * 10);
disguiseRunnable.put(player, runnable);
disguiseSlap.put(player, disguise);
disguiseClone.put(player, options);
}
public void setDisguiseEntity(final String player, Disguise disguise) {
if (disguiseRunnable.containsKey(player)) {
BukkitRunnable run = disguiseRunnable.remove(player);
run.cancel();
run.run();
}
BukkitRunnable runnable = new BukkitRunnable() {
public void run() {
disguiseEntity.remove(player);
disguiseRunnable.remove(player);
}
};
runnable.runTaskLater(plugin, 20 * 10);
disguiseRunnable.put(player, runnable);
disguiseEntity.put(player, disguise);
}
}

View File

@ -138,6 +138,7 @@ public class LibsDisguises extends JavaPlugin {
getCommand("disguiseradius").setExecutor(new DisguiseRadiusCommand(getConfig().getInt("DisguiseRadiusMax")));
getCommand("undisguiseradius").setExecutor(new UndisguiseRadiusCommand(getConfig().getInt("UndisguiseRadiusMax")));
getCommand("disguisehelp").setExecutor(new DisguiseHelpCommand());
getCommand("disguiseclone").setExecutor(new DisguiseCloneCommand(listener));
getCommand("libsdisguises").setExecutor(new LibsDisguisesCommand());
registerValues();
}

View File

@ -0,0 +1,64 @@
package me.libraryaddict.disguise.commands;
import me.libraryaddict.disguise.DisguiseListener;
import me.libraryaddict.disguise.utilities.BaseDisguiseCommand;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class DisguiseCloneCommand extends BaseDisguiseCommand {
private DisguiseListener listener;
public DisguiseCloneCommand(DisguiseListener listener) {
this.listener = listener;
}
@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.disguise.disguiseclone")) {
boolean doEnquipment = true;
boolean doSneak = false;
boolean doSprint = false;
for (String option : args) {
if (StringUtils.startsWithIgnoreCase(option, "ignoreEnquip")) {
doEnquipment = false;
} else if (option.equalsIgnoreCase("doSneakSprint")) {
doSneak = true;
doSprint = true;
} else if (option.equalsIgnoreCase("doSneak")) {
doSneak = true;
} else if (option.equalsIgnoreCase("doSprint")) {
doSprint = true;
} else {
sender.sendMessage(ChatColor.DARK_RED + "Unknown option '" + option
+ "' - Valid options are 'IgnoreEnquipment' 'DoSneakSprint' 'DoSneak' 'DoSprint'");
return true;
}
}
listener.setDisguiseClone(sender.getName(), new Boolean[] { doEnquipment, doSneak, doSprint });
sender.sendMessage(ChatColor.RED + "Right click a entity in the next 10 seconds to disguise as it!");
} else {
sender.sendMessage(ChatColor.RED + "There was once a curious little boy,"
+ " he liked to try out these strange sounding commands."
+ " One day, that curious little boy tried out the wrong command and was set on fire!" + " Aka.");
sender.sendMessage(ChatColor.DARK_RED + "You are forbidden to use this command.");
}
return true;
}
/**
* Send the player the information
*/
protected void sendCommandUsage(CommandSender sender) {
sender.sendMessage(ChatColor.DARK_GREEN + "Disguise as the entity you right click! Or as their disguise!");
sender.sendMessage(ChatColor.DARK_GREEN + "/disguiseclone IgnoreEnquipment" + ChatColor.DARK_GREEN + "("
+ ChatColor.GREEN + "Optional" + ChatColor.DARK_GREEN + ")");
}
}

View File

@ -35,7 +35,7 @@ public class DisguiseEntityCommand extends BaseDisguiseCommand {
}
return true;
}
listener.setSlap(sender.getName(), disguise);
listener.setDisguiseEntity(sender.getName(), disguise);
sender.sendMessage(ChatColor.RED + "Right click a entity in the next 10 seconds to disguise it as a "
+ disguise.getType().toReadable() + "!");
return true;

View File

@ -21,10 +21,10 @@ public class UndisguiseEntityCommand implements CommandExecutor {
return true;
}
if (sender.hasPermission("libsdisguises.undisguiseentity")) {
listener.setSlap(sender.getName(), null);
listener.setDisguiseEntity(sender.getName(), null);
sender.sendMessage(ChatColor.RED + "Right click a disguised entity to undisguise them!");
} else
sender.sendMessage(ChatColor.RED + "You are forbidden to use this command!");
sender.sendMessage(ChatColor.RED + "You are forbidden to use this command.");
return true;
}
}