diff --git a/src/com/garbagemule/MobArena/ArenaMasterImpl.java b/src/com/garbagemule/MobArena/ArenaMasterImpl.java index 542ece8..4dc5c3c7f 100644 --- a/src/com/garbagemule/MobArena/ArenaMasterImpl.java +++ b/src/com/garbagemule/MobArena/ArenaMasterImpl.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Entity; @@ -487,17 +488,45 @@ public class ArenaMasterImpl implements ArenaMaster // If no arenas were found, create a default node. if (arenanames == null || arenanames.isEmpty()) { createArenaNode("default", plugin.getServer().getWorlds().get(0)); - arenanames = config.getKeys("arenas"); } - - // Establish the list. + arenas = new LinkedList(); - - for (String arenaname : arenanames) { - loadArena(arenaname); + for (World w : Bukkit.getServer().getWorlds()) { + loadArenasInWorld(w.getName()); + } + } + + public void loadArenasInWorld(String worldName) { + Set arenaNames = config.getKeys("arenas"); + if (arenaNames == null || arenaNames.isEmpty()) { + return; + } + for (String arenaName : arenaNames) { + Arena arena = getArenaWithName(arenaName); + if (arena != null) continue; + + String arenaWorld = config.getString("arenas." + arenaName + ".settings.world", null); + if (!arenaWorld.equals(worldName)) continue; + + loadArena(arenaName); + } + } + + public void unloadArenasInWorld(String worldName) { + Set arenaNames = config.getKeys("arenas"); + if (arenaNames == null || arenaNames.isEmpty()) { + return; + } + for (String arenaName : arenaNames) { + Arena arena = getArenaWithName(arenaName); + if (arena == null) continue; + + String arenaWorld = arena.getWorld().getName(); + if (!arenaWorld.equals(worldName)) continue; + + arena.forceEnd(); + arenas.remove(arena); } - - selectedArena = arenas.get(0); } private Arena loadArena(String arenaname) { @@ -510,7 +539,7 @@ public class ArenaMasterImpl implements ArenaMaster world = plugin.getServer().getWorld(worldName); if (world == null) { - Messenger.severe("The world '" + worldName + "' for arena '" + arenaname + "' does not exist!"); + Messenger.warning("World '" + worldName + "' for arena '" + arenaname + "' was not found..."); return null; } } @@ -528,9 +557,15 @@ public class ArenaMasterImpl implements ArenaMaster // Register the permission registerPermission("mobarena.arenas." + arenaname.toLowerCase(), PermissionDefault.TRUE); + + // Set the selected arena, if it is null + if (selectedArena == null) { + selectedArena = arena; + } // Finally, add it to the arena list. arenas.add(arena); + Messenger.info("Loaded arena '" + arenaname + "'."); return arena; } diff --git a/src/com/garbagemule/MobArena/framework/ArenaMaster.java b/src/com/garbagemule/MobArena/framework/ArenaMaster.java index 184bf83..ef2f9c7 100644 --- a/src/com/garbagemule/MobArena/framework/ArenaMaster.java +++ b/src/com/garbagemule/MobArena/framework/ArenaMaster.java @@ -123,6 +123,10 @@ public interface ArenaMaster */ public void loadArenas(); + public void loadArenasInWorld(String worldName); + + public void unloadArenasInWorld(String worldName); + public Arena createArenaNode(String configName, World world); public void removeArenaNode(Arena arena); diff --git a/src/com/garbagemule/MobArena/listeners/MAGlobalListener.java b/src/com/garbagemule/MobArena/listeners/MAGlobalListener.java index 7d9a17a..a8d6099 100644 --- a/src/com/garbagemule/MobArena/listeners/MAGlobalListener.java +++ b/src/com/garbagemule/MobArena/listeners/MAGlobalListener.java @@ -8,6 +8,8 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.event.entity.*; import org.bukkit.event.player.*; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; import com.garbagemule.MobArena.Messenger; import com.garbagemule.MobArena.MobArena; @@ -300,4 +302,23 @@ public class MAGlobalListener implements Listener arena.getEventListener().onPlayerPreLogin(event); } } + + + + /////////////////////////////////////////////////////////////////////////// + // // + // WORLD EVENTS // + // // + /////////////////////////////////////////////////////////////////////////// + + + @EventHandler(priority = EventPriority.NORMAL) + public void worldLoadEvent(WorldLoadEvent event) { + am.loadArenasInWorld(event.getWorld().getName()); + } + + @EventHandler(priority = EventPriority.NORMAL) + public void worldUnloadEvent(WorldUnloadEvent event) { + am.unloadArenasInWorld(event.getWorld().getName()); + } }