From e73f0414d2aefb5f5ba17e483eeb777b0e6b74f6 Mon Sep 17 00:00:00 2001 From: Gibstick Date: Mon, 22 Jul 2013 16:22:31 -0400 Subject: [PATCH] added code framework for uninvited guests --- .../discosheep/BaaBaaBlockSheepEvents.java | 28 ++++- src/ca/gibstick/discosheep/DiscoParty.java | 109 ++++++++++++------ src/ca/gibstick/discosheep/DiscoSheep.java | 12 +- src/plugin.yml | 5 +- 4 files changed, 117 insertions(+), 37 deletions(-) diff --git a/src/ca/gibstick/discosheep/BaaBaaBlockSheepEvents.java b/src/ca/gibstick/discosheep/BaaBaaBlockSheepEvents.java index e460788..d3d7e40 100644 --- a/src/ca/gibstick/discosheep/BaaBaaBlockSheepEvents.java +++ b/src/ca/gibstick/discosheep/BaaBaaBlockSheepEvents.java @@ -5,10 +5,13 @@ */ package ca.gibstick.discosheep; +import org.bukkit.entity.Player; import org.bukkit.entity.Sheep; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerShearEntityEvent; @@ -39,7 +42,7 @@ public class BaaBaaBlockSheepEvents implements Listener { // actually make sheep invincible @EventHandler - public void onEntityDamageEvent(EntityDamageEvent e) { + public void onLivingEntityDamageEvent(EntityDamageEvent e) { if (e.getEntity() instanceof Sheep) { for (DiscoParty party : parent.getParties()) { if (party.getSheepList().contains((Sheep) e.getEntity())) { @@ -50,6 +53,22 @@ public class BaaBaaBlockSheepEvents implements Listener { } } } + for (DiscoParty party : parent.getParties()) { + if (party.getGuestList().contains(e.getEntity())) { + e.setCancelled(true); + } + } + + } + + // prevent uninvited guests from targetting players + @EventHandler + public void onEntityTargetLivingEntityEvent(EntityTargetEvent e) { + for (DiscoParty party : parent.getParties()) { + if (party.getGuestList().contains(e.getEntity())) { // safe; event is only triggered by LivingEntity targetting LivingEntity + e.setCancelled(true); + } + } } @EventHandler @@ -58,4 +77,11 @@ public class BaaBaaBlockSheepEvents implements Listener { parent.stopParty(name); // stop party on player quit or else it will CONTINUE FOR ETERNITY } + + @EventHandler + public void onPlayerJoinEvent(PlayerJoinEvent e) { + Player player = e.getPlayer(); + DiscoParty party = new DiscoParty(parent, player); + parent.partyOnJoin(player); + } } diff --git a/src/ca/gibstick/discosheep/DiscoParty.java b/src/ca/gibstick/discosheep/DiscoParty.java index 0893fb4..1b13267 100644 --- a/src/ca/gibstick/discosheep/DiscoParty.java +++ b/src/ca/gibstick/discosheep/DiscoParty.java @@ -1,8 +1,10 @@ package ca.gibstick.discosheep; import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.Random; +import java.util.logging.Level; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.Location; @@ -14,6 +16,7 @@ import org.bukkit.entity.Player; import org.bukkit.entity.Sheep; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Builder; +import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.util.Vector; @@ -26,16 +29,20 @@ public class DiscoParty { private DiscoSheep ds; private Player player; private ArrayList sheepList = new ArrayList(); + private ArrayList guestList = new ArrayList(); static int defaultDuration = 300; // ticks for entire party static int defaultPeriod = 10; // ticks per state change static int defaultRadius = 5; static int defaultSheep = 10; + static int defaultCreepers = 1; static float defaultSheepJump = 0.35f; static int maxDuration = 2400; // 120 seconds static int maxSheep = 100; static int maxRadius = 100; static int minPeriod = 5; // 0.25 seconds static int maxPeriod = 40; // 2.0 seconds + static int maxCreepers = 5; + private HashMap guestNumbers = new HashMap(); private boolean doFireworks = false; private boolean doJump = true; private int duration, period, radius, sheep; @@ -78,18 +85,22 @@ public class DiscoParty { // used for /ds other and /ds all public DiscoParty DiscoParty(Player player) { DiscoParty newParty = new DiscoParty(this.ds, player); - newParty.setDoFireworks(this.doFireworks); - newParty.setDuration(this.duration); - newParty.setPeriod(this.period); - newParty.setRadius(this.radius); - newParty.setSheep(this.sheep); + newParty.doFireworks = this.doFireworks; + newParty.duration = this.duration; + newParty.period = this.period; + newParty.radius = this.radius; + newParty.sheep = this.sheep; return newParty; } - List getSheepList() { + ArrayList getSheepList() { return sheepList; } + ArrayList getGuestList() { + return guestList; + } + public int getSheep() { return this.sheep; } @@ -138,7 +149,7 @@ public class DiscoParty { if (r < 1) { r = 1; } - + this.setRadius(r); return this; } @@ -156,7 +167,7 @@ public class DiscoParty { this.doFireworks = doFireworks; return this; } - + // use current settings as new defaults public DiscoParty setDefaultsFromCurrent() { DiscoParty.defaultDuration = this.duration; @@ -166,30 +177,51 @@ public class DiscoParty { return this; } - // Spawn some number of sheep next to given player - void spawnSheep(int num, int sheepSpawnRadius) { + Location getRandomSpawnLocation(double x, double z, World world, int spawnRadius) { + Location loc; + + double y; + + + /* random point on circle with polar coordinates + * random number must be square rooted to obtain uniform distribution + * otherwise the sheep are biased toward the centre */ + double r = Math.sqrt(Math.random()) * spawnRadius; + double azimuth = Math.random() * 2 * Math.PI; // radians + x += r * Math.cos(azimuth); + z += r * Math.sin(azimuth); + y = world.getHighestBlockYAt((int) x, (int) z); + + loc = new Location(world, x, y, z); + loc.setPitch((float) Math.random() * 360 - 180); + loc.setYaw(0); + + return loc; + } + + // Spawn some number of guests next to given player + void spawnAll(int sheep, int spawnRadius) { Location loc; World world = player.getWorld(); - for (int i = 0; i < num; i++) { - double x = player.getLocation().getX(); - double z = player.getLocation().getZ(); - double y; - /* random point on circle with polar coordinates - * random number must be square rooted to obtain uniform distribution - * otherwise the sheep are biased toward the centre */ - double r = Math.sqrt(Math.random()) * sheepSpawnRadius; - double azimuth = Math.random() * 2 * Math.PI; // radians - x += r * Math.cos(azimuth); - z += r * Math.sin(azimuth); - y = world.getHighestBlockYAt((int) x, (int) z); - - loc = new Location(world, x, y, z); - loc.setPitch((float) Math.random() * 360 - 180); - loc.setYaw(0); + double x = player.getLocation().getX(); + double z = player.getLocation().getZ(); + for (int i = 0; i < sheep; i++) { + loc = getRandomSpawnLocation(x, z, world, spawnRadius); spawnSheep(world, loc); } + + // loop through hashmap of other guests and spawn accordingly + for (Map.Entry entry : guestNumbers.entrySet()) { + EntityType ent = EntityType.fromName((String) entry.getKey()); + int num = (Integer) entry.getValue(); + + for (int i = 0; i < num; i++) { + loc = getRandomSpawnLocation(x, z, world, spawnRadius); + spawnGuest(world, loc, ent); + } + } } void spawnSheep(World world, Location loc) { @@ -200,13 +232,22 @@ public class DiscoParty { getSheepList().add(newSheep); } - // Mark all sheep in the sheep array for removal, then clear the array - void removeAllSheep() { + void spawnGuest(World world, Location loc, EntityType type) { + LivingEntity newGuest = (LivingEntity) world.spawnEntity(loc, type); + getGuestList().add(newGuest); + ds.getLogger().log(Level.INFO, "SPAWNING GUEST"); + } + + // Mark all guests for removal, then clear the array + void removeAllGuests() { for (Sheep sheeple : getSheepList()) { - //sheeple.setHealth(0); // removed to make it more resilient to updates sheeple.remove(); } + for (LivingEntity guest : getGuestList()) { + guest.remove(); + } getSheepList().clear(); + getGuestList().clear(); } // Set a random colour for all sheep in array @@ -362,11 +403,12 @@ public class DiscoParty { updater.runTaskLater(ds, this.period); } + @Deprecated void startDisco(int duration, int sheepAmount, int radius, int period, boolean fireworks) { if (this.duration > 0) { stopDisco(); } - this.spawnSheep(sheepAmount, radius); + this.spawnAll(sheepAmount, radius); this.doFireworks = fireworks; this.period = period; this.duration = duration; @@ -375,13 +417,14 @@ public class DiscoParty { } void startDisco() { - this.spawnSheep(sheep, radius); + this.guestNumbers.put("CREEPER", 5); + this.spawnAll(sheep, radius); this.scheduleUpdate(); ds.getPartyMap().put(this.player.getName(), this); } void stopDisco() { - removeAllSheep(); + removeAllGuests(); this.duration = 0; if (updater != null) { updater.cancel(); diff --git a/src/ca/gibstick/discosheep/DiscoSheep.java b/src/ca/gibstick/discosheep/DiscoSheep.java index 91942d2..f79061a 100644 --- a/src/ca/gibstick/discosheep/DiscoSheep.java +++ b/src/ca/gibstick/discosheep/DiscoSheep.java @@ -2,7 +2,6 @@ package ca.gibstick.discosheep; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -22,6 +21,7 @@ public final class DiscoSheep extends JavaPlugin { static final String PERMISSION_CHANGEPERIOD = "discosheep.changeperiod"; static final String PERMISSION_CHANGEDEFAULTS = "discosheep.changedefaults"; static final String PERMISSION_SAVECONFIG = "discosheep.saveconfig"; + static final String PERMISSION_ONJOIN = "discosheep.onjoin"; Map parties = new HashMap(); private BaaBaaBlockSheepEvents blockEvents = new BaaBaaBlockSheepEvents(this); FileConfiguration config; @@ -102,10 +102,11 @@ public final class DiscoSheep extends JavaPlugin { return this.parties; } - public synchronized List getParties() { + public synchronized ArrayList getParties() { return new ArrayList(this.getPartyMap().values()); } + public void stopParty(String name) { if (this.hasParty(name)) { this.getParty(name).stopDisco(); @@ -211,6 +212,13 @@ public final class DiscoSheep extends JavaPlugin { } } + void partyOnJoin(Player player) { + if (player.hasPermission(PERMISSION_ONJOIN)) { + DiscoParty party = new DiscoParty(this, player); + party.startDisco(); + } + } + boolean setDefaultsCommand(CommandSender sender, DiscoParty party) { if (sender.hasPermission(PERMISSION_CHANGEDEFAULTS)) { party.setDefaultsFromCurrent(); diff --git a/src/plugin.yml b/src/plugin.yml index 32a19bc..80600aa 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -59,4 +59,7 @@ permissions: default: op discosheep.saveconfig: description: Allows a player to save the config with current values set in memory - default: op \ No newline at end of file + default: op + discosheep.partyonjoin: + description: Gives a player a disco party on join + default: false \ No newline at end of file