#1423 Implement CMI spawn integration

This commit is contained in:
Gabriele C
2017-11-28 12:57:39 +01:00
parent 350321c80b
commit c7c8e673f0
6 changed files with 145 additions and 16 deletions
@@ -40,6 +40,10 @@ public class ServerListener implements Listener {
if ("Essentials".equalsIgnoreCase(pluginName)) {
pluginHookService.unhookEssentials();
ConsoleLogger.info("Essentials has been disabled: unhooking");
} else if ("CMI".equalsIgnoreCase(pluginName)) {
pluginHookService.unhookCMI();
spawnLoader.unloadCMISpawn();
ConsoleLogger.info("CMI has been disabled: unhooking");
} else if ("Multiverse-Core".equalsIgnoreCase(pluginName)) {
pluginHookService.unhookMultiverse();
ConsoleLogger.info("Multiverse-Core has been disabled: unhooking");
@@ -70,6 +74,9 @@ public class ServerListener implements Listener {
pluginHookService.tryHookToMultiverse();
} else if ("EssentialsSpawn".equalsIgnoreCase(pluginName)) {
spawnLoader.loadEssentialsSpawn();
} else if ("CMI".equalsIgnoreCase(pluginName)) {
pluginHookService.tryHookToCMI();
spawnLoader.loadCMISpawn();
} else if ("ProtocolLib".equalsIgnoreCase(pluginName)) {
protocolLibService.setup();
}
@@ -22,6 +22,7 @@ public class PluginHookService {
private final PluginManager pluginManager;
private Essentials essentials;
private Plugin cmi;
private MultiverseCore multiverse;
/**
@@ -33,6 +34,7 @@ public class PluginHookService {
public PluginHookService(PluginManager pluginManager) {
this.pluginManager = pluginManager;
tryHookToEssentials();
tryHookToCMI();
tryHookToMultiverse();
}
@@ -60,6 +62,19 @@ public class PluginHookService {
return null;
}
/**
* If CMI is hooked into, return CMI' data folder.
*
* @return The CMI data folder, or null if unavailable
*/
public File getCMIDataFolder() {
Plugin plugin = pluginManager.getPlugin("CMI");
if(plugin == null) {
return null;
}
return plugin.getDataFolder();
}
/**
* Return the spawn of the given world as defined by Multiverse (if available).
*
@@ -76,10 +91,10 @@ public class PluginHookService {
return null;
}
// ------
// "Is plugin available" methods
// ------
/**
* @return true if we have a hook to Essentials, false otherwise
*/
@@ -87,6 +102,13 @@ public class PluginHookService {
return essentials != null;
}
/**
* @return true if we have a hook to CMI, false otherwise
*/
public boolean isCMIAvailable() {
return cmi != null;
}
/**
* @return true if we have a hook to Multiverse, false otherwise
*/
@@ -109,6 +131,17 @@ public class PluginHookService {
}
}
/**
* Attempts to create a hook into CMI.
*/
public void tryHookToCMI() {
try {
cmi = getPlugin(pluginManager, "CMI", Plugin.class);
} catch (Exception | NoClassDefFoundError ignored) {
cmi = null;
}
}
/**
* Attempts to create a hook into Multiverse.
*/
@@ -123,6 +156,7 @@ public class PluginHookService {
// ------
// Unhook methods
// ------
/**
* Unhooks from Essentials.
*/
@@ -130,6 +164,13 @@ public class PluginHookService {
essentials = null;
}
/**
* Unhooks from CMI.
*/
public void unhookCMI() {
cmi = null;
}
/**
* Unhooks from Multiverse.
*/
@@ -140,6 +181,7 @@ public class PluginHookService {
// ------
// Helpers
// ------
private static <T extends Plugin> T getPlugin(PluginManager pluginManager, String name, Class<T> clazz)
throws Exception, NoClassDefFoundError {
if (pluginManager.isPluginEnabled(name)) {
@@ -150,5 +192,4 @@ public class PluginHookService {
return null;
}
}
@@ -35,6 +35,7 @@ public class SpawnLoader implements Reloadable {
private FileConfiguration authMeConfiguration;
private String[] spawnPriority;
private Location essentialsSpawn;
private Location cmiSpawn;
/**
* Constructor.
@@ -130,6 +131,32 @@ public class SpawnLoader implements Reloadable {
essentialsSpawn = null;
}
/**
* Load the spawn point defined in CMI.
*/
public void loadCMISpawn() {
File cmiFolder = pluginHookService.getCMIDataFolder();
if (cmiFolder == null) {
return;
}
File cmiConfig = new File(cmiFolder, "config.yml");
if (cmiConfig.exists()) {
cmiSpawn = getLocationFromConfigurationUpper(
YamlConfiguration.loadConfiguration(cmiConfig), "Spawn.Main");
} else {
cmiSpawn = null;
ConsoleLogger.info("CMI config file not found: '" + cmiConfig.getAbsolutePath() + "'");
}
}
/**
* Unset the spawn point defined in CMI.
*/
public void unloadCMISpawn() {
cmiSpawn = null;
}
/**
* Return the spawn location for the given player. The source of the spawn location varies
* depending on the spawn priority setting.
@@ -162,6 +189,9 @@ public class SpawnLoader implements Reloadable {
case "essentials":
spawnLoc = essentialsSpawn;
break;
case "cmi":
spawnLoc = cmiSpawn;
break;
case "authme":
spawnLoc = getSpawn();
break;
@@ -242,6 +272,28 @@ public class SpawnLoader implements Reloadable {
return null;
}
/**
* Build a {@link Location} object from the given path in the file configuration.
*
* @param configuration The file configuration to read from
* @param pathPrefix The path to get the spawn point from
*
* @return Location corresponding to the values in the path
*/
private static Location getLocationFromConfigurationUpper(FileConfiguration configuration, String pathPrefix) {
if (containsAllSpawnFieldsUpper(configuration, pathPrefix)) {
String prefix = pathPrefix + ".";
String worldName = configuration.getString(prefix + "World");
World world = Bukkit.getWorld(worldName);
if (!StringUtils.isEmpty(worldName) && world != null) {
return new Location(world, configuration.getDouble(prefix + "X"),
configuration.getDouble(prefix + "Y"), configuration.getDouble(prefix + "Z"),
getFloat(configuration, prefix + "Yaw"), getFloat(configuration, prefix + "Pitch"));
}
}
return null;
}
/**
* Return whether the file configuration contains all fields necessary to define a spawn
* under the given path.
@@ -261,6 +313,25 @@ public class SpawnLoader implements Reloadable {
return true;
}
/**
* Return whether the file configuration contains all fields necessary to define a spawn
* under the given path.
*
* @param configuration The file configuration to use
* @param pathPrefix The path to verify
*
* @return True if all spawn fields are present, false otherwise
*/
private static boolean containsAllSpawnFieldsUpper(FileConfiguration configuration, String pathPrefix) {
String[] fields = {"World", "X", "Y", "Z", "Yaw", "Pitch"};
for (String field : fields) {
if (!configuration.contains(pathPrefix + "." + field)) {
return false;
}
}
return true;
}
/**
* Retrieve a property as a float from the given file configuration.
*
@@ -274,4 +345,5 @@ public class SpawnLoader implements Reloadable {
// This behavior is consistent with FileConfiguration#getDouble
return (value instanceof Number) ? ((Number) value).floatValue() : 0;
}
}
@@ -140,9 +140,9 @@ public final class RestrictionSettings implements SettingsHolder {
public static final Property<Boolean> DISPLAY_OTHER_ACCOUNTS =
newProperty("settings.restrictions.displayOtherAccounts", true);
@Comment("Spawn priority; values: authme, essentials, multiverse, default")
@Comment("Spawn priority; values: authme, essentials, cmi, multiverse, default")
public static final Property<String> SPAWN_PRIORITY =
newProperty("settings.restrictions.spawnPriority", "authme,essentials,multiverse,default");
newProperty("settings.restrictions.spawnPriority", "authme,essentials,cmi,multiverse,default");
@Comment("Maximum Login authorized by IP")
public static final Property<Integer> MAX_LOGIN_PER_IP =
@@ -31,6 +31,7 @@ public class ServerListenerTest {
private static final String ESSENTIALS = "Essentials";
private static final String ESSENTIALS_SPAWN = "EssentialsSpawn";
private static final String CMI = "CMI";
private static final String MULTIVERSE = "Multiverse-Core";
private static final String PROTOCOL_LIB = "ProtocolLib";
@@ -58,6 +59,10 @@ public class ServerListenerTest {
public void shouldForwardPluginNameOnEnable() {
checkEnableHandling(ESSENTIALS, () -> verify(pluginHookService).tryHookToEssentials());
checkEnableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).loadEssentialsSpawn());
checkEnableHandling(CMI, () -> {
verify(pluginHookService).tryHookToCMI();
verify(spawnLoader).loadCMISpawn();
});
checkEnableHandling(MULTIVERSE, () -> verify(pluginHookService).tryHookToMultiverse());
checkEnableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).setup());
checkEnableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader));
@@ -67,6 +72,10 @@ public class ServerListenerTest {
public void shouldForwardPluginNameOnDisable() {
checkDisableHandling(ESSENTIALS, () -> verify(pluginHookService).unhookEssentials());
checkDisableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).unloadEssentialsSpawn());
checkDisableHandling(CMI, () -> {
verify(pluginHookService).unhookCMI();
verify(spawnLoader).unloadCMISpawn();
});
checkDisableHandling(MULTIVERSE, () -> verify(pluginHookService).unhookMultiverse());
checkDisableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).disable());
checkDisableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader));