From 906fe93d6a961636ae0f57b8a6d2197875738678 Mon Sep 17 00:00:00 2001 From: Brian Date: Wed, 6 Jun 2012 20:20:11 -0400 Subject: [PATCH] v0.94.4.69 - beginning of Class Limits feature [not working] --- resources/plugin.yml | 2 +- resources/res/class-limits.yml | 5 ++ src/com/garbagemule/MobArena/ArenaImpl.java | 19 ++++- .../garbagemule/MobArena/ArenaListener.java | 22 +++++ .../MobArena/ClassLimitManager.java | 81 +++++++++++++++++++ .../garbagemule/MobArena/MASpawnThread.java | 4 + src/com/garbagemule/MobArena/Msg.java | 1 + .../garbagemule/MobArena/RewardManager.java | 2 +- .../garbagemule/MobArena/framework/Arena.java | 3 + 9 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 resources/res/class-limits.yml create mode 100644 src/com/garbagemule/MobArena/ClassLimitManager.java diff --git a/resources/plugin.yml b/resources/plugin.yml index 1303d5e..c495346 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.68 +version: 0.94.4.69 softdepend: [Spout,MultiVerse,XcraftGate,Towny,Heroes,MagicSpells,Vault] commands: ma: diff --git a/resources/res/class-limits.yml b/resources/res/class-limits.yml new file mode 100644 index 0000000..3753416 --- /dev/null +++ b/resources/res/class-limits.yml @@ -0,0 +1,5 @@ +Knight: -1 +Tank: -1 +Archer: -1 +Chemist: -1 +Oddjob: -1 \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/ArenaImpl.java b/src/com/garbagemule/MobArena/ArenaImpl.java index c82cb04..85f047e 100644 --- a/src/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/com/garbagemule/MobArena/ArenaImpl.java @@ -72,8 +72,9 @@ public class ArenaImpl implements Arena private Leaderboard leaderboard; // Player stuff - private InventoryManager inventoryManager; - private RewardManager rewardManager; + private InventoryManager inventoryManager; + private RewardManager rewardManager; + private ClassLimitManager limitManager; private Map arenaPlayerMap; private Map playerData = new HashMap(); @@ -131,6 +132,7 @@ public class ArenaImpl implements Arena this.inventoryManager = new InventoryManager(this); this.rewardManager = new RewardManager(this); + this.limitManager = new ClassLimitManager(this); // Warps, points and locations this.leaderboard = new Leaderboard(plugin, this, region.getLeaderboard()); @@ -383,6 +385,11 @@ public class ArenaImpl implements Arena return monsterManager; } + @Override + public ClassLimitManager getClassLimitManager() { + return limitManager; + } + @Override public ArenaLog getLog() { return log; @@ -432,6 +439,14 @@ public class ArenaImpl implements Arena // Teleport players, give full health, initialize map for (Player p : arenaPlayers) { + // TODO figure out how people die in lobby and get sent to spectator area early + // Remove player from spec list to avoid invincibility issues + if (inSpec(p)) { + specPlayers.remove(p); + System.out.println("[MobArena] Player " + p.getName() + " joined the arena from the spec area!"); + System.out.println("[MobArena] Invincibility glitch attempt stopped!"); + } + p.teleport(region.getArenaWarp()); //movePlayerToLocation(p, region.getArenaWarp()); setHealth(p, 20); diff --git a/src/com/garbagemule/MobArena/ArenaListener.java b/src/com/garbagemule/MobArena/ArenaListener.java index 8c799e5..273c045 100644 --- a/src/com/garbagemule/MobArena/ArenaListener.java +++ b/src/com/garbagemule/MobArena/ArenaListener.java @@ -129,6 +129,17 @@ public class ArenaListener this.allowTeleport = s.getBoolean("allow-teleporting", false); this.canShare = s.getBoolean("share-items-in-arena", true); this.autoIgniteTNT = s.getBoolean("auto-ignite-tnt", false); + + /* + * TODO: ClassLimitManager limits = arena.getClassLimitManager(); + * For Each loop to go through each class + * Make sure each class is an actual class + * + * put this stuff in the limit manager + * Map to house the class names and defined limit + * Map to house the current amounts + * clearing methods for the current amounts when the arena starts + */ this.allowMonsters = arena.getWorld().getAllowMonsters(); @@ -785,6 +796,17 @@ public class ArenaListener Messenger.tellPlayer(p, Msg.LOBBY_CLASS_PERMISSION); return; } + + /* + * TODO put in class limit check (use ClassLimitManager) + * going to need to track how many pick what classes + * going to need to deny them if there is already too many of that class + * will need to display the new message for class limit exceeded - Msg.LOBBY_CLASS_FULL + * + * big todo: check if a player switches class. if the player already has a class, remove it, and add the new one + * will be "playerChangedClass(previous ArenaClass)" followed by "playerPickedClass(new ArenaClass)" + * however... if the previous and new classes are the same, ignore it completely, and let it move to delayAssignClass() + */ // Delay the inventory stuff to ensure that right-clicking works. delayAssignClass(p, className); diff --git a/src/com/garbagemule/MobArena/ClassLimitManager.java b/src/com/garbagemule/MobArena/ClassLimitManager.java new file mode 100644 index 0000000..aace13b --- /dev/null +++ b/src/com/garbagemule/MobArena/ClassLimitManager.java @@ -0,0 +1,81 @@ +package com.garbagemule.MobArena; + +import java.util.HashMap; + +import com.garbagemule.MobArena.framework.Arena; +import com.garbagemule.MobArena.util.config.ConfigSection; + +public class ClassLimitManager +{ + private HashMap classLimits, classesInUse; + private ConfigSection limits; + private MobArena plugin; + + public ClassLimitManager(Arena arena) { + this.plugin = arena.getPlugin(); + this.limits = new ConfigSection(plugin.getMAConfig(), "arenas." + arena.configName() + ".class-limits"); + + this.classLimits = new HashMap(); + this.classesInUse = new HashMap(); + + loadLimitMap(); + initInUseMap(); + } + + public int getClassLimit(ArenaClass ac) { + if (classLimits.get(ac) != null) + return classLimits.get(ac).intValue(); + else + return addNewClass(ac); + } + + public int getClassInUse(ArenaClass ac) { + if (classesInUse.get(ac) != null) + return classesInUse.get(ac).intValue(); + else { + addNewClass(ac); + return 0; + } + } + + private void loadLimitMap() { + for (ArenaClass ac : plugin.getArenaMaster().getClasses().values()) { + classLimits.put(ac, limits.getInt(ac.getName(), -1)); + } + } + + private void initInUseMap() { + for (ArenaClass ac : plugin.getArenaMaster().getClasses().values()) { + classesInUse.put(ac, Integer.valueOf(0)); + } + } + + private int addNewClass(ArenaClass ac) { + classLimits.put(ac, Integer.valueOf(-1)); + classesInUse.put(ac, Integer.valueOf(0)); + limits.set(ac.getName(), -1); + return -1; + } + + public void playerPickedClass(ArenaClass ac) { + classesInUse.put(ac, classesInUse.get(ac) + 1); + } + + public void playerChangedClass(ArenaClass ac) { + classesInUse.put(ac, classesInUse.get(ac) - 1); + } + + public boolean canPlayerJoinClass(ArenaClass ac) { + if (classLimits.get(ac).intValue() <= -1) + return true; + else if (classesInUse.get(ac).intValue() >= classLimits.get(ac).intValue()) + return false; + else + return true; + } + + public void clearClassesInUse() { + classesInUse.clear(); + initInUseMap(); + } +} \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/MASpawnThread.java b/src/com/garbagemule/MobArena/MASpawnThread.java index b4225fa..33a342c 100644 --- a/src/com/garbagemule/MobArena/MASpawnThread.java +++ b/src/com/garbagemule/MobArena/MASpawnThread.java @@ -247,6 +247,10 @@ public class MASpawnThread implements Runnable continue; } + // TODO remove debug message + Location l = p.getLocation(); + System.out.println("Player: " + p.getName() + " found at location:" + l.getX() + ", " + l.getY() + ", " + l.getZ()); + Messenger.tellPlayer(p, "Leaving so soon?"); p.getInventory().clear(); arena.playerLeave(p); diff --git a/src/com/garbagemule/MobArena/Msg.java b/src/com/garbagemule/MobArena/Msg.java index 928e18e..1641980 100644 --- a/src/com/garbagemule/MobArena/Msg.java +++ b/src/com/garbagemule/MobArena/Msg.java @@ -46,6 +46,7 @@ public enum Msg LOBBY_DROP_ITEM("No sharing allowed at this time!", "Can't drop items here."), LOBBY_PLAYER_READY("You have been flagged as ready!", "Flagged as ready!"), LOBBY_PICK_CLASS("You must first pick a class!", "Pick a class first!"), + LOBBY_CLASS_FULL("This class can no longer be selected, class limit reached!", "Class limit reached!"), LOBBY_NOT_ENOUGH_PLAYERS("Not enough players to start. Need at least % players.", "Need more players."), LOBBY_RIGHT_CLICK("Punch the sign. Don't right-click.", "Punch the sign."), LOBBY_CLASS_PICKED("You have chosen % as your class!", "%"), diff --git a/src/com/garbagemule/MobArena/RewardManager.java b/src/com/garbagemule/MobArena/RewardManager.java index b6d9875..4cee6ad 100644 --- a/src/com/garbagemule/MobArena/RewardManager.java +++ b/src/com/garbagemule/MobArena/RewardManager.java @@ -66,4 +66,4 @@ public class RewardManager } rewarded.add(p); } -} +} \ No newline at end of file diff --git a/src/com/garbagemule/MobArena/framework/Arena.java b/src/com/garbagemule/MobArena/framework/Arena.java index aa1d6a1..670fc68 100644 --- a/src/com/garbagemule/MobArena/framework/Arena.java +++ b/src/com/garbagemule/MobArena/framework/Arena.java @@ -13,6 +13,7 @@ import org.bukkit.inventory.ItemStack; import com.garbagemule.MobArena.ArenaClass; import com.garbagemule.MobArena.ArenaListener; import com.garbagemule.MobArena.ArenaPlayer; +import com.garbagemule.MobArena.ClassLimitManager; import com.garbagemule.MobArena.MASpawnThread; import com.garbagemule.MobArena.MobArena; import com.garbagemule.MobArena.MonsterManager; @@ -104,6 +105,8 @@ public interface Arena public MonsterManager getMonsterManager(); + public ClassLimitManager getClassLimitManager(); + public void revivePlayer(Player p); public ArenaLog getLog();