#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

View File

@ -1,5 +1,5 @@
<!-- AUTO-GENERATED FILE! Do not edit this directly --> <!-- AUTO-GENERATED FILE! Do not edit this directly -->
<!-- File auto-generated on Tue Oct 31 15:56:59 CET 2017. See docs/config/config.tpl.md --> <!-- File auto-generated on Tue Nov 28 12:49:57 CET 2017. See docs/config/config.tpl.md -->
## AuthMe Configuration ## AuthMe Configuration
The first time you run AuthMe it will create a config.yml file in the plugins/AuthMe folder, The first time you run AuthMe it will create a config.yml file in the plugins/AuthMe folder,
@ -202,8 +202,8 @@ settings:
# Should we display all other accounts from a player when he joins? # Should we display all other accounts from a player when he joins?
# permission: /authme.admin.accounts # permission: /authme.admin.accounts
displayOtherAccounts: true displayOtherAccounts: true
# Spawn priority; values: authme, essentials, multiverse, default # Spawn priority; values: authme, essentials, cmi, multiverse, default
spawnPriority: 'authme,essentials,multiverse,default' spawnPriority: 'authme,essentials,cmi,multiverse,default'
# Maximum Login authorized by IP # Maximum Login authorized by IP
maxLoginPerIp: 0 maxLoginPerIp: 0
# Maximum Join authorized by IP # Maximum Join authorized by IP
@ -560,4 +560,4 @@ To change settings on a running server, save your changes to config.yml and use
--- ---
This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Tue Oct 31 15:56:59 CET 2017 This page was automatically generated on the [AuthMe/AuthMeReloaded repository](https://github.com/AuthMe/AuthMeReloaded/tree/master/docs/) on Tue Nov 28 12:49:57 CET 2017

View File

@ -40,6 +40,10 @@ public class ServerListener implements Listener {
if ("Essentials".equalsIgnoreCase(pluginName)) { if ("Essentials".equalsIgnoreCase(pluginName)) {
pluginHookService.unhookEssentials(); pluginHookService.unhookEssentials();
ConsoleLogger.info("Essentials has been disabled: unhooking"); 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)) { } else if ("Multiverse-Core".equalsIgnoreCase(pluginName)) {
pluginHookService.unhookMultiverse(); pluginHookService.unhookMultiverse();
ConsoleLogger.info("Multiverse-Core has been disabled: unhooking"); ConsoleLogger.info("Multiverse-Core has been disabled: unhooking");
@ -70,6 +74,9 @@ public class ServerListener implements Listener {
pluginHookService.tryHookToMultiverse(); pluginHookService.tryHookToMultiverse();
} else if ("EssentialsSpawn".equalsIgnoreCase(pluginName)) { } else if ("EssentialsSpawn".equalsIgnoreCase(pluginName)) {
spawnLoader.loadEssentialsSpawn(); spawnLoader.loadEssentialsSpawn();
} else if ("CMI".equalsIgnoreCase(pluginName)) {
pluginHookService.tryHookToCMI();
spawnLoader.loadCMISpawn();
} else if ("ProtocolLib".equalsIgnoreCase(pluginName)) { } else if ("ProtocolLib".equalsIgnoreCase(pluginName)) {
protocolLibService.setup(); protocolLibService.setup();
} }

View File

@ -22,6 +22,7 @@ public class PluginHookService {
private final PluginManager pluginManager; private final PluginManager pluginManager;
private Essentials essentials; private Essentials essentials;
private Plugin cmi;
private MultiverseCore multiverse; private MultiverseCore multiverse;
/** /**
@ -33,6 +34,7 @@ public class PluginHookService {
public PluginHookService(PluginManager pluginManager) { public PluginHookService(PluginManager pluginManager) {
this.pluginManager = pluginManager; this.pluginManager = pluginManager;
tryHookToEssentials(); tryHookToEssentials();
tryHookToCMI();
tryHookToMultiverse(); tryHookToMultiverse();
} }
@ -60,6 +62,19 @@ public class PluginHookService {
return null; 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). * Return the spawn of the given world as defined by Multiverse (if available).
* *
@ -76,10 +91,10 @@ public class PluginHookService {
return null; return null;
} }
// ------ // ------
// "Is plugin available" methods // "Is plugin available" methods
// ------ // ------
/** /**
* @return true if we have a hook to Essentials, false otherwise * @return true if we have a hook to Essentials, false otherwise
*/ */
@ -87,6 +102,13 @@ public class PluginHookService {
return essentials != null; 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 * @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. * Attempts to create a hook into Multiverse.
*/ */
@ -123,6 +156,7 @@ public class PluginHookService {
// ------ // ------
// Unhook methods // Unhook methods
// ------ // ------
/** /**
* Unhooks from Essentials. * Unhooks from Essentials.
*/ */
@ -130,6 +164,13 @@ public class PluginHookService {
essentials = null; essentials = null;
} }
/**
* Unhooks from CMI.
*/
public void unhookCMI() {
cmi = null;
}
/** /**
* Unhooks from Multiverse. * Unhooks from Multiverse.
*/ */
@ -140,6 +181,7 @@ public class PluginHookService {
// ------ // ------
// Helpers // Helpers
// ------ // ------
private static <T extends Plugin> T getPlugin(PluginManager pluginManager, String name, Class<T> clazz) private static <T extends Plugin> T getPlugin(PluginManager pluginManager, String name, Class<T> clazz)
throws Exception, NoClassDefFoundError { throws Exception, NoClassDefFoundError {
if (pluginManager.isPluginEnabled(name)) { if (pluginManager.isPluginEnabled(name)) {
@ -150,5 +192,4 @@ public class PluginHookService {
return null; return null;
} }
} }

View File

@ -35,6 +35,7 @@ public class SpawnLoader implements Reloadable {
private FileConfiguration authMeConfiguration; private FileConfiguration authMeConfiguration;
private String[] spawnPriority; private String[] spawnPriority;
private Location essentialsSpawn; private Location essentialsSpawn;
private Location cmiSpawn;
/** /**
* Constructor. * Constructor.
@ -130,6 +131,32 @@ public class SpawnLoader implements Reloadable {
essentialsSpawn = null; 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 * Return the spawn location for the given player. The source of the spawn location varies
* depending on the spawn priority setting. * depending on the spawn priority setting.
@ -162,6 +189,9 @@ public class SpawnLoader implements Reloadable {
case "essentials": case "essentials":
spawnLoc = essentialsSpawn; spawnLoc = essentialsSpawn;
break; break;
case "cmi":
spawnLoc = cmiSpawn;
break;
case "authme": case "authme":
spawnLoc = getSpawn(); spawnLoc = getSpawn();
break; break;
@ -242,6 +272,28 @@ public class SpawnLoader implements Reloadable {
return null; 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 * Return whether the file configuration contains all fields necessary to define a spawn
* under the given path. * under the given path.
@ -261,6 +313,25 @@ public class SpawnLoader implements Reloadable {
return true; 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. * 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 // This behavior is consistent with FileConfiguration#getDouble
return (value instanceof Number) ? ((Number) value).floatValue() : 0; return (value instanceof Number) ? ((Number) value).floatValue() : 0;
} }
} }

View File

@ -140,9 +140,9 @@ public final class RestrictionSettings implements SettingsHolder {
public static final Property<Boolean> DISPLAY_OTHER_ACCOUNTS = public static final Property<Boolean> DISPLAY_OTHER_ACCOUNTS =
newProperty("settings.restrictions.displayOtherAccounts", true); 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 = 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") @Comment("Maximum Login authorized by IP")
public static final Property<Integer> MAX_LOGIN_PER_IP = public static final Property<Integer> MAX_LOGIN_PER_IP =

View File

@ -31,6 +31,7 @@ public class ServerListenerTest {
private static final String ESSENTIALS = "Essentials"; private static final String ESSENTIALS = "Essentials";
private static final String ESSENTIALS_SPAWN = "EssentialsSpawn"; private static final String ESSENTIALS_SPAWN = "EssentialsSpawn";
private static final String CMI = "CMI";
private static final String MULTIVERSE = "Multiverse-Core"; private static final String MULTIVERSE = "Multiverse-Core";
private static final String PROTOCOL_LIB = "ProtocolLib"; private static final String PROTOCOL_LIB = "ProtocolLib";
@ -58,6 +59,10 @@ public class ServerListenerTest {
public void shouldForwardPluginNameOnEnable() { public void shouldForwardPluginNameOnEnable() {
checkEnableHandling(ESSENTIALS, () -> verify(pluginHookService).tryHookToEssentials()); checkEnableHandling(ESSENTIALS, () -> verify(pluginHookService).tryHookToEssentials());
checkEnableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).loadEssentialsSpawn()); checkEnableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).loadEssentialsSpawn());
checkEnableHandling(CMI, () -> {
verify(pluginHookService).tryHookToCMI();
verify(spawnLoader).loadCMISpawn();
});
checkEnableHandling(MULTIVERSE, () -> verify(pluginHookService).tryHookToMultiverse()); checkEnableHandling(MULTIVERSE, () -> verify(pluginHookService).tryHookToMultiverse());
checkEnableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).setup()); checkEnableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).setup());
checkEnableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader)); checkEnableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader));
@ -67,6 +72,10 @@ public class ServerListenerTest {
public void shouldForwardPluginNameOnDisable() { public void shouldForwardPluginNameOnDisable() {
checkDisableHandling(ESSENTIALS, () -> verify(pluginHookService).unhookEssentials()); checkDisableHandling(ESSENTIALS, () -> verify(pluginHookService).unhookEssentials());
checkDisableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).unloadEssentialsSpawn()); checkDisableHandling(ESSENTIALS_SPAWN, () -> verify(spawnLoader).unloadEssentialsSpawn());
checkDisableHandling(CMI, () -> {
verify(pluginHookService).unhookCMI();
verify(spawnLoader).unloadCMISpawn();
});
checkDisableHandling(MULTIVERSE, () -> verify(pluginHookService).unhookMultiverse()); checkDisableHandling(MULTIVERSE, () -> verify(pluginHookService).unhookMultiverse());
checkDisableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).disable()); checkDisableHandling(PROTOCOL_LIB, () -> verify(protocolLibService).disable());
checkDisableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader)); checkDisableHandling("UnknownPlugin", () -> verifyZeroInteractions(pluginHookService, spawnLoader));