From 3f71080b028ac26e85fab586f37b319961e08ee3 Mon Sep 17 00:00:00 2001 From: Zrips Date: Sat, 20 May 2017 14:46:11 +0300 Subject: [PATCH] 1.12 support and new version checker --- pom.xml | 5 +- src/main/java/com/gamingmesh/jobs/Jobs.java | 19 ++- .../jobs/config/BossBarManager.java | 5 +- .../jobs/config/GeneralConfigManager.java | 15 +- .../jobs/economy/BufferedEconomy.java | 3 +- .../jobs/listeners/JobsListener.java | 6 + .../com/gamingmesh/jobs/nmsUtil/v1_12.java | 39 +++++ .../com/gamingmesh/jobs/stuff/ActionBar.java | 118 +++++--------- .../gamingmesh/jobs/stuff/VersionChecker.java | 144 ++++++++++++++++++ src/main/resources/plugin.yml | 3 +- 10 files changed, 267 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/gamingmesh/jobs/nmsUtil/v1_12.java create mode 100644 src/main/java/com/gamingmesh/jobs/stuff/VersionChecker.java diff --git a/pom.xml b/pom.xml index 6cdc42d3..ca127f4c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 Jobs jobs - 3.9.0 + 3.9.2 Jobs http://maven.apache.org @@ -118,6 +118,9 @@ org.apache.maven.plugins maven-jar-plugin 2.3.1 + + C:\Users\Arte\Desktop\Server\plugins + diff --git a/src/main/java/com/gamingmesh/jobs/Jobs.java b/src/main/java/com/gamingmesh/jobs/Jobs.java index 85be1457..638c7cae 100644 --- a/src/main/java/com/gamingmesh/jobs/Jobs.java +++ b/src/main/java/com/gamingmesh/jobs/Jobs.java @@ -88,6 +88,7 @@ import com.gamingmesh.jobs.stuff.Debug; import com.gamingmesh.jobs.stuff.JobsClassLoader; import com.gamingmesh.jobs.stuff.Loging; import com.gamingmesh.jobs.stuff.TabComplete; +import com.gamingmesh.jobs.stuff.VersionChecker; import com.gamingmesh.jobs.tasks.BufferedPaymentThread; import com.gamingmesh.jobs.tasks.DatabaseSaveThread; @@ -145,6 +146,8 @@ public class Jobs extends JavaPlugin { private static ActionBar actionbar; private boolean running = false; + protected static VersionChecker versionCheckManager; + protected static SelectionManager smanager; public void setMcMMOlistener() { @@ -686,12 +689,21 @@ public class Jobs extends JavaPlugin { return economy; } + /** + * Gets the version check manager + * @return the version check manager + */ + public static VersionChecker getVersionCheckManager() { + return versionCheckManager; + } + @Override public void onEnable() { running = true; - String packageName = getServer().getClass().getPackage().getName(); - String[] packageSplit = packageName.split("\\."); - version = packageSplit[packageSplit.length - 1].substring(0, packageSplit[packageSplit.length - 1].length() - 3); + + versionCheckManager = new VersionChecker(this); + version = versionCheckManager.getVersion().getShortVersion(); + try { Class nmsClass; nmsClass = Class.forName("com.gamingmesh.jobs.nmsUtil." + version); @@ -710,6 +722,7 @@ public class Jobs extends JavaPlugin { } try { + setActionBar(); YmlMaker jobConfig = new YmlMaker(this, "jobConfig.yml"); jobConfig.saveDefaultConfig(); diff --git a/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java b/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java index 108745bd..926a4ba6 100644 --- a/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java +++ b/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java @@ -18,6 +18,7 @@ import com.gamingmesh.jobs.container.BossBarInfo; import com.gamingmesh.jobs.container.Job; import com.gamingmesh.jobs.container.JobProgression; import com.gamingmesh.jobs.container.JobsPlayer; +import com.gamingmesh.jobs.stuff.VersionChecker.Version; public class BossBarManager { @@ -28,7 +29,7 @@ public class BossBarManager { } public synchronized void ShowJobProgression(final JobsPlayer player) { - if (Jobs.getActionBar().getVersion() < 1900) + if (Jobs.getVersionCheckManager().getVersion().isLower(Version.v1_9_R1)) return; if (player == null) @@ -48,7 +49,7 @@ public class BossBarManager { } public synchronized void ShowJobProgression(final JobsPlayer player, final JobProgression jobProg) { - if (Jobs.getActionBar().getVersion() < 1900) + if (Jobs.getVersionCheckManager().getVersion().isLower(Version.v1_9_R1)) return; String playername = player.getUserName(); if (!Jobs.getBossBarToggleList().containsKey(playername) && Jobs.getGCManager().BossBarsMessageByDefault) diff --git a/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java b/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java index 8b1823fa..b3d5c0ef 100644 --- a/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java +++ b/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java @@ -42,6 +42,7 @@ import com.gamingmesh.jobs.container.Schedule; import com.gamingmesh.jobs.dao.JobsDAOMySQL; import com.gamingmesh.jobs.dao.JobsDAOSQLite; import com.gamingmesh.jobs.stuff.ChatColor; +import com.gamingmesh.jobs.stuff.VersionChecker.Version; public class GeneralConfigManager { private Jobs plugin; @@ -144,6 +145,8 @@ public class GeneralConfigManager { public boolean DBCleaningUsersUse; public int DBCleaningUsersDays; + private boolean ShowNewVersion; + public HashMap> getCommandArgs() { return commandArgs; } @@ -438,6 +441,10 @@ public class GeneralConfigManager { if (MultiServerCompatability) saveOnDisconnect = true; + c.getW().addComment("Optimizations.NewVersion", + "When set to true staff will be informed about new Jobs plugin version", "You need to have jobs.versioncheck permission node"); + ShowNewVersion = c.get("Optimizations.NewVersion", true); + c.getW().addComment("Optimizations.DBCleaning.Jobs.Use", "Warning!!! before enabling this feature, please make data base backup, just in case there will be some issues with data base cleaning", "When set to true, jobs data base will be cleaned on each startup to avoid having not used jobs", @@ -518,7 +525,7 @@ public class GeneralConfigManager { modifyChat = c.get("modify-chat", true); modifyChatPrefix = c.get("modify-chat-prefix", "&c[", true); - modifyChatSuffix = c.get("modify-chat-suffix", "&c]", true); + modifyChatSuffix = c.get("modify-chat-suffix", "&c]&r", true); modifyChatSeparator = c.get("modify-chat-separator", " ", true); c.getW().addComment("UseCustomNames", "Do you want to use custom item/block/mob/enchant/color names", @@ -768,7 +775,7 @@ public class GeneralConfigManager { c.getW().addComment("BossBar.Enabled", "Enables BossBar feature", "Works only from 1.9 mc version"); BossBarEnabled = c.get("BossBar.Enabled", true); - if (Jobs.getActionBar().getVersion() < 1900) { + if (Jobs.getVersionCheckManager().getVersion().isLower(Version.v1_9_R1)) { BossBarEnabled = false; Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[Jobs] Your server version don't support BossBar. This feature will be disabled"); } @@ -885,4 +892,8 @@ public class GeneralConfigManager { public int getSelectionTooldID() { return getSelectionTooldID; } + + public boolean isShowNewVersion() { + return ShowNewVersion; + } } diff --git a/src/main/java/com/gamingmesh/jobs/economy/BufferedEconomy.java b/src/main/java/com/gamingmesh/jobs/economy/BufferedEconomy.java index a73c2f89..feda7e3f 100644 --- a/src/main/java/com/gamingmesh/jobs/economy/BufferedEconomy.java +++ b/src/main/java/com/gamingmesh/jobs/economy/BufferedEconomy.java @@ -30,6 +30,7 @@ import com.gamingmesh.jobs.Jobs; import com.gamingmesh.jobs.api.JobsPaymentEvent; import com.gamingmesh.jobs.container.JobsPlayer; import com.gamingmesh.jobs.stuff.ChatColor; +import com.gamingmesh.jobs.stuff.VersionChecker.Version; import com.gamingmesh.jobs.tasks.BufferedPaymentTask; public class BufferedEconomy { @@ -193,7 +194,7 @@ public class BufferedEconomy { try { // Action bar stuff Jobs.getActionBar().ShowActionBar(payment); - if (payment.getOfflinePlayer().isOnline() && Jobs.getActionBar().getVersion() > 1900) { + if (payment.getOfflinePlayer().isOnline() && Jobs.getVersionCheckManager().getVersion().isHigher(Version.v1_8_R3)) { JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(payment.getOfflinePlayer().getUniqueId()); Jobs.getBBManager().ShowJobProgression(jPlayer); } diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java index b36a0c17..8dd268dc 100644 --- a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java +++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java @@ -93,6 +93,12 @@ public class JobsListener implements Listener { return false; } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onJoin(PlayerJoinEvent event) { + if (Jobs.getGCManager().isShowNewVersion() && event.getPlayer().hasPermission("jobs.versioncheck")) + plugin.getVersionCheckManager().VersionCheck(event.getPlayer()); + } + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onSelection(PlayerInteractEvent event) { if (event.getPlayer() == null) diff --git a/src/main/java/com/gamingmesh/jobs/nmsUtil/v1_12.java b/src/main/java/com/gamingmesh/jobs/nmsUtil/v1_12.java new file mode 100644 index 00000000..adc8876b --- /dev/null +++ b/src/main/java/com/gamingmesh/jobs/nmsUtil/v1_12.java @@ -0,0 +1,39 @@ +package com.gamingmesh.jobs.nmsUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.inventory.ItemStack; + +import com.gamingmesh.jobs.NMS; + +public class v1_12 implements NMS { + @Override + public List getPistonRetractBlocks(BlockPistonRetractEvent event) { + List blocks = new ArrayList(); + blocks.addAll(event.getBlocks()); + return blocks; + } + + @Override + public String getRealType(Entity entity) { + return entity.getType().name(); + } + + @Override + public ItemStack getItemInMainHand(Player player) { + return player.getInventory().getItemInMainHand(); + } + + @Override + public Block getTargetBlock(Player player, int range) { + return player.getTargetBlock((Set) null, range); + } + +} diff --git a/src/main/java/com/gamingmesh/jobs/stuff/ActionBar.java b/src/main/java/com/gamingmesh/jobs/stuff/ActionBar.java index f5856e31..5a9073da 100644 --- a/src/main/java/com/gamingmesh/jobs/stuff/ActionBar.java +++ b/src/main/java/com/gamingmesh/jobs/stuff/ActionBar.java @@ -12,14 +12,14 @@ import org.bukkit.entity.Player; import com.gamingmesh.jobs.Jobs; import com.gamingmesh.jobs.economy.BufferedPayment; +import com.gamingmesh.jobs.stuff.VersionChecker.Version; /** * * @author hamzaxx */ public class ActionBar { - private int cleanVersion = -1; - private String version = ""; + private Version version = Version.v1_11_R1; private Object packet; private Method getHandle; private Method sendPacket; @@ -28,49 +28,13 @@ public class ActionBar { private Class nmsIChatBaseComponent; private Class packetType; - public int getVersion() { - if (cleanVersion == -1) - getInfo(); - return cleanVersion; - } - - private void getInfo() { + private Class ChatMessageclz; + private Class sub; + private Object[] consts; + + public ActionBar() { try { - String[] v = Bukkit.getServer().getClass().getPackage().getName().split("\\."); - version = v[v.length - 1]; - // Translating version to integer for simpler use - try { - cleanVersion = Integer.parseInt(version.replace("v", "").replace("V", "").replace("_", "").replace("r", "").replace("R", "")); - cleanVersion *= 10; - } catch (NumberFormatException e) { - // Fail safe if it for some reason can't translate version to integer - if (version.contains("v1_4")) - cleanVersion = 1400; - if (version.contains("v1_5")) - cleanVersion = 1500; - if (version.contains("v1_6")) - cleanVersion = 1600; - if (version.contains("v1_7")) - cleanVersion = 1700; - if (version.contains("v1_8_R1")) - cleanVersion = 1810; - if (version.contains("v1_8_R2")) - cleanVersion = 1820; - if (version.contains("v1_8_R3")) - cleanVersion = 1830; - if (version.contains("v1_9_R1")) - cleanVersion = 1910; - if (version.contains("v1_9_R2")) - cleanVersion = 1920; - if (version.contains("v1_10_R1")) - cleanVersion = 11010; - if (version.contains("v1_11_R1")) - cleanVersion = 11110; - } - - if (cleanVersion < 1400) - cleanVersion *= 10; - + version = Jobs.getVersionCheckManager().getVersion(); packetType = Class.forName(getPacketPlayOutChat()); Class typeCraftPlayer = Class.forName(getCraftPlayerClasspath()); Class typeNMSPlayer = Class.forName(getNMSPlayerClasspath()); @@ -81,17 +45,21 @@ public class ActionBar { playerConnection = typeNMSPlayer.getField("playerConnection"); sendPacket = typePlayerConnection.getMethod("sendPacket", Class.forName(getPacketClasspath())); + if (Jobs.getVersionCheckManager().getVersion().isHigher(Version.v1_11_R1)) { + ChatMessageclz = Class.forName(getChatMessageTypeClasspath()); + consts = ChatMessageclz.getEnumConstants(); + sub = consts[2].getClass(); + } + } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | NoSuchFieldException ex) { Bukkit.getLogger().log(Level.SEVERE, "Error {0}", ex); } + } public void ShowActionBar(BufferedPayment payment) { - - if (cleanVersion == -1) - getInfo(); - - if (cleanVersion == -1) + + if (!payment.getOfflinePlayer().isOnline()) return; String playername = payment.getOfflinePlayer().getName(); @@ -110,31 +78,15 @@ public class ActionBar { if (abp != null && show) { String Message = Jobs.getLanguage().getMessage("command.toggle.output.paid.main"); if (payment.getAmount() != 0D) - Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.money", "[amount]", convertAmount(payment.getAmount())); - + Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.money", "[amount]", String.format("%.2f", payment.getAmount())); if (payment.getPoints() != 0D) - Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.points", "[points]", convertAmount(payment.getPoints())); - + Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.points", "[points]", String.format("%.2f", payment.getPoints())); if (payment.getExp() != 0D) - Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.exp", "[exp]", convertAmount(payment.getExp())); - + Message = Message + " " + Jobs.getLanguage().getMessage("command.toggle.output.paid.exp", "[exp]", String.format("%.2f", payment.getExp())); send(abp, ChatColor.GREEN + Message); } } - private static String convertAmount(double amount) { - String format = "%.2f"; - if (amount % 1 == 0 || amount > 100 || amount < -100) { - amount = (int) Math.round(amount); - format = "%.0f"; - } else { - if ((amount * 10) % 1 == 0) { - format = "%.1f"; - } - } - return String.format(format, amount); - } - public void send(CommandSender receivingPacket, String msg) { try { if (msg == null || nmsChatSerializer == null || msg.isEmpty()) @@ -142,14 +94,16 @@ public class ActionBar { if (receivingPacket == null) return; - - if (cleanVersion < 1800 || !(receivingPacket instanceof Player)) { + + if (version.isLower(Version.v1_8_R1) || !(receivingPacket instanceof Player)) { receivingPacket.sendMessage(ChatColor.translateAlternateColorCodes('&', msg)); return; } Object serialized = nmsChatSerializer.getMethod("a", String.class).invoke(null, "{\"text\": \"" + ChatColor.translateAlternateColorCodes('&', msg) + "\"}"); - if (cleanVersion > 1800) { + if (Jobs.getVersionCheckManager().getVersion().isHigher(Version.v1_11_R1)) + packet = packetType.getConstructor(nmsIChatBaseComponent, sub).newInstance(serialized, consts[2]); + else if (version.isHigher(Version.v1_7_R4)) { packet = packetType.getConstructor(nmsIChatBaseComponent, byte.class).newInstance(serialized, (byte) 2); } else { packet = packetType.getConstructor(nmsIChatBaseComponent, int.class).newInstance(serialized, 2); @@ -163,32 +117,36 @@ public class ActionBar { } private String getCraftPlayerClasspath() { - return "org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"; + return "org.bukkit.craftbukkit." + version.name() + ".entity.CraftPlayer"; } private String getPlayerConnectionClasspath() { - return "net.minecraft.server." + version + ".PlayerConnection"; + return "net.minecraft.server." + version.name() + ".PlayerConnection"; } private String getNMSPlayerClasspath() { - return "net.minecraft.server." + version + ".EntityPlayer"; + return "net.minecraft.server." + version.name() + ".EntityPlayer"; } private String getPacketClasspath() { - return "net.minecraft.server." + version + ".Packet"; + return "net.minecraft.server." + version.name() + ".Packet"; } private String getIChatBaseComponentClasspath() { - return "net.minecraft.server." + version + ".IChatBaseComponent"; + return "net.minecraft.server." + version.name() + ".IChatBaseComponent"; } private String getChatSerializerClasspath() { - if (cleanVersion < 1820) - return "net.minecraft.server." + version + ".ChatSerializer"; - return "net.minecraft.server." + version + ".IChatBaseComponent$ChatSerializer";// 1_8_R2 moved to IChatBaseComponent + if (!Jobs.getVersionCheckManager().getVersion().isHigher(Version.v1_8_R2)) + return "net.minecraft.server." + version.name() + ".ChatSerializer"; + return "net.minecraft.server." + version.name() + ".IChatBaseComponent$ChatSerializer";// 1_8_R2 moved to IChatBaseComponent } private String getPacketPlayOutChat() { - return "net.minecraft.server." + version + ".PacketPlayOutChat"; + return "net.minecraft.server." + version.name() + ".PacketPlayOutChat"; + } + + private String getChatMessageTypeClasspath() { + return "net.minecraft.server." + version.name() + ".ChatMessageType"; } } \ No newline at end of file diff --git a/src/main/java/com/gamingmesh/jobs/stuff/VersionChecker.java b/src/main/java/com/gamingmesh/jobs/stuff/VersionChecker.java new file mode 100644 index 00000000..a0ad66cd --- /dev/null +++ b/src/main/java/com/gamingmesh/jobs/stuff/VersionChecker.java @@ -0,0 +1,144 @@ +package com.gamingmesh.jobs.stuff; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Arrays; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import com.gamingmesh.jobs.Jobs; + +public class VersionChecker { + Jobs plugin; + private int resource = 4216; + + public VersionChecker(Jobs plugin) { + this.plugin = plugin; + version = getCurrent(); + } + + private Version version = Version.v1_11_R1; + + public Version getVersion() { + return version; + } + + public enum Version { + v1_7_R1(), + v1_7_R2(), + v1_7_R3(), + v1_7_R4(), + v1_8_R1(), + v1_8_R2(), + v1_8_R3(), + v1_9_R1(), + v1_9_R2(), + v1_10_R1(), + v1_11_R1(), + v1_11_R2(), + v1_11_R3(), + v1_12_R1(), + v1_12_R2(), + v1_12_R3(), + v1_13_R1(), + v1_13_R2(), + v1_13_R3(); + + private Integer value = null; + private String shortVersion = null; + + public Integer getValue() { + if (value == null) + try { + value = Integer.valueOf(this.name().replaceAll("[^\\d.]", "")); + } catch (Exception e) { + } + return this.value; + } + + public String getShortVersion() { + if (shortVersion == null) + shortVersion = this.name().split("_R")[0]; + return shortVersion; + } + + public boolean isHigher(Version version) { + return getValue() > version.getValue(); + } + + public boolean isLower(Version version) { + return getValue() < version.getValue(); + } + } + + public static Version getCurrent() { + String[] v = Bukkit.getServer().getClass().getPackage().getName().split("\\."); + String vv = v[v.length - 1]; + for (Version one : Version.values()) { + if (one.name().equalsIgnoreCase(vv)) { + return one; + } + } + return null; + } + + public boolean isLower(Version version) { + return this.version.getValue() < version.getValue(); + } + + public boolean isLowerEquals(Version version) { + return this.version.getValue() <= version.getValue(); + } + + public boolean isHigher(Version version) { + return this.version.getValue() > version.getValue(); + } + + public boolean isHigherEquals(Version version) { + return this.version.getValue() >= version.getValue(); + } + + public void VersionCheck(final Player player) { + if (!Jobs.getGCManager().isShowNewVersion()) + return; + + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + String currentVersion = plugin.getDescription().getVersion(); + String newVersion = getNewVersion(); + if (newVersion == null || newVersion.equalsIgnoreCase(currentVersion)) + return; + List msg = Arrays.asList( + ChatColor.GREEN + "*********************** " + plugin.getDescription().getName() + " **************************", + ChatColor.GREEN + "* " + newVersion + " is now available! Your version: " + currentVersion, + ChatColor.GREEN + "* " + ChatColor.DARK_GREEN + plugin.getDescription().getWebsite(), + ChatColor.GREEN + "************************************************************"); + for (String one : msg) + if (player != null) + player.sendMessage(one); + } + }); + } + + public String getNewVersion() { + try { + HttpURLConnection con = (HttpURLConnection) new URL("http://www.spigotmc.org/api/general.php").openConnection(); + con.setDoOutput(true); + con.setRequestMethod("POST"); + con.getOutputStream().write(("key=98BE0FE67F88AB82B4C197FAF1DC3B69206EFDCC4D3B80FC83A00037510B99B4&resource=" + resource).getBytes("UTF-8")); + String version = new BufferedReader(new InputStreamReader(con.getInputStream())).readLine(); + if (version.length() <= 9) + return version; + } catch (Exception ex) { + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Failed to check for " + plugin.getDescription().getName() + " update on spigot web page."); + } + return null; + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 56895301..e681e70e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,8 @@ name: Jobs description: Jobs Plugin for the BukkitAPI main: com.gamingmesh.jobs.Jobs -version: 3.9.0 +version: 3.9.2 +website: https://www.spigotmc.org/resources/jobs-reborn.4216/ author: phrstbrn softdepend: [Vault, iConomy, MythicMobs, McMMO] commands: