diff --git a/MobArena.jar b/MobArena.jar index c013e56..2035e45 100644 Binary files a/MobArena.jar and b/MobArena.jar differ diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index cbc01c4..7620113 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -213,7 +213,11 @@ public class Arena { // Sanity-checks. if (!running || !arenaPlayers.isEmpty()) + { + //System.out.println("Arena was not ended, playercount: " + arenaPlayers.size()); return false; + } + //else System.out.println("Arena ending..."); // Set the boolean. running = false; @@ -423,6 +427,7 @@ public class Arena sheepTaskId = -1; spawnThread = null; } + else System.out.println("--------- THE SPAWNTHREAD IS NULL! ----------"); // Restore spawn flags. MAUtils.setSpawnFlags(plugin, world, spawnMonsters, allowMonsters, allowAnimals); @@ -639,11 +644,8 @@ public class Arena public void repairBlocks() { - //long start = System.nanoTime(); while (!repairQueue.isEmpty()) - { repairQueue.poll().repair(); - } } public void queueRepairable(Repairable r) @@ -1289,10 +1291,6 @@ public class Arena MAUtils.tellPlayer(p, Msg.JOIN_EMPTY_INV); else if (!canAfford(p))// || !takeFee(p)) MAUtils.tellPlayer(p, Msg.JOIN_FEE_REQUIRED, MAUtils.listToString(entryFee, plugin)); - /*else if (emptyInvJoin && !MAUtils.hasEmptyInventory(p)) - MAUtils.tellPlayer(p, Msg.JOIN_EMPTY_INV); - else if (!emptyInvJoin && !MAUtils.storeInventory(p)) - MAUtils.tellPlayer(p, Msg.JOIN_STORE_INV_FAIL);*/ else return true; return false; diff --git a/src/com/garbagemule/MobArena/MAListener.java b/src/com/garbagemule/MobArena/MAListener.java index 8db0e65..c076c3b 100644 --- a/src/com/garbagemule/MobArena/MAListener.java +++ b/src/com/garbagemule/MobArena/MAListener.java @@ -11,6 +11,7 @@ import org.bukkit.block.Sign; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.entity.Slime; import org.bukkit.entity.Wolf; import org.bukkit.event.Event.Result; @@ -243,34 +244,51 @@ public class MAListener implements ArenaListener }, arena.repairDelay); } + + /****************************************************** + * + * DEATH LISTENERS + * + ******************************************************/ + public void onEntityDeath(EntityDeathEvent event) - { + { if (event.getEntity() instanceof Player) - { - Player p = (Player) event.getEntity(); - - if (!arena.arenaPlayers.contains(p)) - return; - - event.getDrops().clear(); - arena.playerDeath(p); - return; - } + onPlayerDeath(event, (Player) event.getEntity()); - if (arena.monsters.remove(event.getEntity())) + else if (arena.monsters.remove(event.getEntity())) + onMonsterDeath(event); + } + + private void onPlayerDeath(EntityDeathEvent event, Player player) + { + if (arena.arenaPlayers.contains(player) || arena.lobbyPlayers.contains(player)) { - EntityDamageEvent e1 = event.getEntity().getLastDamageCause(); - EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null; - Entity damager = (e2 != null) ? e2.getDamager() : null; - - if (damager instanceof Player) - arena.playerKill((Player) damager); - - event.getDrops().clear(); - arena.resetIdleTimer(); - return; + event.getDrops().clear(); + arena.playerDeath(player); } } + + private void onMonsterDeath(EntityDeathEvent event) + { + EntityDamageEvent e1 = event.getEntity().getLastDamageCause(); + EntityDamageByEntityEvent e2 = (e1 instanceof EntityDamageByEntityEvent) ? (EntityDamageByEntityEvent) e1 : null; + Entity damager = (e2 != null) ? e2.getDamager() : null; + + if (damager instanceof Player) + arena.playerKill((Player) damager); + + event.getDrops().clear(); + arena.resetIdleTimer(); + return; + } + + + /****************************************************** + * + * DAMAGE LISTENERS + * + ******************************************************/ public void onEntityDamage(EntityDamageEvent event) { @@ -282,91 +300,108 @@ public class MAListener implements ArenaListener // Pet wolf if (damagee instanceof Wolf && arena.pets.contains(damagee)) - { - if (damager == null) - { - damagee.setFireTicks(32768); - event.setCancelled(true); - return; - } - else if (damager instanceof Player) - event.setCancelled(true); - else - event.setDamage(0); - - return; - } - // Arena player + onPetDamage(event, (Wolf) damagee, damager); + + // Player else if (damagee instanceof Player) - { - if (arena.lobbyPlayers.contains(damagee)) - event.setCancelled(true); - else if (!arena.arenaPlayers.contains(damagee)) - return; - else if (!arena.detDamage && event.getCause() == DamageCause.BLOCK_EXPLOSION) - event.setCancelled(true); - else if (damager instanceof Player && !arena.pvp) - { - // if 'inLobby' fails, and 'not inArena' fails, 'inArena' is true - event.setCancelled(true); - return; - } - - if (!event.isCancelled()) - arena.log.players.get((Player) damagee).dmgTaken += event.getDamage(); - } - // Other LivingEntity + onPlayerDamage(event, (Player) damagee, damager); + + // Monster else if (arena.monsters.contains(damagee)) - { - if (damager instanceof Player) + onMonsterDamage(event, damagee, damager); + } + + private void onPlayerDamage(EntityDamageEvent event, Player player, Entity damager) + { + // Cancel all damage in the lobby + if (arena.lobbyPlayers.contains(player)) + event.setCancelled(true); + + // If not in the lobby or the arena, return + else if (!arena.arenaPlayers.contains(player)) + return; + + // Cancel block explosion damage if detonate-damage: false + else if (!arena.detDamage && event.getCause() == DamageCause.BLOCK_EXPLOSION) + event.setCancelled(true); + + // If PvP is disabled and damager is a player, cancel damage + else if (damager instanceof Player && !arena.pvp) + event.setCancelled(true); + + // Log damage + if (!event.isCancelled()) + arena.log.players.get(player).dmgTaken += event.getDamage(); + } + + private void onPetDamage(EntityDamageEvent event, Wolf pet, Entity damager) + { + if (damager == null) + { + if (arena.hellhounds) + pet.setFireTicks(32768); + + event.setCancelled(true); + } + + // Cancel player and projectile damage + else if (damager instanceof Player || damager instanceof Projectile) + event.setCancelled(true); + + // Set damage to 0 for knockbacks from monsters + else event.setDamage(0); + } + + private void onMonsterDamage(EntityDamageEvent event, Entity monster, Entity damager) + { + if (damager instanceof Player) + { + if (!arena.arenaPlayers.contains(damager)) { - if (!arena.arenaPlayers.contains(damager)) - { - event.setCancelled(true); - return; - } - - arena.log.players.get((Player) damager).dmgDone += event.getDamage(); - arena.log.players.get((Player) damager).hits++; - } - else if (damager instanceof Wolf && arena.pets.contains(damager)) - { - event.setDamage(1); - arena.log.players.get((Player) ((Wolf) damager).getOwner()).dmgDone += event.getDamage(); - } - else if (damager instanceof LivingEntity) - { - if (!arena.monsterInfight) - event.setCancelled(true); + event.setCancelled(true); + return; } - // Boss - if (arena.bossWave != null && damagee.equals(arena.bossWave.getEntity())) + arena.log.players.get((Player) damager).dmgDone += event.getDamage(); + arena.log.players.get((Player) damager).hits++; + } + else if (damager instanceof Wolf && arena.pets.contains(damager)) + { + event.setDamage(1); + arena.log.players.get((Player) ((Wolf) damager).getOwner()).dmgDone += event.getDamage(); + } + else if (damager instanceof LivingEntity) + { + if (!arena.monsterInfight) + event.setCancelled(true); + } + + // Boss + if (arena.bossWave != null && monster.equals(arena.bossWave.getEntity())) + { + if (event.getCause() == DamageCause.LIGHTNING) { - if (event.getCause() == DamageCause.LIGHTNING) - { - event.setCancelled(true); - return; - } - - // Subtract boss health, and reset actual entity health - arena.bossWave.subtractHealth(event.getDamage()); - arena.bossWave.getEntity().setHealth(100); - - // Set damage to 1 for knockback and feedback - event.setDamage(1); - - // If the boss is dead, remove the entity and create an explosion! - if (arena.bossWave.getHealth() <= 0) - { - arena.bossWave.clear(); - arena.bossWave = null; - } - else if (arena.bossWave.getHealth() <= 100 && !arena.bossWave.isLowHealthAnnounced()) - { - MAUtils.tellAll(arena, Msg.WAVE_BOSS_LOW_HEALTH); - arena.bossWave.setLowHealthAnnounced(true); - } + event.setCancelled(true); + return; + } + + // Subtract boss health, and reset actual entity health + arena.bossWave.subtractHealth(event.getDamage()); + arena.bossWave.getEntity().setHealth(100); + + // Set damage to 1 for knockback and feedback + event.setDamage(1); + + // If the boss is dead, remove the entity and create an explosion! + if (arena.bossWave.getHealth() <= 0) + { + arena.bossWave.clear(); + arena.bossWave = null; + } + else if (arena.bossWave.getHealth() <= 100 && !arena.bossWave.isLowHealthAnnounced()) + { + MAUtils.tellAll(arena, Msg.WAVE_BOSS_LOW_HEALTH); + arena.bossWave.setLowHealthAnnounced(true); } } } diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index a9edd17..8d932d4 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -386,7 +386,7 @@ public class MAUtils // If the player isn't online, hack the playerName.dat file if (!p.isOnline()) - System.out.println("FUCKKKKKKKKKKKKKKKKKKKKKKKKKK!");//return writeInventoryData(p, stacks); + System.out.println("THE WORLD IS GOING TO END! SOMETHING IS WRONG!");//return writeInventoryData(p, stacks); // Otherwise, restore the inventory directly ItemStack[] items = new ItemStack[stacks.length-4]; @@ -1028,6 +1028,16 @@ public class MAUtils return false; } + public static int getInt(Configuration config, String path) + { + Object o = config.getProperty(path); + + if (o instanceof Integer) + return (Integer) o; + + return 0; + } + /* ///////////////////////////////////////////////////////////////////// // diff --git a/src/com/garbagemule/MobArena/MobArena.java b/src/com/garbagemule/MobArena/MobArena.java index 327dcfc..6416a21 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -21,14 +21,12 @@ import com.nijikokun.bukkit.Permissions.Permissions; import com.garbagemule.MobArena.util.FileUtils; import com.garbagemule.register.payment.Method; import com.garbagemule.register.payment.Methods; -//import com.garbagemule.ArenaPlugin.ArenaPlugin; -//import com.garbagemule.ArenaPlugin.Master; /** * MobArena * @author garbagemule */ -public class MobArena extends JavaPlugin// implements ArenaPlugin +public class MobArena extends JavaPlugin { private Configuration config; private ArenaMaster am; @@ -120,7 +118,6 @@ public class MobArena extends JavaPlugin// implements ArenaPlugin // Register events. pm.registerEvent(Event.Type.BLOCK_BREAK, blockListener, Priority.Highest, this); pm.registerEvent(Event.Type.BLOCK_BURN, blockListener, Priority.Highest, this); - //pm.registerEvent(Event.Type.BLOCK_PHYSICS, blockListener, Priority.Normal, this); pm.registerEvent(Event.Type.BLOCK_PLACE, blockListener, Priority.Highest, this); pm.registerEvent(Event.Type.BLOCK_IGNITE, blockListener, Priority.Highest, this); pm.registerEvent(Event.Type.PLAYER_INTERACT, playerListener, Priority.Normal, this); @@ -145,8 +142,8 @@ public class MobArena extends JavaPlugin// implements ArenaPlugin public boolean has(Player p, String s) { // First check for NijikoPerms - if (permissionHandler != null) - return permissionHandler.has(p, s); + //if (permissionHandler != null) + // return permissionHandler.has(p, s); // If the permission is set, check if player has permission if (p.isPermissionSet(s)) diff --git a/src/com/garbagemule/MobArena/util/WaveUtils.java b/src/com/garbagemule/MobArena/util/WaveUtils.java index 8811d35..6857b2a 100644 --- a/src/com/garbagemule/MobArena/util/WaveUtils.java +++ b/src/com/garbagemule/MobArena/util/WaveUtils.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.util.config.Configuration; import com.garbagemule.MobArena.Arena; +import com.garbagemule.MobArena.MAUtils; import com.garbagemule.MobArena.MobArena; import com.garbagemule.MobArena.waves.*; import com.garbagemule.MobArena.waves.Wave.*; @@ -174,7 +175,8 @@ public class WaveUtils { int frequency = config.getInt(path + "frequency", 0); int priority = config.getInt(path + "priority", 0); - int wave = config.getInt(path + "wave", frequency); + int wave = MAUtils.getInt(config, path + "wave"); + //int wave = config.getInt(path + "wave", frequency); if (type == WaveType.DEFAULT) result = new DefaultWave(arena, name, wave, frequency, priority, config, path); @@ -187,7 +189,8 @@ public class WaveUtils } else { - int wave = config.getInt(path + "wave", 0); + int wave = MAUtils.getInt(config, path + "wave"); + //int wave = config.getInt(path + "wave", 0); if (type == WaveType.DEFAULT) result = new DefaultWave(arena, name, wave, config, path); @@ -244,7 +247,8 @@ public class WaveUtils wellDefined = false; } // OPTIONAL: Wave - int wave = config.getInt(path + "wave", frequency); + int wave = MAUtils.getInt(config, path + "wave"); + //int wave = config.getInt(path + "wave", frequency); if (wave < 0) { MobArena.warning("'wave' must be greater than 0 in " + path); @@ -254,7 +258,8 @@ public class WaveUtils else if (branch == WaveBranch.SINGLE) { // REQUIRED: Wave number - int wave = config.getInt(path + "wave", 0); + int wave = MAUtils.getInt(config, path + "wave"); + //int wave = config.getInt(path + "wave", 0); if (wave == 0) { MobArena.warning("Missing 'wave'-node in " + path); diff --git a/src/com/garbagemule/MobArena/waves/SpecialWave.java b/src/com/garbagemule/MobArena/waves/SpecialWave.java index cc65db7..6e762f8 100644 --- a/src/com/garbagemule/MobArena/waves/SpecialWave.java +++ b/src/com/garbagemule/MobArena/waves/SpecialWave.java @@ -37,6 +37,10 @@ public class SpecialWave extends NormalWave // Get the valid spawnpoints, and initialize counter List validSpawnpoints = WaveUtils.getValidSpawnpoints(getArena(), getArena().getLivingPlayers()); + // Strike some lightning! + for (Location loc : validSpawnpoints) + getWorld().strikeLightningEffect(loc); + // Spawn all the monsters spawnAll(getMonstersToSpawn(getArena().getPlayerCount()), validSpawnpoints); }