fixed guests, egg breeding, other singleton fixes

tbh the guests fixed themselves
This commit is contained in:
Charlie 2014-07-30 16:47:28 -04:00
parent d162115f4f
commit 0be6fc4f2d
4 changed files with 152 additions and 63 deletions

View File

@ -1,14 +1,10 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ca.gibstick.discosheep; package ca.gibstick.discosheep;
import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandPermissions; import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.sk89q.minecraft.util.commands.NestedCommand; import com.sk89q.minecraft.util.commands.NestedCommand;
import java.util.Arrays;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandException; import org.bukkit.command.CommandException;
@ -35,23 +31,64 @@ public class DiscoCommands {
static final String PERMISSION_TOGGLEPARTYONJOIN = "discosheep.admin.toggleonjoin"; static final String PERMISSION_TOGGLEPARTYONJOIN = "discosheep.admin.toggleonjoin";
static final String PERMISSION_LIGHTNING = "discosheep.party.lightning"; static final String PERMISSION_LIGHTNING = "discosheep.party.lightning";
static final String FLAGS = "n:t:p:r:lf"; static final String FLAGS = "n:t:p:r:lfg";
private static final DiscoSheep plugin = DiscoSheep.getInstance(); private static final DiscoSheep plugin = DiscoSheep.getInstance();
public static class ParentCommand { public static class ParentCommand {
@Command(aliases = {"discosheep", "ds"}, desc = "Main Discosheep Command", min = 0, max = -1) @Command(aliases = {"ds", "discosheep"}, desc = "Main Discosheep Command (see /ds help)", min = 0, max = -1)
@NestedCommand(DiscoCommands.class) @NestedCommand(DiscoCommands.class)
public static void DiscoCommand(final CommandContext args, CommandSender sender) throws CommandException { public static void DiscoCommand(final CommandContext args, CommandSender sender) throws CommandException {
} }
} }
private static boolean getNextArg(String[] args, int i, String compare) {
if (i < args.length - 1) {
return args[i + 1].equalsIgnoreCase(compare);
}
return false;
}
private static String getNextArg(String[] args, int i) {
if (i < args.length - 1) {
return args[i + 1];
} else {
return null;
}
}
// return portion of the array that contains space-separated args,
// stopping at the end of the array or the next -switch
private static String[] getNextArgs(String[] args, int i) {
int j = i;
while (j < args.length && !args[j].startsWith("-")) {
j++;
}
return Arrays.copyOfRange(args, i, j);
}
private static int getNextIntArg(String[] args, int i) {
if (i < args.length - 1) {
try {
return Integer.parseInt(args[i + 1]);
} catch (NumberFormatException e) {
return -1; // so that it fails limit checks elsewhere
}
}
return -1; // ibid
}
private static void parsePartyFlags(DiscoParty party, final CommandContext args, CommandSender sender) throws IllegalArgumentException { private static void parsePartyFlags(DiscoParty party, final CommandContext args, CommandSender sender) throws IllegalArgumentException {
party.setDuration(args.getFlagInteger('t', DiscoParty.defaultDuration));
party.setPeriod(args.getFlagInteger('p', DiscoParty.defaultPeriod)); party.setPeriod(args.getFlagInteger('p', DiscoParty.defaultPeriod));
party.setSheep(args.getFlagInteger('n', DiscoParty.defaultSheep)); party.setSheep(args.getFlagInteger('n', DiscoParty.defaultSheep));
// handle special case of duration conversion ugh
if (args.hasFlag('t')) {
int duration = args.getFlagInteger('t');
party.setDuration(plugin.toTicks(duration));
}
// handle the special case of radius flag arg "dense" // handle the special case of radius flag arg "dense"
String radiusArg = args.getFlag('r', Integer.toString(DiscoParty.defaultRadius)); String radiusArg = args.getFlag('r', Integer.toString(DiscoParty.defaultRadius));
if ("dense".equals(radiusArg)) { if ("dense".equals(radiusArg)) {
@ -60,6 +97,7 @@ public class DiscoCommands {
party.setRadius(Integer.parseInt(radiusArg)); party.setRadius(Integer.parseInt(radiusArg));
} }
// party will still start if player doesn't have permission for extras
if (sender.hasPermission(PERMISSION_FIREWORKS)) { if (sender.hasPermission(PERMISSION_FIREWORKS)) {
party.setDoFireworks(args.hasFlag('f')); party.setDoFireworks(args.hasFlag('f'));
} else { } else {
@ -71,11 +109,58 @@ public class DiscoCommands {
} else { } else {
plugin.noPermsMessage(sender, PERMISSION_LIGHTNING); plugin.noPermsMessage(sender, PERMISSION_LIGHTNING);
} }
// handle guests
if (args.hasFlag('g')) {
// stop if no permission for spawning guests
if (!sender.hasPermission(PERMISSION_SPAWNGUESTS)) {
plugin.noPermsMessage(sender, PERMISSION_SPAWNGUESTS);
return;
} }
@Command(aliases = {"test"}, desc = "Test command", usage = "No arguments", min = 0, max = 0) String dirtyArgs[] = args.getParsedSlice(0);
public static void test(final CommandContext args, CommandSender sender) throws CommandException { //sender.sendMessage(dirtyArgs);
sender.sendMessage("TESTING"); for (int i = 0; i < dirtyArgs.length; i++) {
if ("none".equals(dirtyArgs[0])) {
plugin.clearGuests(party);
return;
}
String[] guests = dirtyArgs;
int j = 0;
while (j < guests.length - 1) {
try {
party.setGuestNumber(guests[j].toUpperCase(), getNextIntArg(guests, j));
} catch (IllegalArgumentException e) {
sender.sendMessage(ChatColor.RED + "Invalid arguments: " + ChatColor.WHITE + guests[j] + ", " + guests[j + 1]
+ ".\nEither a name typo or a number that is not within limits.");
}
j += 2; // skip over two arguments, since they come in pairs of entity-number
}
}
}
}
/*-- Actual commands begin here --*/
@Command(aliases = "help", desc = "DiscoSheep help", usage = "No arguments", min = 0, max = -1)
public static void helpCommand(CommandContext args, CommandSender sender) {
sender.sendMessage(ChatColor.YELLOW
+ "DiscoSheep Help\n"
+ ChatColor.GRAY
+ " Subcommands\n"
+ ChatColor.WHITE + "me, stop, all, stopall, save, reload, togglejoin\n"
+ "other <players>: start a party for the space-delimited list of players\n"
+ "defaults: Change the default settings for parties (takes normal arguments)\n"
+ ChatColor.GRAY + " Arguments\n"
+ ChatColor.WHITE + "-n <integer>: set the number of sheep per player that spawn\n"
+ "-t <seconds>: set the party duration in seconds\n"
+ "-p <ticks>: set the number of ticks between each disco beat\n"
+ "-r <radius>: set radius of the area in which sheep can spawn\n"
+ "-g <mob> <number>: set spawns for other mobs"
+ "-l: enables lightning"
+ "-f: enables fireworks");
} }
@Command(aliases = {"stop", "stoppls", "wtf"}, desc = "Stop your own disco party", usage = "No arguments", min = 0, max = 0) @Command(aliases = {"stop", "stoppls", "wtf"}, desc = "Stop your own disco party", usage = "No arguments", min = 0, max = 0)
@ -90,7 +175,8 @@ public class DiscoCommands {
} }
@Command(aliases = {"reload"}, desc = "Reload DiscoSheep configuration from file", usage = "No arguments", min = 0, max = 0) @Command(aliases = {"reload"}, desc = "Reload DiscoSheep configuration from file", usage = "No arguments", min = 0, max = 0)
public static void reloadCommand(final CommandContext args, CommandSender sender) { public static void reloadCommand(final CommandContext args, CommandSender sender
) {
plugin.reloadConfigFromDisk(); plugin.reloadConfigFromDisk();
sender.sendMessage(ChatColor.GREEN + "DiscoSheep config reloaded from file."); sender.sendMessage(ChatColor.GREEN + "DiscoSheep config reloaded from file.");
} }
@ -104,7 +190,8 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_PARTY) @CommandPermissions(value = PERMISSION_PARTY)
public static void partyCommand(final CommandContext args, CommandSender sender) { public static void partyCommand(final CommandContext args, CommandSender sender
) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
sender.sendMessage("You must be a player to have a party"); sender.sendMessage("You must be a player to have a party");
return; return;
@ -131,13 +218,13 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_OTHER) @CommandPermissions(value = PERMISSION_OTHER)
public static void partyOtherCommand(CommandContext args, CommandSender sender) { public static void partyOtherCommand(CommandContext args, CommandSender sender
) {
DiscoParty party = new DiscoParty(); DiscoParty party = new DiscoParty();
Player p;
String players[] = args.getSlice(1);
parsePartyFlags(party, args, sender); parsePartyFlags(party, args, sender);
String players[] = args.getParsedSlice(0);
Player p;
for (String playerName : players) { for (String playerName : players) {
p = Bukkit.getServer().getPlayer(playerName); p = Bukkit.getServer().getPlayer(playerName);
if (p != null) { if (p != null) {
@ -160,7 +247,8 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_ALL) @CommandPermissions(value = PERMISSION_ALL)
public static void partyAllCommand(final CommandContext args, CommandSender sender) { public static void partyAllCommand(final CommandContext args, CommandSender sender
) {
DiscoParty party = new DiscoParty(); DiscoParty party = new DiscoParty();
parsePartyFlags(party, args, sender); parsePartyFlags(party, args, sender);
for (Player p : Bukkit.getServer().getOnlinePlayers()) { for (Player p : Bukkit.getServer().getOnlinePlayers()) {
@ -181,7 +269,8 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_TOGGLEPARTYONJOIN) @CommandPermissions(value = PERMISSION_TOGGLEPARTYONJOIN)
public static void togglePartyOnJoinCommand(final CommandContext args, CommandSender sender) { public static void togglePartyOnJoinCommand(final CommandContext args, CommandSender sender
) {
boolean result = plugin.toggleOnJoin(); boolean result = plugin.toggleOnJoin();
if (result) { if (result) {
sender.sendMessage(ChatColor.GREEN + "DiscoSheep party on join functionality enabled."); sender.sendMessage(ChatColor.GREEN + "DiscoSheep party on join functionality enabled.");
@ -199,7 +288,8 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_CHANGEDEFAULTS) @CommandPermissions(value = PERMISSION_CHANGEDEFAULTS)
public static void setDefaultsCommand(final CommandContext args, CommandSender sender) { public static void setDefaultsCommand(final CommandContext args, CommandSender sender
) {
DiscoParty party = new DiscoParty(); DiscoParty party = new DiscoParty();
parsePartyFlags(party, args, sender); parsePartyFlags(party, args, sender);
party.setDefaultsFromCurrent(); party.setDefaultsFromCurrent();
@ -215,7 +305,8 @@ public class DiscoCommands {
flags = FLAGS flags = FLAGS
) )
@CommandPermissions(value = PERMISSION_SAVECONFIG) @CommandPermissions(value = PERMISSION_SAVECONFIG)
public static void saveConfigCommand(final CommandContext args, CommandSender sender) { public static void saveConfigCommand(final CommandContext args, CommandSender sender
) {
plugin.saveConfigToDisk(); plugin.saveConfigToDisk();
sender.sendMessage(ChatColor.GREEN + "DiscoSheep config saved to disk"); sender.sendMessage(ChatColor.GREEN + "DiscoSheep config saved to disk");
} }

View File

@ -273,7 +273,7 @@ public class DiscoParty {
} }
} }
loc = player.getLocation(); //loc = player.getLocation();
//this.spawnFloor(world, new Location(world, loc.getBlockX(), loc.getBlockY() - 1, loc.getBlockZ())); //this.spawnFloor(world, new Location(world, loc.getBlockX(), loc.getBlockY() - 1, loc.getBlockZ()));
} }
@ -498,7 +498,7 @@ public class DiscoParty {
this.scheduleUpdate(); this.scheduleUpdate();
parent.getPartyMap().put(this.player.getName(), this); parent.getPartyMap().put(this.player.getName(), this);
// start listening // start listening
this.partyEvents = new PartyEvents(this.parent, this); this.partyEvents = new PartyEvents(this);
parent.getServer().getPluginManager().registerEvents(this.partyEvents, this.parent); parent.getServer().getPluginManager().registerEvents(this.partyEvents, this.parent);
} }

View File

@ -16,6 +16,7 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandException; import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -96,21 +97,15 @@ public final class DiscoSheep extends JavaPlugin {
* Iterate through all live entities and create default configuration values for them * Iterate through all live entities and create default configuration values for them
* excludes bosses and other mobs that throw NPE * excludes bosses and other mobs that throw NPE
*/ */
/* for (EntityType ent : EntityType.values()) { for (EntityType ent : EntityType.values()) {
if (ent.isAlive() if (ent.isAlive()
&& !ent.equals(EntityType.ENDER_DRAGON) && !ent.equals(EntityType.ENDER_DRAGON)
&& !ent.equals(EntityType.WITHER) && !ent.equals(EntityType.WITHER)
&& !ent.equals(EntityType.PIG_ZOMBIE)
&& !ent.equals(EntityType.OCELOT)
&& !ent.equals(EntityType.CAVE_SPIDER)
&& !ent.equals(EntityType.MAGMA_CUBE)
&& !ent.equals(EntityType.MUSHROOM_COW)
&& !ent.equals(EntityType.IRON_GOLEM)
&& !ent.equals(EntityType.PLAYER)) { && !ent.equals(EntityType.PLAYER)) {
getConfig().addDefault("default.guests." + ent.toString(), 0); getConfig().addDefault("default.guests." + ent.toString(), 0);
getConfig().addDefault("max.guests." + ent.toString(), 0); getConfig().addDefault("max.guests." + ent.toString(), 5);
}
} }
}*/
loadConfigFromDisk(); loadConfigFromDisk();
} }
@ -129,13 +124,13 @@ public final class DiscoSheep extends JavaPlugin {
DiscoParty.defaultDuration = toTicks(getConfig().getInt("default.duration")); DiscoParty.defaultDuration = toTicks(getConfig().getInt("default.duration"));
DiscoParty.defaultPeriod = getConfig().getInt("default.period-ticks"); DiscoParty.defaultPeriod = getConfig().getInt("default.period-ticks");
/* for (String key : getConfig().getConfigurationSection("default.guests").getKeys(false)) { for (String key : getConfig().getConfigurationSection("default.guests").getKeys(false)) {
DiscoParty.getDefaultGuestNumbers().put(key, getConfig().getInt("default.guests." + key)); DiscoParty.getDefaultGuestNumbers().put(key, getConfig().getInt("default.guests." + key));
} }
for (String key : getConfig().getConfigurationSection("max.guests").getKeys(false)) { for (String key : getConfig().getConfigurationSection("max.guests").getKeys(false)) {
DiscoParty.getMaxGuestNumbers().put(key, getConfig().getInt("max.guests." + key)); DiscoParty.getMaxGuestNumbers().put(key, getConfig().getInt("max.guests." + key));
}*/ }
} }
void reloadConfigFromDisk() { void reloadConfigFromDisk() {
@ -150,9 +145,9 @@ public final class DiscoSheep extends JavaPlugin {
getConfig().set("default.duration", toSeconds_i(DiscoParty.defaultDuration)); getConfig().set("default.duration", toSeconds_i(DiscoParty.defaultDuration));
getConfig().set("default.period-ticks", DiscoParty.defaultPeriod); getConfig().set("default.period-ticks", DiscoParty.defaultPeriod);
/* for (Map.Entry<String, Integer> entry : DiscoParty.getDefaultGuestNumbers().entrySet()) { for (Map.Entry<String, Integer> entry : DiscoParty.getDefaultGuestNumbers().entrySet()) {
getConfig().set("default.guests." + entry.getKey(), entry.getValue()); getConfig().set("default.guests." + entry.getKey(), entry.getValue());
}*/ }
saveConfig(); saveConfig();
} }
@ -163,15 +158,15 @@ public final class DiscoSheep extends JavaPlugin {
commands = null; commands = null;
} }
static int toTicks(double seconds) { int toTicks(double seconds) {
return (int) Math.round(seconds * 20.0); return (int) Math.round(seconds * 20.0);
} }
static double toSeconds(int ticks) { double toSeconds(int ticks) {
return (double) Math.round(ticks / 20.0); return (double) Math.round(ticks / 20.0);
} }
static int toSeconds_i(int ticks) { int toSeconds_i(int ticks) {
return (int) Math.round(ticks / 20.0); return (int) Math.round(ticks / 20.0);
} }

View File

@ -5,7 +5,9 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.event.player.PlayerShearEntityEvent;
/** /**
@ -14,7 +16,7 @@ import org.bukkit.event.player.PlayerShearEntityEvent;
*/ */
public class PartyEvents implements Listener { public class PartyEvents implements Listener {
DiscoSheep parent; DiscoSheep plugin = DiscoSheep.getInstance();
DiscoParty party; DiscoParty party;
/* /*
* There will be multiple instances of PartyEvents, * There will be multiple instances of PartyEvents,
@ -24,8 +26,7 @@ public class PartyEvents implements Listener {
* unregister the listeners when no parties are running. * unregister the listeners when no parties are running.
*/ */
public PartyEvents(DiscoSheep parent, DiscoParty party) { public PartyEvents(DiscoParty party) {
this.parent = parent;
this.party = party; this.party = party;
} }
@ -33,11 +34,9 @@ public class PartyEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerShear(PlayerShearEntityEvent e) { public void onPlayerShear(PlayerShearEntityEvent e) {
if (e.getEntity() instanceof Sheep) { if (e.getEntity() instanceof Sheep) {
if (party.getSheepList().contains((Sheep) e.getEntity())) { if (party.getSheepList().contains((Sheep) e.getEntity())) {
e.setCancelled(true); e.setCancelled(true);
} }
} }
} }
@ -46,13 +45,10 @@ public class PartyEvents implements Listener {
public void onLivingEntityDamageEvent(EntityDamageEvent e) { public void onLivingEntityDamageEvent(EntityDamageEvent e) {
if (e.getEntity() instanceof Sheep) { if (e.getEntity() instanceof Sheep) {
if (party.getSheepList().contains((Sheep) e.getEntity())) { if (party.getSheepList().contains((Sheep) e.getEntity())) {
{
party.jump(e.getEntity()); // for kicks party.jump(e.getEntity()); // for kicks
e.setCancelled(true); e.setCancelled(true);
} }
} }
}
if (party.getGuestList().contains(e.getEntity())) { if (party.getGuestList().contains(e.getEntity())) {
party.jump(e.getEntity()); party.jump(e.getEntity());
e.setCancelled(true); e.setCancelled(true);
@ -62,10 +58,17 @@ public class PartyEvents implements Listener {
// prevent uninvited guests from targetting players // prevent uninvited guests from targetting players
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityTargetLivingEntityEvent(EntityTargetEvent e) { public void onEntityTargetLivingEntityEvent(EntityTargetEvent e) {
if (party.getGuestList().contains(e.getEntity())) { if (party.getGuestList().contains(e.getEntity())) {
e.setCancelled(true); e.setCancelled(true);
} }
}
// prevent egg breeding
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerInteractEntityEvent(PlayerInteractEntityEvent e) {
if (party.getSheepList().contains(e.getRightClicked()) || party.getGuestList().contains(e.getRightClicked())) {
e.setCancelled(true);
}
}
} }
}