From 5ed81f0a2ad593b272b33451b708d7252ad43d48 Mon Sep 17 00:00:00 2001 From: garbagemule Date: Sat, 22 Dec 2012 13:36:49 +0100 Subject: [PATCH] Add a couple of new tiny features. - With pvp-enabled: true, PvP is activated at the first wave, giving players a period of time to spread out. - The per-class config option, unbreakable-weapons: true-false, can be used to set whether weapons for a class should have infinite durability or not. --- resources/plugin.yml | 2 +- src/com/garbagemule/MobArena/ArenaClass.java | 7 +++++-- src/com/garbagemule/MobArena/ArenaImpl.java | 14 +++++++++++--- src/com/garbagemule/MobArena/ArenaListener.java | 15 +++++++++++++-- src/com/garbagemule/MobArena/ArenaMasterImpl.java | 5 ++++- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/resources/plugin.yml b/resources/plugin.yml index 45d0216..a8b763c 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -1,7 +1,7 @@ name: MobArena author: garbagemule main: com.garbagemule.MobArena.MobArena -version: 0.94.4.82 +version: 0.94.4.90 softdepend: [Spout,MultiVerse,MultiWorld,XcraftGate,Towny,Heroes,MagicSpells,Vault] commands: ma: diff --git a/src/com/garbagemule/MobArena/ArenaClass.java b/src/com/garbagemule/MobArena/ArenaClass.java index 38eb970..828fa8a 100644 --- a/src/com/garbagemule/MobArena/ArenaClass.java +++ b/src/com/garbagemule/MobArena/ArenaClass.java @@ -20,12 +20,13 @@ public class ArenaClass private List items, armor; private Map perms; private int pets; + private boolean unbreakableWeapons; /** * Create a new, empty arena class with the given name. * @param name the class name as it appears in the config-file */ - public ArenaClass(String name) { + public ArenaClass(String name, boolean unbreakableWeapons) { this.configName = name; this.lowercaseName = name.toLowerCase(); @@ -33,6 +34,8 @@ public class ArenaClass this.armor = new ArrayList(4); this.perms = new HashMap(); this.pets = 0; + + this.unbreakableWeapons = unbreakableWeapons; } /** @@ -104,7 +107,7 @@ public class ArenaClass public void addItem(ItemStack stack) { if (stack == null) return; - if (isWeapon(stack)) { + if (unbreakableWeapons && isWeapon(stack)) { stack.setDurability(Short.MIN_VALUE); } else if (stack.getType() == Material.BONE) { diff --git a/src/com/garbagemule/MobArena/ArenaImpl.java b/src/com/garbagemule/MobArena/ArenaImpl.java index 4adebb7..662f219 100644 --- a/src/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/com/garbagemule/MobArena/ArenaImpl.java @@ -760,6 +760,13 @@ public class ArenaImpl implements Arena // Schedule it for the initial first wave delay. scheduleTask(spawnThread, settings.getInt("first-wave-delay", 5) * 20); + + // Schedule to enable PvP if pvp-enabled: true + scheduleTask(new Runnable() { + public void run() { + eventListener.pvpActivate(); + } + }, settings.getInt("first-wave-delay", 5) * 20); } /** @@ -778,6 +785,7 @@ public class ArenaImpl implements Arena private void stopSpawner() { world.setSpawnFlags(allowMonsters, allowAnimals); + eventListener.pvpDeactivate(); //world.setDifficulty(spawnMonsters); } @@ -856,7 +864,7 @@ public class ArenaImpl implements Arena @Override public void movePlayerToLobby(Player p) { - updateChunk(region.getLobbyWarp()); + //updateChunk(region.getLobbyWarp()); specPlayers.remove(p); // If joining from spec area lobbyPlayers.add(p); p.teleport(region.getLobbyWarp()); @@ -867,7 +875,7 @@ public class ArenaImpl implements Arena @Override public void movePlayerToSpec(Player p) { - updateChunk(region.getSpecWarp()); + //updateChunk(region.getSpecWarp()); specPlayers.add(p); p.teleport(region.getSpecWarp()); timeStrategy.setPlayerTime(p); @@ -880,7 +888,7 @@ public class ArenaImpl implements Arena Location entry = playerData.get(p).entry(); if (entry == null || p.isDead()) return; - updateChunk(entry); + //updateChunk(entry); p.teleport(entry); timeStrategy.resetPlayerTime(p); //movePlayerToLocation(p, entry); diff --git a/src/com/garbagemule/MobArena/ArenaListener.java b/src/com/garbagemule/MobArena/ArenaListener.java index b83a031..e6b4160 100644 --- a/src/com/garbagemule/MobArena/ArenaListener.java +++ b/src/com/garbagemule/MobArena/ArenaListener.java @@ -95,7 +95,8 @@ public class ArenaListener protect; private boolean monsterExp, monsterInfight, - pvpEnabled, + pvpOn, // pvp-enabled in config + pvpEnabled = false, // activated on first wave foodRegen, lockFoodLevel; @SuppressWarnings("unused") @@ -124,7 +125,7 @@ public class ArenaListener this.protect = s.getBoolean("protect", true); this.monsterExp = s.getBoolean("monster-exp", false); this.monsterInfight = s.getBoolean("monster-infight", false); - this.pvpEnabled = s.getBoolean("pvp-enabled", false); + this.pvpOn = s.getBoolean("pvp-enabled", false); this.foodRegen = s.getBoolean("food-regen", false); this.lockFoodLevel = s.getBoolean("lock-food-level", true); this.allowTeleport = s.getBoolean("allow-teleporting", false); @@ -137,6 +138,16 @@ public class ArenaListener this.banned = new HashSet(); } + + void pvpActivate() { + if (arena.isRunning() && !arena.getPlayersInArena().isEmpty()) { + pvpEnabled = pvpOn; + } + } + + void pvpDeactivate() { + if (pvpOn) pvpEnabled = false; + } public void onBlockBreak(BlockBreakEvent event) { // Check if the block is a sign, it might be a leaderboard diff --git a/src/com/garbagemule/MobArena/ArenaMasterImpl.java b/src/com/garbagemule/MobArena/ArenaMasterImpl.java index e7ee6ab..542ece8 100644 --- a/src/com/garbagemule/MobArena/ArenaMasterImpl.java +++ b/src/com/garbagemule/MobArena/ArenaMasterImpl.java @@ -309,9 +309,12 @@ public class ArenaMasterImpl implements ArenaMaster Messenger.severe("Failed to load class '" + classname + "'."); return null; } + + // Check if weapons for this class should be unbreakable + boolean unbreakableWeapons = section.getBoolean("unbreakable-weapons", true); // Create an ArenaClass with the config-file name. - ArenaClass arenaClass = new ArenaClass(classname); + ArenaClass arenaClass = new ArenaClass(classname, unbreakableWeapons); // Parse the items-node String items = section.getString("items", "");