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

View File

@ -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<Arena>();
for (String arenaname : arenanames) {
loadArena(arenaname);
for (World w : Bukkit.getServer().getWorlds()) {
loadArenasInWorld(w.getName());
}
}
selectedArena = arenas.get(0);
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);
}
}
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;
}
}
@ -529,8 +558,14 @@ 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;
}

View File

@ -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);

View File

@ -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());
}
}