diff --git a/src/main/java/org/ultramine/permission/ClientPermissionManager.java b/src/main/java/org/ultramine/permission/ClientPermissionManager.java index 31278ae..843b9db 100644 --- a/src/main/java/org/ultramine/permission/ClientPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ClientPermissionManager.java @@ -82,4 +82,10 @@ public void reload() { } + + @Override + public PermissionRepository getRepository() + { + return permissionRepository; + } } diff --git a/src/main/java/org/ultramine/permission/IPermissionHandler.java b/src/main/java/org/ultramine/permission/IPermissionHandler.java index 1911fc4..129e779 100644 --- a/src/main/java/org/ultramine/permission/IPermissionHandler.java +++ b/src/main/java/org/ultramine/permission/IPermissionHandler.java @@ -23,4 +23,6 @@ public void save(); public void reload(); + + public PermissionRepository getRepository(); } \ No newline at end of file diff --git a/src/main/java/org/ultramine/permission/PermissionRepository.java b/src/main/java/org/ultramine/permission/PermissionRepository.java index 56ef555..744bd50 100644 --- a/src/main/java/org/ultramine/permission/PermissionRepository.java +++ b/src/main/java/org/ultramine/permission/PermissionRepository.java @@ -9,8 +9,20 @@ public class PermissionRepository { - private Set registeredPermissions = new HashSet(); - private Map proxyPermissions = new HashMap(); + private Set registeredPermissions; + private Map proxyPermissions; + + public PermissionRepository() + { + registeredPermissions = new HashSet(); + proxyPermissions = new HashMap(); + } + + public PermissionRepository(PermissionRepository anotherRepository) + { + registeredPermissions = new HashSet(anotherRepository.registeredPermissions); + proxyPermissions = new HashMap(anotherRepository.proxyPermissions); + } public ProxyPermission getPermission(String key) { @@ -30,7 +42,7 @@ return proxyPermissions.get(key); } - public void registerPermission(IPermission permission) + public ProxyPermission registerPermission(IPermission permission) { if (registeredPermissions.contains(permission.getKey())) throw new IllegalArgumentException("Permission already registered"); @@ -38,6 +50,12 @@ if (permission.getKey().startsWith("^")) throw new IllegalArgumentException("^* names are reserved"); + if (permission instanceof ProxyPermission) + { + proxyPermissions.put(permission.getKey(), (ProxyPermission)permission); + return (ProxyPermission)permission; + } + ProxyPermission proxy = getPermission(permission.getKey()); if (permission instanceof IChangeablePermission) proxy.linkChangeable((IChangeablePermission)permission); @@ -45,6 +63,7 @@ proxy.linkSimple(permission); registeredPermissions.add(permission.getKey()); + return proxy; } public static class ProxyPermission implements IChangeablePermission diff --git a/src/main/java/org/ultramine/permission/ServerPermissionManager.java b/src/main/java/org/ultramine/permission/ServerPermissionManager.java index 29989de..a4d7f1a 100644 --- a/src/main/java/org/ultramine/permission/ServerPermissionManager.java +++ b/src/main/java/org/ultramine/permission/ServerPermissionManager.java @@ -135,6 +135,12 @@ reloadWorld(world); } + @Override + public PermissionRepository getRepository() + { + return permissionRepository; + } + public void reloadWorld(String name) { World.WorldData data = YamlConfigProvider.getOrCreateConfig(worldFile(name), World.WorldData.class); diff --git a/src/main/java/org/ultramine/server/PermissionHandler.java b/src/main/java/org/ultramine/server/PermissionHandler.java index a8c3b44..e2da43d 100644 --- a/src/main/java/org/ultramine/server/PermissionHandler.java +++ b/src/main/java/org/ultramine/server/PermissionHandler.java @@ -2,6 +2,7 @@ import net.minecraft.entity.player.EntityPlayer; import org.ultramine.permission.ClientPermissionManager; +import org.ultramine.permission.IPermission; import org.ultramine.permission.IPermissionHandler; import org.ultramine.permission.MetaResolver; import org.ultramine.permission.Permission; @@ -15,30 +16,49 @@ public static final String OP_PERMISSION = "minecraft.op"; private static PermissionHandler instance; - private static PermissionRepository permissionRepository = new PermissionRepository(); + private static PermissionRepository mainRepository = new PermissionRepository(); public static void registerPermission(String key, String name, String description) { - permissionRepository.registerPermission(new Permission(key, name, description)); + if (instance != null) + getInstance().getRepository().registerPermission(new Permission(key, name, description)); + else + mainRepository.registerPermission(new Permission(key, name, description)); } - public static PermissionRepository getRepository() + public static void registerPermission(IPermission permission) { - return permissionRepository; + if (instance != null) + getInstance().getRepository().registerPermission(permission); + else + mainRepository.registerPermission(permission); + } + + public static PermissionRepository.ProxyPermission getPermission(String key) + { + if (instance != null) + return getInstance().getRepository().getPermission(key); + + return mainRepository.getPermission(key); } public static void initServer() { if (instance != null) throw new IllegalStateException("Handler is already initialized"); - instance = new PermissionHandler(new ServerPermissionManager(ConfigurationHandler.getSettingDir(), permissionRepository)); + instance = new PermissionHandler(new ServerPermissionManager(ConfigurationHandler.getSettingDir(), new PermissionRepository(mainRepository))); } public static void initClient() { if (instance != null) throw new IllegalStateException("Handler is already initialized"); - instance = new PermissionHandler(new ClientPermissionManager(permissionRepository)); + instance = new PermissionHandler(new ClientPermissionManager(new PermissionRepository(mainRepository))); + } + + public static void reset() + { + instance = null; } public static PermissionHandler getInstance() @@ -140,6 +160,12 @@ handler.reload(); } + @Override + public PermissionRepository getRepository() + { + return handler.getRepository(); + } + private String worldName(EntityPlayer player) { return player.getEntityWorld().getWorldInfo().getWorldName(); diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 18ecdf3..e82c8c2 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -15,6 +15,7 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.network.NetworkCheckHandler; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; @@ -90,6 +91,12 @@ } } + @Subscribe + public void stopServer(FMLServerStoppedEvent e) + { + PermissionHandler.reset(); + } + @Override public Object getMod() {