mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-22 18:55:17 +01:00
Fixed code according to comments on last commit.
Reworked locales so they use a nice and pretty folder structure. Added the ability to define adapters to serialize certain data structures. Added the PotionType list adapter. Saving and loading of configs basically works. Known issues: 1. The config.yml is saved and loaded to/from the database folder 2. More error handling is required for the config loading. e.g., a list value with only one value in it is not read as a list. This could get tricky. 3. Comments are not saved (yet)
This commit is contained in:
parent
92af75e602
commit
2765e5f3ab
@ -48,11 +48,10 @@ public class BSkyBlock extends JavaPlugin {
|
||||
@Override
|
||||
public void onEnable(){
|
||||
plugin = this;
|
||||
|
||||
// Load config - EXPERIMENTAL
|
||||
settings = new Settings();
|
||||
// Load config - EXPERIMENTAL
|
||||
try {
|
||||
//config.saveConfig(); // works, but will wipe out comments
|
||||
//settings.saveConfig(); -- doesn't work completely yet
|
||||
settings = settings.loadSettings();
|
||||
getLogger().info("DEBUG: island distance = " + settings.getIslandDistance());
|
||||
} catch (Exception e) {
|
||||
@ -188,7 +187,7 @@ public class BSkyBlock extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return BSBDatabase.getDatabase(plugin).toString();
|
||||
return BSBDatabase.getDatabase().toString();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,14 +1,15 @@
|
||||
package us.tastybento.bskyblock;
|
||||
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
|
||||
|
||||
/**
|
||||
* All the plugin settings are here
|
||||
* @author Tastybento
|
||||
*/
|
||||
public class Constants {
|
||||
// ----------------- Constants -----------------
|
||||
|
||||
// Game Type BSKYBLOCK or ACIDISLAND
|
||||
public enum GameType {
|
||||
BSKYBLOCK, ACIDISLAND, BOTH
|
||||
}
|
||||
/*
|
||||
public final static GameType GAMETYPE = GameType.ACIDISLAND;
|
||||
// The spawn command (Essentials spawn for example)
|
||||
|
@ -9,12 +9,12 @@ import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
import us.tastybento.bskyblock.Constants.GameType;
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry;
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
|
||||
import us.tastybento.bskyblock.api.configuration.ISettings;
|
||||
import us.tastybento.bskyblock.api.configuration.PotionEffectListAdpater;
|
||||
import us.tastybento.bskyblock.api.configuration.StoreAt;
|
||||
import us.tastybento.bskyblock.api.flags.Flag;
|
||||
import us.tastybento.bskyblock.config.StoreAt;
|
||||
import us.tastybento.bskyblock.database.BSBDatabase.DatabaseType;
|
||||
|
||||
/**
|
||||
@ -148,7 +148,7 @@ public class Settings implements ISettings<Settings> {
|
||||
// Remove mobs
|
||||
private boolean removeMobsOnLogin;
|
||||
private boolean removeMobsOnIsland;
|
||||
private List<String> removeMobsWhitelist;
|
||||
private List<String> removeMobsWhitelist = new ArrayList<>();
|
||||
|
||||
private boolean makeIslandIfNone;
|
||||
private boolean immediateTeleportOnIsland;
|
||||
@ -213,16 +213,16 @@ public class Settings implements ISettings<Settings> {
|
||||
private List<PotionEffectType> acidEffects = new ArrayList<>(Arrays.asList(PotionEffectType.CONFUSION, PotionEffectType.SLOW));
|
||||
|
||||
/* SCHEMATICS */
|
||||
private List<String> companionNames;
|
||||
private ItemStack[] chestItems;
|
||||
private EntityType companionType;
|
||||
private List<String> companionNames = new ArrayList<>();
|
||||
private ItemStack[] chestItems = {};
|
||||
private EntityType companionType = EntityType.COW;
|
||||
|
||||
private boolean useOwnGenerator;
|
||||
|
||||
private HashMap<String,Integer> limitedBlocks;
|
||||
private boolean teamJoinDeathReset;
|
||||
|
||||
private String uniqueId;
|
||||
private String uniqueId = "";
|
||||
|
||||
/**
|
||||
* @return the uniqueId
|
||||
@ -1112,5 +1112,11 @@ public class Settings implements ISettings<Settings> {
|
||||
public void setTeamJoinDeathReset(boolean teamJoinDeathReset) {
|
||||
this.teamJoinDeathReset = teamJoinDeathReset;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Settings getInstance() {
|
||||
// TODO Auto-generated method stub
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@ -1,14 +1,13 @@
|
||||
package us.tastybento.bskyblock.api.addons;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
@ -25,6 +24,7 @@ import us.tastybento.bskyblock.BSkyBlock;
|
||||
public abstract class Addon implements AddonInterface {
|
||||
|
||||
private static final String ADDON_CONFIG_FILENAME = "config.yml";
|
||||
private static final boolean DEBUG = false;
|
||||
private boolean enabled;
|
||||
private AddonDescription description;
|
||||
private FileConfiguration config;
|
||||
@ -146,53 +146,44 @@ public abstract class Addon implements AddonInterface {
|
||||
|
||||
/**
|
||||
* Saves a resource contained in this add-on's jar file to the destination folder.
|
||||
* @param resourcePath in jar file
|
||||
* @param jarResource in jar file
|
||||
* @param destinationFolder on file system
|
||||
* @param replace - if true, will overwrite previous file
|
||||
* @param prefix - if true, filename will be prefixed with the name of this addon
|
||||
* @param noPath - if true, the resource's path will be ignored when saving
|
||||
*/
|
||||
public void saveResource(String resourcePath, File destinationFolder, boolean replace, boolean prefix) {
|
||||
if (resourcePath == null || resourcePath.equals("")) {
|
||||
public void saveResource(String jarResource, File destinationFolder, boolean replace, boolean noPath) {
|
||||
if (jarResource == null || jarResource.equals("")) {
|
||||
throw new IllegalArgumentException("ResourcePath cannot be null or empty");
|
||||
}
|
||||
|
||||
resourcePath = resourcePath.replace('\\', '/');
|
||||
jarResource = jarResource.replace('\\', '/');
|
||||
InputStream in = null;
|
||||
try {
|
||||
JarFile jar = new JarFile(file);
|
||||
JarEntry config = jar.getJarEntry(resourcePath);
|
||||
JarEntry config = jar.getJarEntry(jarResource);
|
||||
if (config != null) {
|
||||
in = jar.getInputStream(config);
|
||||
}
|
||||
if (in == null) {
|
||||
jar.close();
|
||||
throw new IllegalArgumentException("The embedded resource '" + resourcePath + "' cannot be found in " + jar.getName());
|
||||
throw new IllegalArgumentException("The embedded resource '" + jarResource + "' cannot be found in " + jar.getName());
|
||||
}
|
||||
File outFile = new File(destinationFolder, resourcePath);
|
||||
//Bukkit.getLogger().info("DEBUG: outFile = " + outFile.getAbsolutePath());
|
||||
//Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName());
|
||||
if (prefix) {
|
||||
// Rename with addon prefix
|
||||
outFile = new File(outFile.getParent(), getDescription().getName() + "-" + outFile.getName());
|
||||
|
||||
// There are two options, use the path of the resource or not
|
||||
File outFile = new File(destinationFolder, jarResource);
|
||||
if (noPath) {
|
||||
outFile = new File(destinationFolder, outFile.getName());
|
||||
}
|
||||
int lastIndex = resourcePath.lastIndexOf('/');
|
||||
File outDir = new File(destinationFolder, resourcePath.substring(0, lastIndex >= 0 ? lastIndex : 0));
|
||||
//Bukkit.getLogger().info("DEBUG: outDir = " + outDir.getAbsolutePath());
|
||||
if (!outDir.exists()) {
|
||||
outDir.mkdirs();
|
||||
// Make any dirs that need to be made
|
||||
outFile.getParentFile().mkdirs();
|
||||
if (DEBUG) {
|
||||
Bukkit.getLogger().info("DEBUG: outFile = " + outFile.getAbsolutePath());
|
||||
Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName());
|
||||
}
|
||||
|
||||
|
||||
if (!outFile.exists() || replace) {
|
||||
OutputStream out = new FileOutputStream(outFile);
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
while ((len = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, len);
|
||||
}
|
||||
out.close();
|
||||
in.close();
|
||||
java.nio.file.Files.copy(in, outFile.toPath());
|
||||
}
|
||||
in.close();
|
||||
jar.close();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
|
@ -352,10 +352,6 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi
|
||||
this.onlyPlayer = onlyPlayer;
|
||||
}
|
||||
|
||||
public void setparameters(String parameters) {
|
||||
this.setParameters(parameters);
|
||||
}
|
||||
|
||||
public void setParameters(String parameters) {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
@ -0,0 +1,13 @@
|
||||
package us.tastybento.bskyblock.api.configuration;
|
||||
|
||||
|
||||
public interface Adapter<S,V> {
|
||||
|
||||
/**
|
||||
* Convert from to something
|
||||
* @param from
|
||||
*/
|
||||
S convertFrom(Object from);
|
||||
|
||||
V convertTo(Object to);
|
||||
}
|
@ -5,6 +5,8 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import us.tastybento.bskyblock.Constants.GameType;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
@ -20,12 +22,6 @@ public @interface ConfigEntry {
|
||||
boolean experimental() default false;
|
||||
boolean needsReset() default false;
|
||||
GameType specificTo() default GameType.BOTH;
|
||||
Class<?> adapter() default NoAdapter.class;
|
||||
Class<?> adapter() default Adapter.class;
|
||||
|
||||
public class NoAdapter {}
|
||||
|
||||
// Game Type BSKYBLOCK or ACIDISLAND
|
||||
public enum GameType {
|
||||
BSKYBLOCK, ACIDISLAND, BOTH
|
||||
}
|
||||
}
|
@ -4,8 +4,9 @@ import java.beans.IntrospectionException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import us.tastybento.bskyblock.BSkyBlock;
|
||||
import us.tastybento.bskyblock.Settings;
|
||||
import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase;
|
||||
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
||||
|
||||
@ -16,21 +17,25 @@ import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
||||
* @param <T>
|
||||
*/
|
||||
public interface ISettings<T> {
|
||||
|
||||
|
||||
// ----------------Saver-------------------
|
||||
@SuppressWarnings("unchecked")
|
||||
default void saveConfig(T instance) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException {
|
||||
default void saveConfig() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, InstantiationException, NoSuchMethodException, IntrospectionException, SQLException {
|
||||
// Get the handler
|
||||
AbstractDatabaseHandler<T> configHandler = (AbstractDatabaseHandler<T>) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), instance.getClass());
|
||||
AbstractDatabaseHandler<T> configHandler = (AbstractDatabaseHandler<T>) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), getInstance().getClass());
|
||||
// Load every field in the config class
|
||||
configHandler.saveObject(instance); // The string parameter can be anything
|
||||
Bukkit.getLogger().info("DEBUG: configHandler = " + configHandler);
|
||||
Bukkit.getLogger().info("DEBUG: instance = " + getInstance());
|
||||
configHandler.saveObject(getInstance()); // The string parameter can be anything
|
||||
}
|
||||
// --------------- Loader ------------------
|
||||
@SuppressWarnings("unchecked")
|
||||
default Settings loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException {
|
||||
default T loadSettings() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, IntrospectionException, SQLException {
|
||||
// Get the handler
|
||||
AbstractDatabaseHandler<Settings> configHandler = (AbstractDatabaseHandler<Settings>) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), Settings.class);
|
||||
AbstractDatabaseHandler<T> configHandler = (AbstractDatabaseHandler<T>) new FlatFileDatabase().getHandler(BSkyBlock.getInstance(), getInstance().getClass());
|
||||
// Load every field in the config class
|
||||
return configHandler.loadObject("config");
|
||||
}
|
||||
|
||||
T getInstance();
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
package us.tastybento.bskyblock.api.configuration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
|
||||
public class PotionEffectListAdpater implements Adapter<List<PotionEffectType>, List<String>> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public List<PotionEffectType> convertFrom(Object from) {
|
||||
List<PotionEffectType> result = new ArrayList<>();
|
||||
if (from instanceof ArrayList) {
|
||||
for (String type: (ArrayList<String>)from) {
|
||||
result.add(PotionEffectType.getByName(type));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public List<String> convertTo(Object to) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if (to instanceof ArrayList) {
|
||||
for (PotionEffectType type: (ArrayList<PotionEffectType>)to) {
|
||||
result.add(type.getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package us.tastybento.bskyblock.config;
|
||||
package us.tastybento.bskyblock.api.configuration;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
@ -1,76 +0,0 @@
|
||||
package us.tastybento.bskyblock.config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import us.tastybento.bskyblock.BSkyBlock;
|
||||
|
||||
/**
|
||||
* This class runs when the config file is not set up enough, or is unsafe.
|
||||
* It provides useful information to the admin on what is wrong.
|
||||
*
|
||||
* @author Tastybento
|
||||
* @author Poslovitch
|
||||
*/
|
||||
public class NotSetup implements CommandExecutor{
|
||||
|
||||
public enum ConfigError {
|
||||
DIFFERENT_WORLDNAME(0, 001),
|
||||
DIFFERENT_ISLAND_DISTANCE(0, 002),
|
||||
PROTECTION_RANGE_HIGHER_THAN_ISLAND_DISTANCE(1, 101),
|
||||
UNKNOWN_LANGUAGE(2, 201),
|
||||
NOT_CHUNK_ISLAND_DISTANCE(2, 202),
|
||||
NOT_EVEN_PROTECTION_RANGE(2, 203),
|
||||
PURGE_ISLAND_LEVEL_TOO_LOW(3, 301),
|
||||
ISLAND_DISTANCE_TOO_LOW(3, 302),
|
||||
PROTECTION_RANGE_TOO_LOW(3, 303),
|
||||
ISLAND_HEIGHT_TOO_LOW(3, 304),
|
||||
NETHER_SPAWN_RADIUS_TOO_LOW(3, 305),
|
||||
NETHER_SPAWN_RADIUS_TOO_HIGH(3, 306);
|
||||
|
||||
/*
|
||||
* Priority:
|
||||
* 0 - CRITICAL
|
||||
* 1 - HIGH
|
||||
* 2 - MEDIUM
|
||||
* 3 - LOW
|
||||
*/
|
||||
private int priority;
|
||||
private int id;
|
||||
|
||||
ConfigError(int priority, int id){
|
||||
this.priority = priority;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public static ConfigError getById(int id){
|
||||
for(ConfigError e : ConfigError.values()){
|
||||
if(e.id == id) return e;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private BSkyBlock plugin;
|
||||
private List<Error> errors;
|
||||
|
||||
/**
|
||||
* Handles plugin operation if a critical config-related issue happened
|
||||
*
|
||||
* @param plugin
|
||||
* @param errors
|
||||
*/
|
||||
public NotSetup(BSkyBlock plugin, List<Error> errors){
|
||||
this.plugin = plugin;
|
||||
this.errors = errors;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -12,9 +12,9 @@ public abstract class BSBDatabase {
|
||||
* FLATFILE and MYSQL. Default is FLATFILE
|
||||
* @return Database type
|
||||
*/
|
||||
public static BSBDatabase getDatabase(BSkyBlock plugin){
|
||||
public static BSBDatabase getDatabase(){
|
||||
for(DatabaseType type : DatabaseType.values()){
|
||||
if(type == plugin.getSettings().getDatabaseType()) return type.database;
|
||||
if(type == BSkyBlock.getInstance().getSettings().getDatabaseType()) return type.database;
|
||||
}
|
||||
return DatabaseType.FLATFILE.database;
|
||||
}
|
||||
|
@ -25,9 +25,10 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import us.tastybento.bskyblock.Constants;
|
||||
import us.tastybento.bskyblock.Constants.GameType;
|
||||
import us.tastybento.bskyblock.api.configuration.Adapter;
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry;
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
|
||||
import us.tastybento.bskyblock.config.StoreAt;
|
||||
import us.tastybento.bskyblock.api.configuration.StoreAt;
|
||||
import us.tastybento.bskyblock.database.DatabaseConnecter;
|
||||
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
|
||||
import us.tastybento.bskyblock.util.Util;
|
||||
@ -172,13 +173,35 @@ public class FlatFileDatabaseHandler<T> extends AbstractDatabaseHandler<T> {
|
||||
storageLocation = configEntry.path();
|
||||
}
|
||||
if (!configEntry.specificTo().equals(GameType.BOTH) && !configEntry.specificTo().equals(Constants.GAMETYPE)) {
|
||||
Bukkit.getLogger().info(field.getName() + " not applicable to this game type");
|
||||
if (DEBUG)
|
||||
Bukkit.getLogger().info(field.getName() + " not applicable to this game type");
|
||||
continue;
|
||||
}
|
||||
// TODO: Add handling of other ConfigEntry elements
|
||||
if (!configEntry.adapter().equals(Adapter.class)) {
|
||||
// A conversion adapter has been defined
|
||||
Object value = config.get(storageLocation);
|
||||
method.invoke(instance, ((Adapter<?,?>)configEntry.adapter().newInstance()).convertFrom(value));
|
||||
if (DEBUG) {
|
||||
plugin.getLogger().info("DEBUG: value = " + value);
|
||||
plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType());
|
||||
plugin.getLogger().info("DEBUG: " + value.getClass());
|
||||
}
|
||||
if (value != null && !value.getClass().equals(MemorySection.class)) {
|
||||
method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType()));
|
||||
}
|
||||
// We are done here
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Look in the YAML Config to see if this field exists (it should)
|
||||
if (config.contains(storageLocation)) {
|
||||
if (config.contains(storageLocation)) {
|
||||
// Check for null values
|
||||
if (config.get(storageLocation) == null) {
|
||||
method.invoke(instance, (Object)null);
|
||||
continue;
|
||||
}
|
||||
// Handle storage of maps. Check if this type is a Map
|
||||
if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) {
|
||||
// Note that we have no idea what type this is
|
||||
@ -291,13 +314,6 @@ public class FlatFileDatabaseHandler<T> extends AbstractDatabaseHandler<T> {
|
||||
// Run through all the fields in the class that is being stored. EVERY field must have a get and set method
|
||||
for (Field field : dataObject.getDeclaredFields()) {
|
||||
|
||||
String storageLocation = field.getName();
|
||||
// Check if there is an annotation on the field
|
||||
ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class);
|
||||
// If there is a config path annotation then do something
|
||||
if (configEntry != null && !configEntry.path().isEmpty()) {
|
||||
storageLocation = configEntry.path();
|
||||
}
|
||||
// Get the property descriptor for this field
|
||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject);
|
||||
// Get the read method, i.e., getXXXX();
|
||||
@ -305,14 +321,34 @@ public class FlatFileDatabaseHandler<T> extends AbstractDatabaseHandler<T> {
|
||||
// Invoke the read method to get the value. We have no idea what type of value it is.
|
||||
Object value = method.invoke(instance);
|
||||
|
||||
String storageLocation = field.getName();
|
||||
// Check if there is an annotation on the field
|
||||
ConfigEntry configEntry = field.getAnnotation(ConfigEntry.class);
|
||||
// If there is a config path annotation then do something
|
||||
if (configEntry != null) {
|
||||
if (!configEntry.path().isEmpty()) {
|
||||
storageLocation = configEntry.path();
|
||||
}
|
||||
// TODO: add in game-specific saving
|
||||
if (!configEntry.adapter().equals(Adapter.class)) {
|
||||
// A conversion adapter has been defined
|
||||
try {
|
||||
config.set(storageLocation, ((Adapter<?,?>)configEntry.adapter().newInstance()).convertTo(value));
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// We are done here
|
||||
continue;
|
||||
}
|
||||
}
|
||||
//plugin.getLogger().info("DEBUG: property desc = " + propertyDescriptor.getPropertyType().getTypeName());
|
||||
// Depending on the vale type, it'll need serializing differenty
|
||||
// Check if this field is the mandatory UniqueId field. This is used to identify this instantiation of the class
|
||||
if (method.getName().equals("getUniqueId")) {
|
||||
// If the object does not have a unique name assigned to it already, one is created at random
|
||||
// If the object does not have a unique name assigned to it already, one is created at random
|
||||
//plugin.getLogger().info("DEBUG: uniqueId = " + value);
|
||||
String id = (String)value;
|
||||
if (id.isEmpty()) {
|
||||
if (value == null || id.isEmpty()) {
|
||||
id = databaseConnecter.getUniqueId(dataObject.getSimpleName());
|
||||
// Set it in the class so that it will be used next time
|
||||
propertyDescriptor.getWriteMethod().invoke(instance, id);
|
||||
|
@ -40,7 +40,7 @@ public class PlayersManager{
|
||||
@SuppressWarnings("unchecked")
|
||||
public PlayersManager(BSkyBlock plugin){
|
||||
this.plugin = plugin;
|
||||
database = BSBDatabase.getDatabase(plugin);
|
||||
database = BSBDatabase.getDatabase();
|
||||
// Set up the database handler to store and retrieve Players classes
|
||||
handler = (AbstractDatabaseHandler<Players>) database.getHandler(plugin, Players.class);
|
||||
playerCache = new HashMap<>();
|
||||
|
@ -135,7 +135,7 @@ public class IslandCache {
|
||||
public Island createIsland(Location location, UUID owner){
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location);
|
||||
Island island = new Island(plugin, location, owner, plugin.getSettings().getIslandProtectionRange());
|
||||
Island island = new Island(location, owner, plugin.getSettings().getIslandProtectionRange());
|
||||
islandsByLocation.put(location, island);
|
||||
if (owner != null)
|
||||
islandsByUUID.put(owner, island);
|
||||
|
@ -140,7 +140,7 @@ public class IslandsManager {
|
||||
@SuppressWarnings("unchecked")
|
||||
public IslandsManager(BSkyBlock plugin){
|
||||
this.plugin = plugin;
|
||||
database = BSBDatabase.getDatabase(plugin);
|
||||
database = BSBDatabase.getDatabase();
|
||||
// Set up the database handler to store and retrieve Island classes
|
||||
handler = (AbstractDatabaseHandler<Island>) database.getHandler(plugin, Island.class);
|
||||
islandCache = new IslandCache();
|
||||
@ -247,7 +247,7 @@ public class IslandsManager {
|
||||
public Island createIsland(Location location, UUID owner){
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location);
|
||||
return islandCache.createIsland(new Island(plugin, location, owner, plugin.getSettings().getIslandProtectionRange()));
|
||||
return islandCache.createIsland(new Island(location, owner, plugin.getSettings().getIslandProtectionRange()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -26,9 +26,9 @@ public class NewIsland {
|
||||
private final Player player;
|
||||
private final Reason reason;
|
||||
|
||||
private NewIsland(BSkyBlock plugin, Island oldIsland, Player player, Reason reason) {
|
||||
private NewIsland(Island oldIsland, Player player, Reason reason) {
|
||||
super();
|
||||
this.plugin = plugin;
|
||||
this.plugin = BSkyBlock.getInstance();
|
||||
this.player = player;
|
||||
this.reason = reason;
|
||||
newIsland();
|
||||
@ -51,7 +51,7 @@ public class NewIsland {
|
||||
* @return New island builder object
|
||||
*/
|
||||
public static Builder builder(BSkyBlock plugin) {
|
||||
return new Builder(plugin);
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -63,12 +63,6 @@ public class NewIsland {
|
||||
private Island oldIsland;
|
||||
private Player player;
|
||||
private Reason reason;
|
||||
private BSkyBlock plugin;
|
||||
|
||||
public Builder(BSkyBlock plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
|
||||
public Builder oldIsland(Island oldIsland) {
|
||||
this.oldIsland = oldIsland;
|
||||
@ -88,7 +82,7 @@ public class NewIsland {
|
||||
|
||||
public Island build() throws IOException {
|
||||
if (player != null) {
|
||||
NewIsland newIsland = new NewIsland(plugin, oldIsland, player, reason);
|
||||
NewIsland newIsland = new NewIsland(oldIsland, player, reason);
|
||||
return newIsland.getIsland();
|
||||
}
|
||||
throw new IOException("Insufficient parameters. Must have a schematic and a player");
|
||||
|
@ -16,11 +16,11 @@ public interface DataObject {
|
||||
/**
|
||||
* @return the uniqueId
|
||||
*/
|
||||
abstract String getUniqueId();
|
||||
String getUniqueId();
|
||||
|
||||
/**
|
||||
* @param uniqueId the uniqueId to set
|
||||
*/
|
||||
abstract void setUniqueId(String uniqueId);
|
||||
void setUniqueId(String uniqueId);
|
||||
|
||||
}
|
||||
|
@ -103,14 +103,14 @@ public class Island implements DataObject {
|
||||
|
||||
public Island() {}
|
||||
|
||||
public Island(BSkyBlock plugin, Location location, UUID owner, int protectionRange) {
|
||||
public Island(Location location, UUID owner, int protectionRange) {
|
||||
this.members.add(owner);
|
||||
this.owner = owner;
|
||||
this.createdDate = System.currentTimeMillis();
|
||||
this.updatedDate = System.currentTimeMillis();
|
||||
this.world = location.getWorld();
|
||||
this.center = location;
|
||||
this.range = plugin.getSettings().getIslandProtectionRange();
|
||||
this.range = BSkyBlock.getInstance().getSettings().getIslandProtectionRange();
|
||||
this.minX = center.getBlockX() - range;
|
||||
this.minZ = center.getBlockZ() - range;
|
||||
this.protectionRange = protectionRange;
|
||||
|
@ -18,8 +18,8 @@ import org.bukkit.material.Chest;
|
||||
|
||||
import us.tastybento.bskyblock.BSkyBlock;
|
||||
import us.tastybento.bskyblock.Constants;
|
||||
import us.tastybento.bskyblock.Constants.GameType;
|
||||
import us.tastybento.bskyblock.api.commands.User;
|
||||
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
|
||||
import us.tastybento.bskyblock.database.objects.Island;
|
||||
|
||||
/**
|
||||
|
@ -31,6 +31,7 @@ import us.tastybento.bskyblock.api.events.addon.AddonEvent;
|
||||
public final class AddonsManager {
|
||||
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String LOCALE_FOLDER = "locales";
|
||||
private List<Addon> addons;
|
||||
private List<AddonClassLoader> loader;
|
||||
private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
|
||||
@ -132,10 +133,11 @@ public final class AddonsManager {
|
||||
addon.setDataFolder(new File(f.getParent(), addon.getDescription().getName()));
|
||||
addon.setAddonFile(f);
|
||||
|
||||
File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + addon.getDescription().getName());
|
||||
// Obtain any locale files and save them
|
||||
for (String localeFile : listJarYamlFiles(jar, "locales")) {
|
||||
//plugin.getLogger().info("DEBUG: saving " + localeFile + " from jar");
|
||||
addon.saveResource(localeFile, plugin.getDataFolder(), false, true);
|
||||
addon.saveResource(localeFile, localeDir, false, true);
|
||||
}
|
||||
plugin.getLocalesManager().loadLocales(addon.getDescription().getName());
|
||||
|
||||
|
@ -2,6 +2,7 @@ package us.tastybento.bskyblock.managers;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
@ -22,7 +23,7 @@ public final class LocalesManager {
|
||||
|
||||
public LocalesManager(BSkyBlock plugin) {
|
||||
this.plugin = plugin;
|
||||
this.loadLocales(""); // Default
|
||||
this.loadLocales("BSkyBlock"); // Default
|
||||
}
|
||||
|
||||
/**
|
||||
@ -49,45 +50,44 @@ public final class LocalesManager {
|
||||
*/
|
||||
public void loadLocales(String parent) {
|
||||
if (DEBUG) {
|
||||
if (parent.isEmpty())
|
||||
plugin.getLogger().info("DEBUG: loading locale for BSkyBlock");
|
||||
else
|
||||
plugin.getLogger().info("DEBUG: loading locale for " + parent);
|
||||
plugin.getLogger().info("DEBUG: loading locale for " + parent);
|
||||
}
|
||||
// Describe the filter - we only want files that are correctly named
|
||||
FilenameFilter ymlFilter = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
// Do BSkyBlock files
|
||||
if (parent.isEmpty()) {
|
||||
if (name.toLowerCase().endsWith(".yml") && name.length() == 9) {
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: bsb locale filename = " + name);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
// Addon locales
|
||||
if (name.startsWith(parent) && name.toLowerCase().endsWith(".yml")) {
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: addon locale filename = " + name);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// Files must be 9 chars long
|
||||
if (name.toLowerCase().endsWith(".yml") && name.length() == 9) {
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: bsb locale filename = " + name);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// Run through the files and store the locales
|
||||
File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER);
|
||||
File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + parent);
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: localeDir = " + localeDir.getAbsolutePath());
|
||||
// If the folder does not exist, then make it and fill with the locale files from the jar
|
||||
// If it does exist, then new files will NOT be written!
|
||||
if (!localeDir.exists()) {
|
||||
localeDir.mkdir();
|
||||
localeDir.mkdirs();
|
||||
FileLister lister = new FileLister(plugin);
|
||||
try {
|
||||
for (String name : lister.listJar(LOCALE_FOLDER)) {
|
||||
plugin.saveResource(name,true);
|
||||
// We cannot use Bukkit's saveResource, because we want it to go into a specific folder, so...
|
||||
InputStream initialStream = plugin.getResource(name);
|
||||
// Get the last part of the name
|
||||
int lastIndex = name.lastIndexOf('/');
|
||||
File targetFile = new File(localeDir, name.substring(lastIndex >= 0 ? lastIndex : 0, name.length()));
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: targetFile = " + targetFile.getAbsolutePath());
|
||||
if (!targetFile.exists()) {
|
||||
java.nio.file.Files.copy(initialStream, targetFile.toPath());
|
||||
}
|
||||
initialStream.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
@ -97,8 +97,8 @@ public final class LocalesManager {
|
||||
// Store all the locales available
|
||||
for (File language : localeDir.listFiles(ymlFilter)) {
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: parent = " + parent + " language = " + language.getName().substring(parent.isEmpty() ? 0 : parent.length() + 1, language.getName().length() - 4));
|
||||
Locale localeObject = Locale.forLanguageTag(language.getName().substring(parent.isEmpty() ? 0 : parent.length() + 1, language.getName().length() - 4));
|
||||
plugin.getLogger().info("DEBUG: parent = " + parent + " language = " + language.getName().substring(0, language.getName().length() - 4));
|
||||
Locale localeObject = Locale.forLanguageTag(language.getName().substring(0, language.getName().length() - 4));
|
||||
if (DEBUG)
|
||||
plugin.getLogger().info("DEBUG: locale country found = " + localeObject.getCountry());
|
||||
if (languages.containsKey(localeObject)) {
|
||||
|
@ -37,6 +37,7 @@ import us.tastybento.bskyblock.api.commands.User;
|
||||
public class Util {
|
||||
|
||||
private static String serverVersion = null;
|
||||
private static BSkyBlock plugin = BSkyBlock.getInstance();
|
||||
|
||||
/**
|
||||
* Returns the server version
|
||||
@ -44,7 +45,7 @@ public class Util {
|
||||
*/
|
||||
public static String getServerVersion() {
|
||||
if (serverVersion == null) {
|
||||
String serverPackageName = getPlugin().getServer().getClass().getPackage().getName();
|
||||
String serverPackageName = plugin.getServer().getClass().getPackage().getName();
|
||||
serverVersion = serverPackageName.substring(serverPackageName.lastIndexOf('.') + 1);
|
||||
}
|
||||
return serverVersion;
|
||||
@ -132,8 +133,8 @@ public class Util {
|
||||
@SuppressWarnings("deprecation")
|
||||
public static List<ItemStack> getPlayerInHandItems(Player player) {
|
||||
List<ItemStack> result = new ArrayList<ItemStack>(2);
|
||||
if (getPlugin().getServer().getVersion().contains("(MC: 1.7")
|
||||
|| getPlugin().getServer().getVersion().contains("(MC: 1.8")) {
|
||||
if (plugin.getServer().getVersion().contains("(MC: 1.7")
|
||||
|| plugin.getServer().getVersion().contains("(MC: 1.8")) {
|
||||
if (player.getItemInHand() != null)
|
||||
result.add(player.getItemInHand());
|
||||
return result;
|
||||
@ -182,8 +183,8 @@ public class Util {
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public static boolean playerIsHolding(Player player, Material type) {
|
||||
if (getPlugin().getServer().getVersion().contains("(MC: 1.7")
|
||||
|| getPlugin().getServer().getVersion().contains("(MC: 1.8")) {
|
||||
if (plugin.getServer().getVersion().contains("(MC: 1.7")
|
||||
|| plugin.getServer().getVersion().contains("(MC: 1.8")) {
|
||||
if (player.getItemInHand() != null && player.getItemInHand().getType().equals(type)) {
|
||||
return true;
|
||||
}
|
||||
@ -206,13 +207,13 @@ public class Util {
|
||||
*/
|
||||
public static boolean inWorld(Location loc) {
|
||||
if (loc != null) {
|
||||
if (loc.getWorld().equals(getPlugin().getIslandWorldManager().getIslandWorld())) {
|
||||
if (loc.getWorld().equals(plugin.getIslandWorldManager().getIslandWorld())) {
|
||||
return true;
|
||||
}
|
||||
if (getPlugin().getSettings().isNetherIslands() && loc.getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) {
|
||||
if (plugin.getSettings().isNetherIslands() && loc.getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) {
|
||||
return true;
|
||||
}
|
||||
if (getPlugin().getSettings().isEndIslands() && loc.getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) {
|
||||
if (plugin.getSettings().isEndIslands() && loc.getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -317,7 +318,7 @@ public class Util {
|
||||
}
|
||||
|
||||
public static void runCommand(final Player player, final String string) {
|
||||
getPlugin().getServer().getScheduler().runTask(getPlugin(), new Runnable() {
|
||||
plugin.getServer().getScheduler().runTask(plugin, new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
@ -361,7 +362,7 @@ public class Util {
|
||||
// In ASkyBlock, liquid may be unsafe
|
||||
if (ground.isLiquid() || space1.isLiquid() || space2.isLiquid()) {
|
||||
// Check if acid has no damage
|
||||
if (getPlugin().getSettings().getAcidDamage() > 0D) {
|
||||
if (plugin.getSettings().getAcidDamage() > 0D) {
|
||||
// Bukkit.getLogger().info("DEBUG: acid");
|
||||
return false;
|
||||
} else if (ground.getType().equals(Material.STATIONARY_LAVA) || ground.getType().equals(Material.LAVA)
|
||||
@ -424,7 +425,7 @@ public class Util {
|
||||
String[] spl = perms.getPermission().split(perm + ".");
|
||||
if (spl.length > 1) {
|
||||
if (!NumberUtils.isDigits(spl[1])) {
|
||||
getPlugin().getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring...");
|
||||
plugin.getLogger().severe("Player " + player.getName() + " has permission: " + perms.getPermission() + " <-- the last part MUST be a number! Ignoring...");
|
||||
|
||||
} else {
|
||||
permValue = Math.max(permValue, Integer.valueOf(spl[1]));
|
||||
@ -440,12 +441,4 @@ public class Util {
|
||||
return permValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the plugin
|
||||
*/
|
||||
public static BSkyBlock getPlugin() {
|
||||
return BSkyBlock.getInstance();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user