Better multiworld support.

This commit is contained in:
Andreas Troelsen
2013-01-16 23:44:20 +01:00
parent a6ea9d03da
commit ddeb0cef44
3 changed files with 69 additions and 9 deletions
@@ -8,6 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@@ -487,17 +488,45 @@ public class ArenaMasterImpl implements ArenaMaster
// If no arenas were found, create a default node. // If no arenas were found, create a default node.
if (arenanames == null || arenanames.isEmpty()) { if (arenanames == null || arenanames.isEmpty()) {
createArenaNode("default", plugin.getServer().getWorlds().get(0)); createArenaNode("default", plugin.getServer().getWorlds().get(0));
arenanames = config.getKeys("arenas");
} }
// Establish the list.
arenas = new LinkedList<Arena>(); arenas = new LinkedList<Arena>();
for (World w : Bukkit.getServer().getWorlds()) {
for (String arenaname : arenanames) { loadArenasInWorld(w.getName());
loadArena(arenaname); }
}
public void loadArenasInWorld(String worldName) {
Set<String> 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<String> 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) { private Arena loadArena(String arenaname) {
@@ -510,7 +539,7 @@ public class ArenaMasterImpl implements ArenaMaster
world = plugin.getServer().getWorld(worldName); world = plugin.getServer().getWorld(worldName);
if (world == null) { 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; return null;
} }
} }
@@ -528,9 +557,15 @@ public class ArenaMasterImpl implements ArenaMaster
// Register the permission // Register the permission
registerPermission("mobarena.arenas." + arenaname.toLowerCase(), PermissionDefault.TRUE); 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. // Finally, add it to the arena list.
arenas.add(arena); arenas.add(arena);
Messenger.info("Loaded arena '" + arenaname + "'.");
return arena; return arena;
} }
@@ -123,6 +123,10 @@ public interface ArenaMaster
*/ */
public void loadArenas(); public void loadArenas();
public void loadArenasInWorld(String worldName);
public void unloadArenasInWorld(String worldName);
public Arena createArenaNode(String configName, World world); public Arena createArenaNode(String configName, World world);
public void removeArenaNode(Arena arena); public void removeArenaNode(Arena arena);
@@ -8,6 +8,8 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.*; import org.bukkit.event.block.*;
import org.bukkit.event.entity.*; import org.bukkit.event.entity.*;
import org.bukkit.event.player.*; 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.Messenger;
import com.garbagemule.MobArena.MobArena; import com.garbagemule.MobArena.MobArena;
@@ -300,4 +302,23 @@ public class MAGlobalListener implements Listener
arena.getEventListener().onPlayerPreLogin(event); 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());
}
} }