mirror of
https://github.com/TotalFreedomMC/TF-EssentialsX.git
synced 2024-09-12 05:08:48 +00:00
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
This commit is contained in:
parent
76ba5caeec
commit
e93e50f6d2
|
@ -136,3 +136,5 @@ v 1.9:
|
||||||
- Catch all errors in badly formatted groups.
|
- 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.
|
- 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.
|
- 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
|
|
@ -1485,7 +1485,7 @@ public class GroupManager extends JavaPlugin {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
worldsHolder.saveChanges(forced);
|
worldsHolder.saveChanges(forced);
|
||||||
sender.sendMessage(ChatColor.YELLOW + " The changes were saved.");
|
sender.sendMessage(ChatColor.YELLOW + " All changes were saved.");
|
||||||
} catch (IllegalStateException ex) {
|
} catch (IllegalStateException ex) {
|
||||||
sender.sendMessage(ChatColor.RED + ex.getMessage());
|
sender.sendMessage(ChatColor.RED + ex.getMessage());
|
||||||
}
|
}
|
||||||
|
@ -1522,6 +1522,7 @@ public class GroupManager extends JavaPlugin {
|
||||||
}
|
}
|
||||||
// WORKING
|
// WORKING
|
||||||
config.load();
|
config.load();
|
||||||
|
globalGroups.load();
|
||||||
worldsHolder.mirrorSetUp();
|
worldsHolder.mirrorSetUp();
|
||||||
|
|
||||||
isLoaded = false;
|
isLoaded = false;
|
||||||
|
@ -1538,7 +1539,7 @@ public class GroupManager extends JavaPlugin {
|
||||||
sender.sendMessage("The request to world '" + auxString + "' was sent.");
|
sender.sendMessage("The request to world '" + auxString + "' was sent.");
|
||||||
} else {
|
} else {
|
||||||
worldsHolder.reloadAll();
|
worldsHolder.reloadAll();
|
||||||
sender.sendMessage(ChatColor.YELLOW + " The current world was reloaded.");
|
sender.sendMessage(ChatColor.YELLOW + " All worlds were reloaded.");
|
||||||
}
|
}
|
||||||
|
|
||||||
isLoaded = true;
|
isLoaded = true;
|
||||||
|
|
|
@ -66,6 +66,15 @@ public abstract class DataUnit {
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the data source to point to a new worldDataHolder
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
*/
|
||||||
|
public void setDataSource(WorldDataHolder source) {
|
||||||
|
this.dataSource = source;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the dataSource
|
* @return the dataSource
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -17,7 +17,8 @@ public class GroupsDataHolder {
|
||||||
/**
|
/**
|
||||||
* Root World name this set of groups is associated with.
|
* Root World name this set of groups is associated with.
|
||||||
*/
|
*/
|
||||||
private String name;
|
//private String name;
|
||||||
|
private WorldDataHolder dataSource;
|
||||||
private Group defaultGroup = null;
|
private Group defaultGroup = null;
|
||||||
private File groupsFile;
|
private File groupsFile;
|
||||||
private boolean haveGroupsChanged = false;
|
private boolean haveGroupsChanged = false;
|
||||||
|
@ -34,16 +35,23 @@ public class GroupsDataHolder {
|
||||||
protected GroupsDataHolder() {
|
protected GroupsDataHolder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setWorldName(String worldName) {
|
public void setDataSource(WorldDataHolder dataSource) {
|
||||||
name = worldName;
|
this.dataSource = dataSource;
|
||||||
|
//push this data source to the users, so they pull the correct groups data.
|
||||||
|
for (Group group : groups.values())
|
||||||
|
group.setDataSource(this.dataSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//protected void setWorldName(String worldName) {
|
||||||
|
// name = worldName;
|
||||||
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the name
|
* @return the name
|
||||||
*/
|
*/
|
||||||
public String getWorldName() {
|
//public String getWorldName() {
|
||||||
return name;
|
// return name;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the defaultGroup
|
* @return the defaultGroup
|
||||||
|
|
|
@ -17,7 +17,8 @@ public class UsersDataHolder {
|
||||||
/**
|
/**
|
||||||
* Root World name this set of groups is associated with.
|
* Root World name this set of groups is associated with.
|
||||||
*/
|
*/
|
||||||
private String name;
|
//private String name;
|
||||||
|
private WorldDataHolder dataSource;
|
||||||
private File usersFile;
|
private File usersFile;
|
||||||
private boolean haveUsersChanged = false;
|
private boolean haveUsersChanged = false;
|
||||||
private long timeStampUsers = 0;
|
private long timeStampUsers = 0;
|
||||||
|
@ -33,19 +34,27 @@ public class UsersDataHolder {
|
||||||
protected UsersDataHolder() {
|
protected UsersDataHolder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setDataSource(WorldDataHolder dataSource) {
|
||||||
|
this.dataSource = dataSource;
|
||||||
|
//push this data source to the users, so they pull the correct groups data.
|
||||||
|
for (User user : users.values())
|
||||||
|
user.setDataSource(this.dataSource);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param worldName
|
* @param worldName
|
||||||
*/
|
*/
|
||||||
public void setWorldName(String worldName) {
|
//public void setWorldName(String worldName) {
|
||||||
this.name = worldName;
|
// this.name = worldName;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the name
|
* @return the name
|
||||||
*/
|
*/
|
||||||
public String getWorldName() {
|
//public String getWorldName() {
|
||||||
return this.name;
|
// return this.name;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the users
|
* @return the users
|
||||||
|
|
|
@ -81,6 +81,16 @@ public class WorldDataHolder {
|
||||||
//this.defaultGroup = defaultGroup;
|
//this.defaultGroup = defaultGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update the dataSource to point to this object.
|
||||||
|
*
|
||||||
|
* This should be called whenever a set of world data is fetched.
|
||||||
|
*/
|
||||||
|
public void updateDataSource() {
|
||||||
|
this.groups.setDataSource(this);
|
||||||
|
this.users.setDataSource(this);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for a user. If it doesn't exist, create a new one with
|
* Search for a user. If it doesn't exist, create a new one with
|
||||||
* default group.
|
* default group.
|
||||||
|
@ -465,6 +475,7 @@ public class WorldDataHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
//PERMISSIONS NODE
|
//PERMISSIONS NODE
|
||||||
|
try {
|
||||||
if (thisGroupNode.get("permissions") == null) {
|
if (thisGroupNode.get("permissions") == null) {
|
||||||
thisGroupNode.put("permissions", new ArrayList<String>());
|
thisGroupNode.put("permissions", new ArrayList<String>());
|
||||||
} else {
|
} else {
|
||||||
|
@ -484,8 +495,12 @@ public class WorldDataHolder {
|
||||||
}
|
}
|
||||||
thisGrp.sortPermissions();
|
thisGrp.sortPermissions();
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new IllegalArgumentException("Invalid formatting found in permissions section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
//INFO NODE
|
//INFO NODE
|
||||||
|
try {
|
||||||
if (thisGroupNode.get("info") instanceof Map) {
|
if (thisGroupNode.get("info") instanceof Map) {
|
||||||
Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
|
Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
|
||||||
if (infoNode != null) {
|
if (infoNode != null) {
|
||||||
|
@ -493,9 +508,13 @@ public class WorldDataHolder {
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
throw new IllegalArgumentException("Unknown entry found in Info section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
throw new IllegalArgumentException("Unknown entry found in Info section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
||||||
|
} catch (Exception e1) {
|
||||||
|
throw new IllegalArgumentException("Invalid formatting found in info section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
||||||
|
}
|
||||||
|
|
||||||
//END INFO NODE
|
//END INFO NODE
|
||||||
|
|
||||||
|
try {
|
||||||
if (thisGroupNode.get("inheritance") == null || thisGroupNode.get("inheritance") instanceof List) {
|
if (thisGroupNode.get("inheritance") == null || thisGroupNode.get("inheritance") instanceof List) {
|
||||||
Object inheritNode = thisGroupNode.get("inheritance");
|
Object inheritNode = thisGroupNode.get("inheritance");
|
||||||
if (inheritNode == null) {
|
if (inheritNode == null) {
|
||||||
|
@ -513,6 +532,9 @@ public class WorldDataHolder {
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
throw new IllegalArgumentException("Unknown entry found in inheritance section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
throw new IllegalArgumentException("Unknown entry found in inheritance section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
||||||
|
} catch (Exception e2) {
|
||||||
|
throw new IllegalArgumentException("Invalid formatting found in inheritance section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
|
|
@ -10,6 +10,7 @@ import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
@ -45,7 +46,7 @@ public class WorldsHolder {
|
||||||
private Map<String, String> mirrorsGroup = new HashMap<String, String>();
|
private Map<String, String> mirrorsGroup = new HashMap<String, String>();
|
||||||
private Map<String, String> mirrorsUser = new HashMap<String, String>();
|
private Map<String, String> mirrorsUser = new HashMap<String, String>();
|
||||||
|
|
||||||
private OverloadedWorldHolder defaultWorld;
|
//private OverloadedWorldHolder defaultWorld;
|
||||||
private String serverDefaultWorldName;
|
private String serverDefaultWorldName;
|
||||||
private GroupManager plugin;
|
private GroupManager plugin;
|
||||||
private File worldsFolder;
|
private File worldsFolder;
|
||||||
|
@ -59,7 +60,7 @@ public class WorldsHolder {
|
||||||
// Setup folders and check files exist for the primary world
|
// Setup folders and check files exist for the primary world
|
||||||
verifyFirstRun();
|
verifyFirstRun();
|
||||||
initialLoad();
|
initialLoad();
|
||||||
if (defaultWorld == null) {
|
if (serverDefaultWorldName == null) {
|
||||||
throw new IllegalStateException("There is no default group! OMG!");
|
throw new IllegalStateException("There is no default group! OMG!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,7 +77,7 @@ public class WorldsHolder {
|
||||||
private void initialWorldLoading() {
|
private void initialWorldLoading() {
|
||||||
//Load the default world
|
//Load the default world
|
||||||
loadWorld(serverDefaultWorldName);
|
loadWorld(serverDefaultWorldName);
|
||||||
defaultWorld = worldsData.get(serverDefaultWorldName);
|
//defaultWorld = getUpdatedWorldData(serverDefaultWorldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAllSearchedWorlds() {
|
private void loadAllSearchedWorlds() {
|
||||||
|
@ -118,6 +119,8 @@ public class WorldsHolder {
|
||||||
mirrorsUser.clear();
|
mirrorsUser.clear();
|
||||||
Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
|
Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
|
||||||
|
|
||||||
|
HashSet<String> mirroredWorlds = new HashSet<String>();
|
||||||
|
|
||||||
if (mirrorsMap != null) {
|
if (mirrorsMap != null) {
|
||||||
for (String source : mirrorsMap.keySet()) {
|
for (String source : mirrorsMap.keySet()) {
|
||||||
// Make sure all non mirrored worlds have a set of data files.
|
// Make sure all non mirrored worlds have a set of data files.
|
||||||
|
@ -140,6 +143,10 @@ public class WorldsHolder {
|
||||||
}
|
}
|
||||||
mirrorsGroup.put(world, getWorldData(source).getName());
|
mirrorsGroup.put(world, getWorldData(source).getName());
|
||||||
mirrorsUser.put(world, getWorldData(source).getName());
|
mirrorsUser.put(world, getWorldData(source).getName());
|
||||||
|
|
||||||
|
// Track this world so we can create a datasource for it later
|
||||||
|
mirroredWorlds.add(o.toString());
|
||||||
|
|
||||||
} else
|
} else
|
||||||
GroupManager.logger.log(Level.WARNING, "Mirroring error with " + o.toString() + ". Recursive loop detected!");
|
GroupManager.logger.log(Level.WARNING, "Mirroring error with " + o.toString() + ". Recursive loop detected!");
|
||||||
}
|
}
|
||||||
|
@ -171,11 +178,13 @@ public class WorldsHolder {
|
||||||
if (type.equals("users"))
|
if (type.equals("users"))
|
||||||
mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName());
|
mirrorsUser.put(key.toLowerCase(), getWorldData(source).getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Track this world so we can create a datasource for it later
|
||||||
|
mirroredWorlds.add(key);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
GroupManager.logger.log(Level.WARNING, "Mirroring error with " + key + ". Recursive loop detected!");
|
GroupManager.logger.log(Level.WARNING, "Mirroring error with " + key + ". Recursive loop detected!");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException("Unknown mirroring format for " + key);
|
throw new IllegalStateException("Unknown mirroring format for " + key);
|
||||||
}
|
}
|
||||||
|
@ -183,6 +192,14 @@ public class WorldsHolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a datasource for any worlds not already loaded
|
||||||
|
for (String world : mirroredWorlds){
|
||||||
|
if (!worldsData.containsKey(world.toLowerCase())) {
|
||||||
|
setupWorldFolder(world);
|
||||||
|
loadWorld(world, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,22 +346,56 @@ public class WorldsHolder {
|
||||||
public OverloadedWorldHolder getWorldData(String worldName) {
|
public OverloadedWorldHolder getWorldData(String worldName) {
|
||||||
String worldNameLowered = worldName.toLowerCase();
|
String worldNameLowered = worldName.toLowerCase();
|
||||||
|
|
||||||
// Return this worlds data
|
// Find this worlds data
|
||||||
if (worldsData.containsKey(worldNameLowered))
|
if (worldsData.containsKey(worldNameLowered)) {
|
||||||
return worldsData.get(worldNameLowered);
|
|
||||||
|
|
||||||
// If groups mirrored return the parent worlds data
|
String usersMirror = mirrorsUser.get(worldNameLowered);
|
||||||
if (mirrorsGroup.containsKey(worldNameLowered))
|
String groupsMirror = mirrorsGroup.get(worldNameLowered);
|
||||||
return worldsData.get(mirrorsGroup.get(worldNameLowered).toLowerCase());
|
|
||||||
|
|
||||||
// If users mirrored return the parent worlds data
|
if (usersMirror != null) {
|
||||||
if (mirrorsUser.containsKey(worldNameLowered))
|
|
||||||
return worldsData.get(mirrorsUser.get(worldNameLowered).toLowerCase());
|
|
||||||
|
|
||||||
|
// If both are mirrored
|
||||||
|
if (groupsMirror != null) {
|
||||||
|
|
||||||
|
// if the data sources are the same, return the parent
|
||||||
|
if (usersMirror == groupsMirror)
|
||||||
|
return getUpdatedWorldData(usersMirror.toLowerCase());
|
||||||
|
|
||||||
|
// Both data sources are mirrors, but they are from different parents
|
||||||
|
// so we return the actual data object.
|
||||||
|
return getUpdatedWorldData(worldNameLowered);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Groups isn't a mirror so return this this worlds data source
|
||||||
|
return getUpdatedWorldData(worldNameLowered);
|
||||||
|
}
|
||||||
|
|
||||||
|
// users isn't mirrored so we need to return this worlds data source
|
||||||
|
return getUpdatedWorldData(worldNameLowered);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Oddly no data source was found for this world so return the default.
|
||||||
GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
|
GroupManager.logger.finest("Requested world " + worldName + " not found or badly mirrored. Returning default world...");
|
||||||
return getDefaultWorld();
|
return getDefaultWorld();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the requested world data and update it's dataSource to be relevant for this world
|
||||||
|
*
|
||||||
|
* @param worldName
|
||||||
|
* @return updated world holder
|
||||||
|
*/
|
||||||
|
private OverloadedWorldHolder getUpdatedWorldData(String worldName) {
|
||||||
|
|
||||||
|
if (worldsData.containsKey(worldName.toLowerCase())) {
|
||||||
|
OverloadedWorldHolder data = worldsData.get(worldName.toLowerCase());
|
||||||
|
data.updateDataSource();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do a matching of playerName, if its found only one player, do
|
* Do a matching of playerName, if its found only one player, do
|
||||||
* getWorldData(player)
|
* getWorldData(player)
|
||||||
|
@ -487,18 +538,29 @@ public class WorldsHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Wrapper for LoadWorld(String,Boolean) for backwards compatibility
|
||||||
|
*
|
||||||
* Load a world from file.
|
* Load a world from file.
|
||||||
* If it already been loaded, summon reload method from dataHolder.
|
* If it already been loaded, summon reload method from dataHolder.
|
||||||
* @param worldName
|
* @param worldName
|
||||||
*/
|
*/
|
||||||
public void loadWorld(String worldName) {
|
public void loadWorld(String worldName) {
|
||||||
|
loadWorld(worldName, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a world from file.
|
||||||
|
* If it already been loaded, summon reload method from dataHolder.
|
||||||
|
* @param worldName
|
||||||
|
*/
|
||||||
|
public void loadWorld(String worldName, Boolean isMirror) {
|
||||||
if (worldsData.containsKey(worldName.toLowerCase())) {
|
if (worldsData.containsKey(worldName.toLowerCase())) {
|
||||||
worldsData.get(worldName.toLowerCase()).reload();
|
worldsData.get(worldName.toLowerCase()).reload();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GroupManager.logger.finest("Trying to load world " + worldName + "...");
|
GroupManager.logger.finest("Trying to load world " + worldName + "...");
|
||||||
File thisWorldFolder = new File(worldsFolder, worldName);
|
File thisWorldFolder = new File(worldsFolder, worldName);
|
||||||
if (thisWorldFolder.exists() && thisWorldFolder.isDirectory()) {
|
if ((isMirror) || (thisWorldFolder.exists() && thisWorldFolder.isDirectory())) {
|
||||||
|
|
||||||
// Setup file handles, if not mirrored
|
// Setup file handles, if not mirrored
|
||||||
File groupsFile = (mirrorsGroup.containsKey(worldName.toLowerCase()))? null : new File(thisWorldFolder, "groups.yml");
|
File groupsFile = (mirrorsGroup.containsKey(worldName.toLowerCase()))? null : new File(thisWorldFolder, "groups.yml");
|
||||||
|
@ -575,17 +637,43 @@ public class WorldsHolder {
|
||||||
* @return the defaultWorld
|
* @return the defaultWorld
|
||||||
*/
|
*/
|
||||||
public OverloadedWorldHolder getDefaultWorld() {
|
public OverloadedWorldHolder getDefaultWorld() {
|
||||||
return defaultWorld;
|
return getUpdatedWorldData(serverDefaultWorldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all physically loaded worlds.
|
* Returns all physically loaded worlds which have at least
|
||||||
|
* one of their own data sets for users or groups.
|
||||||
|
*
|
||||||
* @return ArrayList<OverloadedWorldHolder> of all loaded worlds
|
* @return ArrayList<OverloadedWorldHolder> of all loaded worlds
|
||||||
*/
|
*/
|
||||||
public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
|
public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
|
||||||
ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();
|
ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();
|
||||||
for (OverloadedWorldHolder data : worldsData.values()) {
|
for (OverloadedWorldHolder data : worldsData.values()) {
|
||||||
if (!list.contains(data)) {
|
if ((!list.contains(data)) && (!mirrorsGroup.containsKey(data.getName().toLowerCase()) || !mirrorsUser.containsKey(data.getName().toLowerCase()))) {
|
||||||
|
|
||||||
|
String worldNameLowered = data.getName().toLowerCase();
|
||||||
|
String usersMirror = mirrorsUser.get(worldNameLowered);
|
||||||
|
String groupsMirror = mirrorsGroup.get(worldNameLowered);
|
||||||
|
|
||||||
|
// is users mirrored?
|
||||||
|
if (usersMirror != null) {
|
||||||
|
|
||||||
|
// If both are mirrored
|
||||||
|
if (groupsMirror != null) {
|
||||||
|
|
||||||
|
// if the data sources are the same, return the parent
|
||||||
|
if (usersMirror == groupsMirror) {
|
||||||
|
if (!list.contains(usersMirror.toLowerCase()))
|
||||||
|
list.add(worldsData.get(usersMirror.toLowerCase()));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Both data sources are mirrors, but they are from different parents
|
||||||
|
// so fall through to add the actual data object.
|
||||||
|
}
|
||||||
|
// Groups isn't a mirror so fall through to add this this worlds data source
|
||||||
|
}
|
||||||
|
|
||||||
|
// users isn't mirrored so we need to add this worlds data source
|
||||||
list.add(data);
|
list.add(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue