From c9cc5cef8b8f602d89eef6efa50745a6faa28f66 Mon Sep 17 00:00:00 2001 From: Garbage Mule Date: Wed, 1 Jun 2011 13:06:19 +0200 Subject: [PATCH] Added a new targetting system --- MobArena.jar | Bin 29564 -> 30177 bytes bin/plugin.yml | 2 +- .../MobArena/MAMonsterListener.java | 3 + .../garbagemule/MobArena/MASpawnThread.java | 83 ++++++++++++++---- 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/MobArena.jar b/MobArena.jar index 9c99a1d4fec8875bf316142247967a0b16f7282b..c21b3f5c01a7ba0c12d1d129409220f276cabf37 100644 GIT binary patch delta 5305 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 UclY9d?SU7<9L9)??|rBGKYCG_VgLXD delta 4602 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 diff --git a/bin/plugin.yml b/bin/plugin.yml index 2044e72..f4cf9f5 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: MobArena main: com.garbagemule.MobArena.MobArena -version: 0.82 +version: 0.84 commands: marena: description: Base command for MobArena diff --git a/src/com/garbagemule/MobArena/MAMonsterListener.java b/src/com/garbagemule/MobArena/MAMonsterListener.java index 3b71af3..5c77614 100644 --- a/src/com/garbagemule/MobArena/MAMonsterListener.java +++ b/src/com/garbagemule/MobArena/MAMonsterListener.java @@ -76,5 +76,8 @@ public class MAMonsterListener extends EntityListener if (event.getReason() == TargetReason.FORGOT_TARGET) event.setCancelled(true); + + if (event.getReason() == TargetReason.TARGET_DIED) + event.setTarget(MASpawnThread.getClosestPlayer(event.getEntity())); } } \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index 58c32c5..ffd8b9b 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -1,12 +1,14 @@ package com.garbagemule.MobArena; import java.util.List; +import java.util.ArrayList; import java.util.Random; import org.bukkit.Location; import org.bukkit.entity.Wolf; import org.bukkit.entity.Slime; import org.bukkit.entity.Player; import org.bukkit.entity.Creature; +import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.CreatureType; import org.bukkit.inventory.ItemStack; @@ -29,14 +31,13 @@ public class MASpawnThread implements Runnable private int dZombies, dSkeletons, dSpiders, dCreepers; private Random random; private Player target; - private Object[] playerArray; private String reward, currentRewards; + // TO-DO: Move this into MAUtils + private static List playerList; public MASpawnThread() { - // Turn the set into an array for lookup with random numbers. - playerArray = ArenaManager.playerSet.toArray(); - noOfPlayers = playerArray.length; + noOfPlayers = ArenaManager.playerSet.size(); noOfSpawnPoints = ArenaManager.spawnpoints.size(); wave = 1; random = new Random(); @@ -50,13 +51,16 @@ public class MASpawnThread implements Runnable public void run() { + // Make a new ArrayList with all the players for fast lookup + playerList = new ArrayList(ArenaManager.playerSet); + // Check if we need to grant more rewards with the recurrent waves. for (Integer i : ArenaManager.everyWaveMap.keySet()) { if (wave % i != 0) continue; - for (Player p : ArenaManager.playerSet) + for (Player p : playerList) { currentRewards = ArenaManager.rewardMap.get(p); reward = MAUtils.getRandomReward(ArenaManager.everyWaveMap.get(i)); @@ -69,7 +73,7 @@ public class MASpawnThread implements Runnable // Same deal, this time with the one-time waves. if (ArenaManager.afterWaveMap.containsKey(wave)) { - for (Player p : ArenaManager.playerSet) + for (Player p : playerList) { currentRewards = ArenaManager.rewardMap.get(p); reward = MAUtils.getRandomReward(ArenaManager.afterWaveMap.get(wave)); @@ -124,11 +128,8 @@ public class MASpawnThread implements Runnable ArenaManager.monsterSet.add(e); // Grab a random target. - // TO-DO: Find a different solution to this. - //ran = random.nextInt(noOfPlayers); - //Creature c = (Creature) e; - //c.setTarget(MAUtils.getRandomPlayer()); - //c.setTarget((Player)playerArray[ran]); // This is faster, but unstable + Creature c = (Creature) e; + c.setTarget(getClosestPlayer(e)); } } @@ -179,6 +180,7 @@ public class MASpawnThread implements Runnable break; } + // Spawn the hippie monsters. for (int i = 0; i < count; i++) { loc = ArenaManager.spawnpoints.get(i % noOfSpawnPoints); @@ -190,20 +192,63 @@ public class MASpawnThread implements Runnable if (wolf) ((Wolf)e).setAngry(true); // Slimes can't have targets, apparently. - //if (!(e instanceof Creature)) - // continue; + if (!(e instanceof Creature)) + continue; // Grab a random target. - //ran = random.nextInt(noOfPlayers); - //Creature c = (Creature) e; - //c.setTarget(MAUtils.getRandomPlayer()); - //c.setTarget((Player)playerArray[ran]); // This is faster, but unstable + Creature c = (Creature) e; + c.setTarget(getClosestPlayer(e)); } // Lightning, just for effect ;) - for (Location l : ArenaManager.spawnpoints) + for (Location spawn : ArenaManager.spawnpoints) { - ArenaManager.world.strikeLightningEffect(l); + ArenaManager.world.strikeLightningEffect(spawn); } } + + /** + * Gets the player closest to the input entity. ArrayList implementation + * means a complexity of O(n). + */ + // TO-DO: Move this into MAUtils + public static Player getClosestPlayer(Entity e) + { + // Grab the coordinates. + double ex = e.getLocation().getX(); + double ey = e.getLocation().getY(); + double ez = e.getLocation().getZ(); + + // Set up the comparison variable and the result. + double current = Double.POSITIVE_INFINITY; + Player result = null; + + /* Iterate through the ArrayList, and update current and result every + * time a squared distance smaller than current is found. */ + for (int i = 0; i < playerList.size(); i++) + { + Player p = playerList.get(i); + double dist = distance(p.getLocation(), ex, ey, ez); + + if (dist < current || current == -1.0D) + { + current = dist; + result = p; + } + } + return result; + } + + /** + * Calculates the squared distance between locations. + */ + // TO-DO: Move this into MAUtils + private static double distance(Location loc, double d1, double d2, double d3) + { + double d4 = loc.getX() - d1; + double d5 = loc.getY() - d2; + double d6 = loc.getZ() - d3; + + return d4*d4 + d5*d5 + d6*d6; + } } \ No newline at end of file