mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-26 20:55:41 +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
|
@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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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.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
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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.ElementType;
|
||||||
import java.lang.annotation.Retention;
|
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
|
* 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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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<>();
|
||||||
|
@ -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);
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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");
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -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)) {
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user