Changelog v 1.1: - Fixed users being able to use 'manuadd' to add users to higher groups than their own. - Added SuperPerms support so GM will update and provide the permissions to plugins which only support Bukkit Perms. - Added more helpful output to errors on argument lengths. - GroupManager will now attempt to select the default world when using commands instead of failing and telling you to use '/manselect '. - Invalid groups assigned to players in users.yml will no longer cause a crash. GM will now set them to the default group instead. - Fix for Users.yml containing only 'users:' causing a crash. - GroupManager will now generate a fresh Users and Groups yml if either file is empty. - Fix for an infinite loop bug with the new Bukkit Perms during a new user creation. - Fixed BukkitPerms population. Wasn't correctly setting superperms. - Push updates to superperms for all valid GM commands. - All GroupManager commands issued by players are now echoed in the console. - Reverted WorldHolder static change to maintain backward plugin compatibility. - Update to handle 'getDescription().getPermissions(') returning a list (CB 1172). - Fix for null in PLAYER_TELEPORT for bukkit perms. - Fixed wasteful updating of perms on a manload. - manulistp now accepts an additional + to list ALL Superperms effective permissions (/manulistp +). - manucheckp also outputs superperms results. - Removed superperms update on plugins unloading. Unneeded and created undesired lag on shutdown. - Added a BukkitPermsUpdateTask to only update superperms once on a load/reload. - Fix for GM not checking inheritance for known superperms nodes. - Optimized getAllPlayersPermissions and fixed pushing unknown perms to superperms. v 1.2: - Changed priority of Registered events to lowest. - Fixed an issue with superperms where plugins define perms with inheritance after the root perms v 1.3: - Rewrote Config loading to use Bukkits Configuration features - Added an opOverride setting in config. If present and set to false, op's will not get overriding permissions in GroupManager. (one op will not be able to alter another op's settings) - GM will now create all relevant world data files for non mirrored worlds. (for all worlds named in config.yml) - Attempt to stop GM wiping groups/users yml's on a bad shut down. - Added event handling to manage new world creation at runtime. - Added the ability to handle unknown worlds at server start. (GM will create the data files for any worlds it finds which are not in the config.yml) - Fix for Bukkit passing a null To location on a player Portaling - Fixed manudelsub not correctly selecting the group to remove. - Added two new permission nodes - groupmanager.notify.self & groupmanager.notify.other These allow players/admins to be notified when players are moved between groups. v 1.4: - Updated for Bukkits new YamlConfiguration. - Cleared remaining Cast errors cause by object cloning. - Removed extra notification messages for the player issuing the group move command. - Added a config setting - bukkit_perms_override: false Enable to allow default Bukkit based permissions to remain enabled, unless directly negated within GroupManager. - Fixed reading world mirrors from the config. - Simplified config.yml while retaining backwards compatibility. - Added data.save.hours setting to config. This allow control over how long backups are retained. v 1.5: - Fixed opOverrides and bukkit_perms_override to read the correct entries. - Better commenting in config.yml - Fixed GM to recognize Superperm child nodes. If you add a node like Towny.admin GM will now correctly report on all child nodes. - Fixed GM loading world data files twice at startup. - Improved error reporting for invalid groups.yml - Added Global Groups Defined in groupmanager/globalgroups.yml. Create groups in the yml with a g: prefix, then inherit in the worlds groups files. - Added Info node support to Global Groups. - Fixed an error on 'manucheckv'. If the users doesn't have the variable it fell through causing an exception. - Added checking of subgroups for Info nodes. - Expanded 'canUserBuild()' to include inheritance and subgroups. - Added a config.yml setting of 'validate_toggle' for those who prefer 'mantogglevalidate' to always be off. - Prevent setting 'minutes' in the config to zero causing an error. - GM will now check to see if it's data files have been changed at each scheduled save. If the files have been altered (on disc) it will reload, so long as the in-memory data hasn't changed. If the files on Disc have changed AND there have been changes to it's in-memory data it will show a warning. You then MUST issue a '/mansave force' to overwrite the disc files, or a '/manload' to overwrite the memory data. - Fix for an error in checkFullUserPermission caused by players disconnecting mid perms update. - Notification of being moved to the default group only happens if it's a demotion/promotion (not on join). - Fixed GM holding files open and causing the time stamp to be incorrect. This caused GM to require a '/mansave force' when it shouldn't be needed. - Fixed a crash on reload due to bukkit not unloading plugins before reloading. v 1.6: - Prevent Group.equals tests throwing a NullPointerException for GlobalGroups. - Stop throwing errors on an empty users file. - Optimize sorting to speedup permission tests. - Fix superperms to pass all tests http://dev.bukkit.org/server-mods/superpermstest/ - Optimizations include changing the return of comparePermissionString. - Added file details in error messages for loading groups/users. v 1.7: - GM now supports offline players without having to mantogglevalidate - Offline player checks now support partial name matches. - Added custom events so plugins can now be notified of changes within GroupManager. - GM now registers with Bukkits ServicesManager. - deleting the contents of GlobalGroups.yml will no longer thrown a NullPointerException. - Removed op permissions from admins in the default GloblaGroups.yml. v 1.8: - Changed ServicesManager registration to lowest from normal. - Fixed 'manucheckp' returning a null for the searched node when it's a group/subgroup. - 'manpromote' and 'mandemote' now correctly send the notification to the console if the command was issued there. - Expanded GlobalGroups.yml and Groups.yml to include Towny permissions. - Delayed GroupManager events so Superperms will be fully updated before plugins receive the events. - Changed the way events are raised to prevent variable corruption. - Reload GlobalGroups when you perform a world load. - Changed GlobalGroups to save/load before local groups in the scheduled data saving/loading - Fix 'manucheckp' to correctly report if a permission is available from GroupManager or Bukkit. - Changed over to a reflection method for populating superperms as Bukkit lags when you handle permissions one at a time. - Major, MAJOR changes to support partial/full world mirroring. You can now mirror groups.yml, users.yml or both files between different worlds. - Catch NullPointerErrors generated by blank permission nodes. - Removed '- bukkit.command' form the globalgroups permission nodes. v 1.9: - Optimize populating Bukkit perms so we no longer calculate the child nodes (Bukkit already does this). - Added a tidy error message for invalid permission entries in GlobalGroups. - Better optimize assembling of a players permissions and allow the * node to populate all registered superperms. - Fixed text when adding a subgroup to not say the player was moved. - Update to new Bukkit Event system. - Update GroupManagerBridge for new event system. - Fixed a random null error upon a player portaling. - Fixed infinite loop error on player join. - Optimized code to only update the player logging in instead of all players online. - Added recursive loop detection for World mirroring (you may not set the main world as a mirror of another). - Fixed fetching world data so it no longer returns the mirrored world for groups. Each world data holder now points to the correct data set, so can be returned as an object. - Changed addSubGroup() to only add the group if it doesn't already exist (no need to update an already existing group). - addSubGroup now returns a boolean for success/failure. - '/manuaddsub' now correctly reports if it was able to add the sub group. - Allow negation to the * permission node when populating superperms. - Fix trying to modify an unmodifiable collection breaking superperms. - Fixed subgroups (I broke earlier). - Check for a null player object in the PlayerTeleportEvent. - Trap errors in fetching the mirrors map. - Fixed an infinite loop error when using '/manudel' on a logged in player. It caused setDefaultGroup to trigger a bukkit update when no GM User existed yet. - do not allow inherited permissions to negate higher perms. - Fixed a bug when pushing superperms in the wrong order. - Fix players retaining permissions when demoted. - Auto sort permissions on load to speed up population of superperms. - Negating a parent node after adding all nodes with * will now correctly remove all child nodes of that parent before populating superperms. eg. - '*' - -vanish.* - vanish.standard - Track the 'onPlayerChangeWorld' event as some teleports seem to not be triggering a world move. - Catch all errors in badly formatted groups. - Fix a bug with getWorldData return the main world data for all mirrors, instead of the worlds parent data. - Prevent getAllPlayersPermissions() processing a group more than once. Improves performance when using complex inheritance structures. - Fix world mirroring so it correctly creates data files and data sources for partially mirrored worlds. - Fixed world mirroring so it returns the correct data for the requested world. - Change Service registration to register WorldsHolder instead of AnjoPermissionsHandler. This is the correct entry point for all data. - Depreciate PlayerTeleportEvent, PlayerRespawnEvent and PlayerPortalEvent as it's all handled in PlayerChangedWorldEvent. This also means we no longer update permissions before we change worlds. - A command of '/manload' with no world arguments now performs a full reload of GM. - Update for Bukkit R5 compatability. - Removed BukkitPermsOverride as this is now the default with bukkit handling child nodes. - Prevent adding inheritances and info nodes to globalgroups. These are permissions collections, not player groups. - Prevent promoting players to, and demoting to GlobalGroups. - Make 'manload' reload the config correctly. - Minor optimization when checking bukkit permissions. - Better reporting when a users.yml is failing to load. - Expanded '/manuadd'to accept an optional variable for the world (eg '/manuadd '). - Removed some debug spam. - Don't remove an attachment on a player leaving as Bukkit never forgets it. This fixes non mirrored permissions being messed up if a player relogs. - Treat all world names as lower case for file handling (please check in your worlds folder. You should have no folders with upper case letters from now). - Auto rename all case sensitive world folders to lower case (if possible). - Update GlobalGroups.yml for new/changed Towny permission nodes. - Stop attempting to push empty permissions when players edit the yml's incorrectly. - Catch errors caused by bad indentation in yml's. - Force remove player attachments on disconnect, and tidyup during player join in case of any errors. Fixes a bug of losing permissions. - Added a new permission node 'groupmanager.op'. This will cause players with this node to be treated as op's when using GroupManager commands (they will still require each commands permission node to use them). - Prevent Null entries in group inheritance from throwing errors. v 2.0: - Fix GM reporting of permission inheritance to retain the correct order. Lower inheritance groups can no longer negate a higher groups permissions. - Fix an error I caused trying to modify an unmodifiable list when parsing '*' permissions. - Don't throw errors when attempting to remove permission attachments (bukkit will have already removed it). - Remove all permission attachments when performing a manload or restart. - Expand 'manwhois' to also list a users subgroups. - Fix a concurrent modification error when removing all attachments. - Better handling of errors in user and group yml's. - Added missing confirmation message on '/manload'. - Stop the error on shutdown if GM failed to load at startup. - GroupManager will now generate it's own log (in the GM folder) to keep things tidy, but also to account of those players unable to find/access their server.log. - Startup errors will now lock out ALL commands other than '/manload' - Fix 'manuadd' to use the default or selected world (via 'manselect'), if the world is not specified in the command. - Expand GlobalGroups.yml and groups.yml to cover the VanishNoPacket plugin. Demonstrating how to negate and add nodes when using the '*' permission with inheritance. - Fix silly nested throw/catch statements. Errors are now correctly generated when reading yml's. - Unregister the worldsHolder as a service on a reload/shutdown instead of the whole plugin. - Update all code formatting to use tabs for indentation. - Stop using our own deprecated methods as we tell others to do. - Finally remove all deprecated methods. - Re-initialize the WorldsHolder on a reload, as un-registering and re-registering a new holder means all plugins have to check for the new service on every quiery. - Prevent null perms getting past the GlobalGroups loader. - Fix forgetting sub groups on a manload. - Allow 'manucheckp' to notify when superperms reports false but it is really negated. - Only output a Data update message if something has changed. - Fix loading users with only numerals in their names to be seen as strings. - Ignore any sub folders in the Worlds folder which start with a period (fix for storing data in svn respoitories). - Throw a better error than 'null' when someone removes all groups from a yml. - Stop force removing attachments and let Bukkit handle it's own mess. - Change to our own Yaml parsing for globalgroups instead of using the YAMLConfiguration class in bukkit. - Fix a cases sensitivity bug in world loading. - Stop using the YamlConfiguration in bukkit for our config handling. We can now support periods in world names. - Fix GlobalGroups not loading permission nodes. - Fix an error with Logging set to 'OFF' triggering a cast exception. - No more null errors from corrupt config.yml's. - Give a better error when a subgroup is null. - Include the GM version when logging errors. - Fix Synchronization on adding subgroups (thanks snowleo). - Remove info node support from GlobalGroups. It should not have them as GlobalGroups are only permission collections. - Change order of data in Users.yml to [name, Group, SubGroup, Permissions, Info nodes]. - Add alphabetically sorted user lists. - allWorldsDataList now returns fully mirrored worlds which are not identical mirrors (fixes the /manselect list). - Add support for Rcon. - Prevent GM commands from being used on CommandBlocks. - Clear our attachment map upon a manload so we correctly reconfigure a players new permissions. - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. - Do not grant any permissions (nor update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. - Negate 'groupmanager.noofflineperms' by default in the owner group. - Add support for BukkitForge using 'overworld' as the main world name. - Prevent '*' permissions granting the 'groupmanager.noofflineperms' permission. - Added '/mancheckw ' to inspect which permission files a world is referencing. - Add config potion to set if GM commands should be allowed on CommnandBlocks. - Catch the error when using an out of date config for 'allow_commandblocks' So it doesn't kill the whole config. - '/manselect' will no longer list duplicate worlds. - Added a new mirroring option in the config of 'all_unnamed_worlds'. This will cause all new or unnamed worlds to use this mirroring. - Don't allow adding a node with '/manuaddp' and '/mangaddp' which is already negated. - Warn when adding a node where an exception already exist. - Only prevent adding nodes with '/manuaddp' and '/mangaddp' if they are exact matches (not wildcards). - Store worldSelection indexed on the senders name rather than the object (fixes commandblocks using manselect). - Check subgroup permissions with an equal priority so no one subgroup is higher ranked than another. - add recursive permission adding/deleting - Prevent adding sub groups for ranks the granting player doesn't have access to. - Allow Exceptions in any inherited group to override negation of permissions. v2.1: - Update for CraftBukkit 1.7.8-R0.1(3050). - Add UUID support. Plugins can still query by player name but a UUID is faster and preferable. - Set a default mirror map if none is found in the config. - Fix clones forgetting sub groups. - Prevent players who have never logged in before from taking over existing accounts. - Added metrics. - Prevent GM's own permission tests from allowing inherited permissions to override inherited negations (caused when we added the exception override for sub groups). - Add internal name to UUID resolution to speed data lookups. - Convert all User lookups and commands to use UUIDs where possible. - Fix Overloaded and non-overloaded users to report correctly for group tests. - Prevent inherited group permission negations overriding higher level group perms. - Fix 'manudel' so it correctly deletes the user.