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:
Tastybento 2018-01-06 19:40:25 -08:00
parent 92af75e602
commit 2765e5f3ab
23 changed files with 210 additions and 220 deletions

View File

@ -48,11 +48,10 @@ public class BSkyBlock extends JavaPlugin {
@Override @Override
public void onEnable(){ public void onEnable(){
plugin = this; plugin = this;
// Load config - EXPERIMENTAL
settings = new Settings(); settings = new Settings();
// Load config - EXPERIMENTAL
try { try {
//config.saveConfig(); // works, but will wipe out comments //settings.saveConfig(); -- doesn't work completely yet
settings = settings.loadSettings(); settings = settings.loadSettings();
getLogger().info("DEBUG: island distance = " + settings.getIslandDistance()); getLogger().info("DEBUG: island distance = " + settings.getIslandDistance());
} catch (Exception e) { } catch (Exception e) {
@ -188,7 +187,7 @@ public class BSkyBlock extends JavaPlugin {
@Override @Override
public String getValue() { public String getValue() {
return BSBDatabase.getDatabase(plugin).toString(); return BSBDatabase.getDatabase().toString();
} }
}); });
} }

View File

@ -1,14 +1,15 @@
package us.tastybento.bskyblock; package us.tastybento.bskyblock;
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
/** /**
* All the plugin settings are here * All the plugin settings are here
* @author Tastybento * @author Tastybento
*/ */
public class Constants { public class Constants {
// ----------------- Constants ----------------- // ----------------- Constants -----------------
// Game Type BSKYBLOCK or ACIDISLAND
public enum GameType {
BSKYBLOCK, ACIDISLAND, BOTH
}
/* /*
public final static GameType GAMETYPE = GameType.ACIDISLAND; public final static GameType GAMETYPE = GameType.ACIDISLAND;
// The spawn command (Essentials spawn for example) // The spawn command (Essentials spawn for example)

View File

@ -9,12 +9,12 @@ import org.bukkit.entity.EntityType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType; 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;
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
import us.tastybento.bskyblock.api.configuration.ISettings; import us.tastybento.bskyblock.api.configuration.ISettings;
import us.tastybento.bskyblock.api.configuration.PotionEffectListAdpater; 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.api.flags.Flag;
import us.tastybento.bskyblock.config.StoreAt;
import us.tastybento.bskyblock.database.BSBDatabase.DatabaseType; import us.tastybento.bskyblock.database.BSBDatabase.DatabaseType;
/** /**
@ -148,7 +148,7 @@ public class Settings implements ISettings<Settings> {
// Remove mobs // Remove mobs
private boolean removeMobsOnLogin; private boolean removeMobsOnLogin;
private boolean removeMobsOnIsland; private boolean removeMobsOnIsland;
private List<String> removeMobsWhitelist; private List<String> removeMobsWhitelist = new ArrayList<>();
private boolean makeIslandIfNone; private boolean makeIslandIfNone;
private boolean immediateTeleportOnIsland; 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)); private List<PotionEffectType> acidEffects = new ArrayList<>(Arrays.asList(PotionEffectType.CONFUSION, PotionEffectType.SLOW));
/* SCHEMATICS */ /* SCHEMATICS */
private List<String> companionNames; private List<String> companionNames = new ArrayList<>();
private ItemStack[] chestItems; private ItemStack[] chestItems = {};
private EntityType companionType; private EntityType companionType = EntityType.COW;
private boolean useOwnGenerator; private boolean useOwnGenerator;
private HashMap<String,Integer> limitedBlocks; private HashMap<String,Integer> limitedBlocks;
private boolean teamJoinDeathReset; private boolean teamJoinDeathReset;
private String uniqueId; private String uniqueId = "";
/** /**
* @return the uniqueId * @return the uniqueId
@ -1112,5 +1112,11 @@ public class Settings implements ISettings<Settings> {
public void setTeamJoinDeathReset(boolean teamJoinDeathReset) { public void setTeamJoinDeathReset(boolean teamJoinDeathReset) {
this.teamJoinDeathReset = teamJoinDeathReset; this.teamJoinDeathReset = teamJoinDeathReset;
} }
@Override
public Settings getInstance() {
// TODO Auto-generated method stub
return this;
}
} }

View File

@ -1,14 +1,13 @@
package us.tastybento.bskyblock.api.addons; package us.tastybento.bskyblock.api.addons;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
@ -25,6 +24,7 @@ import us.tastybento.bskyblock.BSkyBlock;
public abstract class Addon implements AddonInterface { public abstract class Addon implements AddonInterface {
private static final String ADDON_CONFIG_FILENAME = "config.yml"; private static final String ADDON_CONFIG_FILENAME = "config.yml";
private static final boolean DEBUG = false;
private boolean enabled; private boolean enabled;
private AddonDescription description; private AddonDescription description;
private FileConfiguration config; 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. * 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 destinationFolder on file system
* @param replace - if true, will overwrite previous file * @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) { public void saveResource(String jarResource, File destinationFolder, boolean replace, boolean noPath) {
if (resourcePath == null || resourcePath.equals("")) { if (jarResource == null || jarResource.equals("")) {
throw new IllegalArgumentException("ResourcePath cannot be null or empty"); throw new IllegalArgumentException("ResourcePath cannot be null or empty");
} }
resourcePath = resourcePath.replace('\\', '/'); jarResource = jarResource.replace('\\', '/');
InputStream in = null; InputStream in = null;
try { try {
JarFile jar = new JarFile(file); JarFile jar = new JarFile(file);
JarEntry config = jar.getJarEntry(resourcePath); JarEntry config = jar.getJarEntry(jarResource);
if (config != null) { if (config != null) {
in = jar.getInputStream(config); in = jar.getInputStream(config);
} }
if (in == null) { if (in == null) {
jar.close(); 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()); // There are two options, use the path of the resource or not
//Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName()); File outFile = new File(destinationFolder, jarResource);
if (prefix) { if (noPath) {
// Rename with addon prefix outFile = new File(destinationFolder, outFile.getName());
outFile = new File(outFile.getParent(), getDescription().getName() + "-" + outFile.getName());
} }
int lastIndex = resourcePath.lastIndexOf('/'); // Make any dirs that need to be made
File outDir = new File(destinationFolder, resourcePath.substring(0, lastIndex >= 0 ? lastIndex : 0)); outFile.getParentFile().mkdirs();
//Bukkit.getLogger().info("DEBUG: outDir = " + outDir.getAbsolutePath()); if (DEBUG) {
if (!outDir.exists()) { Bukkit.getLogger().info("DEBUG: outFile = " + outFile.getAbsolutePath());
outDir.mkdirs(); Bukkit.getLogger().info("DEBUG: outFile name = " + outFile.getName());
} }
if (!outFile.exists() || replace) { if (!outFile.exists() || replace) {
OutputStream out = new FileOutputStream(outFile); java.nio.file.Files.copy(in, outFile.toPath());
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
in.close();
} }
in.close();
jar.close(); jar.close();
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();

View File

@ -352,10 +352,6 @@ public abstract class CompositeCommand extends Command implements PluginIdentifi
this.onlyPlayer = onlyPlayer; this.onlyPlayer = onlyPlayer;
} }
public void setparameters(String parameters) {
this.setParameters(parameters);
}
public void setParameters(String parameters) { public void setParameters(String parameters) {
this.parameters = parameters; this.parameters = parameters;
} }

View File

@ -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);
}

View File

@ -5,6 +5,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import us.tastybento.bskyblock.Constants.GameType;
/** /**
* *
* *
@ -20,12 +22,6 @@ public @interface ConfigEntry {
boolean experimental() default false; boolean experimental() default false;
boolean needsReset() default false; boolean needsReset() default false;
GameType specificTo() default GameType.BOTH; 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
}
} }

View File

@ -4,8 +4,9 @@ import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException; import java.sql.SQLException;
import org.bukkit.Bukkit;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.Settings;
import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase; import us.tastybento.bskyblock.database.flatfile.FlatFileDatabase;
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
@ -16,21 +17,25 @@ import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
* @param <T> * @param <T>
*/ */
public interface ISettings<T> { public interface ISettings<T> {
// ----------------Saver------------------- // ----------------Saver-------------------
@SuppressWarnings("unchecked") @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 // 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 // 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 ------------------ // --------------- Loader ------------------
@SuppressWarnings("unchecked") @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 // 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 // Load every field in the config class
return configHandler.loadObject("config"); return configHandler.loadObject("config");
} }
T getInstance();
} }

View File

@ -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;
}
}

View File

@ -1,4 +1,4 @@
package us.tastybento.bskyblock.config; package us.tastybento.bskyblock.api.configuration;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -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;
}
}

View File

@ -12,9 +12,9 @@ public abstract class BSBDatabase {
* FLATFILE and MYSQL. Default is FLATFILE * FLATFILE and MYSQL. Default is FLATFILE
* @return Database type * @return Database type
*/ */
public static BSBDatabase getDatabase(BSkyBlock plugin){ public static BSBDatabase getDatabase(){
for(DatabaseType type : DatabaseType.values()){ 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; return DatabaseType.FLATFILE.database;
} }

View File

@ -25,9 +25,10 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import us.tastybento.bskyblock.Constants; 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;
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType; import us.tastybento.bskyblock.api.configuration.StoreAt;
import us.tastybento.bskyblock.config.StoreAt;
import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.DatabaseConnecter;
import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler;
import us.tastybento.bskyblock.util.Util; import us.tastybento.bskyblock.util.Util;
@ -172,13 +173,35 @@ public class FlatFileDatabaseHandler<T> extends AbstractDatabaseHandler<T> {
storageLocation = configEntry.path(); storageLocation = configEntry.path();
} }
if (!configEntry.specificTo().equals(GameType.BOTH) && !configEntry.specificTo().equals(Constants.GAMETYPE)) { 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; continue;
} }
} }
// Look in the YAML Config to see if this field exists (it should) // 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 // Handle storage of maps. Check if this type is a Map
if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) { if (Map.class.isAssignableFrom(propertyDescriptor.getPropertyType())) {
// Note that we have no idea what type this is // 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 // 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()) { 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 // Get the property descriptor for this field
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), dataObject);
// Get the read method, i.e., getXXXX(); // 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. // Invoke the read method to get the value. We have no idea what type of value it is.
Object value = method.invoke(instance); 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()); //plugin.getLogger().info("DEBUG: property desc = " + propertyDescriptor.getPropertyType().getTypeName());
// Depending on the vale type, it'll need serializing differenty // 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 // 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 (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); //plugin.getLogger().info("DEBUG: uniqueId = " + value);
String id = (String)value; String id = (String)value;
if (id.isEmpty()) { if (value == null || id.isEmpty()) {
id = databaseConnecter.getUniqueId(dataObject.getSimpleName()); id = databaseConnecter.getUniqueId(dataObject.getSimpleName());
// Set it in the class so that it will be used next time // Set it in the class so that it will be used next time
propertyDescriptor.getWriteMethod().invoke(instance, id); propertyDescriptor.getWriteMethod().invoke(instance, id);

View File

@ -40,7 +40,7 @@ public class PlayersManager{
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public PlayersManager(BSkyBlock plugin){ public PlayersManager(BSkyBlock plugin){
this.plugin = plugin; this.plugin = plugin;
database = BSBDatabase.getDatabase(plugin); database = BSBDatabase.getDatabase();
// Set up the database handler to store and retrieve Players classes // Set up the database handler to store and retrieve Players classes
handler = (AbstractDatabaseHandler<Players>) database.getHandler(plugin, Players.class); handler = (AbstractDatabaseHandler<Players>) database.getHandler(plugin, Players.class);
playerCache = new HashMap<>(); playerCache = new HashMap<>();

View File

@ -135,7 +135,7 @@ public class IslandCache {
public Island createIsland(Location location, UUID owner){ public Island createIsland(Location location, UUID owner){
if (DEBUG) if (DEBUG)
plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location); 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); islandsByLocation.put(location, island);
if (owner != null) if (owner != null)
islandsByUUID.put(owner, island); islandsByUUID.put(owner, island);

View File

@ -140,7 +140,7 @@ public class IslandsManager {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public IslandsManager(BSkyBlock plugin){ public IslandsManager(BSkyBlock plugin){
this.plugin = plugin; this.plugin = plugin;
database = BSBDatabase.getDatabase(plugin); database = BSBDatabase.getDatabase();
// Set up the database handler to store and retrieve Island classes // Set up the database handler to store and retrieve Island classes
handler = (AbstractDatabaseHandler<Island>) database.getHandler(plugin, Island.class); handler = (AbstractDatabaseHandler<Island>) database.getHandler(plugin, Island.class);
islandCache = new IslandCache(); islandCache = new IslandCache();
@ -247,7 +247,7 @@ public class IslandsManager {
public Island createIsland(Location location, UUID owner){ public Island createIsland(Location location, UUID owner){
if (DEBUG) if (DEBUG)
plugin.getLogger().info("DEBUG: adding island for " + owner + " at " + location); 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()));
} }
/** /**

View File

@ -26,9 +26,9 @@ public class NewIsland {
private final Player player; private final Player player;
private final Reason reason; private final Reason reason;
private NewIsland(BSkyBlock plugin, Island oldIsland, Player player, Reason reason) { private NewIsland(Island oldIsland, Player player, Reason reason) {
super(); super();
this.plugin = plugin; this.plugin = BSkyBlock.getInstance();
this.player = player; this.player = player;
this.reason = reason; this.reason = reason;
newIsland(); newIsland();
@ -51,7 +51,7 @@ public class NewIsland {
* @return New island builder object * @return New island builder object
*/ */
public static Builder builder(BSkyBlock plugin) { public static Builder builder(BSkyBlock plugin) {
return new Builder(plugin); return new Builder();
} }
/** /**
@ -63,12 +63,6 @@ public class NewIsland {
private Island oldIsland; private Island oldIsland;
private Player player; private Player player;
private Reason reason; private Reason reason;
private BSkyBlock plugin;
public Builder(BSkyBlock plugin) {
this.plugin = plugin;
}
public Builder oldIsland(Island oldIsland) { public Builder oldIsland(Island oldIsland) {
this.oldIsland = oldIsland; this.oldIsland = oldIsland;
@ -88,7 +82,7 @@ public class NewIsland {
public Island build() throws IOException { public Island build() throws IOException {
if (player != null) { if (player != null) {
NewIsland newIsland = new NewIsland(plugin, oldIsland, player, reason); NewIsland newIsland = new NewIsland(oldIsland, player, reason);
return newIsland.getIsland(); return newIsland.getIsland();
} }
throw new IOException("Insufficient parameters. Must have a schematic and a player"); throw new IOException("Insufficient parameters. Must have a schematic and a player");

View File

@ -16,11 +16,11 @@ public interface DataObject {
/** /**
* @return the uniqueId * @return the uniqueId
*/ */
abstract String getUniqueId(); String getUniqueId();
/** /**
* @param uniqueId the uniqueId to set * @param uniqueId the uniqueId to set
*/ */
abstract void setUniqueId(String uniqueId); void setUniqueId(String uniqueId);
} }

View File

@ -103,14 +103,14 @@ public class Island implements DataObject {
public Island() {} 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.members.add(owner);
this.owner = owner; this.owner = owner;
this.createdDate = System.currentTimeMillis(); this.createdDate = System.currentTimeMillis();
this.updatedDate = System.currentTimeMillis(); this.updatedDate = System.currentTimeMillis();
this.world = location.getWorld(); this.world = location.getWorld();
this.center = location; this.center = location;
this.range = plugin.getSettings().getIslandProtectionRange(); this.range = BSkyBlock.getInstance().getSettings().getIslandProtectionRange();
this.minX = center.getBlockX() - range; this.minX = center.getBlockX() - range;
this.minZ = center.getBlockZ() - range; this.minZ = center.getBlockZ() - range;
this.protectionRange = protectionRange; this.protectionRange = protectionRange;

View File

@ -18,8 +18,8 @@ import org.bukkit.material.Chest;
import us.tastybento.bskyblock.BSkyBlock; import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.Constants;
import us.tastybento.bskyblock.Constants.GameType;
import us.tastybento.bskyblock.api.commands.User; import us.tastybento.bskyblock.api.commands.User;
import us.tastybento.bskyblock.api.configuration.ConfigEntry.GameType;
import us.tastybento.bskyblock.database.objects.Island; import us.tastybento.bskyblock.database.objects.Island;
/** /**

View File

@ -31,6 +31,7 @@ import us.tastybento.bskyblock.api.events.addon.AddonEvent;
public final class AddonsManager { public final class AddonsManager {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private static final String LOCALE_FOLDER = "locales";
private List<Addon> addons; private List<Addon> addons;
private List<AddonClassLoader> loader; private List<AddonClassLoader> loader;
private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>(); 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.setDataFolder(new File(f.getParent(), addon.getDescription().getName()));
addon.setAddonFile(f); addon.setAddonFile(f);
File localeDir = new File(plugin.getDataFolder(), LOCALE_FOLDER + File.separator + addon.getDescription().getName());
// Obtain any locale files and save them // Obtain any locale files and save them
for (String localeFile : listJarYamlFiles(jar, "locales")) { for (String localeFile : listJarYamlFiles(jar, "locales")) {
//plugin.getLogger().info("DEBUG: saving " + localeFile + " from jar"); //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()); plugin.getLocalesManager().loadLocales(addon.getDescription().getName());

View File

@ -2,6 +2,7 @@ package us.tastybento.bskyblock.managers;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
@ -22,7 +23,7 @@ public final class LocalesManager {
public LocalesManager(BSkyBlock plugin) { public LocalesManager(BSkyBlock plugin) {
this.plugin = plugin; this.plugin = plugin;
this.loadLocales(""); // Default this.loadLocales("BSkyBlock"); // Default
} }
/** /**
@ -49,45 +50,44 @@ public final class LocalesManager {
*/ */
public void loadLocales(String parent) { public void loadLocales(String parent) {
if (DEBUG) { if (DEBUG) {
if (parent.isEmpty()) plugin.getLogger().info("DEBUG: loading locale for " + parent);
plugin.getLogger().info("DEBUG: loading locale for BSkyBlock");
else
plugin.getLogger().info("DEBUG: loading locale for " + parent);
} }
// Describe the filter - we only want files that are correctly named // Describe the filter - we only want files that are correctly named
FilenameFilter ymlFilter = new FilenameFilter() { FilenameFilter ymlFilter = new FilenameFilter() {
@Override @Override
public boolean accept(File dir, String name) { public boolean accept(File dir, String name) {
// Do BSkyBlock files // Files must be 9 chars long
if (parent.isEmpty()) { if (name.toLowerCase().endsWith(".yml") && name.length() == 9) {
if (name.toLowerCase().endsWith(".yml") && name.length() == 9) { if (DEBUG)
if (DEBUG) plugin.getLogger().info("DEBUG: bsb locale filename = " + name);
plugin.getLogger().info("DEBUG: bsb locale filename = " + name); return true;
return true; }
} return false;
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;
}
} }
}; };
// Run through the files and store the locales // 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 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 it does exist, then new files will NOT be written!
if (!localeDir.exists()) { if (!localeDir.exists()) {
localeDir.mkdir(); localeDir.mkdirs();
FileLister lister = new FileLister(plugin); FileLister lister = new FileLister(plugin);
try { try {
for (String name : lister.listJar(LOCALE_FOLDER)) { 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) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -97,8 +97,8 @@ public final class LocalesManager {
// Store all the locales available // Store all the locales available
for (File language : localeDir.listFiles(ymlFilter)) { for (File language : localeDir.listFiles(ymlFilter)) {
if (DEBUG) if (DEBUG)
plugin.getLogger().info("DEBUG: parent = " + parent + " language = " + 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(parent.isEmpty() ? 0 : parent.length() + 1, language.getName().length() - 4)); Locale localeObject = Locale.forLanguageTag(language.getName().substring(0, language.getName().length() - 4));
if (DEBUG) if (DEBUG)
plugin.getLogger().info("DEBUG: locale country found = " + localeObject.getCountry()); plugin.getLogger().info("DEBUG: locale country found = " + localeObject.getCountry());
if (languages.containsKey(localeObject)) { if (languages.containsKey(localeObject)) {

View File

@ -37,6 +37,7 @@ import us.tastybento.bskyblock.api.commands.User;
public class Util { public class Util {
private static String serverVersion = null; private static String serverVersion = null;
private static BSkyBlock plugin = BSkyBlock.getInstance();
/** /**
* Returns the server version * Returns the server version
@ -44,7 +45,7 @@ public class Util {
*/ */
public static String getServerVersion() { public static String getServerVersion() {
if (serverVersion == null) { if (serverVersion == null) {
String serverPackageName = getPlugin().getServer().getClass().getPackage().getName(); String serverPackageName = plugin.getServer().getClass().getPackage().getName();
serverVersion = serverPackageName.substring(serverPackageName.lastIndexOf('.') + 1); serverVersion = serverPackageName.substring(serverPackageName.lastIndexOf('.') + 1);
} }
return serverVersion; return serverVersion;
@ -132,8 +133,8 @@ public class Util {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static List<ItemStack> getPlayerInHandItems(Player player) { public static List<ItemStack> getPlayerInHandItems(Player player) {
List<ItemStack> result = new ArrayList<ItemStack>(2); List<ItemStack> result = new ArrayList<ItemStack>(2);
if (getPlugin().getServer().getVersion().contains("(MC: 1.7") if (plugin.getServer().getVersion().contains("(MC: 1.7")
|| getPlugin().getServer().getVersion().contains("(MC: 1.8")) { || plugin.getServer().getVersion().contains("(MC: 1.8")) {
if (player.getItemInHand() != null) if (player.getItemInHand() != null)
result.add(player.getItemInHand()); result.add(player.getItemInHand());
return result; return result;
@ -182,8 +183,8 @@ public class Util {
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static boolean playerIsHolding(Player player, Material type) { public static boolean playerIsHolding(Player player, Material type) {
if (getPlugin().getServer().getVersion().contains("(MC: 1.7") if (plugin.getServer().getVersion().contains("(MC: 1.7")
|| getPlugin().getServer().getVersion().contains("(MC: 1.8")) { || plugin.getServer().getVersion().contains("(MC: 1.8")) {
if (player.getItemInHand() != null && player.getItemInHand().getType().equals(type)) { if (player.getItemInHand() != null && player.getItemInHand().getType().equals(type)) {
return true; return true;
} }
@ -206,13 +207,13 @@ public class Util {
*/ */
public static boolean inWorld(Location loc) { public static boolean inWorld(Location loc) {
if (loc != null) { if (loc != null) {
if (loc.getWorld().equals(getPlugin().getIslandWorldManager().getIslandWorld())) { if (loc.getWorld().equals(plugin.getIslandWorldManager().getIslandWorld())) {
return true; return true;
} }
if (getPlugin().getSettings().isNetherIslands() && loc.getWorld().equals(getPlugin().getIslandWorldManager().getNetherWorld())) { if (plugin.getSettings().isNetherIslands() && loc.getWorld().equals(plugin.getIslandWorldManager().getNetherWorld())) {
return true; return true;
} }
if (getPlugin().getSettings().isEndIslands() && loc.getWorld().equals(getPlugin().getIslandWorldManager().getEndWorld())) { if (plugin.getSettings().isEndIslands() && loc.getWorld().equals(plugin.getIslandWorldManager().getEndWorld())) {
return true; return true;
} }
} }
@ -317,7 +318,7 @@ public class Util {
} }
public static void runCommand(final Player player, final String string) { 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 @Override
public void run() { public void run() {
@ -361,7 +362,7 @@ public class Util {
// In ASkyBlock, liquid may be unsafe // In ASkyBlock, liquid may be unsafe
if (ground.isLiquid() || space1.isLiquid() || space2.isLiquid()) { if (ground.isLiquid() || space1.isLiquid() || space2.isLiquid()) {
// Check if acid has no damage // Check if acid has no damage
if (getPlugin().getSettings().getAcidDamage() > 0D) { if (plugin.getSettings().getAcidDamage() > 0D) {
// Bukkit.getLogger().info("DEBUG: acid"); // Bukkit.getLogger().info("DEBUG: acid");
return false; return false;
} else if (ground.getType().equals(Material.STATIONARY_LAVA) || ground.getType().equals(Material.LAVA) } 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 + "."); String[] spl = perms.getPermission().split(perm + ".");
if (spl.length > 1) { if (spl.length > 1) {
if (!NumberUtils.isDigits(spl[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 { } else {
permValue = Math.max(permValue, Integer.valueOf(spl[1])); permValue = Math.max(permValue, Integer.valueOf(spl[1]));
@ -440,12 +441,4 @@ public class Util {
return permValue; return permValue;
} }
/**
* @return the plugin
*/
public static BSkyBlock getPlugin() {
return BSkyBlock.getInstance();
}
} }