diff --git a/build.gradle b/build.gradle index bab2d6d2..2d87516f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,11 @@ import org.apache.tools.ant.filters.* -buildscript { - dependencies { - classpath fileTree(dir: './gradle/', - includes: ['versioning.jar']) - } -} - plugins { - id 'com.github.johnrengelman.shadow' version '7.1.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' id 'io.github.slimjar' version '1.3.0' id 'java' id 'maven-publish' - id 'net.nemerosa.versioning' version '2.14.0' + id 'net.nemerosa.versioning' version '2.15.1' } group = 'com.gmail.picono435' @@ -20,20 +13,14 @@ description = 'The best jobs plugin ever! You can customize every single thing o sourceCompatibility = '1.8' targetCompatibility = '1.8' -versioning { - releaseMode = { nextTag, lastTag, currentTag, extension -> - "1.0-beta-5" - } as Object -} - if (System.getenv("STABLE_BUILD") != null) { if (System.getenv("STABLE_BUILD") == '1') { version versioning.info.build + "-DEV" } else { - version versioning.info.display + version "1.0-beta-6" } } else { - version versioning.info.display + version versioning.info.build + "-DEV" } repositories { @@ -80,45 +67,46 @@ repositories { dependencies { // Slimjar - implementation slimjar("1.2.6") + shadow implementation(slimjar("1.2.6")) // Spigot - compileOnly 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' + compileOnly 'org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT' // Storage Methods - slim 'org.mongodb:mongodb-driver-sync:4.4.0' + slim 'org.mongodb:mongodb-driver-sync:4.5.0' slim 'com.zaxxer:HikariCP:4.0.3' slim 'com.h2database:h2:1.4.200' slim 'org.xerial:sqlite-jdbc:3.36.0.3' - slim 'org.mariadb.jdbc:mariadb-java-client:2.7.4' - slim 'mysql:mysql-connector-java:8.0.27' - implementation 'org.spongepowered:configurate-core:4.1.2' - implementation 'org.spongepowered:configurate-gson:4.1.2' - implementation 'org.spongepowered:configurate-yaml:4.1.2' - implementation 'org.spongepowered:configurate-hocon:4.1.2' + slim 'org.mariadb.jdbc:mariadb-java-client:3.0.3' + slim 'mysql:mysql-connector-java:8.0.28' + shadow implementation('org.spongepowered:configurate-core:4.1.2') + shadow implementation('org.spongepowered:configurate-gson:4.1.2') + shadow implementation('org.spongepowered:configurate-yaml:4.1.2') + shadow implementation('org.spongepowered:configurate-hocon:4.1.2') // Plugins API - compileOnly('me.clip:placeholderapi:2.10.10') { transitive = false } + compileOnly('me.clip:placeholderapi:2.11.1') { transitive = false } compileOnly('com.github.MilkBowl:VaultAPI:1.7.1') { transitive = false } - compileOnly('org.black_ixx:playerpoints:3.1.0') { transitive = false } + compileOnly('org.black_ixx:playerpoints:3.2.0') { transitive = false } compileOnly('com.github.Realizedd:TokenManager:3.2.4') { transitive = false } // Other libraries - implementation 'com.github.mkremins:fanciful:18dc039f5b' - slim 'com.fasterxml.jackson.core:jackson-databind:2.13.0' - slim 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.0' - implementation 'org.apache.maven:maven-artifact:3.8.4' - implementation 'org.bstats:bstats-bukkit:2.2.1' - slim 'org.slf4j:slf4j-simple:1.7.32' - slim 'org.slf4j:slf4j-api:1.7.32' + shadow implementation('com.github.mkremins:fanciful:18dc039f5b') + slim 'com.fasterxml.jackson.core:jackson-databind:2.13.1' + slim 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.1' + shadow implementation('org.apache.maven:maven-artifact:3.8.4') + shadow implementation('org.bstats:bstats-bukkit:3.0.0') + slim 'org.slf4j:slf4j-simple:1.7.36' + slim 'org.slf4j:slf4j-api:1.7.36' testImplementation 'com.github.seeseemelk:MockBukkit-v1.16:1.0.0' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - testCompileOnly 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' + testCompileOnly 'org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT' testCompileOnly('me.clip:placeholderapi:2.10.10') { transitive = false } testCompileOnly('com.github.MilkBowl:VaultAPI:1.7') { transitive = false } - testCompileOnly('org.black_ixx:playerpoints:3.0.3') { transitive = false } + testCompileOnly('org.black_ixx:playerpoints:3.1.1') { transitive = false } testCompileOnly('com.github.Realizedd:TokenManager:3.2.4') { transitive = false } } slimJar { relocate 'org.mongodb', 'com.gmail.picono435.picojobs.libs.mongodb' relocate 'com.zaxxer', 'com.gmail.picono435.picojobs.libs.zaxxer' + relocate 'org.h2', 'com.gmail.picono435.picojobs.libs.h2' relocate 'com.h2database', 'com.gmail.picono435.picojobs.libs.h2database' relocate 'org.xerial', 'com.gmail.picono435.picojobs.libs.xerial' relocate 'org.mariadb.jbdc', 'com.gmail.picono435.picojobs.libs.mariadb' @@ -177,3 +165,5 @@ publishing { mavenLocal() } } + +compileTestJava.dependsOn(shadowJar) diff --git a/gradle/versioning.jar b/gradle/versioning.jar deleted file mode 100644 index 392109ea..00000000 Binary files a/gradle/versioning.jar and /dev/null differ diff --git a/src/main/java/com/gmail/picono435/picojobs/PicoJobsPlugin.java b/src/main/java/com/gmail/picono435/picojobs/PicoJobsPlugin.java index 417d4e7f..fcd90304 100644 --- a/src/main/java/com/gmail/picono435/picojobs/PicoJobsPlugin.java +++ b/src/main/java/com/gmail/picono435/picojobs/PicoJobsPlugin.java @@ -3,21 +3,20 @@ import java.io.*; import java.lang.reflect.Method; import java.net.HttpURLConnection; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.*; import java.util.concurrent.Callable; import java.util.logging.*; -import com.gmail.picono435.picojobs.storage.sql.file.H2Storage; +import com.gmail.picono435.picojobs.hooks.economy.CommandImplementation; +import com.gmail.picono435.picojobs.hooks.economy.ItemImplementation; +import com.gmail.picono435.picojobs.listeners.jobs.*; +import com.gmail.picono435.picojobs.storage.sql.H2Storage; import com.gmail.picono435.picojobs.utils.GitHubAPI; -import io.github.slimjar.resolver.data.Mirror; import io.github.slimjar.resolver.data.Repository; -import io.github.slimjar.resolver.mirrors.MirrorSelector; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.bstats.bukkit.Metrics; import org.bstats.charts.DrilldownPie; @@ -46,20 +45,6 @@ import com.gmail.picono435.picojobs.listeners.ClickInventoryListener; import com.gmail.picono435.picojobs.listeners.CreatePlayerListener; import com.gmail.picono435.picojobs.listeners.ExecuteCommandListener; -import com.gmail.picono435.picojobs.listeners.jobs.FisherListener; -import com.gmail.picono435.picojobs.listeners.jobs.KillEntityListener; -import com.gmail.picono435.picojobs.listeners.jobs.KillerListener; -import com.gmail.picono435.picojobs.listeners.jobs.MilkListener; -import com.gmail.picono435.picojobs.listeners.jobs.PlaceListener; -import com.gmail.picono435.picojobs.listeners.jobs.RepairListener; -import com.gmail.picono435.picojobs.listeners.jobs.ShearListener; -import com.gmail.picono435.picojobs.listeners.jobs.SmeltListener; -import com.gmail.picono435.picojobs.listeners.jobs.TameListener; -import com.gmail.picono435.picojobs.listeners.jobs.BreakListener; -import com.gmail.picono435.picojobs.listeners.jobs.CraftListener; -import com.gmail.picono435.picojobs.listeners.jobs.EatListener; -import com.gmail.picono435.picojobs.listeners.jobs.EnchantListener; -import com.gmail.picono435.picojobs.listeners.jobs.FillListener; import com.gmail.picono435.picojobs.api.managers.LanguageManager; import com.gmail.picono435.picojobs.utils.FileCreator; import com.google.gson.JsonArray; @@ -67,7 +52,8 @@ import com.google.gson.JsonParser; import io.github.slimjar.app.builder.ApplicationBuilder; -import org.codehaus.plexus.util.FileUtils; +import org.h2.tools.RunScript; +import org.h2.tools.Script; public class PicoJobsPlugin extends JavaPlugin { @@ -101,12 +87,7 @@ public void onLoad() { sendConsoleMessage(Level.INFO, "Loading dependencies, this might take some minutes when ran for the first time..."); ApplicationBuilder .appending("PicoJobs") - .mirrorSelector(new MirrorSelector() { - @Override - public Collection select(Collection collection, Collection collection1) throws MalformedURLException { - return collection; - } - }) + .mirrorSelector((collection, collection1) -> collection) .downloadDirectoryPath(getDataFolder().toPath().resolve("libraries")) .internalRepositories(Collections.singleton(new Repository(new URL("https://repo.maven.apache.org/maven2/")))) .build(); @@ -125,7 +106,7 @@ public void onEnable() { if(checkLegacy() ) { sendConsoleMessage(Level.WARNING, "Checked that you are using a LEGACY spigot/bukkit version. We will use the old Material Support."); } - + // CREATING AND CONFIGURING INTERNAL FILES saveDefaultConfig(); loggingHandler = new ConsoleHandler(); @@ -162,6 +143,8 @@ public synchronized String format(LogRecord record) { // SETTING UP AND REQUIRED AND OPTIONAL DEPENDENCIES PicoJobsAPI.registerEconomy(new ExpImplementation()); + PicoJobsAPI.registerEconomy(new CommandImplementation()); + PicoJobsAPI.registerEconomy(new ItemImplementation()); VaultHook.setupVault(); PlayerPointsHook.setupPlayerPoints(); PicoJobsAPI.registerEconomy(new TokenManagerImplementation()); @@ -175,6 +158,22 @@ public void run() { // GENERATE JOBS FROM CONFIGURATION sendConsoleMessage(Level.INFO, "Generating jobs from configuration..."); if(!generateJobsFromConfig()) return; + + // Fix my dumb way to migrate the database! This will be removed asap. + if(PicoJobsAPI.getSettingsManager().getStorageMethod().equalsIgnoreCase("H2")) { + try { + if(PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("script").toFile().exists()) { + RunScript.main("-url jdbc:h2:$f -script $script" + .replace("$f", PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("picojobs-h2").toAbsolutePath().toString()) + .replace("$script", PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("script").toString()) + .split(" ")); + PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("script").toFile().deleteOnExit(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + PicoJobsAPI.getStorageManager().initializeStorageFactory(); if(!isTestEnvironment) { metrics.addCustomChart(new SingleLineChart("created_jobs", new Callable() { @@ -204,38 +203,32 @@ public Integer call() throws Exception { Bukkit.getPluginManager().registerEvents(new EatListener(), this); Bukkit.getPluginManager().registerEvents(new EnchantListener(), this); Bukkit.getPluginManager().registerEvents(new MilkListener(), this); + Bukkit.getPluginManager().registerEvents(new MoveListener(), this); + Bukkit.getPluginManager().registerEvents(new TradeListener(), this); Bukkit.getPluginManager().registerEvents(new RepairListener(), this); Bukkit.getPluginManager().registerEvents(new SmeltListener(), this); Bukkit.getPluginManager().registerEvents(new KillEntityListener(), this); sendConsoleMessage(Level.INFO, "The plugin was succefully enabled."); - - checkVersion(); + + if(getConfig().getBoolean("update-checker")) { + checkVersion(); + } } public void onDisable() { sendConsoleMessage(Level.INFO, "Disconnecting connection to storage..."); jobs.clear(); + PicoJobsAPI.getStorageManager().destroyStorageFactory(); + if(wasUpdated && PicoJobsAPI.getStorageManager().getStorageFactory() instanceof H2Storage) { try { - // Copy the current database to a -old file - FileUtils.copyFile(PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("picojobs-h2.mv.db").toFile(), PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("picojobs-h2-old.mv.db").toFile()); - // Set the path where the script file will be located - Path scriptFile = PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("script").toAbsolutePath(); - // Backup database to script - ((H2Storage) PicoJobsAPI.getStorageManager().getStorageFactory()).backupDataTo(scriptFile.toFile()); - PicoJobsAPI.getStorageManager().destroyStorageFactory(); - // Delete the current database - PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2.mv.db").toFile().delete(); - sendConsoleMessage(Level.INFO, "The plugin was succefully disabled."); - return; - } catch (Exception e) { + Script.main("-url jdbc:h2:$f -script $f.zip -options compression zip".replace("$f", PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2").toAbsolutePath().toString()).split(" ")); + } catch (SQLException e) { e.printStackTrace(); } } - - PicoJobsAPI.getStorageManager().destroyStorageFactory(); sendConsoleMessage(Level.INFO, "The plugin was succefully disabled."); } @@ -254,21 +247,35 @@ public void debugMessage(String message) { public Handler getLoggingHandler() { return loggingHandler; } - - public boolean isNewerThan(String version) { + + /* + * Same as having serverVersion >= specifiedVersion + * Example: 1.18.1 >= 1.12.2 + * + * @param version + * @return + */ + public boolean isMoreThan(String version) { DefaultArtifactVersion legacyVersion = new DefaultArtifactVersion(version); DefaultArtifactVersion serverVersionArt = new DefaultArtifactVersion(serverVersion); - if(legacyVersion.compareTo(serverVersionArt) >= 0) { + if(serverVersionArt.compareTo(legacyVersion) >= 0) { return true; } else { return false; } } - - public boolean isOlderThan(String version) { + + /* + * Same as having serverVersion <= specifiedVersion + * Example: 1.18.1 <= 1.12.2 + * + * @param version + * @return + */ + public boolean isLessThan(String version) { DefaultArtifactVersion legacyVersion = new DefaultArtifactVersion(version); DefaultArtifactVersion serverVersionArt = new DefaultArtifactVersion(serverVersion); - if(legacyVersion.compareTo(serverVersionArt) <= 0) { + if(serverVersionArt.compareTo(legacyVersion) <= 0) { return true; } else { return false; @@ -298,17 +305,18 @@ public boolean generateJobsFromConfig() { debugMessage("Display name: " + displayname); String tag = jobc.getString("tag"); debugMessage("Tag: " + tag); - List types; - if(jobc.contains("types")) { - types = Type.getTypes(jobc.getStringList("types")); - } else { - types = new ArrayList(); - } if(jobc.contains("type")) { String typeString = jobc.getString("type"); - types.add(Type.getType(typeString.toUpperCase(Locale.ROOT))); + jobc.set("types", Collections.singletonList(typeString)); + jobc.set("type", null); + try { + FileCreator.getJobsConfig().save(FileCreator.getJobsFile()); + } catch (IOException e) { + e.printStackTrace(); + } } - debugMessage("Types: " + types); + List types = Type.getTypes(jobc.getStringList("types")); + debugMessage("Types: " + Arrays.toString(types.toArray())); double method = jobc.getDouble("method"); debugMessage("Method: " + method); double salary = jobc.getDouble("salary"); @@ -331,13 +339,33 @@ public boolean generateJobsFromConfig() { String item = guic.getString("item"); int itemData = guic.getInt("item-data"); boolean enchanted = guic.getBoolean("enchanted"); + List lore = guic.getStringList("lore"); // CALCULATING OPTIONALS boolean useWhitelist = jobc.getBoolean("use-whitelist"); - List whitelist = jobc.getStringList("whitelist"); + Map> whitelist = new HashMap<>(); + if(jobc.contains("whitelist")) { + // Legacy: Will be removed in future update + if(jobc.get("whitelist") instanceof List) { + List white = jobc.getStringList("whitelist"); + for(Type type : types) { + whitelist.put(type, white); + jobc.set("whitelist." + type.name(), white); + try { + FileCreator.getJobsConfig().save(FileCreator.getJobsFile()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } else { + for(String type : jobc.getConfigurationSection("whitelist").getKeys(false)) { + whitelist.put(Type.getType(type), jobc.getConfigurationSection("whitelist").getStringList(type)); + } + } + } - Job job = new Job(jobid, displayname, tag, types, method, salary, maxSalary, requiresPermission, salaryFrequency, methodFrequency, economy, workMessage, slot, item, itemData, enchanted, useWhitelist, whitelist); + Job job = new Job(jobid, displayname, tag, types, method, salary, maxSalary, requiresPermission, salaryFrequency, methodFrequency, economy, workMessage, slot, item, itemData, enchanted, lore, useWhitelist, whitelist); jobs.put(jobid, job); diff --git a/src/main/java/com/gmail/picono435/picojobs/api/Job.java b/src/main/java/com/gmail/picono435/picojobs/api/Job.java index bf9a548c..9cf133f4 100644 --- a/src/main/java/com/gmail/picono435/picojobs/api/Job.java +++ b/src/main/java/com/gmail/picono435/picojobs/api/Job.java @@ -1,9 +1,6 @@ package com.gmail.picono435.picojobs.api; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; +import java.util.*; import org.bukkit.ChatColor; import org.bukkit.DyeColor; @@ -45,13 +42,14 @@ public class Job { private Material item; private int itemData; private boolean enchanted; + private List lore; // OPTIONAL private boolean useWhitelist; - private List whitelist; - private List stringWhitelist; + private Map> whitelist; + private Map> stringWhitelist; - public Job(String id, String displayname, String tag, List types, double method, double salary, double maxSalary, boolean requiresPermission, double salaryFrequency, double methodFrequency, String economy, String workMessage, int slot, String item, int itemData, boolean enchanted, boolean useWhitelist, List whitelist) { + public Job(String id, String displayname, String tag, List types, double method, double salary, double maxSalary, boolean requiresPermission, double salaryFrequency, double methodFrequency, String economy, String workMessage, int slot, String item, int itemData, boolean enchanted, List lore, boolean useWhitelist, Map> whitelist) { this.id = id; this.displayname = displayname; this.tag = tag; @@ -70,46 +68,52 @@ public Job(String id, String displayname, String tag, List types, double m this.item = m; this.itemData = itemData; this.enchanted = enchanted; + this.lore = lore; this.useWhitelist = useWhitelist; if(whitelist != null) { - this.whitelist = new ArrayList(); - for(Type type: this.types) { + this.whitelist = new HashMap<>(); + for(Type type : whitelist.keySet()) { String whitelistType = type.getWhitelistType(); + List objects = new ArrayList<>(); if(whitelistType.equals("material")) { - for(String s : whitelist) { + for(String s : whitelist.get(type)) { Material matNew = OtherUtils.matchMaterial(s); if(matNew == null) continue; - this.whitelist.add(matNew); + objects.add(matNew); } + this.whitelist.put(type, objects); } else if(whitelistType.equals("entity")) { - for(String s : whitelist) { + for(String s : whitelist.get(type)) { EntityType entityNew = OtherUtils.getEntityByName(s); if(entityNew == null) continue; - this.whitelist.add(entityNew); + objects.add(entityNew); } + this.whitelist.put(type, objects); } else if(whitelistType.equals("job")) { Job j = this; new BukkitRunnable() { public void run() { - for(String s : whitelist) { + for(String s : whitelist.get(type)) { Job jobNew = PicoJobsAPI.getJobsManager().getJob(s); if(jobNew == null) continue; - j.whitelist.add(jobNew); + objects.add(jobNew); } + j.whitelist.put(type, objects); } }.runTask(PicoJobsPlugin.getInstance()); } else if(whitelistType.equals("color")) { - for(String s : whitelist) { + for(String s : whitelist.get(type)) { DyeColor colorNew = DyeColor.valueOf(s.toUpperCase(Locale.ROOT)); if(colorNew == null) continue; - this.whitelist.add(colorNew); + objects.add(colorNew); } + this.whitelist.put(type, objects); } } this.stringWhitelist = whitelist; } else { - this.whitelist = new ArrayList(); + this.whitelist = new HashMap<>(); } } @@ -295,6 +299,16 @@ public int getItemData() { public boolean isEnchanted() { return this.enchanted; } + + /** + * Gets the item lore + * + * @return the item lore of the job item + * @author Picono435 + */ + public List getLore() { + return this.lore; + } /** * Checks if it's whitelist or not @@ -316,7 +330,7 @@ public boolean isWhitelist() { @SuppressWarnings("deprecation") public ItemStack getFormattedItem() { ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = getItemData() - 1; if(itemData == -1) { builder = new ItemBuilder(getMaterial()); @@ -328,76 +342,81 @@ public ItemStack getFormattedItem() { } builder.setName(getDisplayName()); if(isEnchanted()) builder.addUnsafeEnchantment(Enchantment.ARROW_DAMAGE, 1); + builder.setLore(getLore()); builder.removeAttributes(); return builder.toItemStack(); } /** * Checks if a material is in the whitelist - * + * + * @param type the job type to get the whitelist from * @param material the material that you want to check * @return true if it's in the whitelist or there is no whitelist, false if not * @author Picono435 */ - public boolean inWhitelist(Material material) { + public boolean inWhitelist(Type type, Material material) { if(this.whitelist == null) return (this.useWhitelist) ? false : true; if(this.whitelist.size() <= 0) return (this.useWhitelist) ? false : true; if(this.useWhitelist) { - return this.whitelist.contains(material); + return this.whitelist.get(type).contains(material); } else { - return !this.whitelist.contains(material); + return !this.whitelist.get(type).contains(material); } } /** * Checks if a entity is in the whitelist - * + * + * @param type the job type to get the whitelist from * @param entity the entity that you want to check * @return true if it's in the whitelist or there is no whitelist, false if not * @author Picono435 */ - public boolean inWhitelist(EntityType entity) { + public boolean inWhitelist(Type type, EntityType entity) { if(this.whitelist == null) return (this.useWhitelist) ? false : true; if(this.whitelist.size() <= 0) return (this.useWhitelist) ? false : true; if(this.useWhitelist) { - return this.whitelist.contains(entity); + return this.whitelist.get(type).contains(entity); } else { - return !this.whitelist.contains(entity); + return !this.whitelist.get(type).contains(entity); } } /** * Checks if a dye color is in the whitelist - * + * + * @param type the job type to get the whitelist from * @param dyecolor the dye color that you want to check * @return true if it's in the whitelist or there is no whitelist, false if not * @author Picono435 */ - public boolean inWhitelist(DyeColor dyecolor) { + public boolean inWhitelist(Type type, DyeColor dyecolor) { if(this.whitelist == null) return (this.useWhitelist) ? false : true; if(this.whitelist.size() <= 0) return (this.useWhitelist) ? false : true; if(this.useWhitelist) { - return this.whitelist.contains(dyecolor); + return this.whitelist.get(type).contains(dyecolor); } else { - return !this.whitelist.contains(dyecolor); + return !this.whitelist.get(type).contains(dyecolor); } } /** * Checks if a job is in the whitelist - * + * + * @param type the job type to get the whitelist from * @param job the job that you want to check * @return true if it's in the whitelist or there is no whitelist, false if not * @author Picono435 */ - public boolean inWhitelist(Job job) { + public boolean inWhitelist(Type type, Job job) { if(this.whitelist == null) return (this.useWhitelist) ? false : true; if(this.whitelist.size() <= 0) return (this.useWhitelist) ? false : true; if(job == null) return (this.useWhitelist) ? false : true; if(this.useWhitelist) { - return this.whitelist.contains(job); + return this.whitelist.get(type).contains(job); } else { - return !this.whitelist.contains(job); + return !this.whitelist.get(type).contains(job); } } @@ -407,20 +426,20 @@ public boolean inWhitelist(Job job) { * @return the whitelist * @author Picono435 */ - public List getWhitelist() { - return this.whitelist; + public Map> getWhitelist() { + return whitelist; } - + /** * Gets the string whitelist * * @return the string whitelist * @author Picono435 */ - public List getStringWhitelist() { - return this.stringWhitelist; + public Map> getStringWhitelist() { + return stringWhitelist; } - + /** * Gets a formatted whitelist string * @@ -428,6 +447,6 @@ public List getStringWhitelist() { * @author Picono435 */ public String getWhitelistArray() { - return Arrays.toString(this.stringWhitelist.toArray()); + return Arrays.toString(this.stringWhitelist.values().toArray()); } } diff --git a/src/main/java/com/gmail/picono435/picojobs/api/JobPlayer.java b/src/main/java/com/gmail/picono435/picojobs/api/JobPlayer.java index 0d54e8da..8cb1fe34 100644 --- a/src/main/java/com/gmail/picono435/picojobs/api/JobPlayer.java +++ b/src/main/java/com/gmail/picono435/picojobs/api/JobPlayer.java @@ -28,8 +28,8 @@ public class JobPlayer { private double salary; private String errorMessage; - public JobPlayer(Job job, double method, double level, double salary, boolean isWorking, UUID uuid) { - this.job = job; + public JobPlayer(String job, double method, double level, double salary, boolean isWorking, UUID uuid) { + this.job = PicoJobsAPI.getJobsManager().getJob(job); this.method = method; this.level = level; this.salary = salary; diff --git a/src/main/java/com/gmail/picono435/picojobs/api/Type.java b/src/main/java/com/gmail/picono435/picojobs/api/Type.java index 2650bdc1..d9c10c7a 100644 --- a/src/main/java/com/gmail/picono435/picojobs/api/Type.java +++ b/src/main/java/com/gmail/picono435/picojobs/api/Type.java @@ -1,6 +1,9 @@ package com.gmail.picono435.picojobs.api; +import com.gmail.picono435.picojobs.PicoJobsPlugin; + import java.util.*; +import java.util.logging.Level; /** * Represents a job type @@ -22,6 +25,8 @@ public enum Type { ENCHANTING("material"), REPAIR("material"), MILK(""), + MOVE("material"), + TRADE("material"), KILL_ENTITY("entity"); private final static Map BY_NAME = new HashMap(); @@ -39,7 +44,11 @@ public static Type getType(String name) { public static List getTypes(List names) { List types = new ArrayList(); for(String name : names) { - types.add(getType(name)); + if(BY_NAME.containsKey(name.toUpperCase(Locale.ROOT))) { + types.add(getType(name.toUpperCase(Locale.ROOT))); + } else { + PicoJobsPlugin.getInstance().sendConsoleMessage(Level.SEVERE, "The job type '" + name.toUpperCase(Locale.ROOT) + "' does not exist. Make sure to use a valid job type."); + } } return types; } diff --git a/src/main/java/com/gmail/picono435/picojobs/api/managers/PlayersManager.java b/src/main/java/com/gmail/picono435/picojobs/api/managers/PlayersManager.java index e8d2a391..fe55e335 100644 --- a/src/main/java/com/gmail/picono435/picojobs/api/managers/PlayersManager.java +++ b/src/main/java/com/gmail/picono435/picojobs/api/managers/PlayersManager.java @@ -101,7 +101,7 @@ public CompletableFuture getJobPlayerFromStorage(UUID uuid) { if(!factory.playerExists(uuid)) { factory.createPlayer(uuid); } - JobPlayer jp = new JobPlayer(PicoJobsAPI.getJobsManager().getJob(factory.getJob(uuid)), + JobPlayer jp = new JobPlayer(factory.getJob(uuid), factory.getMethod(uuid), factory.getMethodLevel(uuid), factory.getSalary(uuid), diff --git a/src/main/java/com/gmail/picono435/picojobs/commands/JobsAdminCommand.java b/src/main/java/com/gmail/picono435/picojobs/commands/JobsAdminCommand.java index 242468d1..0921c282 100644 --- a/src/main/java/com/gmail/picono435/picojobs/commands/JobsAdminCommand.java +++ b/src/main/java/com/gmail/picono435/picojobs/commands/JobsAdminCommand.java @@ -8,6 +8,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import java.util.UUID; import java.util.logging.Level; import org.apache.commons.lang3.StringUtils; @@ -93,6 +94,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String } PicoJobsAPI.getStorageManager().destroyStorageFactory(); PicoJobsAPI.getStorageManager().initializeStorageFactory(); + for(UUID uuid : PicoJobsAPI.getStorageManager().getCacheManager().getAllFromCache()) { + PicoJobsAPI.getPlayersManager().getJobPlayer(uuid).setJob(PicoJobsAPI.getJobsManager().getJob(PicoJobsAPI.getPlayersManager().getJobPlayer(uuid).getJob().getID())); + } p.sendMessage(LanguageManager.getMessage("reload-command", pl)); return true; } diff --git a/src/main/java/com/gmail/picono435/picojobs/hooks/economy/CommandImplementation.java b/src/main/java/com/gmail/picono435/picojobs/hooks/economy/CommandImplementation.java new file mode 100644 index 00000000..5a2356b1 --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/hooks/economy/CommandImplementation.java @@ -0,0 +1,44 @@ +package com.gmail.picono435.picojobs.hooks.economy; + +import com.gmail.picono435.picojobs.PicoJobsPlugin; +import com.gmail.picono435.picojobs.api.EconomyImplementation; +import com.gmail.picono435.picojobs.api.JobPlayer; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.gmail.picono435.picojobs.utils.FileCreator; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.List; + +public class CommandImplementation extends EconomyImplementation { + + public CommandImplementation() { + this.requiredPlugin = Bukkit.getPluginManager().getPlugin("PicoJobs"); + } + + @Override + public String getName() { + return "COMMAND"; + } + + @Override + public double getBalance(Player player) { + return 0D; + } + + @Override + public void deposit(Player player, double amount) { + JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(player); + List commands = FileCreator.getJobsConfig().getStringList("jobs." + jp.getJob().getID() + "." + "commands"); + for(String command : commands) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command + .replace("%amount%", amount + "") + .replace("%player%", player.getName()) + ); + } + } + + @Override + public void withdraw(Player player, double amount) {} + +} diff --git a/src/main/java/com/gmail/picono435/picojobs/hooks/economy/ItemImplementation.java b/src/main/java/com/gmail/picono435/picojobs/hooks/economy/ItemImplementation.java new file mode 100644 index 00000000..e487ea2c --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/hooks/economy/ItemImplementation.java @@ -0,0 +1,43 @@ +package com.gmail.picono435.picojobs.hooks.economy; + +import com.gmail.picono435.picojobs.api.EconomyImplementation; +import com.gmail.picono435.picojobs.api.JobPlayer; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.gmail.picono435.picojobs.utils.FileCreator; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class ItemImplementation extends EconomyImplementation { + + public ItemImplementation() { + this.requiredPlugin = Bukkit.getPluginManager().getPlugin("PicoJobs"); + } + + @Override + public String getName() { + return "ITEM"; + } + + @Override + public double getBalance(Player player) { + return 0D; + } + + @Override + public void deposit(Player player, double amount) { + JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(player); + List items = FileCreator.getJobsConfig().getStringList("jobs." + jp.getJob().getID() + "." + "items"); + for(String item : items) { + Material material = Material.matchMaterial(item); + player.getInventory().addItem(new ItemStack(material, (int) Math.round(amount))); + } + } + + @Override + public void withdraw(Player player, double amount) {} + +} diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/BreakListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/BreakListener.java index 9c3e7be7..9f4325dd 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/BreakListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/BreakListener.java @@ -1,11 +1,15 @@ package com.gmail.picono435.picojobs.listeners.jobs; +import org.bukkit.CropState; +import org.bukkit.Material; +import org.bukkit.block.data.Ageable; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.material.Crops; import org.bukkit.metadata.FixedMetadataValue; import com.gmail.picono435.picojobs.PicoJobsPlugin; @@ -20,16 +24,26 @@ public class BreakListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBreakBlock(BlockBreakEvent e) { if(e.getBlock().getMetadata("PLACED").size() > 0) return; - + Player p = e.getPlayer(); JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(p); if(!jp.hasJob()) return; if(!jp.isWorking()) return; Job job = jp.getJob(); if(!job.getTypes().contains(Type.BREAK)) return; - - if(!job.inWhitelist(e.getBlock().getType())) return; - + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { + if(e.getBlock().getState().getData() instanceof Crops) { + if(((Crops)e.getBlock().getState().getData()).getState() != CropState.RIPE) return; + } + } else { + if(e.getBlock().getBlockData() instanceof Ageable) { + Ageable ageable = (Ageable) e.getBlock().getBlockData(); + if(ageable.getMaximumAge() != ageable.getAge()) return; + } + } + + if(!job.inWhitelist(Type.BREAK, e.getBlock().getType())) return; + if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); } @@ -37,7 +51,14 @@ public void onBreakBlock(BlockBreakEvent e) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlaceBlock(BlockPlaceEvent e) { - if(e.getPlayer() == null) return; + if(e.getBlock().getType() == Material.BEETROOT_SEEDS || + e.getBlock().getType() == Material.MELON_SEEDS || + e.getBlock().getType() == Material.PUMPKIN_SEEDS || + e.getBlock().getType() == Material.WHEAT_SEEDS || + e.getBlock().getType() == Material.CARROT || + e.getBlock().getType() == Material.POTATO || + e.getBlock().getType() == Material.WHEAT + ) return; e.getBlock().setMetadata("PLACED", new FixedMetadataValue(PicoJobsPlugin.getInstance(), "YES")); } } diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/CraftListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/CraftListener.java index 61041d5e..3142cb40 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/CraftListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/CraftListener.java @@ -41,7 +41,7 @@ public void onCraftItem(CraftItemEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.CRAFT)) return; - if(!job.inWhitelist(e.getCurrentItem().getType())) return; + if(!job.inWhitelist(Type.CRAFT, e.getCurrentItem().getType())) return; for(int i = 0; i < e.getCurrentItem().getAmount(); i++) { if(jp.simulateEvent()) { diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EatListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EatListener.java index 82750c6f..109af27c 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EatListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EatListener.java @@ -23,7 +23,7 @@ public void onEat(PlayerItemConsumeEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.EAT)) return; - if(!job.inWhitelist(e.getItem().getType())) return; + if(!job.inWhitelist(Type.EAT, e.getItem().getType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EnchantListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EnchantListener.java index b4072e8d..ac9def2b 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EnchantListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/EnchantListener.java @@ -23,7 +23,7 @@ public void onEnchant(EnchantItemEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.ENCHANTING)) return; - if(!job.inWhitelist(e.getItem().getType())) return; + if(!job.inWhitelist(Type.ENCHANTING, e.getItem().getType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FillListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FillListener.java index 3bd775ad..5588aed5 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FillListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FillListener.java @@ -21,10 +21,10 @@ public class FillListener implements Listener { public void onFillBucket(PlayerBucketFillEvent e) { if(e.getPlayer() == null) return; Block b = e.getBlockClicked(); - if(!PicoJobsPlugin.getInstance().isNewerThan("1.17")) { + if(!PicoJobsPlugin.getInstance().isLessThan("1.17.1")) { if(b == null || (!b.isLiquid())) return; } else { - if(b == null || (!b.isLiquid() && b.getType() == Material.POWDER_SNOW)) return; + if(b == null || (!b.isLiquid() && b.getType() != Material.POWDER_SNOW)) return; } Player p = e.getPlayer(); JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(p); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FisherListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FisherListener.java index f729e287..7960a9da 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FisherListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/FisherListener.java @@ -26,7 +26,7 @@ public void onPlayerDeath(PlayerFishEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.FISHING)) return; if(!(e.getCaught() instanceof Item)) return; - if(!job.inWhitelist(((Item)e.getCaught()).getItemStack().getType())) return; + if(!job.inWhitelist(Type.FISHING, ((Item)e.getCaught()).getItemStack().getType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillEntityListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillEntityListener.java index 98063108..d0bee885 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillEntityListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillEntityListener.java @@ -24,7 +24,7 @@ public void onEntityDeath(EntityDeathEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.KILL_ENTITY)) return; - if(!job.inWhitelist(e.getEntity().getType())) return; + if(!job.inWhitelist(Type.KILL_ENTITY, e.getEntity().getType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillerListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillerListener.java index 6ef7d817..9995a401 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillerListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/KillerListener.java @@ -25,7 +25,7 @@ public void onPlayerDeath(PlayerDeathEvent e) { if(!job.getTypes().contains(Type.KILL)) return; JobPlayer jdead = PicoJobsAPI.getPlayersManager().getJobPlayer(e.getEntity()); - if(!job.inWhitelist(jdead.getJob())) return; + if(!job.inWhitelist(Type.KILL, jdead.getJob())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/MoveListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/MoveListener.java new file mode 100644 index 00000000..e9982a18 --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/MoveListener.java @@ -0,0 +1,38 @@ +package com.gmail.picono435.picojobs.listeners.jobs; + +import com.gmail.picono435.picojobs.api.Job; +import com.gmail.picono435.picojobs.api.JobPlayer; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.gmail.picono435.picojobs.api.Type; +import com.gmail.picono435.picojobs.api.managers.LanguageManager; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.enchantment.EnchantItemEvent; +import org.bukkit.event.player.PlayerMoveEvent; + +public class MoveListener implements Listener { + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onMove(PlayerMoveEvent e) { + Player p = e.getPlayer(); + JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(p); + if(!jp.hasJob()) return; + if(!jp.isWorking()) return; + Job job = jp.getJob(); + if(!job.getTypes().contains(Type.MOVE)) return; + + if(!job.inWhitelist(Type.MOVE, p.getLocation().getBlock().getType())) return; + + long distance = Math.round(Math.floor(e.getTo().distance(e.getFrom()))); + + for(int i = 0; i < distance; i++) { + if(jp.simulateEvent()) { + p.sendMessage(LanguageManager.getMessage("finished-work", p)); + return; + } + } + } +} diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/PlaceListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/PlaceListener.java index 60a80802..e9277b10 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/PlaceListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/PlaceListener.java @@ -23,7 +23,7 @@ public void onPlaceBlock(BlockPlaceEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.PLACE)) return; - if(!job.inWhitelist(e.getBlock().getType())) return; + if(!job.inWhitelist(Type.PLACE, e.getBlock().getType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/RepairListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/RepairListener.java index 05474b3e..7fcbceff 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/RepairListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/RepairListener.java @@ -29,7 +29,7 @@ public void onCraftItem(InventoryClickEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.REPAIR)) return; - if(!job.inWhitelist(e.getCurrentItem().getType())) return; + if(!job.inWhitelist(Type.REPAIR, e.getCurrentItem().getType())) return; for(int i = 0; i < e.getCurrentItem().getAmount(); i++) { if(jp.simulateEvent()) { diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/ShearListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/ShearListener.java index f818e971..660f6920 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/ShearListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/ShearListener.java @@ -25,7 +25,7 @@ public void onShearEntity(PlayerShearEntityEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.SHEAR)) return; - if(!job.inWhitelist(((Sheep)e.getEntity()).getColor())) return; + if(!job.inWhitelist(Type.SHEAR, ((Sheep)e.getEntity()).getColor())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/SmeltListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/SmeltListener.java index cc60a59d..86ad4b8c 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/SmeltListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/SmeltListener.java @@ -21,7 +21,7 @@ public class SmeltListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onCraftItem(InventoryClickEvent e) { if(e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) return; - if(!PicoJobsPlugin.getInstance().isNewerThan("1.14")) { + if(!PicoJobsPlugin.getInstance().isMoreThan("1.14")) { if(e.getInventory().getType() != InventoryType.FURNACE && e.getInventory().getType() != InventoryType.valueOf("BLAST_FURNACE") && e.getInventory().getType() != InventoryType.valueOf("SMOKER")) return; } else { if(e.getInventory().getType() != InventoryType.FURNACE) return; @@ -35,7 +35,7 @@ public void onCraftItem(InventoryClickEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.SMELT)) return; - if(!job.inWhitelist(e.getCurrentItem().getType())) return; + if(!job.inWhitelist(Type.SMELT, e.getCurrentItem().getType())) return; for(int i = 0; i < e.getCurrentItem().getAmount(); i++) { if(jp.simulateEvent()) { diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TameListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TameListener.java index 40a04141..25f4c330 100644 --- a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TameListener.java +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TameListener.java @@ -23,7 +23,7 @@ public void onTameAnimal(EntityTameEvent e) { Job job = jp.getJob(); if(!job.getTypes().contains(Type.TAME)) return; - if(!job.inWhitelist(e.getEntityType())) return; + if(!job.inWhitelist(Type.TAME, e.getEntityType())) return; if(jp.simulateEvent()) { p.sendMessage(LanguageManager.getMessage("finished-work", p)); diff --git a/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TradeListener.java b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TradeListener.java new file mode 100644 index 00000000..9d0a32f0 --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/listeners/jobs/TradeListener.java @@ -0,0 +1,40 @@ +package com.gmail.picono435.picojobs.listeners.jobs; + +import com.gmail.picono435.picojobs.api.Job; +import com.gmail.picono435.picojobs.api.JobPlayer; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.gmail.picono435.picojobs.api.Type; +import com.gmail.picono435.picojobs.api.managers.LanguageManager; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; + +public class TradeListener implements Listener { + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onTrade(InventoryClickEvent e) { + if(e.getInventory().getType() != InventoryType.MERCHANT) return; + if(e.getSlotType() != InventoryType.SlotType.RESULT) return; + if(e.getCurrentItem() == null || e.getCurrentItem().getType() == Material.AIR) return; + Player p = (Player) e.getWhoClicked(); + JobPlayer jp = PicoJobsAPI.getPlayersManager().getJobPlayer(p); + if(!jp.hasJob()) return; + if(!jp.isWorking()) return; + Job job = jp.getJob(); + if(!job.getTypes().contains(Type.TRADE)) return; + + if(!job.inWhitelist(Type.TRADE, e.getCurrentItem().getType())) return; + + for(int i = 0; i < e.getCurrentItem().getAmount(); i++) { + if(jp.simulateEvent()) { + p.sendMessage(LanguageManager.getMessage("finished-work", p)); + return; + } + } + } +} diff --git a/src/main/java/com/gmail/picono435/picojobs/menu/JobsMenu.java b/src/main/java/com/gmail/picono435/picojobs/menu/JobsMenu.java index d426f324..21a08c81 100644 --- a/src/main/java/com/gmail/picono435/picojobs/menu/JobsMenu.java +++ b/src/main/java/com/gmail/picono435/picojobs/menu/JobsMenu.java @@ -49,7 +49,7 @@ public static Inventory getChooseJobMenu(ConfigurationSection guiSettings) { if(category.getBoolean("put-background-item")) { ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = category.getInt("item-data"); if(itemData == -1) { builder = new ItemBuilder(OtherUtils.matchMaterial(category.getString("item"))); @@ -81,7 +81,7 @@ public static Inventory getNeedAcceptJobMenu(ConfigurationSection guiSettings, P for(String itemName : items.getKeys(false)) { ConfigurationSection itemConfig = items.getConfigurationSection(itemName); ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = itemConfig.getInt("item-data"); if(itemData == -1) { builder = new ItemBuilder(OtherUtils.matchMaterial(itemConfig.getString("material"))); @@ -114,7 +114,7 @@ public static Inventory getNeedAcceptJobMenu(ConfigurationSection guiSettings, P if(category.getBoolean("put-background-item")) { ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = category.getInt("item-data"); if(itemData == -1) { builder = new ItemBuilder(OtherUtils.matchMaterial(category.getString("item"))); @@ -146,7 +146,7 @@ public static Inventory getWorkStatusJobMenu(ConfigurationSection guiSettings, P for(String itemName : items.getKeys(false)) { ConfigurationSection itemConfig = items.getConfigurationSection(itemName); ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = itemConfig.getInt("item-data"); if(itemData == -1) { builder = new ItemBuilder(OtherUtils.matchMaterial(itemConfig.getString("material"))); @@ -179,7 +179,7 @@ public static Inventory getWorkStatusJobMenu(ConfigurationSection guiSettings, P if(category.getBoolean("put-background-item")) { ItemBuilder builder; - if(PicoJobsPlugin.getInstance().isOlderThan("1.12.2")) { + if(PicoJobsPlugin.getInstance().isLessThan("1.12.2")) { int itemData = category.getInt("item-data"); if(itemData == -1) { builder = new ItemBuilder(OtherUtils.matchMaterial(category.getString("item"))); diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/StorageManager.java b/src/main/java/com/gmail/picono435/picojobs/storage/StorageManager.java index 7050da9e..d651a155 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/StorageManager.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/StorageManager.java @@ -1,6 +1,5 @@ package com.gmail.picono435.picojobs.storage; -import java.util.Arrays; import java.util.Locale; import java.util.logging.Level; @@ -11,11 +10,7 @@ import com.gmail.picono435.picojobs.storage.file.JsonStorage; import com.gmail.picono435.picojobs.storage.file.YamlStorage; import com.gmail.picono435.picojobs.storage.mongodb.MongoStorage; -import com.gmail.picono435.picojobs.storage.sql.MariaDbStorage; -import com.gmail.picono435.picojobs.storage.sql.MySqlStorage; -import com.gmail.picono435.picojobs.storage.sql.PostgreStorage; -import com.gmail.picono435.picojobs.storage.sql.file.H2Storage; -import com.gmail.picono435.picojobs.storage.sql.file.SqliteStorage; +import com.gmail.picono435.picojobs.storage.sql.*; public class StorageManager { diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/cache/CacheManager.java b/src/main/java/com/gmail/picono435/picojobs/storage/cache/CacheManager.java index 5ead0016..32eb3fe9 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/cache/CacheManager.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/cache/CacheManager.java @@ -1,8 +1,6 @@ package com.gmail.picono435.picojobs.storage.cache; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; import com.gmail.picono435.picojobs.PicoJobsPlugin; import com.gmail.picono435.picojobs.api.JobPlayer; @@ -52,4 +50,20 @@ public void removeFromCache(UUID uuid) { cache.remove(uuid); } + /** + * Gets all players from the cache system + * + * @return the job player uuid list of all jobplayers cached + */ + public List getAllFromCache() { + return new ArrayList<>(cache.keySet()); + } + + /** + * Clears all the cache saved in the plugin, make sure you know what you doing before calling this + */ + public void clearCache() { + cache.clear(); + } + } diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/H2Storage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/H2Storage.java new file mode 100644 index 00000000..e1429cb2 --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/H2Storage.java @@ -0,0 +1,40 @@ +package com.gmail.picono435.picojobs.storage.sql; + +import com.gmail.picono435.picojobs.PicoJobsPlugin; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.zaxxer.hikari.HikariDataSource; +import org.h2.tools.RunScript; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class H2Storage extends HikariStorageFactory { + + @Override + protected boolean initializeStorage() throws Exception { + configurationSection = PicoJobsAPI.getSettingsManager().getRemoteSqlConfiguration(); + + if(PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2.zip").toFile().exists()) { + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2.mv.db").toFile().delete(); + RunScript.main("-url jdbc:h2:$f -script $f.zip -options compression zip".replace("$f", PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2").toAbsolutePath().toString()).split(" ")); + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2.zip").toFile().delete(); + } + + config.setDriverClassName("org.h2.Driver"); + //config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource"); + config.setJdbcUrl("jdbc:h2:" + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2")); + + this.hikari = new HikariDataSource(config); + + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));")) { + stm.execute(); + } + return false; + } + + @Override + public void destroyStorage() { + hikari.close(); + } +} diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/HikariStorageFactory.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/HikariStorageFactory.java index 5a747fff..92bc410f 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/HikariStorageFactory.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/HikariStorageFactory.java @@ -19,48 +19,33 @@ public abstract class HikariStorageFactory extends StorageFactory { @Override public boolean createPlayer(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("INSERT INTO " + configurationSection.getString("tablename") + " (`uuid`) VALUES (?)"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("INSERT INTO " + configurationSection.getString("tablename") + " (`uuid`) VALUES (?)")) { stm.setString(1, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } @Override public boolean playerExists(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `uuid` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `uuid` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); - if(rs.next()) { - stm.close(); - conn.close(); - return true; - } else { - stm.close(); - conn.close(); - return false; - } + return rs.next(); } } @Override public String getJob(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `job` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `job` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); if(rs.next()) { - String result = rs.getString("job"); - stm.close(); - conn.close(); - return result; + return rs.getString("job"); } else { - stm.close(); - conn.close(); return null; } } @@ -68,18 +53,13 @@ public String getJob(UUID uuid) throws Exception { @Override public double getMethod(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `method` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `method` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); if(rs.next()) { - double result = rs.getDouble("method"); - stm.close(); - conn.close(); - return result; + return rs.getDouble("method"); } else { - stm.close(); - conn.close(); return 0; } } @@ -87,18 +67,13 @@ public double getMethod(UUID uuid) throws Exception { @Override public double getMethodLevel(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `level` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `level` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); if(rs.next()) { - double result = rs.getDouble("level"); - stm.close(); - conn.close(); - return result; + return rs.getDouble("level"); } else { - stm.close(); - conn.close(); return 0; } } @@ -106,18 +81,13 @@ public double getMethodLevel(UUID uuid) throws Exception { @Override public boolean isWorking(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `is-working` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `is-working` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); if(rs.next()) { - boolean result = rs.getBoolean("is-working"); - stm.close(); - conn.close(); - return result; + return rs.getBoolean("is-working"); } else { - stm.close(); - conn.close(); return false; } } @@ -125,18 +95,13 @@ public boolean isWorking(UUID uuid) throws Exception { @Override public double getSalary(UUID uuid) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `salary` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("SELECT `salary` FROM " + configurationSection.getString("tablename") + " WHERE `uuid`=?")) { stm.setString(1, uuid.toString()); ResultSet rs = stm.executeQuery(); if(rs.next()) { - double result = rs.getDouble("salary"); - stm.close(); - conn.close(); - return result; + return rs.getDouble("salary"); } else { - stm.close(); - conn.close(); return 0; } } @@ -144,65 +109,55 @@ public double getSalary(UUID uuid) throws Exception { @Override public boolean setJob(UUID uuid, String job) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `job`=? WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `job`=? WHERE `uuid`=?")) { stm.setString(1, job); stm.setString(2, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } @Override public boolean setMethod(UUID uuid, double method) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `method`=? WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `method`=? WHERE `uuid`=?")) { stm.setDouble(1, method); stm.setString(2, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } @Override public boolean setMethodLevel(UUID uuid, double level) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `level`=? WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `level`=? WHERE `uuid`=?")) { stm.setDouble(1, level); stm.setString(2, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } @Override public boolean setWorking(UUID uuid, boolean isWorking) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `is-working`=? WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `is-working`=? WHERE `uuid`=?")) { stm.setBoolean(1, isWorking); stm.setString(2, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } @Override public boolean setSalary(UUID uuid, double salary) throws Exception { - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `salary`=? WHERE `uuid`=?"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("UPDATE " + configurationSection.getString("tablename") + " SET `salary`=? WHERE `uuid`=?")) { stm.setDouble(1, salary); stm.setString(2, uuid.toString()); int result = stm.executeUpdate(); - stm.close(); - conn.close(); return result >= 1; } } diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/MariaDbStorage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/MariaDbStorage.java index f4abc69c..7ea40f60 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/MariaDbStorage.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/MariaDbStorage.java @@ -27,11 +27,9 @@ public boolean initializeStorage() throws SQLException { this.hikari = new HikariDataSource(config); - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));")) { stm.execute(); - stm.close(); - conn.close(); } return false; } @@ -39,6 +37,5 @@ public boolean initializeStorage() throws SQLException { @Override public void destroyStorage() { hikari.close(); - return; } } diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/MySqlStorage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/MySqlStorage.java index 80c60c52..4b30d096 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/MySqlStorage.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/MySqlStorage.java @@ -25,11 +25,9 @@ public boolean initializeStorage() throws SQLException { this.hikari = new HikariDataSource(config); - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));")) { stm.execute(); - stm.close(); - conn.close(); } return false; } @@ -37,6 +35,5 @@ public boolean initializeStorage() throws SQLException { @Override public void destroyStorage() { hikari.close(); - return; } } diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/PostgreStorage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/PostgreStorage.java index 40db5c2c..a6fb32ac 100644 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/PostgreStorage.java +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/PostgreStorage.java @@ -27,11 +27,9 @@ public boolean initializeStorage() throws SQLException { this.hikari = new HikariDataSource(config); - try(Connection conn = hikari.getConnection()) { - PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));"); + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));")) { stm.execute(); - stm.close(); - conn.close(); } return false; } @@ -39,6 +37,5 @@ public boolean initializeStorage() throws SQLException { @Override public void destroyStorage() { hikari.close(); - return; } } diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/SqliteStorage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/SqliteStorage.java new file mode 100644 index 00000000..0989ad36 --- /dev/null +++ b/src/main/java/com/gmail/picono435/picojobs/storage/sql/SqliteStorage.java @@ -0,0 +1,33 @@ +package com.gmail.picono435.picojobs.storage.sql; + +import com.gmail.picono435.picojobs.PicoJobsPlugin; +import com.gmail.picono435.picojobs.api.PicoJobsAPI; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.Connection; +import java.sql.PreparedStatement; + +public class SqliteStorage extends HikariStorageFactory { + + @Override + protected boolean initializeStorage() throws Exception { + configurationSection = PicoJobsAPI.getSettingsManager().getRemoteSqlConfiguration(); + + config.setDriverClassName("org.sqlite.JDBC"); + //config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource"); + config.setJdbcUrl("jdbc:sqlite:" + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-sqlite.db")); + + this.hikari = new HikariDataSource(config); + + try(Connection conn = hikari.getConnection(); + PreparedStatement stm = conn.prepareStatement("CREATE TABLE IF NOT EXISTS " + configurationSection.getString("tablename") + " (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));")) { + stm.execute(); + } + return false; + } + + @Override + public void destroyStorage() { + hikari.close(); + } +} diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/FlatfileStorageFactory.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/FlatfileStorageFactory.java deleted file mode 100644 index 10bd02fc..00000000 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/FlatfileStorageFactory.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.gmail.picono435.picojobs.storage.sql.file; - -import java.io.File; -import java.lang.reflect.Constructor; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.UUID; -import java.util.logging.Level; - -import com.gmail.picono435.picojobs.PicoJobsPlugin; -import com.gmail.picono435.picojobs.storage.StorageFactory; - -public abstract class FlatfileStorageFactory extends StorageFactory { - - protected Connection conn; - protected Constructor connectionConstructor; - - protected abstract Connection getConnection() throws Exception; - - @Override - protected void destroyStorage() { - try { - this.connectionConstructor = null; - } catch(Exception ex) { - PicoJobsPlugin.getInstance().sendConsoleMessage(Level.SEVERE, "Error connecting to the storage. The plugin will not work correctly."); - return; - } - } - - public void backupDataTo(File file) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SCRIPT TO ?"); - stm.setString(1, file.getAbsolutePath()); - stm.execute(); - stm.close(); - } - } - - public void retrieveDataFrom(File file) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("RUNSCRIPT FROM ?"); - stm.setString(1, file.getAbsolutePath()); - stm.execute(); - stm.close(); - } - } - - @Override - public boolean createPlayer(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("INSERT INTO `jobplayers` (`uuid`) VALUES (?)"); - stm.setString(1, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - - @Override - public boolean playerExists(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `uuid` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - stm.close(); - return true; - } else { - stm.close(); - return false; - } - } - } - - @Override - public String getJob(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `job` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - String result = rs.getString("job"); - stm.close(); - return result; - } else { - stm.close(); - return null; - } - } - } - - @Override - public double getMethod(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `method` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - double result = rs.getDouble("method"); - stm.close(); - return result; - } else { - stm.close(); - return 0; - } - } - } - - @Override - public double getMethodLevel(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `level` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - double result = rs.getDouble("level"); - stm.close(); - return result; - } else { - stm.close(); - return 0; - } - } - } - - @Override - public boolean isWorking(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `is-working` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - boolean result = rs.getBoolean("is-working"); - stm.close(); - return result; - } else { - stm.close(); - return false; - } - } - } - - @Override - public double getSalary(UUID uuid) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("SELECT `salary` FROM `jobplayers` WHERE `uuid`=?"); - stm.setString(1, uuid.toString()); - ResultSet rs = stm.executeQuery(); - if(rs.next()) { - double result = rs.getDouble("salary"); - stm.close(); - return result; - } else { - stm.close(); - return 0; - } - } - } - - @Override - public boolean setJob(UUID uuid, String job) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE `jobplayers` SET `job`=? WHERE `uuid`=?"); - stm.setString(1, job); - stm.setString(2, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - - @Override - public boolean setMethod(UUID uuid, double method) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE `jobplayers` SET `method`=? WHERE `uuid`=?"); - stm.setDouble(1, method); - stm.setString(2, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - - @Override - public boolean setMethodLevel(UUID uuid, double level) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE `jobplayers` SET `level`=? WHERE `uuid`=?"); - stm.setDouble(1, level); - stm.setString(2, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - - @Override - public boolean setWorking(UUID uuid, boolean isWorking) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE `jobplayers` SET `is-working`=? WHERE `uuid`=?"); - stm.setBoolean(1, isWorking); - stm.setString(2, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - - @Override - public boolean setSalary(UUID uuid, double salary) throws Exception { - try(Connection conn = getConnection()) { - PreparedStatement stm = conn.prepareStatement("UPDATE `jobplayers` SET `salary`=? WHERE `uuid`=?"); - stm.setDouble(1, salary); - stm.setString(2, uuid.toString()); - int result = stm.executeUpdate(); - stm.close(); - return result >= 1; - } - } - -} diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/H2Storage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/H2Storage.java deleted file mode 100644 index 2258a155..00000000 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/H2Storage.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gmail.picono435.picojobs.storage.sql.file; - -import java.io.File; -import java.nio.file.Path; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.util.Properties; - -import com.gmail.picono435.picojobs.PicoJobsPlugin; -import com.gmail.picono435.picojobs.api.PicoJobsAPI; -import org.codehaus.plexus.util.FileUtils; - -public class H2Storage extends FlatfileStorageFactory { - - @Override - protected boolean initializeStorage() throws Exception { - this.connectionConstructor = Class.forName("org.h2.jdbc.JdbcConnection").getConstructor(String.class, Properties.class); - - PreparedStatement stm = getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS `jobplayers` (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));"); - stm.execute(); - stm.close(); - return true; - } - - @Override - protected Connection getConnection() throws Exception { - if(this.conn == null || this.conn.isClosed() || !this.conn.isValid(15)) { - this.conn = (Connection) this.connectionConstructor.newInstance("jdbc:h2:" + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2"), new Properties()); - Path scriptFile = PicoJobsPlugin.getInstance().getDataFolder().toPath().resolve("storage").resolve("script").toAbsolutePath(); - if(scriptFile.toFile().exists()) { - // Import data to the database - PreparedStatement stm = conn.prepareStatement("RUNSCRIPT FROM ?"); - stm.setString(1, scriptFile.toString()); - stm.execute(); - stm.close(); - scriptFile.toFile().delete(); - this.conn = (Connection) this.connectionConstructor.newInstance("jdbc:h2:" + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-h2"), new Properties()); - } - } - return this.conn; - } -} \ No newline at end of file diff --git a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/SqliteStorage.java b/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/SqliteStorage.java deleted file mode 100644 index f615155f..00000000 --- a/src/main/java/com/gmail/picono435/picojobs/storage/sql/file/SqliteStorage.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.gmail.picono435.picojobs.storage.sql.file; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.util.Properties; - -import com.gmail.picono435.picojobs.PicoJobsPlugin; - -public class SqliteStorage extends FlatfileStorageFactory { - - @Override - protected boolean initializeStorage() throws Exception { - this.connectionConstructor = Class.forName("org.sqlite.jdbc4.JDBC4Connection").getConstructor(String.class, String.class, Properties.class); - - PreparedStatement stm = getConnection().prepareStatement("CREATE TABLE IF NOT EXISTS `jobplayers` (`uuid` VARCHAR(255) NOT NULL, `job` TEXT DEFAULT NULL, `method` DOUBLE DEFAULT '0', `level` DOUBLE DEFAULT '0', `salary` DOUBLE DEFAULT '0', `is-working` BOOLEAN DEFAULT FALSE, PRIMARY KEY (`uuid`));"); - stm.execute(); - stm.close(); - return true; - } - - @Override - protected Connection getConnection() throws Exception { - if(this.conn == null || this.conn.isClosed()) { - this.conn = (Connection) this.connectionConstructor.newInstance("jdbc:sqlite:" + PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("picojobs-sqlite.db"), PicoJobsPlugin.getInstance().getDataFolder().toPath().toAbsolutePath().resolve("storage").resolve("picojobs-sqlite.db").toString(), new Properties()); - } - return this.conn; - } -} diff --git a/src/main/java/com/gmail/picono435/picojobs/utils/ItemBuilder.java b/src/main/java/com/gmail/picono435/picojobs/utils/ItemBuilder.java index 582e728f..c4f4d167 100644 --- a/src/main/java/com/gmail/picono435/picojobs/utils/ItemBuilder.java +++ b/src/main/java/com/gmail/picono435/picojobs/utils/ItemBuilder.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; @@ -104,7 +106,11 @@ public ItemBuilder setLore(String... lore){ public ItemBuilder setLore(List lore) { ItemMeta im = is.getItemMeta(); - im.setLore(lore); + List newLore = new ArrayList<>(); + for(String l : lore) { + newLore.add(PlaceholderAPI.setPlaceholders(null, ChatColor.translateAlternateColorCodes('&', l))); + } + im.setLore(newLore); is.setItemMeta(im); return this; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c9a43e6a..c10f5114 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -24,7 +24,9 @@ debug: false lang: "en-GB" # Here you can put the name of your server, this message will appier in the start of all messages. To disable just put nothing. prefix: "&6[PicoJobs] " -# Here you can enable/disable the auto update +# Here you can enable/disable the update checker +update-checker: true +# Here you can enable/disable the auto update (ignored if update-checker is false) auto-update: true ################################################################################# diff --git a/src/main/resources/langs/hu-HU.yml b/src/main/resources/langs/hu-HU.yml index 23e952d2..fa4df0f5 100644 --- a/src/main/resources/langs/hu-HU.yml +++ b/src/main/resources/langs/hu-HU.yml @@ -10,10 +10,10 @@ ## ################################################################################# #In this category you can change the general messages of the plugin -no-permission: "&cHey! You do not have permission to execute that command." -ignore-action: "&cHey! Don't be lazy and go speak with the NPC." -choosed-job: "&aCongratulations! You choosed the job %jobplayer_job%&a." -accepted-work: "&aYou accepted the work of %jobplayer_work%." +no-permission: "&cHé! Nincs jogosultsága a parancs végrehajtásához." +ignore-action: "&cHé! Ne légy lusta, és beszélj az NPC-vel." +choosed-job: "&aGratulálunk! Munkát választottál: %jobplayer_job%&a." +accepted-work: "&a Elfogadtad a munkát. %jobplayer_work%." no-salary: "&cYou do not have enough salary to get! Please go work ;(" got-salary: "&aGreat Work! You just got your %jobplayer_salary% salary!" finished-work: "&aCongratulations! You just finished your work. Use /jobs to get more information about it." diff --git a/src/main/resources/langs/pl-PL.yml b/src/main/resources/langs/pl-PL.yml index 84321d76..072e62ae 100644 --- a/src/main/resources/langs/pl-PL.yml +++ b/src/main/resources/langs/pl-PL.yml @@ -11,49 +11,49 @@ ################################################################################# #In this category you can change the general messages of the plugin no-permission: "&cHej! Nie masz uprawnień do wykonania tej komendy." -ignore-action: "&cHej! Bądź leniwy i porozmawiaj z NPC." +ignore-action: "&cHej! Nie bądź leniwy i porozmawiaj z NPC." choosed-job: "&aGratulacje! Wybrałeś zadanie %jobplayer_job%&a." accepted-work: "&aAkceptowałeś pracę %jobplayer_work%." no-salary: "&cNie masz wystarczająco dużo wynagrodzenia, aby dotrzeć! Przejdź do pracy ;(" got-salary: "&aŚwietna robota! Właśnie otrzymałeś %jobplayer_salary% pensję!" finished-work: "&aGratulacje! Właśnie zakończyłeś swoją pracę. Użyj /jobs aby uzyskać więcej informacji na ten temat." -need-level: "&cHej! Musisz zrobić %a% pracuje, aby wykonać tę akcję." +need-level: "&cHej! Musisz zrobić %a% zadań, aby wykonać tę akcję." no-args: "&cHej! Użyj poprawnej składni." my-salary: "&aMasz %jobplayer_salary%$ wynagrodzenia." unknow-job: "&cTo zadanie nie zostało znalezione, użyj TAB COMPLETE, aby uzyskać listę zadań." #In this message you can use the placeholders: %cooldown_mtime% -> Minecraft Time // %cooldown_time% -> Real Life Time -salary-cooldown: "&cMusisz poczekać więcej %cooldown_mtime% przed ponownym pobraniem wynagrodzenia." +salary-cooldown: "&cMusisz poczekać jeszcze %cooldown_mtime% przed ponownym pobraniem wynagrodzenia." work-status: "&aOto co musisz zrobić: %jobplayer_work%" admin-commands: |- &6Pełna lista poleceń: &e/jobsadmin help &6- &eZobacz te wiadomości &e/jobsadmin info &6- &ePobiera informacje o graczu - &e/jobsadmin przeładuj &6- &eOdśwież wszystkie możliwe konfiguracje. - &e/jobsadmin aktualizacja &6- &eInstaluje aktualizację wtyczki - &e/jobsadmin o &6- &eGets informacje o serwerze i wtyczce - &e/jobsadmin ustawione &6- &eUstawia salary/metodę gracza - &e/jobsadmin edytor &6- &eTworzy sesję edytora sieciowego + &e/jobsadmin reload &6- &eOdświeża wszystkie możliwe konfiguracje. + &e/jobsadmin update &6- &eInstaluje aktualizację wtyczki + &e/jobsadmin about &6- &ePokazuje informacje o serwerze i wtyczce + &e/jobsadmin set &6- &eUstawia wynagrodzenie/metodę gracza + &e/jobsadmin editor &6- &eTworzy sesję edytora sieciowego &e/jobsadmin apyedits &6- &eZastosuj edycje sesji edytora sieciowego - &e/jobsadmin debugg &6- &eWłącza tryb DEBUG wtyczki + &e/jobsadmin debug &6- &eWłącza tryb DEBUG wtyczki member-commands: |- &6Pełna lista poleceń: &e/jobs help &6- &eZobacz te wiadomości &e/jobs choose &6- &eWybiera pracę - &e/pracę &6- &eZobacz status/Akceptuj swoją pracę - &e/pracę &e/pracę &6- &eSprawdź swoje wynagrodzenie - &e/roboty wycofaj &6- &ePobrać swoje wynagrodzenie - &e/roboty pozostaw &6- &eOpuść pracę + &e/jobs work &6- &eZobacz status/Akceptuj swoją pracę + &e/jobs salary &e/pracę &6- &eSprawdź swoje wynagrodzenie + &e/jobs withdraw &6- &ePobierz swoje wynagrodzenie + &e/jobs leave &6- &eOpuść pracę info-command: |- &6Status gracza %player_name% - &eSalary: %jobplayer_salary% - &eIs Working: %jobplayer_working% + &eWynagrodzenie: %jobplayer_salary% + &eCzy Pracuje: %jobplayer_working% &ePraca: %jobplayer_work% - &eJob: %jobplayer_job% -reload-command: "&aKonfiguracje, Zadania i Język zostały pomyślnie załadowane." + &eStanowisko: %jobplayer_job% +reload-command: "&aKonfiguracje, Prace i Język zostały pomyślnie załadowane." player-not-found: "&cTen gracz nie jest online, proszę wpisać prawidłowego gracza." unknow-error: "&cWystąpił nieznany błąd, sprawdź konsolę, aby uzyskać więcej informacji." left-job: "&cNie jesteś bezrobotny! Zalecamy wybrać nową ofertę pracy lub stracisz dużo pieniędzy." -already-updated: "&cWtyczka jest już w ostatniej wersji, aby uzyskać więcej informacji sprawdź naszą WIKI." +already-updated: "&cWtyczka jest już w najnowszej wersji, aby uzyskać więcej informacji sprawdź naszą WIKI." update-started: "&aAktualizacja wtyczki PicoJobs rozpoczęta, proszę czekać..." updated-sucefully: "&aWtyczka została zaktualizowana, uruchom ponownie serwer, aby zakończyć aktualizację." sucefully: "&aAkcja została wykonana z pewnością." @@ -66,15 +66,15 @@ invalid-arg: "&aWysłany argument jest nieprawidłowy. Proszę sprawdzić niepra #In this category you can change the formats of placeholders and other things #All these messages work with Player Placeholders ;) (PlaceholderAPI Required) #Change how the works should be displayed. (DEFAULT, to a specific job go into settings/jobs.yml) -break-work: "niszcz %a% bloków" +break-work: "zniszcz %a% bloków" kill-work: "zabij %a% osób" -fishing-work: "ryby %a% ryb" -place-work: "umieść %a% bloków" -craft-work: "twórz %a% przedmiotów" +fishing-work: "wyłów %a% ryb" +place-work: "postaw %a% bloków" +craft-work: "stwórz %a% przedmiotów" tame-work: "oswoić %a% zwierząt" shear-work: "ścinaj %a% owiec" fill-work: "wypełnij %a% wiader" -smelt-work: "przetapianie %a% przedmiotów" +smelt-work: "przetop %a% przedmiotów" eat-work: "zjedz %a% przedmiotów" enchanting-work: "zaklęcie %a% przedmiotów" repair-work: "napraw %a% przedmiotów" @@ -91,7 +91,7 @@ default-tag: "" #In this category you can add aliases for all the commands of the plugin aliases: jobs: - - "Zadania" + - "praca" - "praca" jobsadmin: - "jobsadmin" @@ -99,7 +99,7 @@ aliases: choose: "wybierz" work: "praca" salary: "wynagrodzenie" - withdraw: "wycofaj" + withdraw: "wypłać" leave: "opuść" help: "pomoc" info: "informacje" @@ -107,7 +107,7 @@ aliases: update: "aktualizuj" about: "o" set: "ustaw" - method: "Metoda" + method: "metoda" job: "praca" editor: "edytor" applyedits: "zastosowana edycja" @@ -130,4 +130,4 @@ months: "miesiące" month: "miesiąc" years: "lata" year: "rok" -and: "W przypadku gdy państwo członkowskie lub Szwajcaria stwierdzi, że dane państwo członkowskie lub Szwajcaria spełniają warunki określone w art. 4 ust. 1 lit. a) i b) oraz w art. 5 ust. 1 lit. b) i c) rozporządzenia (WE) nr 207/2009 oraz w art. 5 ust. 1 lit. b) i c) rozporządzenia (WE) nr 207/2009 oraz w art. 5 ust. 1 lit. b) tego rozporządzenia i art. 6 ust. 1 lit. b) tego rozporządzenia i c) tego rozporządzenia stosuje się od dnia 1 stycznia 2018 r." +and: "i" diff --git a/src/main/resources/langs/uk-UA.yml b/src/main/resources/langs/uk-UA.yml index fdd2cece..d5cd3911 100644 --- a/src/main/resources/langs/uk-UA.yml +++ b/src/main/resources/langs/uk-UA.yml @@ -11,15 +11,15 @@ ################################################################################# #In this category you can change the general messages of the plugin no-permission: "&cHey! Ви не маєте дозволу на виконання цієї команди." -ignore-action: "&cХей! Не ледачий і йдіть розмовляти з NPC." +ignore-action: "&cХей! Не будьте ледачм та йдіть розмовлятити з NPC." choosed-job: "&aВітаємо! Ви обрали завдання %jobplayer_job%&a." accepted-work: "&aВи прийняли роботу з %jobplayer_work%." no-salary: "&cУ вас недостатньо зарплатні! Будь ласка, йдіть до роботи ;(" got-salary: "&aВідмінна робота! Ви щойно отримали вашу зарплату %jobplayer_salary%!" -finished-work: "&aВітаємо! Ви щойно завершили роботу. Використовуйте /завдань, щоб отримати більше інформації." +finished-work: "&aВітаємо! Ви щойно завершили роботу. Використовуйте /jobs, щоб отримати більше інформації." need-level: "&cХей! Ви повинні зробити %a% роботи для виконання цієї дії." -no-args: "&cХей! Будь ласка, використайте правильний синтаксис." -my-salary: "&aУ вас є %jobplayer_salary%$ зарплатні." +no-args: "&cХей! Будь ласка, використовуйте правильний синтаксис!" +my-salary: "&aУ Вас є %jobplayer_salary%$ зарплатні." unknow-job: "&cЦе завдання не знайдено, будь ласка, використовуйте TAB COMPLETE для отримання списку завдань." #In this message you can use the placeholders: %cooldown_mtime% -> Minecraft Time // %cooldown_time% -> Real Life Time salary-cooldown: "&cВи повинні почекати більше %cooldown_mtime% перед тим, як отримати вашу зарплату знову." @@ -57,7 +57,7 @@ already-updated: "&cПлагін вже знаходиться в останні update-started: "&aОновлення плагіна PicoJobs запущено, будь ласка зачекайте..." updated-sucefully: "&aПлагін було успішно оновлено, будь ласка перезапустіть сервер, щоб завершити оновлення." sucefully: "&aЦя дія була успішно зроблена." -invalid-arg: "&aНадіслано аргумент недопустимий. Будь ласка, перевірте неправильну відповідь." +invalid-arg: "&aПомилка синтаксису. Будь ласка, перевірте неправильну відповідь." ################################################################################# ## #Format messages # @@ -69,10 +69,10 @@ invalid-arg: "&aНадіслано аргумент недопустимий. Б break-work: "зупинити %a% блоків" kill-work: "вбити %a% людей" fishing-work: "риби %a% риб" -place-work: "розмістити %a% блоків" +place-work: "розміняти %a% блоків" craft-work: "виробити %a% товарів" tame-work: "приручити %a% тварин" -shear-work: "стригти %a% овець" +shear-work: "постригти %a% овець" fill-work: "заповнити %a% відра" smelt-work: "переплавити %a% товарів" eat-work: "їжте %a% елементів" diff --git a/src/main/resources/settings/guis.yml b/src/main/resources/settings/guis.yml index 66ab220f..9b1795aa 100644 --- a/src/main/resources/settings/guis.yml +++ b/src/main/resources/settings/guis.yml @@ -74,8 +74,8 @@ gui-settings: - "&7Check our &8&ndiscord&r&7 to" - "&7get more information" - "" - - "&7If you want to buy the premium" - - "&7version go to our &8&nwebsite" + - "&7Check our new and improved" + - "&7PiconoDev &8&nwebsite" action: none material: "BOOKSHELF" item-data: 0 @@ -138,8 +138,8 @@ gui-settings: - "&7Check our &8&ndiscord&r&7 to" - "&7get more information" - "" - - "&7If you want to buy the premium" - - "&7version go to our &8&nwebsite" + - "&7Check our new and improved" + - "&7PiconoDev &8&nwebsite" action: none material: "BOOKSHELF" item-data: 0 diff --git a/src/main/resources/settings/jobs.yml b/src/main/resources/settings/jobs.yml index bcbe557b..e8a3f005 100644 --- a/src/main/resources/settings/jobs.yml +++ b/src/main/resources/settings/jobs.yml @@ -31,7 +31,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: true # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["COW", "PIG", "CHICKEN", "SHEEP"] + whitelist: + kill_entity: ["COW", "PIG", "CHICKEN", "SHEEP"] # The work message that you want to use - OPTIONAL [default can be found in the language file] work-message: "kill %a% animals" # Choose Job Menu settings @@ -44,6 +45,11 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by hunting" + - "&8 animals" + # This is a example of a enchanter job enchanter: @@ -52,7 +58,7 @@ jobs: # The tag of the job tag: "&c[E]" # The type of the job - type: "enchanting" + types: [enchanting] # Put here the default kills, (this change depends on the frequency) method: 10 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -83,6 +89,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by enchanting" + - "&8 items" # This is a example of a woodcutter job woodcutter: @@ -91,7 +101,7 @@ jobs: # The tag of the job tag: "&6[W]" # The type of the job - type: "break" + types: [break] # Put here the default kills, (this change depends on the frequency) method: 15 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -109,7 +119,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: true # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["OAK_WOOD", "OAK_LOG", "BIRCH_WOOD", "BIRCH_LOG", "JUNGLE_WOOD", "JUNGLE_LOG", "ACACIA_WOOD", "ACACIA_LOG", "DARK_OAK_WOOD", "DARK_OAK_LOG"] + whitelist: + break: ["OAK_WOOD", "OAK_LOG", "BIRCH_WOOD", "BIRCH_LOG", "JUNGLE_WOOD", "JUNGLE_LOG", "ACACIA_WOOD", "ACACIA_LOG", "DARK_OAK_WOOD", "DARK_OAK_LOG", "SPRUCE_WOOD", "SPRUCE_LOG"] # The work message that you want to use - OPTIONAL [default can be found in the language file] work-message: "cut %a% woods" # Choose Job Menu settings @@ -122,6 +133,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by cutting" + - "&8 trees" # This is a example of a miner job miner: @@ -130,7 +145,7 @@ jobs: # The tag of the job tag: "&7[M]" # The type of the job - type: "break" + types: [break] # Put here the default kills, (this change depends on the frequency) method: 10 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -149,24 +164,25 @@ jobs: use-whitelist: true # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL whitelist: - - gold_ore - - iron_ore - - coal_ore - - lapis_ore - - diamond_ore - - redstone_ore - - emerald_ore - - nether_quartz_ore - - nether_gold_ore - - copper_ore - - deepslate_gold_ore - - deepslate_iron_ore - - deepslate_coal_ore - - deepslate_lapis_ore - - deepslate_diamond_ore - - deepslate_redstone_ore - - deepslate_emerald_ore - - deepslate_copper_ore + break: + - gold_ore + - iron_ore + - coal_ore + - lapis_ore + - diamond_ore + - redstone_ore + - emerald_ore + - nether_quartz_ore + - nether_gold_ore + - copper_ore + - deepslate_gold_ore + - deepslate_iron_ore + - deepslate_coal_ore + - deepslate_lapis_ore + - deepslate_diamond_ore + - deepslate_redstone_ore + - deepslate_emerald_ore + - deepslate_copper_ore # The work message that you want to use - OPTIONAL [default can be found in the language file] work-message: "mine %a% ores" # Choose Job Menu settings @@ -179,6 +195,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by mining" + - "&8 ores" # This is a example of a builder job builder: @@ -187,7 +207,7 @@ jobs: # The tag of the job tag: "&d[B]" # The type of the job - type: "place" + types: [place] # Put here the default kills, (this change depends on the frequency) method: 35 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -205,7 +225,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: true # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["bricks"] + whitelist: + place: ["bricks"] # The work message that you want to use - OPTIONAL [default can be found in the language file] work-message: "place %a% bricks" # Choose Job Menu settings @@ -218,6 +239,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by building" + - "&8 with bricks" # This is a example of a digger job digger: @@ -226,7 +251,7 @@ jobs: # The tag of the job tag: "&3[D]" # The type of the job - type: "break" + types: [break] # Put here the default kills, (this change depends on the frequency) method: 25 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -244,7 +269,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: true # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["dirt", "grass", "grass_block"] + whitelist: + break: ["dirt", "grass", "grass_block"] # The work message that you want to use - OPTIONAL [default can be found in the language file] work-message: "dig %a% dirts" # Choose Job Menu settings @@ -257,6 +283,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by digging" + - "&8 dirt" # This is a example of a craftsman job craftsman: @@ -265,7 +295,7 @@ jobs: # The tag of the job tag: "&a[C]" # The type of the job - type: "craft" + types: [craft] # Put here the default kills, (this change depends on the frequency) method: 10 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -296,6 +326,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by crafting" + - "&8 items" # This is a example of a fisherman job fisherman: @@ -304,7 +338,7 @@ jobs: # The tag of the job tag: "&b[F]" # The type of the job - type: "fishing" + types: [fishing] # Put here the default kills, (this change depends on the frequency) method: 25 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -322,7 +356,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: false # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["NAME_TAG"] + whitelist: + fishing: ["NAME_TAG"] # The work message that you want to use - OPTIONAL [default can be found in the language file] # work-message: "fish %a% fishes" # Choose Job Menu settings @@ -335,6 +370,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by fishing" + - "&8 fish" # This is a example of a weaponsmith job weaponsmith: @@ -343,7 +382,7 @@ jobs: # The tag of the job tag: "&8[W]" # The type of the job - type: "repair" + types: [repair] # Put here the default kills, (this change depends on the frequency) method: 8 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -374,6 +413,10 @@ jobs: item-data: 0 # If you want to the item be enchanted or not enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by repairing" + - "&8 tools" # This is a example of a killer job killer: @@ -382,7 +425,7 @@ jobs: # The tag of the job tag: "&9[K]" # The type of the job - type: "kill" + types: [kill] # Put here the default kills, (this change depends on the frequency) method: 20 # If the player requires a permission to get the job. List of permission nodes in https://github.com/Picono435/PicoJobs/wiki/Permissions @@ -400,7 +443,8 @@ jobs: # Use whitelist or blacklist - OPTIONAL [requires="whitelist"] use-whitelist: false # The block whitelist/blacklist, depending on what is in use-whitelist - OPTIONAL - whitelist: ["weaponsmith"] + whitelist: + kill: ["weaponsmith"] # The work message that you want to use - OPTIONAL [default can be found in the language file] # work-message: "kill %a% people" # Choose Job Menu settings @@ -412,4 +456,8 @@ jobs: # The item data LEGACY ONLY item-data: 0 # If you want to the item be enchanted or not - enchanted: false \ No newline at end of file + enchanted: false + # The lore of the item ( what appears bellow, you can use placeholders here) + lore: + - "&8Earn by killing" + - "&8 players" \ No newline at end of file