From b0c97f0fe92a8204c7e6dbeedc88d48fa428394b Mon Sep 17 00:00:00 2001 From: pop4959 Date: Thu, 7 May 2020 02:18:31 -0700 Subject: [PATCH 01/10] Fix spawner delay feature --- .../essentials/commands/Commandspawner.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index ee079d6789d..6aa43035a89 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -7,11 +7,16 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; +import com.earth2me.essentials.utils.VersionUtil; +import net.ess3.nms.refl.ReflUtil; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.Locale; import static com.earth2me.essentials.I18n.tl; @@ -57,8 +62,31 @@ protected void run(final Server server, final User user, final String commandLab final Trade charge = new Trade("spawner-" + mob.name.toLowerCase(Locale.ENGLISH), ess); charge.isAffordableFor(user); try { - CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); + Block block = target.getBlock(); + CreatureSpawner spawner = (CreatureSpawner) block.getState(); spawner.setSpawnedType(mob.getType()); + if (delay > 0) { + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_12_2_R01)) { + spawner.setMinSpawnDelay(0); + spawner.setMaxSpawnDelay(Integer.MAX_VALUE); + spawner.setMinSpawnDelay(delay); + spawner.setMaxSpawnDelay(delay); + } else { + Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); + Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Method getSpawner = tileEntityMobSpawner.getDeclaredMethod("getSpawner"); + Method getTileEntityAt = craftWorld.getDeclaredMethod("getTileEntityAt", int.class, int.class, int.class); + Object craftTileEntity = getTileEntityAt.invoke(block.getWorld(), block.getX(), block.getY(), block.getZ()); + Object nmsSpawner = getSpawner.invoke(craftTileEntity); + Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); + Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); + if (minSpawnDelay != null && maxSpawnDelay != null) { + minSpawnDelay.setInt(nmsSpawner, delay); + maxSpawnDelay.setInt(nmsSpawner, delay); + } + } + } spawner.setDelay(delay); spawner.update(); } catch (Throwable ex) { From 8a6af584217a51b252f27232d7155e34e7e4f2ac Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 11:37:13 -0700 Subject: [PATCH 02/10] Update branch --- .github/workflows/build.yml | 3 - .gitignore | 3 +- Essentials/pom.xml | 30 +--- .../src/com/earth2me/essentials/Backup.java | 25 +++- .../com/earth2me/essentials/Essentials.java | 28 +++- .../essentials/EssentialsEntityListener.java | 5 + .../essentials/EssentialsPlayerListener.java | 2 +- .../essentials/EssentialsPluginListener.java | 1 + .../essentials/EssentialsServerListener.java | 3 +- .../src/com/earth2me/essentials/I18n.java | 56 ++++++-- .../com/earth2me/essentials/ISettings.java | 6 + .../src/com/earth2me/essentials/Kit.java | 12 +- .../src/com/earth2me/essentials/Settings.java | 16 +++ .../src/com/earth2me/essentials/Teleport.java | 4 +- .../essentials/commands/Commandbigtree.java | 8 +- .../commands/Commandclearinventory.java | 66 ++++++--- .../essentials/commands/Commanddepth.java | 2 +- .../essentials/commands/Commandeco.java | 5 + .../essentials/commands/Commandexp.java | 4 + .../essentials/commands/Commandext.java | 8 +- .../essentials/commands/Commandhat.java | 8 ++ .../essentials/commands/Commandinvsee.java | 4 + .../essentials/commands/Commandmsg.java | 2 +- .../essentials/commands/Commandpay.java | 2 +- .../essentials/commands/Commandrest.java | 72 ++++++++++ .../essentials/commands/Commandtempbanip.java | 87 ++++++++++++ .../essentials/commands/Commandtree.java | 8 +- .../essentials/craftbukkit/ServerState.java | 67 +++++++++ .../messaging/IMessageRecipient.java | 4 +- .../messaging/SimpleMessageRecipient.java | 8 ++ .../essentials/perm/IPermissionsHandler.java | 6 + .../essentials/perm/PermissionsHandler.java | 27 ++++ .../perm/impl/LuckPermsHandler.java | 55 ++++++++ .../perm/impl/SuperpermsHandler.java | 10 ++ .../essentials/signs/EssentialsSign.java | 8 +- .../essentials/signs/SignDisposal.java | 17 ++- .../earth2me/essentials/signs/SignTrade.java | 8 +- .../earth2me/essentials/utils/DateUtil.java | 4 + .../earth2me/essentials/utils/NumberUtil.java | 9 ++ Essentials/src/config.yml | 16 ++- Essentials/src/messages.properties | 8 ++ .../net/ess3/api/events/KitClaimEvent.java | 55 ++++++++ .../events/PrivateMessagePreSendEvent.java | 60 ++++++++ Essentials/src/plugin.yml | 16 ++- Essentials/src/worth.yml | 2 + .../EssentialsAntiBuildListener.java | 129 +++++++++++++++--- .../essentials/chat/EssentialsChatPlayer.java | 4 +- .../earth2me/essentials/xmpp/XMPPManager.java | 10 +- README.md | 17 +-- nms/1_8_R1Provider/.gitignore | 1 - nms/1_8_R1Provider/pom.xml | 28 ---- .../nms/v1_8_R1/v1_8_R1SpawnerProvider.java | 46 ------- nms/1_8_R2Provider/.gitignore | 1 - nms/1_8_R2Provider/pom.xml | 28 ---- .../nms/v1_8_R2/v1_8_R2SpawnerProvider.java | 46 ------- .../nms/flattened/FlatSpawnEggProvider.java | 2 +- .../nms/legacy/LegacyPotionMetaProvider.java | 2 +- .../nms/legacy/LegacySpawnEggProvider.java | 2 +- .../nms/legacy/LegacySpawnerProvider.java | 2 +- .../src/net/ess3/nms/SpawnEggProvider.java | 1 + .../src/net/ess3/nms/SpawnerProvider.java | 18 +-- .../src/net/ess3/providers/Provider.java | 2 +- .../net/ess3/providers/ProviderFactory.java | 21 ++- .../ess3/nms/refl/ReflSpawnEggProvider.java | 2 +- .../src/net/ess3/nms/refl/ReflUtil.java | 20 +-- .../src/net/ess3/nms/refl/SpawnEggRefl.java | 5 +- .../updatedmeta/BasePotionDataProvider.java | 2 +- .../updatedmeta/BlockMetaSpawnerProvider.java | 2 +- pom.xml | 24 ---- scripts/buildtools.sh | 61 --------- 70 files changed, 917 insertions(+), 409 deletions(-) create mode 100644 Essentials/src/com/earth2me/essentials/commands/Commandrest.java create mode 100644 Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java create mode 100644 Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java create mode 100644 Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java create mode 100644 Essentials/src/net/ess3/api/events/KitClaimEvent.java create mode 100644 Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java delete mode 100644 nms/1_8_R1Provider/.gitignore delete mode 100644 nms/1_8_R1Provider/pom.xml delete mode 100644 nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java delete mode 100644 nms/1_8_R2Provider/.gitignore delete mode 100644 nms/1_8_R2Provider/pom.xml delete mode 100644 nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java delete mode 100755 scripts/buildtools.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b832765e26..3d4b31e2b46 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,9 +28,6 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - - name: Run BuildTools - if: steps.cache.outputs.cache-hit != 'true' - run: chmod +x scripts/buildtools.sh && ./scripts/buildtools.sh - name: Build with Maven run: mvn package --file pom.xml - name: Copy artifacts diff --git a/.gitignore b/.gitignore index 5cb07e59bba..d5ab3034d69 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ # Build files target/ -jars/ \ No newline at end of file +jars/ +out/ \ No newline at end of file diff --git a/Essentials/pom.xml b/Essentials/pom.xml index a2f7695cf03..e18d0b6188d 100644 --- a/Essentials/pom.xml +++ b/Essentials/pom.xml @@ -54,6 +54,12 @@ 1.7 provided + + net.luckperms + api + 5.0 + provided + io.papermc paperlib @@ -72,30 +78,6 @@ 2.17.2 compile - - net.ess3 - 1_8_R1Provider - 2.17.2 - compile - - - org.bukkit - craftbukkit - - - - - net.ess3 - 1_8_R2Provider - 2.17.2 - compile - - - org.bukkit - craftbukkit - - - net.ess3 LegacyProvider diff --git a/Essentials/src/com/earth2me/essentials/Backup.java b/Essentials/src/com/earth2me/essentials/Backup.java index 6f4020acce8..9b481de056a 100644 --- a/Essentials/src/com/earth2me/essentials/Backup.java +++ b/Essentials/src/com/earth2me/essentials/Backup.java @@ -7,6 +7,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,11 +22,13 @@ public class Backup implements Runnable { private transient boolean running = false; private transient int taskId = -1; private transient boolean active = false; + private final AtomicBoolean pendingShutdown = new AtomicBoolean(false); + private transient CompletableFuture taskLock = null; public Backup(final IEssentials ess) { this.ess = ess; server = ess.getServer(); - if (!ess.getOnlinePlayers().isEmpty()) { + if (!ess.getOnlinePlayers().isEmpty() || ess.getSettings().isAlwaysRunBackup()) { ess.runTaskAsynchronously(this::startTask); } } @@ -52,20 +56,30 @@ private synchronized void startTask() { } } + public CompletableFuture getTaskLock() { + return taskLock; + } + + public void setPendingShutdown(boolean shutdown) { + pendingShutdown.set(shutdown); + } + @Override public void run() { if (active) { return; } - active = true; final String command = ess.getSettings().getBackupCommand(); if (command == null || "".equals(command)) { return; } + active = true; + taskLock = new CompletableFuture<>(); if ("save-all".equalsIgnoreCase(command)) { final CommandSender cs = server.getConsoleSender(); server.dispatchCommand(cs, "save-all"); active = false; + taskLock.complete(new Object()); return; } LOGGER.log(Level.INFO, tl("backupStarted")); @@ -102,14 +116,17 @@ class BackupEnableSaveTask implements Runnable { @Override public void run() { server.dispatchCommand(cs, "save-on"); - if (ess.getOnlinePlayers().isEmpty()) { + if (!ess.getSettings().isAlwaysRunBackup() && ess.getOnlinePlayers().isEmpty()) { stopTask(); } active = false; + taskLock.complete(new Object()); LOGGER.log(Level.INFO, tl("backupFinished")); } } - ess.scheduleSyncDelayedTask(new BackupEnableSaveTask()); + if (!pendingShutdown.get()) { + ess.scheduleSyncDelayedTask(new BackupEnableSaveTask()); + } } }); } diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index e8d714eb06b..95b13c97179 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -18,6 +18,7 @@ package com.earth2me.essentials; import com.earth2me.essentials.commands.*; +import com.earth2me.essentials.craftbukkit.ServerState; import com.earth2me.essentials.items.AbstractItemDb; import com.earth2me.essentials.items.CustomItemResolver; import com.earth2me.essentials.items.FlatItemDb; @@ -47,8 +48,6 @@ import net.ess3.nms.refl.ReflSpawnEggProvider; import net.ess3.nms.updatedmeta.BasePotionDataProvider; import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider; -import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider; -import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -250,8 +249,6 @@ public void onEnable() { spawnerProvider = new ProviderFactory<>(getLogger(), Arrays.asList( BlockMetaSpawnerProvider.class, - v1_8_R2SpawnerProvider.class, - v1_8_R1SpawnerProvider.class, LegacySpawnerProvider.class ), "mob spawner").getProvider(); spawnEggProvider = new ProviderFactory<>(getLogger(), @@ -313,6 +310,7 @@ public void onEnable() { handleCrash(ex); throw ex; } + getBackup().setPendingShutdown(false); } @Override @@ -362,20 +360,40 @@ private void registerListeners(PluginManager pm) { @Override public void onDisable() { + boolean stopping = ServerState.isStopping(); + if (!stopping) { + LOGGER.log(Level.SEVERE, tl("serverReloading")); + } + getBackup().setPendingShutdown(true); for (User user : getOnlineUsers()) { if (user.isVanished()) { user.setVanished(false); user.sendMessage(tl("unvanishedReload")); } - user.stopTransaction(); + if (stopping) { + user.setLastLocation(); + if (!user.isHidden()) { + user.setLastLogout(System.currentTimeMillis()); + } + user.cleanup(); + } else { + user.stopTransaction(); + } } cleanupOpenInventories(); + if (getBackup().getTaskLock() != null && !getBackup().getTaskLock().isDone()) { + LOGGER.log(Level.SEVERE, tl("backupInProgress")); + getBackup().getTaskLock().join(); + } if (i18n != null) { i18n.onDisable(); } if (backup != null) { backup.stopTask(); } + + this.getPermissionsHandler().unregisterContexts(); + Economy.setEss(null); Trade.closeLog(); getUserMap().getUUIDMap().shutdown(); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java index c14becb62c8..bad908628b1 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import net.ess3.api.IEssentials; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; @@ -145,6 +146,10 @@ public void onPlayerDeathEvent(final PlayerDeathEvent event) { return; } final User user = ess.getUser(event.getEntity()); + if (ess.getSettings().infoAfterDeath()) { + final Location loc = user.getLocation(); + user.sendMessage(tl("infoAfterDeath", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + } if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back")) { user.setLastLocation(); user.sendMessage(tl("backAfterDeath")); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 2a33c03cc54..3fdc2db307d 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -458,7 +458,7 @@ public void onPlayerTeleport(final PlayerTeleportEvent event) { } final User user = ess.getUser(player); //There is TeleportCause.COMMMAND but plugins have to actively pass the cause in on their teleports. - if (backListener && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { + if (user.isAuthorized("essentials.back.onteleport") && backListener && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { user.setLastLocation(); } if (teleportInvulnerability && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java index d7543cdc8d5..ddda2343f15 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java @@ -36,6 +36,7 @@ public void onPluginDisable(final PluginDisableEvent event) { if (event.getPlugin().getName().equals("EssentialsChat")) { ess.getSettings().setEssentialsChatActive(false); } + ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); // Check to see if the plugin thats being disabled is the one we are using if (ess.getPaymentMethod() != null && Methods.hasMethod() && Methods.checkDisabled(event.getPlugin())) { diff --git a/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java index 0416eeda083..bcc13effd2e 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java @@ -19,7 +19,8 @@ public class EssentialsServerListener implements Listener { private static final List ignoredSLPECallers = Arrays.asList( ".LegacyPingHandler.channelRead(", // CB responding to pings from pre-Netty clients - "de.dytanic.cloudnet.bridge.BukkitBootstrap" // CloudNet v2 doing... something + "de.dytanic.cloudnet.bridge.BukkitBootstrap", // CloudNet v2 doing... something + "de.dytanic.cloudnet.ext.bridge.bukkit.BukkitCloudNetBridgePlugin" // CloudNet v3 doing... something else ); private final transient IEssentials ess; diff --git a/Essentials/src/com/earth2me/essentials/I18n.java b/Essentials/src/com/earth2me/essentials/I18n.java index 8e7edc4823d..e9ef0eadce8 100644 --- a/Essentials/src/com/earth2me/essentials/I18n.java +++ b/Essentials/src/com/earth2me/essentials/I18n.java @@ -2,12 +2,11 @@ import net.ess3.api.IEssentials; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; +import java.io.*; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.*; import java.util.logging.Level; @@ -38,7 +37,7 @@ protected Object handleGetObject(String key) { public I18n(final IEssentials ess) { this.ess = ess; - defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH); + defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH, new UTF8PropertiesControl()); localeBundle = defaultBundle; customBundle = NULL_BUNDLE; } @@ -114,13 +113,13 @@ public void updateLocale(final String loc) { Logger.getLogger("Essentials").log(Level.INFO, String.format("Using locale %s", currentLocale.toString())); try { - localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale); + localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new UTF8PropertiesControl()); } catch (MissingResourceException ex) { localeBundle = NULL_BUNDLE; } try { - customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess)); + customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess), new UTF8PropertiesControl()); } catch (MissingResourceException ex) { customBundle = NULL_BUNDLE; } @@ -130,7 +129,9 @@ public static String capitalCase(final String input) { return input == null || input.length() == 0 ? input : input.toUpperCase(Locale.ENGLISH).charAt(0) + input.toLowerCase(Locale.ENGLISH).substring(1); } - + /** + * Attempts to load properties files from the plugin directory before falling back to the jar. + */ private static class FileResClassLoader extends ClassLoader { private final transient File dataFolder; @@ -145,8 +146,7 @@ public URL getResource(final String string) { if (file.exists()) { try { return file.toURI().toURL(); - } catch (MalformedURLException ignored) { - } + } catch (MalformedURLException ignored) {} } return null; } @@ -157,10 +157,42 @@ public InputStream getResourceAsStream(final String string) { if (file.exists()) { try { return new FileInputStream(file); - } catch (FileNotFoundException ignored) { - } + } catch (FileNotFoundException ignored) {} } return null; } } + + /** + * Reads .properties files as UTF-8 instead of ISO-8859-1, which is the default on Java 8/below. + * Java 9 fixes this by defaulting to UTF-8 for .properties files. + */ + private static class UTF8PropertiesControl extends ResourceBundle.Control { + public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IOException { + String resourceName = toResourceName(toBundleName(baseName, locale), "properties"); + ResourceBundle bundle = null; + InputStream stream = null; + if (reload) { + URL url = loader.getResource(resourceName); + if (url != null) { + URLConnection connection = url.openConnection(); + if (connection != null) { + connection.setUseCaches(false); + stream = connection.getInputStream(); + } + } + } else { + stream = loader.getResourceAsStream(resourceName); + } + if (stream != null) { + try { + // use UTF-8 here, this is the important bit + bundle = new PropertyResourceBundle(new InputStreamReader(stream, StandardCharsets.UTF_8)); + } finally { + stream.close(); + } + } + return bundle; + } + } } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index a5393f0f208..e7ce055c530 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -32,6 +32,8 @@ public interface ISettings extends IConf { long getBackupInterval(); + boolean isAlwaysRunBackup(); + String getChatFormat(String group); int getChatRadius(); @@ -278,6 +280,8 @@ public interface ISettings extends IConf { BigDecimal getMinimumPayAmount(); + boolean isPayExcludesIgnoreList(); + long getLastMessageReplyRecipientTimeout(); boolean isMilkBucketEasterEggEnabled(); @@ -356,4 +360,6 @@ public interface ISettings extends IConf { boolean isSpawnIfNoHome(); + boolean infoAfterDeath(); + } diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index cdf5a7d0c46..299afe885b0 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -7,7 +7,10 @@ import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; +import net.ess3.api.events.KitClaimEvent; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -149,14 +152,19 @@ public boolean expandItems(final User user, final List items) throws Exc IText input = new SimpleTextInput(items); IText output = new KeywordReplacer(input, user.getSource(), ess, true, true); + KitClaimEvent event = new KitClaimEvent(user, this); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } + boolean spew = false; final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments(); final boolean currencyIsSuffix = ess.getSettings().isCurrencySymbolSuffixed(); - final String currencySymbol = ess.getSettings().getCurrencySymbol(); List itemList = new ArrayList<>(); for (String kitItem : output.getLines()) { if (!currencyIsSuffix ? kitItem.startsWith(ess.getSettings().getCurrencySymbol()) : kitItem.endsWith(ess.getSettings().getCurrencySymbol())) { - final String valueString = currencyIsSuffix ? kitItem.substring(0, currencySymbol.length()) : kitItem.substring(currencySymbol.length()); + final String valueString = NumberUtil.sanitizeCurrencyString(kitItem, ess); BigDecimal value = new BigDecimal(valueString.trim()); Trade t = new Trade(value, ess); t.pay(user, OverflowType.DROP); diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index 487b1bc9e91..d0a03650afd 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -425,6 +425,11 @@ public String getBackupCommand() { return config.getString("backup.command", null); } + @Override + public boolean isAlwaysRunBackup() { + return config.getBoolean("backup.always-run", false); + } + private final Map chatFormats = Collections.synchronizedMap(new HashMap<>()); @Override @@ -565,6 +570,7 @@ public void reloadConfig() { logCommandBlockCommands = _logCommandBlockCommands(); nickBlacklist = _getNickBlacklist(); maxProjectileSpeed = _getMaxProjectileSpeed(); + removeEffectsOnHeal = _isRemovingEffectsOnHeal(); } void _lateLoadItemSpawnBlacklist() { @@ -1253,6 +1259,11 @@ public int getMaxUserCacheCount() { return new BigDecimal(config.getString("minimum-pay-amount", "0.001")); } + @Override + public boolean isPayExcludesIgnoreList() { + return config.getBoolean("pay-excludes-ignore-list", false); + } + @Override public long getLastMessageReplyRecipientTimeout() { return config.getLong("last-message-reply-recipient-timeout", 180); } @@ -1679,4 +1690,9 @@ public boolean isRemovingEffectsOnHeal() { public boolean isSpawnIfNoHome() { return config.getBoolean("spawn-if-no-home", true); } + + @Override + public boolean infoAfterDeath() { + return config.getBoolean("send-info-after-death", false); + } } diff --git a/Essentials/src/com/earth2me/essentials/Teleport.java b/Essentials/src/com/earth2me/essentials/Teleport.java index d63378c3719..bab29fb1fde 100644 --- a/Essentials/src/com/earth2me/essentials/Teleport.java +++ b/Essentials/src/com/earth2me/essentials/Teleport.java @@ -129,7 +129,9 @@ protected void now(IUser teleportee, ITarget target, TeleportCause cause) throws return; } - teleportee.setLastLocation(); + if (teleportee.isAuthorized("essentials.back.onteleport")) { + teleportee.setLastLocation(); + } if (!teleportee.getBase().isEmpty()) { if (!ess.getSettings().isTeleportPassengerDismount()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java index 19b217ba541..93c5dff5358 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java @@ -33,9 +33,11 @@ public void run(final Server server, final User user, final String commandLabel, throw new NotEnoughArgumentsException(); } - final Location loc = LocationUtil.getTarget(user.getBase()); - final Location safeLocation = LocationUtil.getSafeDestination(loc); - final boolean success = user.getWorld().generateTree(safeLocation, tree); + final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0); + if (!user.getWorld().getBlockAt(loc).isPassable()) { + throw new Exception(tl("bigTreeFailure")); + } + final boolean success = user.getWorld().generateTree(loc, tree); if (success) { user.sendMessage(tl("bigTreeSuccess")); } else { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java index 59bd467878c..11b0ed5573c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java @@ -5,6 +5,7 @@ import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; +import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -40,7 +41,7 @@ private void parseCommand(Server server, CommandSource sender, String commandLab Collection players = new ArrayList<>(); User senderUser = ess.getUser(sender.getPlayer()); String previousClearCommand = ""; - + int offset = 0; if (sender.isPlayer()) { @@ -79,39 +80,65 @@ private void parseCommand(Server server, CommandSource sender, String commandLab } } - protected void clearHandler(CommandSource sender, Player player, String[] args, int offset, boolean showExtended) throws Exception { - short data = -1; - int type = -1; + private static class Item { + private Material material; + private short data; + + public Item(Material material, short data) { + this.material = material; + this.data = data; + } + + public Material getMaterial() { + return material; + } + + public short getData() { + return data; + } + } + + private enum ClearHandlerType { + ALL_EXCEPT_ARMOR, ALL_INCLUDING_ARMOR, SPECIFIC_ITEM + } + + protected void clearHandler(CommandSource sender, Player player, String[] args, int offset, boolean showExtended) { + ClearHandlerType type = ClearHandlerType.ALL_EXCEPT_ARMOR; + final Set items = new HashSet<>(); int amount = -1; - final Set mats = new HashSet<>(); if (args.length > (offset + 1) && NumberUtil.isInt(args[(offset + 1)])) { amount = Integer.parseInt(args[(offset + 1)]); } if (args.length > offset) { if (args[offset].equalsIgnoreCase("**")) { - type = -2; + type = ClearHandlerType.ALL_INCLUDING_ARMOR; } else if (!args[offset].equalsIgnoreCase("*")) { final String[] split = args[offset].split(","); - - for (String name : split) { + for (String item : split) { + final String[] itemParts = item.split(":"); + short data; + try { + data = Short.parseShort(itemParts[1]); + } catch (Exception e) { + data = 0; + } try { - mats.add(ess.getItemDb().get(name).getType()); + items.add(new Item(ess.getItemDb().get(itemParts[0]).getType(), data)); } catch (Exception ignored) {} } - - type = 1; + type = ClearHandlerType.SPECIFIC_ITEM; } } - if (type == -1) // type -1 represents wildcard or all items + if (type == ClearHandlerType.ALL_EXCEPT_ARMOR) { if (showExtended) { sender.sendMessage(tl("inventoryClearingAllItems", player.getDisplayName())); } InventoryWorkaround.clearInventoryNoArmor(player.getInventory()); InventoryWorkaround.setItemInOffHand(player, null); - } else if (type == -2) // type -2 represents double wildcard or all items and armor + } else if (type == ClearHandlerType.ALL_INCLUDING_ARMOR) { if (showExtended) { sender.sendMessage(tl("inventoryClearingAllArmor", player.getDisplayName())); @@ -120,20 +147,21 @@ protected void clearHandler(CommandSource sender, Player player, String[] args, InventoryWorkaround.setItemInOffHand(player, null); player.getInventory().setArmorContents(null); } else { - for (Material mat : mats) { + for (Item item : items) { + ItemStack stack = new ItemStack(item.getMaterial()); + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + stack.setDurability(item.getData()); + } if (amount == -1) // amount -1 means all items will be cleared { - ItemStack stack = new ItemStack(mat, BASE_AMOUNT, data); + stack.setAmount(BASE_AMOUNT); ItemStack removedStack = player.getInventory().removeItem(stack).get(0); final int removedAmount = (BASE_AMOUNT - removedStack.getAmount()); if (removedAmount > 0 || showExtended) { sender.sendMessage(tl("inventoryClearingStack", removedAmount, stack.getType().toString().toLowerCase(Locale.ENGLISH), player.getDisplayName())); } } else { - if (amount < 0) { - amount = 1; - } - ItemStack stack = new ItemStack(mat, amount); + stack.setAmount(amount < 0 ? 1 : amount); if (player.getInventory().containsAtLeast(stack, amount)) { sender.sendMessage(tl("inventoryClearingStack", amount, stack.getType().toString().toLowerCase(Locale.ENGLISH), player.getDisplayName())); player.getInventory().removeItem(stack); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java index 34aa53526c3..84de07e1090 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java @@ -13,7 +13,7 @@ public Commanddepth() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final int depth = user.getLocation().getBlockY() - 63; + final int depth = user.getLocation().getBlockY() - user.getWorld().getSeaLevel(); if (depth > 0) { user.sendMessage(tl("depthAboveSea", depth)); } else if (depth < 0) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java index 89dbb850069..401cce52821 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java @@ -20,6 +20,7 @@ public class Commandeco extends EssentialsLoopCommand { Commandeco.EcoCommands cmd; BigDecimal amount; + boolean isPercent; public Commandeco() { super("eco"); @@ -35,6 +36,7 @@ public void run(final Server server, final CommandSource sender, final String co try { cmd = Commandeco.EcoCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); + isPercent = cmd != EcoCommands.RESET && args[2].endsWith("%"); amount = (cmd == Commandeco.EcoCommands.RESET) ? startingBalance : new BigDecimal(args[2].replaceAll("[^0-9\\.]", "")); } catch (Exception ex) { throw new NotEnoughArgumentsException(ex); @@ -53,6 +55,9 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws NotEnoughArgumentsException, ChargeException, MaxMoneyException { + if (isPercent && cmd != EcoCommands.RESET) { + amount = player.getMoney().multiply(amount).scaleByPowerOfTen(-2); + } switch (cmd) { case GIVE: player.giveMoney(amount, sender, UserBalanceUpdateEvent.Cause.COMMAND_ECO); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java index a7c2a7428a6..df7ed87927c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java @@ -79,6 +79,10 @@ public void run(final Server server, final CommandSource sender, final String co expMatch(server, sender, args[1], args[2], false); } else if (args.length > 2 && args[0].equalsIgnoreCase("give")) { expMatch(server, sender, args[1], args[2], true); + } else if (args.length > 2 && args[0].equalsIgnoreCase("take")) { + expMatch(server, sender, args[1], "-" + args[2], true); + } else if (args.length > 2 && args[0].equalsIgnoreCase("reset")) { + expMatch(server, sender, args[1], "0", false); } else { String match = args[0].trim(); if (args.length >= 2 && NumberUtil.isInt(args[0].toLowerCase(Locale.ENGLISH).replace("l", ""))) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/com/earth2me/essentials/commands/Commandext.java index b751b1e4c4d..7cd24eb05ae 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandext.java @@ -27,13 +27,13 @@ protected void run(final Server server, final CommandSource sender, final String @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (args.length < 1) { - extPlayer(user.getBase()); - user.sendMessage(tl("extinguish")); + if (args.length > 0 && user.isAuthorized("essentials.ext.others")) { + loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); return; } - loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); + extPlayer(user.getBase()); + user.sendMessage(tl("extinguish")); } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java index d15cdf2fda3..3dbd0226bd1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java @@ -2,10 +2,12 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; +import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.permissions.Permission; @@ -55,6 +57,8 @@ protected void run(final Server server, final User user, final String commandLab final ItemStack head = inv.getHelmet(); if (head == null || head.getType() == Material.AIR) { user.sendMessage(tl("hatEmpty")); + } else if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_9_4_R01) && head.getEnchantments().containsKey(Enchantment.BINDING_CURSE) && !user.isAuthorized("essentials.hat.ignore-binding")) { + user.sendMessage(tl("hatCurse")); } else { final ItemStack air = new ItemStack(Material.AIR); inv.setHelmet(air); @@ -71,6 +75,10 @@ protected void run(final Server server, final User user, final String commandLab if (hand.getType().getMaxDurability() == 0) { final PlayerInventory inv = user.getBase().getInventory(); final ItemStack head = inv.getHelmet(); + if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_9_4_R01) && head != null && head.getEnchantments().containsKey(Enchantment.BINDING_CURSE) && !user.isAuthorized("essentials.hat.ignore-binding")) { + user.sendMessage(tl("hatCurse")); + return; + } inv.setHelmet(hand); inv.setItemInHand(head); user.sendMessage(tl("hatPlaced")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java index ddf2857b3e9..3215f6c9259 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Server; import org.bukkit.inventory.Inventory; @@ -25,6 +26,9 @@ protected void run(final Server server, final User user, final String commandLab if (args.length > 1 && user.isAuthorized("essentials.invsee.equip")) { inv = server.createInventory(invUser.getBase(), 9, "Equipped"); inv.setContents(invUser.getBase().getInventory().getArmorContents()); + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_9_4_R01)) { + inv.setItem(4, invUser.getBase().getInventory().getItemInOffHand()); + } } else { inv = invUser.getBase().getInventory(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index f2fdfcc3385..94ec79cd875 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -20,7 +20,7 @@ public Commandmsg() { @Override public void run(Server server, CommandSource sender, String commandLabel, String[] args) throws Exception { - if (args.length < 2 || args[0].trim().length() < 2 || args[1].trim().isEmpty()) { + if (args.length < 2 || args[0].trim().isEmpty() || args[1].trim().isEmpty()) { throw new NotEnoughArgumentsException(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java index 6e63243bda1..cf5b515ea50 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java @@ -59,7 +59,7 @@ public void run(final Server server, final User user, final String commandLabel, protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws ChargeException { User user = ess.getUser(sender.getPlayer()); try { - if (!player.isAcceptingPay()) { + if (!player.isAcceptingPay() || (ess.getSettings().isPayExcludesIgnoreList() && player.isIgnoredPlayer(user))) { sender.sendMessage(tl("notAcceptingPay", player.getDisplayName())); return; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrest.java b/Essentials/src/com/earth2me/essentials/commands/Commandrest.java new file mode 100644 index 00000000000..2a38cda19cd --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrest.java @@ -0,0 +1,72 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.VersionUtil; +import org.bukkit.Server; +import org.bukkit.Statistic; + +import java.util.Collections; +import java.util.List; + +import static com.earth2me.essentials.I18n.tl; + +public class Commandrest extends EssentialsLoopCommand { + public Commandrest() { + super("rest"); + } + + @Override + public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + user.sendMessage(tl("unsupportedFeature")); + return; + } + if (args.length > 0 && user.isAuthorized("essentials.rest.others")) { + loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); + return; + } + restPlayer(user); + } + + @Override + public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { + sender.sendMessage(tl("unsupportedFeature")); + return; + } + if (args.length < 1) { + throw new NotEnoughArgumentsException(); + } + loopOnlinePlayers(server, sender, true, true, args[0], null); + } + + @Override + protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws PlayerExemptException { + restPlayer(player); + sender.sendMessage(tl("restOther", player.getDisplayName())); + } + + private void restPlayer(final User user) { + user.getBase().setStatistic(Statistic.TIME_SINCE_REST, 0); + user.sendMessage(tl("rest")); + } + + @Override + protected List getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) { + if (args.length == 1 && user.isAuthorized("essentials.rest.others")) { + return getPlayers(server, user); + } else { + return Collections.emptyList(); + } + } + + @Override + protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + return getPlayers(server, sender); + } else { + return Collections.emptyList(); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java new file mode 100644 index 00000000000..4d74c707d43 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java @@ -0,0 +1,87 @@ +package com.earth2me.essentials.commands; + +import com.earth2me.essentials.CommandSource; +import com.earth2me.essentials.Console; +import com.earth2me.essentials.User; +import com.earth2me.essentials.utils.DateUtil; +import com.earth2me.essentials.utils.FormatUtil; +import org.bukkit.BanList; +import org.bukkit.Server; +import org.bukkit.entity.Player; + +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.logging.Level; + +import static com.earth2me.essentials.I18n.tl; + +public class Commandtempbanip extends EssentialsCommand { + public Commandtempbanip() { + super("tempbanip"); + } + + @Override + public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { + if (args.length < 2) { + throw new NotEnoughArgumentsException(); + } + + final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; + + String ipAddress; + if (FormatUtil.validIP(args[0])) { + ipAddress = args[0]; + } else { + try { + User player = getPlayer(server, args, 0, true, true); + ipAddress = player.getLastLoginAddress(); + } catch (PlayerNotFoundException ex) { + ipAddress = args[0]; + } + } + + if (ipAddress.isEmpty()) { + throw new PlayerNotFoundException(); + } + + final String time = getFinalArg(args, 1); + final long banTimestamp = DateUtil.parseDateDiff(time, true); + String banReason = DateUtil.removeTimePattern(time); + + final long maxBanLength = ess.getSettings().getMaxTempban() * 1000; + if (maxBanLength > 0 && ((banTimestamp - GregorianCalendar.getInstance().getTimeInMillis()) > maxBanLength) && sender.isPlayer() && !(ess.getUser(sender.getPlayer()).isAuthorized("essentials.tempban.unlimited"))) { + sender.sendMessage(tl("oversizedTempban")); + throw new NoChargeException(); + } + + if (banReason.length() < 2) { + banReason = tl("defaultBanReason"); + } + + String banDisplay = tl("banFormat", banReason, senderName); + + ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, new Date(banTimestamp), senderName); + final String message = tl("playerTempBanIpAddress", senderName, ipAddress, DateUtil.formatDateDiff(banTimestamp), banReason); + + for (Player player : ess.getServer().getOnlinePlayers()) { + if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) { + player.kickPlayer(banDisplay); + } + } + + server.getLogger().log(Level.INFO, message); + ess.broadcastMessage("essentials.banip.notify", message); + } + + @Override + protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { + if (args.length == 1) { + // TODO: Also list IP addresses? + return getPlayers(server, sender); + } else { + // Note: following args are both date diffs _and_ messages; ideally we'd mix with the vanilla handler + return COMMON_DATE_DIFFS; + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java index f57505057fb..a477c18b2d1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java @@ -42,9 +42,11 @@ public void run(final Server server, final User user, final String commandLabel, } } - final Location loc = LocationUtil.getTarget(user.getBase()); - final Location safeLocation = LocationUtil.getSafeDestination(loc); - final boolean success = user.getWorld().generateTree(safeLocation, tree); + final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0); + if (!user.getWorld().getBlockAt(loc).isPassable()) { + throw new Exception(tl("treeFailure")); + } + final boolean success = user.getWorld().generateTree(loc, tree); if (success) { user.sendMessage(tl("treeSpawned")); } else { diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java b/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java new file mode 100644 index 00000000000..c8febbb6c7e --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java @@ -0,0 +1,67 @@ +package com.earth2me.essentials.craftbukkit; + +import net.ess3.nms.refl.ReflUtil; +import org.bukkit.Bukkit; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class ServerState { + + private static final MethodHandle isStopping; //Only in Paper + private static final MethodHandle nmsHasStopped; + private static final MethodHandle nmsIsRunning; + private static final Object nmsServer; + + static { + MethodHandle isStoppingHandle = null; + MethodHandle nmsHasStoppedHandle = null; + MethodHandle nmsIsRunningHandle = null; + Object nmsServerObject = null; + try { + //noinspection JavaLangInvokeHandleSignature - We don't compile against Paper + isStoppingHandle = MethodHandles.lookup().findStatic(Bukkit.class, "isStopping", MethodType.methodType(boolean.class)); + } catch (Throwable e) { + try { + Class nmsClass = ReflUtil.getNMSClass("MinecraftServer"); + if (nmsClass != null) { + nmsServerObject = nmsClass.getMethod("getServer").invoke(null); + nmsIsRunningHandle = MethodHandles.lookup().findVirtual(nmsClass, "isRunning", MethodType.methodType(boolean.class)); + nmsHasStoppedHandle = MethodHandles.lookup().findVirtual(nmsClass, "hasStopped", MethodType.methodType(boolean.class)); + } + } catch (Throwable ignored) { + } + } + isStopping = isStoppingHandle; + nmsHasStopped = nmsHasStoppedHandle; + nmsIsRunning = nmsIsRunningHandle; + nmsServer = nmsServerObject; + } + + public static boolean isStopping() { + boolean stopping = false; + if (isStopping != null) { + try { + stopping = (boolean) isStopping.invoke(); + } catch (Throwable t) { + t.printStackTrace(); + } + } else if (nmsServer != null) { + if (nmsHasStopped != null) { + try { + stopping = (boolean) nmsHasStopped.invoke(nmsServer); + } catch (Throwable t) { + t.printStackTrace(); + } + } else if (nmsIsRunning != null) { + try { + stopping = !(boolean) nmsIsRunning.invoke(nmsServer); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } + return stopping; + } +} diff --git a/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java b/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java index d30eb91b9b0..dc3385cd700 100644 --- a/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java +++ b/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java @@ -91,7 +91,9 @@ enum MessageResponse { /** States that the message was NOT received as a result of the sender being ignored by the recipient. */ SENDER_IGNORED, /** States that the message was NOT received as a result of the recipient being unreachable. */ - UNREACHABLE; + UNREACHABLE, + /** States that the message was NOT received as a result of the message pre-send event being cancelled. */ + EVENT_CANCELLED; /** * Returns whether this response is a success. In other words equal to {@link #SUCCESS} or {@link #SUCCESS_BUT_AFK} diff --git a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java index 2b6f720659e..aea874c30ab 100644 --- a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java +++ b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; +import net.ess3.api.events.PrivateMessagePreSendEvent; import java.lang.ref.WeakReference; @@ -62,6 +63,13 @@ public String getName() { } @Override public MessageResponse sendMessage(IMessageRecipient recipient, String message) { + final PrivateMessagePreSendEvent event = new PrivateMessagePreSendEvent(this, recipient, message); + ess.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return MessageResponse.EVENT_CANCELLED; + } + + message = event.getMessage(); MessageResponse messageResponse = recipient.onReceiveMessage(this.parent, message); switch (messageResponse) { case UNREACHABLE: diff --git a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java index e0d50a10d0e..f5cccf7406c 100644 --- a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java @@ -3,6 +3,8 @@ import org.bukkit.entity.Player; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; public interface IPermissionsHandler { @@ -23,5 +25,9 @@ public interface IPermissionsHandler { String getSuffix(Player base); + void registerContext(String context, Function> calculator, Supplier> suggestions); + + void unregisterContexts(); + boolean tryProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java index 847164f25e8..7a6d5665a2d 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java @@ -2,11 +2,14 @@ import com.earth2me.essentials.Essentials; import com.earth2me.essentials.perm.impl.*; +import com.google.common.collect.ImmutableSet; import org.bukkit.entity.Player; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.logging.Level; public class PermissionsHandler implements IPermissionsHandler { @@ -89,6 +92,16 @@ public String getSuffix(final Player base) { return suffix; } + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + handler.registerContext(context, calculator, suggestions); + } + + @Override + public void unregisterContexts() { + handler.unregisterContexts(); + } + @Override public boolean tryProvider() { return true; @@ -97,6 +110,7 @@ public boolean tryProvider() { public void checkPermissions() { // load and assign a handler List> providerClazz = Arrays.asList( + LuckPermsHandler.class, ModernVaultHandler.class, GenericVaultHandler.class, SuperpermsHandler.class @@ -105,7 +119,14 @@ public void checkPermissions() { try { IPermissionsHandler provider = providerClass.newInstance(); if (provider.tryProvider()) { + if (provider.getClass().isInstance(this.handler)) { + return; + } + if (this.handler != null) { + unregisterContexts(); + } this.handler = provider; + initContexts(); break; } } catch (Throwable ignored) { @@ -160,4 +181,10 @@ private void checkPermLag(long start, String summary) { } } + private void initContexts() { + registerContext("essentials:afk", player -> Collections.singleton(String.valueOf(ess.getUser(player).isAfk())), () -> ImmutableSet.of("true", "false")); + registerContext("essentials:muted", player -> Collections.singleton(String.valueOf(ess.getUser(player).isMuted())), () -> ImmutableSet.of("true", "false")); + registerContext("essentials:vanished", player -> Collections.singleton(String.valueOf(ess.getUser(player).isHidden())), () -> ImmutableSet.of("true", "false")); + } + } diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java new file mode 100644 index 00000000000..98dbe6fbdc7 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java @@ -0,0 +1,55 @@ +package com.earth2me.essentials.perm.impl; + +import net.luckperms.api.LuckPerms; +import net.luckperms.api.context.ContextCalculator; +import net.luckperms.api.context.ContextConsumer; +import net.luckperms.api.context.ContextSet; +import net.luckperms.api.context.ImmutableContextSet; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Function; +import java.util.function.Supplier; + +public class LuckPermsHandler extends ModernVaultHandler { + private LuckPerms luckPerms; + private Set> contextCalculators; + + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + ContextCalculator contextCalculator = new ContextCalculator() { + @Override + public void calculate(Player target, ContextConsumer consumer) { + calculator.apply(target).forEach(value -> consumer.accept(context, value)); + } + + @Override + public ContextSet estimatePotentialContexts() { + ImmutableContextSet.Builder builder = ImmutableContextSet.builder(); + suggestions.get().forEach(value -> builder.add(context, value)); + return builder.build(); + } + }; + luckPerms.getContextManager().registerCalculator(contextCalculator); + contextCalculators.add(contextCalculator); + } + + @Override + public void unregisterContexts() { + contextCalculators.forEach(contextCalculator -> luckPerms.getContextManager().unregisterCalculator(contextCalculator)); + contextCalculators.clear(); + } + + @Override + public boolean tryProvider() { + RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); + if (provider != null) { + luckPerms = provider.getProvider(); + contextCalculators = new HashSet<>(); + } + return luckPerms != null && super.tryProvider(); + } +} diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java index fa7a67e17ff..e8aa7da866a 100644 --- a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java @@ -7,6 +7,8 @@ import java.util.Arrays; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; public class SuperpermsHandler implements IPermissionsHandler { @@ -72,6 +74,14 @@ public String getSuffix(final Player base) { return null; } + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + } + + @Override + public void unregisterContexts() { + } + @Override public boolean tryProvider() { return getEnabledPermsPlugin() != null; diff --git a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java index bda414a6322..1d045b8bb73 100644 --- a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java @@ -375,9 +375,9 @@ protected final ItemStack getItemMeta(final ItemStack item, final String meta, f return stack; } - protected final BigDecimal getMoney(final String line) throws SignException { - final boolean isMoney = line.matches("^[^0-9-\\.][\\.0-9]+$"); - return isMoney ? getBigDecimalPositive(line.substring(1)) : null; + protected final BigDecimal getMoney(final String line, final IEssentials ess) throws SignException { + final boolean isMoney = line.matches("^[^0-9-\\.]?[\\.0-9]+[^0-9-\\.]?$"); + return isMoney ? getBigDecimalPositive(NumberUtil.sanitizeCurrencyString(line, ess)) : null; } protected final BigDecimal getBigDecimalPositive(final String line) throws SignException { @@ -410,7 +410,7 @@ protected final Trade getTrade(final ISign sign, final int index, final int decr return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess); } - final BigDecimal money = getMoney(line); + final BigDecimal money = getMoney(line, ess); if (money == null) { final String[] split = line.split("[ :]+", 2); if (split.length != 2) { diff --git a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java b/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java index e0de8e0c565..c86d0ecbddc 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java @@ -1,5 +1,6 @@ package com.earth2me.essentials.signs; +import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.User; import net.ess3.api.IEssentials; @@ -11,9 +12,23 @@ public SignDisposal() { super("Disposal"); } + @Override + protected boolean onSignCreate(ISign sign, User player, String username, IEssentials ess) throws SignException, ChargeException { + if (!player.isAuthorized("essentials.signs.disposal.name")) { + sign.setLine(1, ""); + sign.setLine(2, ""); + sign.setLine(3, ""); + } + return true; + } + @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - player.getBase().openInventory(ess.getServer().createInventory(player.getBase(), 36, tl("disposal"))); + String title = (sign.getLine(1) + " " + sign.getLine(2) + " " + sign.getLine(3)).trim(); + if (title.isEmpty()) { + title = tl("disposal"); + } + player.getBase().openInventory(ess.getServer().createInventory(player.getBase(), 36, title)); return true; } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java index b7f97fb429e..f206faace1b 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java @@ -149,7 +149,7 @@ protected final void validateTrade(final ISign sign, final int index, final bool final String[] split = line.split("[ :]+"); if (split.length == 1 && !amountNeeded) { - final BigDecimal money = getMoney(split[0]); + final BigDecimal money = getMoney(split[0], ess); if (money != null) { if (NumberUtil.shortCurrency(money, ess).length() * 2 > 15) { throw new SignException("Line can be too long!"); @@ -160,7 +160,7 @@ protected final void validateTrade(final ISign sign, final int index, final bool } if (split.length == 2 && amountNeeded) { - final BigDecimal money = getMoney(split[0]); + final BigDecimal money = getMoney(split[0], ess); BigDecimal amount = getBigDecimalPositive(split[1]); if (money != null && amount != null) { amount = amount.subtract(amount.remainder(money)); @@ -218,7 +218,7 @@ protected final Trade getTrade(final ISign sign, final int index, final AmountTy if (split.length == 2) { try { - final BigDecimal money = getMoney(split[0]); + final BigDecimal money = getMoney(split[0], ess); final BigDecimal amount = notEmpty ? getBigDecimalPositive(split[1]) : getBigDecimal(split[1]); if (money != null && amount != null) { return new Trade(amountType == AmountType.COST ? money : amount, ess); @@ -317,7 +317,7 @@ private void setAmount(final ISign sign, final int index, final BigDecimal value final String[] split = line.split("[ :]+"); if (split.length == 2) { - final BigDecimal money = getMoney(split[0]); + final BigDecimal money = getMoney(split[0], ess); final BigDecimal amount = getBigDecimal(split[1]); if (money != null && amount != null) { final String newline = NumberUtil.shortCurrency(money, ess) + ":" + NumberUtil.shortCurrency(value, ess).substring(1); diff --git a/Essentials/src/com/earth2me/essentials/utils/DateUtil.java b/Essentials/src/com/earth2me/essentials/utils/DateUtil.java index 75419fea21a..3a5d65505d7 100644 --- a/Essentials/src/com/earth2me/essentials/utils/DateUtil.java +++ b/Essentials/src/com/earth2me/essentials/utils/DateUtil.java @@ -134,6 +134,8 @@ public static String formatDateDiff(Calendar fromDate, Calendar toDate) { if (toDate.after(fromDate)) { future = true; } + // Temporary 50ms time buffer added to avoid display truncation due to code execution delays + toDate.add(Calendar.MILLISECOND, future ? 50 : -50); StringBuilder sb = new StringBuilder(); int[] types = new int[]{Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND}; String[] names = new String[]{tl("year"), tl("years"), tl("month"), tl("months"), tl("day"), tl("days"), tl("hour"), tl("hours"), tl("minute"), tl("minutes"), tl("second"), tl("seconds")}; @@ -148,6 +150,8 @@ public static String formatDateDiff(Calendar fromDate, Calendar toDate) { sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]); } } + // Preserve correctness in the original date object by removing the extra buffer time + toDate.add(Calendar.MILLISECOND, future ? -50 : 50); if (sb.length() == 0) { return tl("now"); } diff --git a/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java b/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java index 0567ee9139b..000a7f2363e 100644 --- a/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java +++ b/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java @@ -88,6 +88,15 @@ public static String displayCurrencyExactly(final BigDecimal value, final IEssen return sign + tl("currency", ess.getSettings().getCurrencySymbol(), currency); } + public static String sanitizeCurrencyString(final String input, final IEssentials ess) { + String symbol = ess.getSettings().getCurrencySymbol(); + boolean suffix = ess.getSettings().isCurrencySymbolSuffixed(); + if (input.contains(symbol)) { + return suffix ? input.substring(0, input.indexOf(symbol)) : input.substring(symbol.length()); + } + return input; + } + public static boolean isInt(final String sInt) { try { Integer.parseInt(sInt); diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 31a699d9071..91e766b5593 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -371,6 +371,8 @@ unprotected-sign-names: backup: # Interval in minutes. interval: 30 + # If true, the backup task will run even if there are no players online. + always-run: false # Unless you add a valid backup command or script here, this feature will be useless. # Use 'save-all' to simply force regular world saving without backup. #command: 'rdiff-backup World1 backups/World1' @@ -457,17 +459,17 @@ broadcast-afk-message: true # You can disable the death messages of Minecraft here. death-messages: true +# When players die, should they receive the coordinates they died at? +send-info-after-death: false + # Should players with permissions be able to join and part silently? # You can control this with essentials.silentjoin and essentials.silentquit permissions if it is enabled. # In addition, people with essentials.silentjoin.vanish will be vanished on join. allow-silent-join-quit: false -# You can set a custom join message here, set to "none" to disable. -# You may use color codes, use {USERNAME} the player's name or {PLAYER} for the player's displayname. +# You can set custom join and quit messages here. Set to "none" to use the default message or "" to disable the message entirely. +# You may use color codes, {USERNAME} for the player's name, and {PLAYER} for the player's displayname. custom-join-message: "none" - -# You can set a custom quit message here, set to "none" to disable. -# You may use color codes, use {USERNAME} the player's name or {PLAYER} for the player's displayname. custom-quit-message: "none" # Add worlds to this list, if you want to automatically disable god mode there. @@ -619,6 +621,7 @@ max-projectile-speed: 8 ############################################################ # Allows people to set their bed during the day. +# This setting has no effect in Minecraft 1.15+, as Minecraft will always allow the player to set their bed location during the day. update-bed-at-daytime: true # Set to true to enable per-world permissions for using homes to teleport between worlds. @@ -700,6 +703,9 @@ economy-log-update-enabled: false # Minimum acceptable amount to be used in /pay. minimum-pay-amount: 0.001 +# Enable this to block users who try to /pay another user which ignore them. +pay-excludes-ignore-list: false + # The format of currency, excluding symbols. See currency-symbol-format-locale for symbol configuration. # # "#,##0.00" is how the majority of countries display currency. diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index 29482c65454..ad9b2432150 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -27,6 +27,7 @@ backOther=\u00a76Returned\u00a7c {0}\u00a76 to previous location. backupDisabled=\u00a74An external backup script has not been configured. backupFinished=\u00a76Backup finished. backupStarted=\u00a76Backup started. +backupInProgress=\u00a76An external backup script is currently in progress! Halting plugin disable until finished. backUsageMsg=\u00a76Returning to previous location. balance=\u00a7aBalance\:\u00a7c {0} balanceOther=\u00a7aBalance of {0}\u00a7a\:\u00a7c {1} @@ -162,6 +163,7 @@ godMode=\u00a76God mode\u00a7c {0}\u00a76. groupDoesNotExist=\u00a74There''s no one online in this group\! groupNumber=\u00a7c{0}\u00a7f online, for the full list\:\u00a7c /{1} {2} hatArmor=\u00a74You cannot use this item as a hat\! +hatCurse=\u00a74You cannot remove a hat with the curse of binding\! hatEmpty=\u00a74You are not wearing a hat. hatFail=\u00a74You must have something to wear in your hand. hatPlaced=\u00a76Enjoy your new hat\! @@ -188,6 +190,7 @@ ignoredList=\u00a76Ignored\:\u00a7r {0} ignoreExempt=\u00a74You may not ignore that player. ignorePlayer=\u00a76You ignore player\u00a7c {0} \u00a76from now on. illegalDate=Illegal date format. +infoAfterDeath=\u00a76You died in \u00a7e{0} \u00a76at \u00a7e{1}, {2}, {3}\u00a76. infoChapter=\u00a76Select chapter\: infoChapterPages=\u00a7e ---- \u00a76{0} \u00a7e--\u00a76 Page \u00a7c{1}\u00a76 of \u00a7c{2} \u00a7e---- infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e---- @@ -390,6 +393,7 @@ payToggleOff=\u00a76You are no longer accepting payments. payToggleOn=\u00a76You are now accepting payments. pendingTeleportCancelled=\u00a74Pending teleportation request cancelled. playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address\u00a7c {1} \u00a76for\: \u00a7c{2}\u00a76. +playerTempBanIpAddress=\u00a76Player\u00a7c {0} \u00a76temporarily banned IP address \u00a7c{1}\u00a76 for \u00a7c{2}\u00a76\: \u00a7c{3}\u00a76. playerBanned=\u00a76Player\u00a7c {0} \u00a76banned\u00a7c {1} \u00a76for\: \u00a7c{2}\u00a76. playerJailed=\u00a76Player\u00a7c {0} \u00a76jailed. playerJailedFor=\u00a76Player\u00a7c {0} \u00a76jailed for\u00a7c {1}\u00a76. @@ -474,6 +478,8 @@ requestSentAlready=\u00a74You have already sent {0}\u00a74 a teleport request. requestTimedOut=\u00a74Teleport request has timed out. resetBal=\u00a76Balance has been reset to \u00a7c{0} \u00a76for all online players. resetBalAll=\u00a76Balance has been reset to \u00a7c{0} \u00a76for all players. +rest=\u00a76You feel well rested. +restOther=\u00a76Resting\u00a7c {0}\u00a76. returnPlayerToJailError=\u00a74Error occurred when trying to return player\u00a7c {0} \u00a74to jail\: \u00a7c{1}\u00a74\! runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while). second=second @@ -484,6 +490,7 @@ seenOnline=\u00a76Player\u00a7c {0} \u00a76has been \u00a7aonline\u00a76 since \ sellBulkPermission=\u00a76You do not have permission to bulk sell. sellHandPermission=\u00a76You do not have permission to hand sell. serverFull=Server is full\! +serverReloading=There's a good chance you're reloading your server right now. If that's the case, why do you hate yourself? Expect no support from the EssentialsX team when using /reload. serverTotal=\u00a76Server Total\:\u00a7c {0} serverUnsupported=You are running an unsupported server version! setBal=\u00a7aYour balance was set to {0}. @@ -653,3 +660,4 @@ year=year years=years youAreHealed=\u00a76You have been healed. youHaveNewMail=\u00a76You have\u00a7c {0} \u00a76messages\! Type \u00a7c/mail read\u00a76 to view your mail. +xmppNotConfigured=XMPP is not configured properly. If you do not know what XMPP is, you may wish to remove the EssentialsXXMPP plugin from your server. diff --git a/Essentials/src/net/ess3/api/events/KitClaimEvent.java b/Essentials/src/net/ess3/api/events/KitClaimEvent.java new file mode 100644 index 00000000000..35ba3a7c8a7 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/KitClaimEvent.java @@ -0,0 +1,55 @@ +package net.ess3.api.events; + +import org.bukkit.Bukkit; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.earth2me.essentials.Kit; + +import net.ess3.api.IUser; + +/** + * Called when the player is given a kit + */ +public class KitClaimEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + + private Kit kit; + private IUser user; + private boolean cancelled; + + public KitClaimEvent(IUser user, Kit kit) { + super(!Bukkit.getServer().isPrimaryThread()); + this.user = user; + this.kit = kit; + } + + public IUser getUser() { + return user; + } + + public Kit getKit() { + return kit; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java b/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java new file mode 100644 index 00000000000..3dac80e9198 --- /dev/null +++ b/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java @@ -0,0 +1,60 @@ +package net.ess3.api.events; + +import com.earth2me.essentials.messaging.IMessageRecipient; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * Called just before a private message is sent to its recipient + */ +public class PrivateMessagePreSendEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled; + + private IMessageRecipient sender; + private IMessageRecipient recipient; + private String message; + + public PrivateMessagePreSendEvent(IMessageRecipient sender, IMessageRecipient recipient, String message) { + this.sender = sender; + this.recipient = recipient; + this.message = message; + } + + public IMessageRecipient getSender() { + return sender; + } + + public IMessageRecipient getRecipient() { + return recipient; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean b) { + this.cancelled = b; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index dcbfd2b6b5a..e0244a123a4 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -5,7 +5,7 @@ main: com.earth2me.essentials.Essentials version: ${full.version} website: http://tiny.cc/EssentialsCommands description: Provides an essential, core set of commands for Bukkit. -softdepend: [Vault] +softdepend: [Vault, LuckPerms] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685] api-version: "1.13" commands: @@ -360,6 +360,10 @@ commands: description: Repairs the durability of one or all items. usage: / [hand|all] aliases: [fix,efix,erepair] + rest: + description: Rests you or the given player. + usage: / [player] + aliases: [erest] rules: description: Views the server rules. usage: / [chapter] [page] @@ -424,6 +428,10 @@ commands: description: Temporary ban a user. usage: / aliases: [etempban] + tempbanip: + description: Temporarily ban an IP Address. + usage: / + aliases: [etempbanip] thunder: description: Enable/disable thunder. usage: / [duration] @@ -628,6 +636,12 @@ permissions: essentials.balancetop.exclude: default: false description: Players with this permission are excluded from the balancetop + essentials.back.onteleport: + default: true + description: Players with this permission will have back location stored during any teleportation + essentials.back.ondeath: + default: false + description: Players with this permission will have back location stored during death essentials.exempt: default: false description: Parent permission to be exempt from many moderator actions diff --git a/Essentials/src/worth.yml b/Essentials/src/worth.yml index 7d273e45dac..5ee6ada47fb 100644 --- a/Essentials/src/worth.yml +++ b/Essentials/src/worth.yml @@ -1,3 +1,5 @@ +# Determines how much items are worth on the server. +# This can be set in this file, or by running the /setworth command. worth: # Items not listed in this file will not be sellable on the server diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java index 4c82aba5d61..c12cd473569 100644 --- a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -1,34 +1,27 @@ package com.earth2me.essentials.antibuild; -import static com.earth2me.essentials.I18n.tl; - import com.earth2me.essentials.User; import com.earth2me.essentials.utils.VersionUtil; -import java.util.logging.Level; -import java.util.logging.Logger; import net.ess3.api.IEssentials; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; 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.BlockDispenseEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -import org.bukkit.event.block.BlockPistonRetractEvent; -import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.*; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static com.earth2me.essentials.I18n.tl; + public class EssentialsAntiBuildListener implements Listener { private static final Logger logger = Logger.getLogger("EssentialsAntiBuild"); @@ -165,6 +158,110 @@ public void onHangingBreak(final HangingBreakByEntityEvent event) { } } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onItemFrameInteract(final PlayerInteractEntityEvent event) { + final User user = ess.getUser(event.getPlayer()); + + if (!(event.getRightClicked() instanceof ItemFrame)) { + return; + } + + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "place", Material.ITEM_FRAME)) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildPlace", Material.ITEM_FRAME.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, Material.ITEM_FRAME) && !user.isAuthorized("essentials.protect.exemptplacement")) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildPlace", Material.ITEM_FRAME.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, Material.ITEM_FRAME) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { + prot.getEssentialsConnect().alert(user, Material.ITEM_FRAME.toString(), tl("alertPlaced")); + } + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onArmorStandInteract(final PlayerInteractAtEntityEvent event) { + final User user = ess.getUser(event.getPlayer()); + + if (!(event.getRightClicked() instanceof ArmorStand)) { + return; + } + + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "place", Material.ARMOR_STAND)) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildPlace", Material.ARMOR_STAND.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, Material.ARMOR_STAND) && !user.isAuthorized("essentials.protect.exemptplacement")) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildPlace", Material.ARMOR_STAND.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, Material.ARMOR_STAND) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { + prot.getEssentialsConnect().alert(user, Material.ARMOR_STAND.toString(), tl("alertPlaced")); + } + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onBlockEntityDamage(final EntityDamageByEntityEvent event) { + Player player = null; + + if (event.getDamager() instanceof Player) { + player = (Player) event.getDamager(); + } else if (event.getDamager() instanceof Projectile && ((Projectile)event.getDamager()).getShooter() instanceof Player) { + player = (Player) ((Projectile)event.getDamager()).getShooter(); + } else { + return; + } + + final User user = ess.getUser(player); + Material type = null; + + if (event.getEntity() instanceof ItemFrame) { + type = Material.ITEM_FRAME; + } else if (event.getEntity() instanceof ArmorStand) { + type = Material.ARMOR_STAND; + } else if (event.getEntity() instanceof EnderCrystal) { + type = Material.END_CRYSTAL; + } else { + return; + } + + if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "break", type)) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildBreak", type.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.blacklist_break, type) && !user.isAuthorized("essentials.protect.exemptbreak")) { + if (ess.getSettings().warnOnBuildDisallow()) { + user.sendMessage(tl("antiBuildBreak", type.toString())); + } + event.setCancelled(true); + return; + } + + if (prot.checkProtectionItems(AntiBuildConfig.alert_on_break, type) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { + prot.getEssentialsConnect().alert(user, type.toString(), tl("alertBroke")); + } + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPistonExtend(final BlockPistonExtendEvent event) { for (Block block : event.getBlocks()) { diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index 38cf0e811d4..27ba8799843 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -38,9 +38,9 @@ String getChatType(final String message) { final char prefix = message.charAt(0); if (prefix == ess.getSettings().getChatShout()) { - return "shout"; + return message.length() > 1 ? "shout" : ""; } else if (prefix == ess.getSettings().getChatQuestion()) { - return "question"; + return message.length() > 1 ? "question" : ""; } else { return ""; } diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java index 7647a8ed1d0..dc7768b89f4 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java @@ -16,6 +16,8 @@ import java.util.*; import java.util.logging.*; +import static com.earth2me.essentials.I18n.tl; + public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf { private static final Logger logger = Logger.getLogger("EssentialsXMPP"); @@ -86,7 +88,7 @@ public void processMessage(final Chat chat, final Message msg) { private boolean connect() { final String server = config.getString("xmpp.server"); if (server == null || server.equals("example.com")) { - logger.log(Level.WARNING, "config broken for xmpp"); + logger.log(Level.WARNING, tl("xmppNotConfigured")); return false; } final int port = config.getInt("xmpp.port", 5222); @@ -128,10 +130,14 @@ final void disconnect() { if (connection != null) { connection.disconnect(new Presence(Presence.Type.unavailable)); } - } final void updatePresence() { + if (connection == null) { + parent.getEss().getLogger().warning(tl("xmppNotConfigured")); + return; + } + final int usercount; final StringBuilder stringBuilder = new StringBuilder(); diff --git a/README.md b/README.md index 8adad139c26..a296bbd0cd2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![EssentialsX](https://i.imgur.com/CP4SZpB.png)](https://essentialsx.github.io) +[![EssentialsX](https://i.imgur.com/CP4SZpB.png)](https://essentialsx.cf) [Jenkins](http://ci.ender.zone/job/EssentialsX/) @@ -40,16 +40,8 @@ If you need to report a bug or want to suggest a new feature, you can [open an i Building -------- -EssentialsX builds against the Spigot/CraftBukkit server software for legacy support. - -To compile EssentialsX, you first need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools). -This only needs to be done once. There are two ways to do this: - -* Use the provided script at `scripts/buildtools.sh` to automatically download and run BuildTools if needed. -* Download and run BuildTools yourself for versions `1.8` and `1.8.3`. - -Next, to build EssentialsX with Maven, run the following command: -``` +To build EssentialsX, you need JDK 8 or higher and Maven installed on your system. Then, run the following command: +```sh mvn clean install ``` @@ -58,7 +50,8 @@ Each module's jar can be found in `target/` inside each module's directory. Using EssentialsX in your plugin -------------------------------- -Writing a plugin and want to support EssentialsX? We have a Maven repository at https://ci.ender.zone/plugin/repository/everything/, and the EssentialsX artifact is `net.ess3:EssentialsX:2.17.0`. More information at the [wiki](https://github.com/EssentialsX/Essentials/wiki/Common-Issues#how-do-i-add-essentialsx-as-a-dependency). +Do you want to integrate with EssentialsX in your plugin? EssentialsX is available on the **ender.zone Maven repository** at https://ci.ender.zone/plugin/repository/everything/, and the EssentialsX artifact is `net.ess3:EssentialsX:2.17.2`. +More information at the [wiki](https://github.com/EssentialsX/Essentials/wiki/Common-Issues#how-do-i-add-essentialsx-as-a-dependency). Contributing diff --git a/nms/1_8_R1Provider/.gitignore b/nms/1_8_R1Provider/.gitignore deleted file mode 100644 index 415c5104f71..00000000000 --- a/nms/1_8_R1Provider/.gitignore +++ /dev/null @@ -1 +0,0 @@ -craftbukkit-*.jar \ No newline at end of file diff --git a/nms/1_8_R1Provider/pom.xml b/nms/1_8_R1Provider/pom.xml deleted file mode 100644 index 0c246a6e457..00000000000 --- a/nms/1_8_R1Provider/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - EssentialsXParent - net.ess3 - 2.17.2 - ../../pom.xml - - 4.0.0 - - 1_8_R1Provider - - - - org.bukkit - craftbukkit - 1.8-R0.1-SNAPSHOT - provided - - - net.ess3 - NMSProvider - 2.17.2 - - - \ No newline at end of file diff --git a/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java b/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java deleted file mode 100644 index 29e66a5036a..00000000000 --- a/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.ess3.nms.v1_8_R1; - -import net.ess3.nms.SpawnerProvider; -import net.minecraft.server.v1_8_R1.NBTTagCompound; -import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - -public class v1_8_R1SpawnerProvider extends SpawnerProvider { - @Override - public ItemStack setEntityType(ItemStack is, EntityType type) { - net.minecraft.server.v1_8_R1.ItemStack itemStack; - CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); - itemStack = CraftItemStack.asNMSCopy(craftStack); - NBTTagCompound tag = itemStack.getTag(); - if (tag == null) { - tag = new NBTTagCompound(); - itemStack.setTag(tag); - } - if (!tag.hasKey("BlockEntityTag")) { - tag.set("BlockEntityTag", new NBTTagCompound()); - } - tag = itemStack.getTag().getCompound("BlockEntityTag"); - tag.setString("EntityId", type.getName()); - ItemStack bukkitItemStack = CraftItemStack.asCraftMirror(itemStack).clone(); - return setDisplayName(bukkitItemStack, type); - } - - @Override - public EntityType getEntityType(ItemStack is) { - net.minecraft.server.v1_8_R1.ItemStack itemStack; - CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); - itemStack = CraftItemStack.asNMSCopy(craftStack); - NBTTagCompound tag = itemStack.getTag(); - if (tag == null || !tag.hasKey("BlockEntityTag")) { - throw new IllegalArgumentException(); - } - String name = tag.getCompound("BlockEntityTag").getString("EntityId"); - return EntityType.fromName(name); - } - - @Override - public String getHumanName() { - return "CraftBukkit 1.8 NMS-based provider"; - } -} diff --git a/nms/1_8_R2Provider/.gitignore b/nms/1_8_R2Provider/.gitignore deleted file mode 100644 index 415c5104f71..00000000000 --- a/nms/1_8_R2Provider/.gitignore +++ /dev/null @@ -1 +0,0 @@ -craftbukkit-*.jar \ No newline at end of file diff --git a/nms/1_8_R2Provider/pom.xml b/nms/1_8_R2Provider/pom.xml deleted file mode 100644 index 2cbe5cbbec6..00000000000 --- a/nms/1_8_R2Provider/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - EssentialsXParent - net.ess3 - 2.17.2 - ../../pom.xml - - 4.0.0 - - 1_8_R2Provider - - - - org.bukkit - craftbukkit - 1.8.3-R0.1-SNAPSHOT - provided - - - net.ess3 - NMSProvider - 2.17.2 - - - \ No newline at end of file diff --git a/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java b/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java deleted file mode 100644 index 2d8a5458f23..00000000000 --- a/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.ess3.nms.v1_8_R2; - -import net.ess3.nms.SpawnerProvider; -import net.minecraft.server.v1_8_R2.NBTTagCompound; -import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftItemStack; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - -public class v1_8_R2SpawnerProvider extends SpawnerProvider { - @Override - public ItemStack setEntityType(ItemStack is, EntityType type) { - net.minecraft.server.v1_8_R2.ItemStack itemStack; - CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); - itemStack = CraftItemStack.asNMSCopy(craftStack); - NBTTagCompound tag = itemStack.getTag(); - if (tag == null) { - tag = new NBTTagCompound(); - itemStack.setTag(tag); - } - if (!tag.hasKey("BlockEntityTag")) { - tag.set("BlockEntityTag", new NBTTagCompound()); - } - tag = itemStack.getTag().getCompound("BlockEntityTag"); - tag.setString("EntityId", type.getName()); - ItemStack bukkitItemStack = CraftItemStack.asCraftMirror(itemStack).clone(); - return setDisplayName(bukkitItemStack, type); - } - - @Override - public EntityType getEntityType(ItemStack is) { - net.minecraft.server.v1_8_R2.ItemStack itemStack; - CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); - itemStack = CraftItemStack.asNMSCopy(craftStack); - NBTTagCompound tag = itemStack.getTag(); - if (tag == null || !tag.hasKey("BlockEntityTag")) { - throw new IllegalArgumentException(); - } - String name = tag.getCompound("BlockEntityTag").getString("EntityId"); - return EntityType.fromName(name); - } - - @Override - public String getHumanName() { - return "CraftBukkit 1.8.3 NMS-based provider"; - } -} diff --git a/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java b/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java index b3e5f3f4659..bea240ba4f0 100644 --- a/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java +++ b/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java @@ -24,7 +24,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getHumanName() { + public String getDescription() { return "1.13+ flat spawn egg provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java index 8ffa477d7c2..5170d4e90f9 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java @@ -14,7 +14,7 @@ public ItemStack createPotionItem(Material initial, int effectId) { } @Override - public String getHumanName() { + public String getDescription() { return "legacy potion meta provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java index 63e8be7c671..27d6a25ff67 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java @@ -24,7 +24,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getHumanName() { + public String getDescription() { return "legacy item data provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java index 2311df7016b..1a2716149e2 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java @@ -18,7 +18,7 @@ public EntityType getEntityType(ItemStack is) { } @Override - public String getHumanName() { + public String getDescription() { return "legacy item data provider"; } } diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java index b52f368f266..cd83b6c8e87 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java @@ -6,6 +6,7 @@ public abstract class SpawnEggProvider implements Provider { public abstract ItemStack createEggItem(EntityType type) throws IllegalArgumentException; + public abstract EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException; @Override diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java index 387c517a9ad..4d142cdd27a 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java @@ -1,7 +1,7 @@ package net.ess3.nms; -import net.ess3.providers.Provider; import com.google.common.collect.ImmutableMap; +import net.ess3.providers.Provider; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -25,18 +25,20 @@ public abstract class SpawnerProvider implements Provider { .build(); public abstract ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException; + public abstract EntityType getEntityType(ItemStack is) throws IllegalArgumentException; @Override public boolean tryProvider() { + EntityType type = EntityType.CREEPER; + Material MOB_SPAWNER; + try { + MOB_SPAWNER = Material.valueOf("SPAWNER"); + } catch (Exception e) { + MOB_SPAWNER = Material.valueOf("MOB_SPAWNER"); + } + try { - EntityType type = EntityType.CREEPER; - Material MOB_SPAWNER; - try { - MOB_SPAWNER = Material.SPAWNER; - } catch (Exception e) { - MOB_SPAWNER = Material.valueOf("MOB_SPAWNER"); - } ItemStack is = setEntityType(new ItemStack(MOB_SPAWNER), type); EntityType readType = getEntityType(is); return type == readType; diff --git a/nms/NMSProvider/src/net/ess3/providers/Provider.java b/nms/NMSProvider/src/net/ess3/providers/Provider.java index 2e7b96a56b8..0e23e9f6d47 100644 --- a/nms/NMSProvider/src/net/ess3/providers/Provider.java +++ b/nms/NMSProvider/src/net/ess3/providers/Provider.java @@ -3,5 +3,5 @@ public interface Provider { boolean tryProvider(); - String getHumanName(); + String getDescription(); } diff --git a/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java b/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java index 0abda6400d8..53b44bf7021 100644 --- a/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java +++ b/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java @@ -5,25 +5,24 @@ public class ProviderFactory { private Logger logger; private String providerType; - private Iterable> availableProviders; + private Iterable> providers; - public ProviderFactory(Logger logger, Iterable> availableProviders, String providerType) { + public ProviderFactory(Logger logger, Iterable> providers, String providerType) { this.logger = logger; this.providerType = providerType; - this.availableProviders = availableProviders; + this.providers = providers; } public T getProvider() { - T finalProvider = null; - for (Class providerClass : availableProviders) { - finalProvider = loadProvider(providerClass); - if (finalProvider != null && finalProvider.tryProvider()) { - break; + for (Class providerClass : providers) { + T provider = loadProvider(providerClass); + if (provider != null && provider.tryProvider()) { + logger.info("Using " + provider.getDescription() + " as " + providerType + " provider."); + return provider; } } - assert finalProvider != null; - logger.info("Using " + finalProvider.getHumanName() + " as " + providerType + " provider."); - return finalProvider; + logger.severe("The " + providerType + " provider failed to load! Some parts of Essentials may not function correctly."); + return null; } private T loadProvider(Class providerClass) { diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java index 6edc649212b..93301fd022c 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java @@ -30,7 +30,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getHumanName() { + public String getDescription() { return "Reflection based provider"; } } diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java index fb0e5f61979..f29bec133a9 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java @@ -36,7 +36,7 @@ public static String getNMSVersion() { } return nmsVersion; } - + public static NMSVersion getNmsVersionObject() { if (nmsVersionObject == null) { nmsVersionObject = NMSVersion.fromString(getNMSVersion()); @@ -224,7 +224,7 @@ public int hashCode() { /** * https://gist.github.com/SupaHam/dad1db6406596c5f8e4b221ff473831c - * + * * @author SupaHam (https://github.com/SupaHam) */ public static class NMSVersion implements Comparable { @@ -232,7 +232,7 @@ public static class NMSVersion implements Comparable { private final int major; private final int minor; private final int release; - + public static NMSVersion fromString(String string) { Preconditions.checkNotNull(string, "string cannot be null."); Matcher matcher = VERSION_PATTERN.matcher(string); @@ -251,19 +251,19 @@ private NMSVersion(int major, int minor, int release) { this.minor = minor; this.release = release; } - + public boolean isHigherThan(NMSVersion o) { return compareTo(o) > 0; } - + public boolean isHigherThanOrEqualTo(NMSVersion o) { return compareTo(o) >= 0; } - + public boolean isLowerThan(NMSVersion o) { return compareTo(o) < 0; } - + public boolean isLowerThanOrEqualTo(NMSVersion o) { return compareTo(o) <= 0; } @@ -290,8 +290,8 @@ public boolean equals(Object o) { } NMSVersion that = (NMSVersion) o; return major == that.major && - minor == that.minor && - release == that.release; + minor == that.minor && + release == that.release; } @Override @@ -301,7 +301,7 @@ public int hashCode() { @Override public String toString() { - return "v" + major + "_" + minor + "_R" + release; + return "v" + major + "_" + minor + "_R" + release; } @Override diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java index d17f7c91bf9..b5fc981db91 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with ASkyBlock. If not, see . ****************************************************************************** -*/ + */ package net.ess3.nms.refl; import org.bukkit.Material; @@ -95,7 +95,7 @@ public ItemStack toItemStack(int amount) throws Exception { } Object id = NBTTagCompoundConstructor.newInstance(); Method tagSetString = ReflUtil.getMethodCached(NBTTagCompoundClass, "setString", String.class, String.class); - + String idString = type.getName(); if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_11_R1)) { // 1.11 requires domain prefix of minecraft. @@ -152,4 +152,3 @@ static SpawnEggRefl fromItemStack(ItemStack item) throws Exception { } } } - diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java index c9aa02eb0ca..ed3464c2346 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java @@ -67,7 +67,7 @@ private static int getBit(int n, int k) { } @Override - public String getHumanName() { + public String getDescription() { return "1.9+ BasePotionData provider"; } } diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java index 28a55220cb4..0a4b18861f7 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java @@ -26,7 +26,7 @@ public EntityType getEntityType(ItemStack is) { } @Override - public String getHumanName() { + public String getDescription() { return "1.8.3+ BlockStateMeta provider"; } } diff --git a/pom.xml b/pom.xml index fb4bd6a8acc..85f8a8e944a 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,6 @@ EssentialsXMPP nms/NMSProvider nms/UpdatedMetaProvider - nms/1_8_R1Provider - nms/1_8_R2Provider nms/LegacyProvider nms/ReflectionProvider nms/FlattenedProvider @@ -253,28 +251,6 @@ true - - - - org.codehaus.mojo - native2ascii-maven-plugin - 2.0.1 - - - utf8-to-latin1 - - inplace - - process-resources - - ${project.build.outputDirectory} - ${project.build.sourceEncoding} - - **/*.properties - - - - diff --git a/scripts/buildtools.sh b/scripts/buildtools.sh deleted file mode 100755 index a7e45436381..00000000000 --- a/scripts/buildtools.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash -mkdir -p .buildtools -pushd .buildtools - -is_installed() { - mvn dependency:get -q -Dartifact=$1 -DremoteRepositories=file://$HOME/.m2/repository 1>/dev/null 2>&1 - return $? -} - -ensure_buildtools() { - if [ ! -f "BuildTools.jar" ]; then - echo "Downloading BuildTools..." - if [[ "$OSTYPE" == "darwin"* ]] || [[ "$OSTYPE" == "msys"* ]]; then - curl https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -o BuildTools.jar - else - wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - fi - fi -} - -run_buildtools() { - ensure_buildtools - # Check if env var isnt empty, then run with xmx flag - if [ ! -z "$BUILDTOOLS_XMX" ]; then - echo "BUILDTOOLS_XMX Environment variable found. Running BuildTools with -Xmx$BUILDTOOLS_XMX" - java -Xmx$BUILDTOOLS_XMX -jar BuildTools.jar --rev $1 - else - java -jar BuildTools.jar --rev $1 - fi - if [ $? -ne 0 ]; then - echo "Running BuildTools for CB $1 failed! Aborting." - popd - exit 255 - else - echo "Successfully built version $1" - fi -} - -# Check CB 1.8 -is_installed org.bukkit:craftbukkit:1.8-R0.1-SNAPSHOT -is_18=$? # 0 = present, 1 = not present - -# Check CB 1.8.3 -is_installed org.bukkit:craftbukkit:1.8.3-R0.1-SNAPSHOT -is_183=$? - -if [ $is_18 -ne 0 ]; then - echo "Installing CraftBukkit 1.8..." - run_buildtools 1.8 -else - echo "CraftBukkit 1.8 installed; skipping BuildTools..." -fi - -if [ $is_183 -ne 0 ]; then - echo "Installing CraftBukkit 1.8.3..." - run_buildtools 1.8.3 -else - echo "CraftBukkit 1.8.3 installed; skipping BuildTools..." -fi - -popd From 98d7dca61316f1bedb004b07d85f860b06a04f3d Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 20:42:45 -0700 Subject: [PATCH 03/10] Spawner block provider --- .../com/earth2me/essentials/Essentials.java | 34 +++++++--- .../essentials/EssentialsBlockListener.java | 2 +- .../com/earth2me/essentials/IEssentials.java | 7 ++- .../essentials/commands/Commandspawner.java | 33 +++------- .../earth2me/essentials/items/FlatItemDb.java | 4 +- .../essentials/items/LegacyItemDb.java | 2 +- ...er.java => LegacySpawnerItemProvider.java} | 4 +- .../net/ess3/nms/SpawnerBlockProvider.java | 10 +++ ...Provider.java => SpawnerItemProvider.java} | 2 +- .../nms/refl/ReflSpawnerBlockProvider.java | 62 +++++++++++++++++++ ...java => BlockMetaSpawnerItemProvider.java} | 4 +- .../BukkitSpawnerBlockProvider.java | 31 ++++++++++ 12 files changed, 148 insertions(+), 47 deletions(-) rename nms/LegacyProvider/src/net/ess3/nms/legacy/{LegacySpawnerProvider.java => LegacySpawnerItemProvider.java} (83%) create mode 100644 nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java rename nms/NMSProvider/src/net/ess3/nms/{SpawnerProvider.java => SpawnerItemProvider.java} (97%) create mode 100644 nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java rename nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/{BlockMetaSpawnerProvider.java => BlockMetaSpawnerItemProvider.java} (89%) create mode 100644 nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 95b13c97179..450d613b311 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -40,14 +40,17 @@ import net.ess3.api.*; import net.ess3.nms.PotionMetaProvider; import net.ess3.nms.SpawnEggProvider; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerBlockProvider; +import net.ess3.nms.SpawnerItemProvider; import net.ess3.nms.flattened.FlatSpawnEggProvider; import net.ess3.nms.legacy.LegacyPotionMetaProvider; import net.ess3.nms.legacy.LegacySpawnEggProvider; -import net.ess3.nms.legacy.LegacySpawnerProvider; +import net.ess3.nms.legacy.LegacySpawnerItemProvider; import net.ess3.nms.refl.ReflSpawnEggProvider; +import net.ess3.nms.refl.ReflSpawnerBlockProvider; import net.ess3.nms.updatedmeta.BasePotionDataProvider; -import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider; +import net.ess3.nms.updatedmeta.BlockMetaSpawnerItemProvider; +import net.ess3.nms.updatedmeta.BukkitSpawnerBlockProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -108,7 +111,8 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient EssentialsTimer timer; private final transient Set vanishedPlayers = new LinkedHashSet<>(); private transient Method oldGetOnlinePlayers; - private transient SpawnerProvider spawnerProvider; + private transient SpawnerItemProvider spawnerItemProvider; + private transient SpawnerBlockProvider spawnerBlockProvider; private transient SpawnEggProvider spawnEggProvider; private transient PotionMetaProvider potionMetaProvider; private transient Kits kits; @@ -246,11 +250,16 @@ public void onEnable() { confList.add(jails); execTimer.mark("Init(Jails)"); - spawnerProvider = new ProviderFactory<>(getLogger(), + spawnerItemProvider = new ProviderFactory<>(getLogger(), Arrays.asList( - BlockMetaSpawnerProvider.class, - LegacySpawnerProvider.class - ), "mob spawner").getProvider(); + BlockMetaSpawnerItemProvider.class, + LegacySpawnerItemProvider.class + ), "mob spawner item").getProvider(); + spawnerBlockProvider = new ProviderFactory<>(getLogger(), + Arrays.asList( + BukkitSpawnerBlockProvider.class, + ReflSpawnerBlockProvider.class + ), "mob spawner block").getProvider(); spawnEggProvider = new ProviderFactory<>(getLogger(), Arrays.asList( FlatSpawnEggProvider.class, @@ -923,8 +932,13 @@ public Iterable getOnlineUsers() { } @Override - public SpawnerProvider getSpawnerProvider() { - return spawnerProvider; + public SpawnerItemProvider getSpawnerItemProvider() { + return spawnerItemProvider; + } + + @Override + public SpawnerBlockProvider getSpawnerBlockProvider() { + return spawnerBlockProvider; } @Override diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 6d2c1024b59..7d2c8ef38c0 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -37,7 +37,7 @@ public void onBlockPlace(final BlockPlaceEvent event) { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = ess.getSpawnerProvider().getEntityType(event.getItemInHand()); + final EntityType type = ess.getSpawnerItemProvider().getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index 7c34c16982f..776b05d8425 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -6,7 +6,8 @@ import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerBlockProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -105,5 +106,7 @@ public interface IEssentials extends Plugin { Iterable getOnlineUsers(); - SpawnerProvider getSpawnerProvider(); + SpawnerItemProvider getSpawnerItemProvider(); + + SpawnerBlockProvider getSpawnerBlockProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index 6aa43035a89..c9909655cd4 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -7,16 +7,13 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; -import com.earth2me.essentials.utils.VersionUtil; -import net.ess3.nms.refl.ReflUtil; +import net.ess3.nms.SpawnerBlockProvider; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.Locale; import static com.earth2me.essentials.I18n.tl; @@ -62,30 +59,14 @@ protected void run(final Server server, final User user, final String commandLab final Trade charge = new Trade("spawner-" + mob.name.toLowerCase(Locale.ENGLISH), ess); charge.isAffordableFor(user); try { - Block block = target.getBlock(); - CreatureSpawner spawner = (CreatureSpawner) block.getState(); + CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); spawner.setSpawnedType(mob.getType()); if (delay > 0) { - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_12_2_R01)) { - spawner.setMinSpawnDelay(0); - spawner.setMaxSpawnDelay(Integer.MAX_VALUE); - spawner.setMinSpawnDelay(delay); - spawner.setMaxSpawnDelay(delay); - } else { - Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); - Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Method getSpawner = tileEntityMobSpawner.getDeclaredMethod("getSpawner"); - Method getTileEntityAt = craftWorld.getDeclaredMethod("getTileEntityAt", int.class, int.class, int.class); - Object craftTileEntity = getTileEntityAt.invoke(block.getWorld(), block.getX(), block.getY(), block.getZ()); - Object nmsSpawner = getSpawner.invoke(craftTileEntity); - Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); - Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); - if (minSpawnDelay != null && maxSpawnDelay != null) { - minSpawnDelay.setInt(nmsSpawner, delay); - maxSpawnDelay.setInt(nmsSpawner, delay); - } - } + SpawnerBlockProvider spawnerBlockProvider = ess.getSpawnerBlockProvider(); + spawnerBlockProvider.setMinSpawnDelay(spawner, 1); + spawnerBlockProvider.setMaxSpawnDelay(spawner, Integer.MAX_VALUE); + spawnerBlockProvider.setMinSpawnDelay(spawner, delay); + spawnerBlockProvider.setMaxSpawnDelay(spawner, delay); } spawner.setDelay(delay); spawner.update(); diff --git a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java index 90f9e5959b5..07084c4c04f 100644 --- a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java @@ -145,7 +145,7 @@ public ItemStack get(String id, boolean useResolvers) throws Exception { // setItemMeta to prevent a race condition EntityType entity = data.getEntity(); if (entity != null && material.toString().contains("SPAWNER")) { - ess.getSpawnerProvider().setEntityType(stack, entity); + ess.getSpawnerItemProvider().setEntityType(stack, entity); } return stack; @@ -203,7 +203,7 @@ private ItemData lookup(ItemStack item) { PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData(); return new ItemData(type, potion); } else if (type.toString().contains("SPAWNER")) { - EntityType entity = ess.getSpawnerProvider().getEntityType(item); + EntityType entity = ess.getSpawnerItemProvider().getEntityType(item); return new ItemData(type, entity); } else { return new ItemData(type); diff --git a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java index 759616e3809..68a926ca2bf 100644 --- a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java @@ -185,7 +185,7 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti if (mat == MOB_SPAWNER) { if (metaData == 0) metaData = EntityType.PIG.getTypeId(); try { - retval = ess.getSpawnerProvider().setEntityType(retval, EntityType.fromId(metaData)); + retval = ess.getSpawnerItemProvider().setEntityType(retval, EntityType.fromId(metaData)); } catch (IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java similarity index 83% rename from nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java rename to nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java index 1a2716149e2..aec11a35a34 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java @@ -1,11 +1,11 @@ package net.ess3.nms.legacy; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @SuppressWarnings("deprecation") -public class LegacySpawnerProvider extends SpawnerProvider { +public class LegacySpawnerItemProvider extends SpawnerItemProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { is.getData().setData((byte) type.getTypeId()); diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java new file mode 100644 index 00000000000..8c887e816c5 --- /dev/null +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java @@ -0,0 +1,10 @@ +package net.ess3.nms; + +import net.ess3.providers.Provider; +import org.bukkit.block.CreatureSpawner; + +public abstract class SpawnerBlockProvider implements Provider { + public abstract void setMaxSpawnDelay(CreatureSpawner spawner, int delay); + + public abstract void setMinSpawnDelay(CreatureSpawner spawner, int delay); +} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java similarity index 97% rename from nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java rename to nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java index 4d142cdd27a..b54e086b8a0 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java @@ -10,7 +10,7 @@ import java.util.Map; -public abstract class SpawnerProvider implements Provider { +public abstract class SpawnerItemProvider implements Provider { private Map entityToDisplayName = ImmutableMap.builder() .put(EntityType.CAVE_SPIDER, "Cave Spider") .put(EntityType.PIG_ZOMBIE, "Zombie Pigman") diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java new file mode 100644 index 00000000000..825c5ba0e2d --- /dev/null +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java @@ -0,0 +1,62 @@ +package net.ess3.nms.refl; + +import net.ess3.nms.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflSpawnerBlockProvider extends SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); + if (maxSpawnDelay != null) { + try { + maxSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) {} + } + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); + if (minSpawnDelay != null) { + try { + minSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) {} + } + } + + @Override + public boolean tryProvider() { + try { + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); + return false; + } catch (NoSuchMethodException e) { + return true; + } + } + + @Override + public String getDescription() { + return "Reflection based provider"; + } + + private Object getNMSSpawner(CreatureSpawner spawner) { + try { + Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); + Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); + Method getSpawner = ReflUtil.getMethodCached(tileEntityMobSpawner, "getSpawner"); + Method getTileEntityAt = ReflUtil.getMethodCached(craftWorld, "getTileEntityAt", int.class, int.class, int.class); + if (getSpawner != null && getTileEntityAt != null) { + Object craftTileEntity = getTileEntityAt.invoke(spawner.getWorld(), spawner.getX(), spawner.getY(), spawner.getZ()); + return getSpawner.invoke(craftTileEntity); + } + } catch (IllegalAccessException | InvocationTargetException ignored) { + } + return null; + } +} diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java similarity index 89% rename from nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java rename to nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java index 0a4b18861f7..a42d64479d3 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java @@ -1,13 +1,13 @@ package net.ess3.nms.updatedmeta; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; -public class BlockMetaSpawnerProvider extends SpawnerProvider { +public class BlockMetaSpawnerItemProvider extends SpawnerItemProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java new file mode 100644 index 00000000000..195516b71a5 --- /dev/null +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java @@ -0,0 +1,31 @@ +package net.ess3.nms.updatedmeta; + +import net.ess3.nms.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +public class BukkitSpawnerBlockProvider extends SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMaxSpawnDelay(delay); + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMinSpawnDelay(delay); + } + + @Override + public boolean tryProvider() { + try { + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); + return true; + } catch (NoSuchMethodException e) { + return false; + } + } + + @Override + public String getDescription() { + return "Bukkit 1.12+ provider"; + } +} From 34e63a8eda2f118ab4834908b387c235746aea32 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 20:54:19 -0700 Subject: [PATCH 04/10] Revert "Spawner block provider" This reverts commit 98d7dca61316f1bedb004b07d85f860b06a04f3d. --- .../com/earth2me/essentials/Essentials.java | 34 +++------- .../essentials/EssentialsBlockListener.java | 2 +- .../com/earth2me/essentials/IEssentials.java | 7 +-- .../essentials/commands/Commandspawner.java | 33 +++++++--- .../earth2me/essentials/items/FlatItemDb.java | 4 +- .../essentials/items/LegacyItemDb.java | 2 +- ...ovider.java => LegacySpawnerProvider.java} | 4 +- .../net/ess3/nms/SpawnerBlockProvider.java | 10 --- ...ItemProvider.java => SpawnerProvider.java} | 2 +- .../nms/refl/ReflSpawnerBlockProvider.java | 62 ------------------- ...der.java => BlockMetaSpawnerProvider.java} | 4 +- .../BukkitSpawnerBlockProvider.java | 31 ---------- 12 files changed, 47 insertions(+), 148 deletions(-) rename nms/LegacyProvider/src/net/ess3/nms/legacy/{LegacySpawnerItemProvider.java => LegacySpawnerProvider.java} (83%) delete mode 100644 nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java rename nms/NMSProvider/src/net/ess3/nms/{SpawnerItemProvider.java => SpawnerProvider.java} (97%) delete mode 100644 nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java rename nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/{BlockMetaSpawnerItemProvider.java => BlockMetaSpawnerProvider.java} (89%) delete mode 100644 nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 450d613b311..95b13c97179 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -40,17 +40,14 @@ import net.ess3.api.*; import net.ess3.nms.PotionMetaProvider; import net.ess3.nms.SpawnEggProvider; -import net.ess3.nms.SpawnerBlockProvider; -import net.ess3.nms.SpawnerItemProvider; +import net.ess3.nms.SpawnerProvider; import net.ess3.nms.flattened.FlatSpawnEggProvider; import net.ess3.nms.legacy.LegacyPotionMetaProvider; import net.ess3.nms.legacy.LegacySpawnEggProvider; -import net.ess3.nms.legacy.LegacySpawnerItemProvider; +import net.ess3.nms.legacy.LegacySpawnerProvider; import net.ess3.nms.refl.ReflSpawnEggProvider; -import net.ess3.nms.refl.ReflSpawnerBlockProvider; import net.ess3.nms.updatedmeta.BasePotionDataProvider; -import net.ess3.nms.updatedmeta.BlockMetaSpawnerItemProvider; -import net.ess3.nms.updatedmeta.BukkitSpawnerBlockProvider; +import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -111,8 +108,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient EssentialsTimer timer; private final transient Set vanishedPlayers = new LinkedHashSet<>(); private transient Method oldGetOnlinePlayers; - private transient SpawnerItemProvider spawnerItemProvider; - private transient SpawnerBlockProvider spawnerBlockProvider; + private transient SpawnerProvider spawnerProvider; private transient SpawnEggProvider spawnEggProvider; private transient PotionMetaProvider potionMetaProvider; private transient Kits kits; @@ -250,16 +246,11 @@ public void onEnable() { confList.add(jails); execTimer.mark("Init(Jails)"); - spawnerItemProvider = new ProviderFactory<>(getLogger(), + spawnerProvider = new ProviderFactory<>(getLogger(), Arrays.asList( - BlockMetaSpawnerItemProvider.class, - LegacySpawnerItemProvider.class - ), "mob spawner item").getProvider(); - spawnerBlockProvider = new ProviderFactory<>(getLogger(), - Arrays.asList( - BukkitSpawnerBlockProvider.class, - ReflSpawnerBlockProvider.class - ), "mob spawner block").getProvider(); + BlockMetaSpawnerProvider.class, + LegacySpawnerProvider.class + ), "mob spawner").getProvider(); spawnEggProvider = new ProviderFactory<>(getLogger(), Arrays.asList( FlatSpawnEggProvider.class, @@ -932,13 +923,8 @@ public Iterable getOnlineUsers() { } @Override - public SpawnerItemProvider getSpawnerItemProvider() { - return spawnerItemProvider; - } - - @Override - public SpawnerBlockProvider getSpawnerBlockProvider() { - return spawnerBlockProvider; + public SpawnerProvider getSpawnerProvider() { + return spawnerProvider; } @Override diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 7d2c8ef38c0..6d2c1024b59 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -37,7 +37,7 @@ public void onBlockPlace(final BlockPlaceEvent event) { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = ess.getSpawnerItemProvider().getEntityType(event.getItemInHand()); + final EntityType type = ess.getSpawnerProvider().getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index 776b05d8425..7c34c16982f 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -6,8 +6,7 @@ import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; -import net.ess3.nms.SpawnerBlockProvider; -import net.ess3.nms.SpawnerItemProvider; +import net.ess3.nms.SpawnerProvider; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -106,7 +105,5 @@ public interface IEssentials extends Plugin { Iterable getOnlineUsers(); - SpawnerItemProvider getSpawnerItemProvider(); - - SpawnerBlockProvider getSpawnerBlockProvider(); + SpawnerProvider getSpawnerProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index c9909655cd4..6aa43035a89 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -7,13 +7,16 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; -import net.ess3.nms.SpawnerBlockProvider; +import com.earth2me.essentials.utils.VersionUtil; +import net.ess3.nms.refl.ReflUtil; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.Locale; import static com.earth2me.essentials.I18n.tl; @@ -59,14 +62,30 @@ protected void run(final Server server, final User user, final String commandLab final Trade charge = new Trade("spawner-" + mob.name.toLowerCase(Locale.ENGLISH), ess); charge.isAffordableFor(user); try { - CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); + Block block = target.getBlock(); + CreatureSpawner spawner = (CreatureSpawner) block.getState(); spawner.setSpawnedType(mob.getType()); if (delay > 0) { - SpawnerBlockProvider spawnerBlockProvider = ess.getSpawnerBlockProvider(); - spawnerBlockProvider.setMinSpawnDelay(spawner, 1); - spawnerBlockProvider.setMaxSpawnDelay(spawner, Integer.MAX_VALUE); - spawnerBlockProvider.setMinSpawnDelay(spawner, delay); - spawnerBlockProvider.setMaxSpawnDelay(spawner, delay); + if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_12_2_R01)) { + spawner.setMinSpawnDelay(0); + spawner.setMaxSpawnDelay(Integer.MAX_VALUE); + spawner.setMinSpawnDelay(delay); + spawner.setMaxSpawnDelay(delay); + } else { + Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); + Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Method getSpawner = tileEntityMobSpawner.getDeclaredMethod("getSpawner"); + Method getTileEntityAt = craftWorld.getDeclaredMethod("getTileEntityAt", int.class, int.class, int.class); + Object craftTileEntity = getTileEntityAt.invoke(block.getWorld(), block.getX(), block.getY(), block.getZ()); + Object nmsSpawner = getSpawner.invoke(craftTileEntity); + Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); + Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); + if (minSpawnDelay != null && maxSpawnDelay != null) { + minSpawnDelay.setInt(nmsSpawner, delay); + maxSpawnDelay.setInt(nmsSpawner, delay); + } + } } spawner.setDelay(delay); spawner.update(); diff --git a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java index 07084c4c04f..90f9e5959b5 100644 --- a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java @@ -145,7 +145,7 @@ public ItemStack get(String id, boolean useResolvers) throws Exception { // setItemMeta to prevent a race condition EntityType entity = data.getEntity(); if (entity != null && material.toString().contains("SPAWNER")) { - ess.getSpawnerItemProvider().setEntityType(stack, entity); + ess.getSpawnerProvider().setEntityType(stack, entity); } return stack; @@ -203,7 +203,7 @@ private ItemData lookup(ItemStack item) { PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData(); return new ItemData(type, potion); } else if (type.toString().contains("SPAWNER")) { - EntityType entity = ess.getSpawnerItemProvider().getEntityType(item); + EntityType entity = ess.getSpawnerProvider().getEntityType(item); return new ItemData(type, entity); } else { return new ItemData(type); diff --git a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java index 68a926ca2bf..759616e3809 100644 --- a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java @@ -185,7 +185,7 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti if (mat == MOB_SPAWNER) { if (metaData == 0) metaData = EntityType.PIG.getTypeId(); try { - retval = ess.getSpawnerItemProvider().setEntityType(retval, EntityType.fromId(metaData)); + retval = ess.getSpawnerProvider().setEntityType(retval, EntityType.fromId(metaData)); } catch (IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java similarity index 83% rename from nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java rename to nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java index aec11a35a34..1a2716149e2 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java @@ -1,11 +1,11 @@ package net.ess3.nms.legacy; -import net.ess3.nms.SpawnerItemProvider; +import net.ess3.nms.SpawnerProvider; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @SuppressWarnings("deprecation") -public class LegacySpawnerItemProvider extends SpawnerItemProvider { +public class LegacySpawnerProvider extends SpawnerProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { is.getData().setData((byte) type.getTypeId()); diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java deleted file mode 100644 index 8c887e816c5..00000000000 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.ess3.nms; - -import net.ess3.providers.Provider; -import org.bukkit.block.CreatureSpawner; - -public abstract class SpawnerBlockProvider implements Provider { - public abstract void setMaxSpawnDelay(CreatureSpawner spawner, int delay); - - public abstract void setMinSpawnDelay(CreatureSpawner spawner, int delay); -} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java similarity index 97% rename from nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java rename to nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java index b54e086b8a0..4d142cdd27a 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java @@ -10,7 +10,7 @@ import java.util.Map; -public abstract class SpawnerItemProvider implements Provider { +public abstract class SpawnerProvider implements Provider { private Map entityToDisplayName = ImmutableMap.builder() .put(EntityType.CAVE_SPIDER, "Cave Spider") .put(EntityType.PIG_ZOMBIE, "Zombie Pigman") diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java deleted file mode 100644 index 825c5ba0e2d..00000000000 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.ess3.nms.refl; - -import net.ess3.nms.SpawnerBlockProvider; -import org.bukkit.block.CreatureSpawner; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class ReflSpawnerBlockProvider extends SpawnerBlockProvider { - @Override - public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); - if (maxSpawnDelay != null) { - try { - maxSpawnDelay.setInt(getNMSSpawner(spawner), delay); - } catch (IllegalAccessException ignored) {} - } - } - - @Override - public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); - if (minSpawnDelay != null) { - try { - minSpawnDelay.setInt(getNMSSpawner(spawner), delay); - } catch (IllegalAccessException ignored) {} - } - } - - @Override - public boolean tryProvider() { - try { - CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); - return false; - } catch (NoSuchMethodException e) { - return true; - } - } - - @Override - public String getDescription() { - return "Reflection based provider"; - } - - private Object getNMSSpawner(CreatureSpawner spawner) { - try { - Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); - Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); - Method getSpawner = ReflUtil.getMethodCached(tileEntityMobSpawner, "getSpawner"); - Method getTileEntityAt = ReflUtil.getMethodCached(craftWorld, "getTileEntityAt", int.class, int.class, int.class); - if (getSpawner != null && getTileEntityAt != null) { - Object craftTileEntity = getTileEntityAt.invoke(spawner.getWorld(), spawner.getX(), spawner.getY(), spawner.getZ()); - return getSpawner.invoke(craftTileEntity); - } - } catch (IllegalAccessException | InvocationTargetException ignored) { - } - return null; - } -} diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java similarity index 89% rename from nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java rename to nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java index a42d64479d3..0a4b18861f7 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java @@ -1,13 +1,13 @@ package net.ess3.nms.updatedmeta; -import net.ess3.nms.SpawnerItemProvider; +import net.ess3.nms.SpawnerProvider; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; -public class BlockMetaSpawnerItemProvider extends SpawnerItemProvider { +public class BlockMetaSpawnerProvider extends SpawnerProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java deleted file mode 100644 index 195516b71a5..00000000000 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.ess3.nms.updatedmeta; - -import net.ess3.nms.SpawnerBlockProvider; -import org.bukkit.block.CreatureSpawner; - -public class BukkitSpawnerBlockProvider extends SpawnerBlockProvider { - @Override - public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { - spawner.setMaxSpawnDelay(delay); - } - - @Override - public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { - spawner.setMinSpawnDelay(delay); - } - - @Override - public boolean tryProvider() { - try { - CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); - return true; - } catch (NoSuchMethodException e) { - return false; - } - } - - @Override - public String getDescription() { - return "Bukkit 1.12+ provider"; - } -} From 259de82770e142a91a9ddb599d5cd884a4b9a90a Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 20:54:35 -0700 Subject: [PATCH 05/10] Revert "Update branch" This reverts commit 8a6af584217a51b252f27232d7155e34e7e4f2ac. --- .github/workflows/build.yml | 3 + .gitignore | 3 +- Essentials/pom.xml | 30 +++- .../src/com/earth2me/essentials/Backup.java | 25 +--- .../com/earth2me/essentials/Essentials.java | 28 +--- .../essentials/EssentialsEntityListener.java | 5 - .../essentials/EssentialsPlayerListener.java | 2 +- .../essentials/EssentialsPluginListener.java | 1 - .../essentials/EssentialsServerListener.java | 3 +- .../src/com/earth2me/essentials/I18n.java | 56 ++------ .../com/earth2me/essentials/ISettings.java | 6 - .../src/com/earth2me/essentials/Kit.java | 12 +- .../src/com/earth2me/essentials/Settings.java | 16 --- .../src/com/earth2me/essentials/Teleport.java | 4 +- .../essentials/commands/Commandbigtree.java | 8 +- .../commands/Commandclearinventory.java | 66 +++------ .../essentials/commands/Commanddepth.java | 2 +- .../essentials/commands/Commandeco.java | 5 - .../essentials/commands/Commandexp.java | 4 - .../essentials/commands/Commandext.java | 8 +- .../essentials/commands/Commandhat.java | 8 -- .../essentials/commands/Commandinvsee.java | 4 - .../essentials/commands/Commandmsg.java | 2 +- .../essentials/commands/Commandpay.java | 2 +- .../essentials/commands/Commandrest.java | 72 ---------- .../essentials/commands/Commandtempbanip.java | 87 ------------ .../essentials/commands/Commandtree.java | 8 +- .../essentials/craftbukkit/ServerState.java | 67 --------- .../messaging/IMessageRecipient.java | 4 +- .../messaging/SimpleMessageRecipient.java | 8 -- .../essentials/perm/IPermissionsHandler.java | 6 - .../essentials/perm/PermissionsHandler.java | 27 ---- .../perm/impl/LuckPermsHandler.java | 55 -------- .../perm/impl/SuperpermsHandler.java | 10 -- .../essentials/signs/EssentialsSign.java | 8 +- .../essentials/signs/SignDisposal.java | 17 +-- .../earth2me/essentials/signs/SignTrade.java | 8 +- .../earth2me/essentials/utils/DateUtil.java | 4 - .../earth2me/essentials/utils/NumberUtil.java | 9 -- Essentials/src/config.yml | 16 +-- Essentials/src/messages.properties | 8 -- .../net/ess3/api/events/KitClaimEvent.java | 55 -------- .../events/PrivateMessagePreSendEvent.java | 60 -------- Essentials/src/plugin.yml | 16 +-- Essentials/src/worth.yml | 2 - .../EssentialsAntiBuildListener.java | 129 +++--------------- .../essentials/chat/EssentialsChatPlayer.java | 4 +- .../earth2me/essentials/xmpp/XMPPManager.java | 10 +- README.md | 17 ++- nms/1_8_R1Provider/.gitignore | 1 + nms/1_8_R1Provider/pom.xml | 28 ++++ .../nms/v1_8_R1/v1_8_R1SpawnerProvider.java | 46 +++++++ nms/1_8_R2Provider/.gitignore | 1 + nms/1_8_R2Provider/pom.xml | 28 ++++ .../nms/v1_8_R2/v1_8_R2SpawnerProvider.java | 46 +++++++ .../nms/flattened/FlatSpawnEggProvider.java | 2 +- .../nms/legacy/LegacyPotionMetaProvider.java | 2 +- .../nms/legacy/LegacySpawnEggProvider.java | 2 +- .../nms/legacy/LegacySpawnerProvider.java | 2 +- .../src/net/ess3/nms/SpawnEggProvider.java | 1 - .../src/net/ess3/nms/SpawnerProvider.java | 18 ++- .../src/net/ess3/providers/Provider.java | 2 +- .../net/ess3/providers/ProviderFactory.java | 21 +-- .../ess3/nms/refl/ReflSpawnEggProvider.java | 2 +- .../src/net/ess3/nms/refl/ReflUtil.java | 20 +-- .../src/net/ess3/nms/refl/SpawnEggRefl.java | 5 +- .../updatedmeta/BasePotionDataProvider.java | 2 +- .../updatedmeta/BlockMetaSpawnerProvider.java | 2 +- pom.xml | 24 ++++ scripts/buildtools.sh | 61 +++++++++ 70 files changed, 409 insertions(+), 917 deletions(-) delete mode 100644 Essentials/src/com/earth2me/essentials/commands/Commandrest.java delete mode 100644 Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java delete mode 100644 Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java delete mode 100644 Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java delete mode 100644 Essentials/src/net/ess3/api/events/KitClaimEvent.java delete mode 100644 Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java create mode 100644 nms/1_8_R1Provider/.gitignore create mode 100644 nms/1_8_R1Provider/pom.xml create mode 100644 nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java create mode 100644 nms/1_8_R2Provider/.gitignore create mode 100644 nms/1_8_R2Provider/pom.xml create mode 100644 nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java create mode 100755 scripts/buildtools.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d4b31e2b46..0b832765e26 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,9 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 + - name: Run BuildTools + if: steps.cache.outputs.cache-hit != 'true' + run: chmod +x scripts/buildtools.sh && ./scripts/buildtools.sh - name: Build with Maven run: mvn package --file pom.xml - name: Copy artifacts diff --git a/.gitignore b/.gitignore index d5ab3034d69..5cb07e59bba 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,4 @@ # Build files target/ -jars/ -out/ \ No newline at end of file +jars/ \ No newline at end of file diff --git a/Essentials/pom.xml b/Essentials/pom.xml index e18d0b6188d..a2f7695cf03 100644 --- a/Essentials/pom.xml +++ b/Essentials/pom.xml @@ -54,12 +54,6 @@ 1.7 provided - - net.luckperms - api - 5.0 - provided - io.papermc paperlib @@ -78,6 +72,30 @@ 2.17.2 compile + + net.ess3 + 1_8_R1Provider + 2.17.2 + compile + + + org.bukkit + craftbukkit + + + + + net.ess3 + 1_8_R2Provider + 2.17.2 + compile + + + org.bukkit + craftbukkit + + + net.ess3 LegacyProvider diff --git a/Essentials/src/com/earth2me/essentials/Backup.java b/Essentials/src/com/earth2me/essentials/Backup.java index 9b481de056a..6f4020acce8 100644 --- a/Essentials/src/com/earth2me/essentials/Backup.java +++ b/Essentials/src/com/earth2me/essentials/Backup.java @@ -7,8 +7,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; @@ -22,13 +20,11 @@ public class Backup implements Runnable { private transient boolean running = false; private transient int taskId = -1; private transient boolean active = false; - private final AtomicBoolean pendingShutdown = new AtomicBoolean(false); - private transient CompletableFuture taskLock = null; public Backup(final IEssentials ess) { this.ess = ess; server = ess.getServer(); - if (!ess.getOnlinePlayers().isEmpty() || ess.getSettings().isAlwaysRunBackup()) { + if (!ess.getOnlinePlayers().isEmpty()) { ess.runTaskAsynchronously(this::startTask); } } @@ -56,30 +52,20 @@ private synchronized void startTask() { } } - public CompletableFuture getTaskLock() { - return taskLock; - } - - public void setPendingShutdown(boolean shutdown) { - pendingShutdown.set(shutdown); - } - @Override public void run() { if (active) { return; } + active = true; final String command = ess.getSettings().getBackupCommand(); if (command == null || "".equals(command)) { return; } - active = true; - taskLock = new CompletableFuture<>(); if ("save-all".equalsIgnoreCase(command)) { final CommandSender cs = server.getConsoleSender(); server.dispatchCommand(cs, "save-all"); active = false; - taskLock.complete(new Object()); return; } LOGGER.log(Level.INFO, tl("backupStarted")); @@ -116,17 +102,14 @@ class BackupEnableSaveTask implements Runnable { @Override public void run() { server.dispatchCommand(cs, "save-on"); - if (!ess.getSettings().isAlwaysRunBackup() && ess.getOnlinePlayers().isEmpty()) { + if (ess.getOnlinePlayers().isEmpty()) { stopTask(); } active = false; - taskLock.complete(new Object()); LOGGER.log(Level.INFO, tl("backupFinished")); } } - if (!pendingShutdown.get()) { - ess.scheduleSyncDelayedTask(new BackupEnableSaveTask()); - } + ess.scheduleSyncDelayedTask(new BackupEnableSaveTask()); } }); } diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 95b13c97179..e8d714eb06b 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -18,7 +18,6 @@ package com.earth2me.essentials; import com.earth2me.essentials.commands.*; -import com.earth2me.essentials.craftbukkit.ServerState; import com.earth2me.essentials.items.AbstractItemDb; import com.earth2me.essentials.items.CustomItemResolver; import com.earth2me.essentials.items.FlatItemDb; @@ -48,6 +47,8 @@ import net.ess3.nms.refl.ReflSpawnEggProvider; import net.ess3.nms.updatedmeta.BasePotionDataProvider; import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider; +import net.ess3.nms.v1_8_R1.v1_8_R1SpawnerProvider; +import net.ess3.nms.v1_8_R2.v1_8_R2SpawnerProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -249,6 +250,8 @@ public void onEnable() { spawnerProvider = new ProviderFactory<>(getLogger(), Arrays.asList( BlockMetaSpawnerProvider.class, + v1_8_R2SpawnerProvider.class, + v1_8_R1SpawnerProvider.class, LegacySpawnerProvider.class ), "mob spawner").getProvider(); spawnEggProvider = new ProviderFactory<>(getLogger(), @@ -310,7 +313,6 @@ public void onEnable() { handleCrash(ex); throw ex; } - getBackup().setPendingShutdown(false); } @Override @@ -360,40 +362,20 @@ private void registerListeners(PluginManager pm) { @Override public void onDisable() { - boolean stopping = ServerState.isStopping(); - if (!stopping) { - LOGGER.log(Level.SEVERE, tl("serverReloading")); - } - getBackup().setPendingShutdown(true); for (User user : getOnlineUsers()) { if (user.isVanished()) { user.setVanished(false); user.sendMessage(tl("unvanishedReload")); } - if (stopping) { - user.setLastLocation(); - if (!user.isHidden()) { - user.setLastLogout(System.currentTimeMillis()); - } - user.cleanup(); - } else { - user.stopTransaction(); - } + user.stopTransaction(); } cleanupOpenInventories(); - if (getBackup().getTaskLock() != null && !getBackup().getTaskLock().isDone()) { - LOGGER.log(Level.SEVERE, tl("backupInProgress")); - getBackup().getTaskLock().join(); - } if (i18n != null) { i18n.onDisable(); } if (backup != null) { backup.stopTask(); } - - this.getPermissionsHandler().unregisterContexts(); - Economy.setEss(null); Trade.closeLog(); getUserMap().getUUIDMap().shutdown(); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java index bad908628b1..c14becb62c8 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java @@ -1,7 +1,6 @@ package com.earth2me.essentials; import net.ess3.api.IEssentials; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; @@ -146,10 +145,6 @@ public void onPlayerDeathEvent(final PlayerDeathEvent event) { return; } final User user = ess.getUser(event.getEntity()); - if (ess.getSettings().infoAfterDeath()) { - final Location loc = user.getLocation(); - user.sendMessage(tl("infoAfterDeath", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - } if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back")) { user.setLastLocation(); user.sendMessage(tl("backAfterDeath")); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java index 3fdc2db307d..2a33c03cc54 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java @@ -458,7 +458,7 @@ public void onPlayerTeleport(final PlayerTeleportEvent event) { } final User user = ess.getUser(player); //There is TeleportCause.COMMMAND but plugins have to actively pass the cause in on their teleports. - if (user.isAuthorized("essentials.back.onteleport") && backListener && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { + if (backListener && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { user.setLastLocation(); } if (teleportInvulnerability && (event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND)) { diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java index ddda2343f15..d7543cdc8d5 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java @@ -36,7 +36,6 @@ public void onPluginDisable(final PluginDisableEvent event) { if (event.getPlugin().getName().equals("EssentialsChat")) { ess.getSettings().setEssentialsChatActive(false); } - ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); // Check to see if the plugin thats being disabled is the one we are using if (ess.getPaymentMethod() != null && Methods.hasMethod() && Methods.checkDisabled(event.getPlugin())) { diff --git a/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java index bcc13effd2e..0416eeda083 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsServerListener.java @@ -19,8 +19,7 @@ public class EssentialsServerListener implements Listener { private static final List ignoredSLPECallers = Arrays.asList( ".LegacyPingHandler.channelRead(", // CB responding to pings from pre-Netty clients - "de.dytanic.cloudnet.bridge.BukkitBootstrap", // CloudNet v2 doing... something - "de.dytanic.cloudnet.ext.bridge.bukkit.BukkitCloudNetBridgePlugin" // CloudNet v3 doing... something else + "de.dytanic.cloudnet.bridge.BukkitBootstrap" // CloudNet v2 doing... something ); private final transient IEssentials ess; diff --git a/Essentials/src/com/earth2me/essentials/I18n.java b/Essentials/src/com/earth2me/essentials/I18n.java index e9ef0eadce8..8e7edc4823d 100644 --- a/Essentials/src/com/earth2me/essentials/I18n.java +++ b/Essentials/src/com/earth2me/essentials/I18n.java @@ -2,11 +2,12 @@ import net.ess3.api.IEssentials; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.StandardCharsets; import java.text.MessageFormat; import java.util.*; import java.util.logging.Level; @@ -37,7 +38,7 @@ protected Object handleGetObject(String key) { public I18n(final IEssentials ess) { this.ess = ess; - defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH, new UTF8PropertiesControl()); + defaultBundle = ResourceBundle.getBundle(MESSAGES, Locale.ENGLISH); localeBundle = defaultBundle; customBundle = NULL_BUNDLE; } @@ -113,13 +114,13 @@ public void updateLocale(final String loc) { Logger.getLogger("Essentials").log(Level.INFO, String.format("Using locale %s", currentLocale.toString())); try { - localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new UTF8PropertiesControl()); + localeBundle = ResourceBundle.getBundle(MESSAGES, currentLocale); } catch (MissingResourceException ex) { localeBundle = NULL_BUNDLE; } try { - customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess), new UTF8PropertiesControl()); + customBundle = ResourceBundle.getBundle(MESSAGES, currentLocale, new FileResClassLoader(I18n.class.getClassLoader(), ess)); } catch (MissingResourceException ex) { customBundle = NULL_BUNDLE; } @@ -129,9 +130,7 @@ public static String capitalCase(final String input) { return input == null || input.length() == 0 ? input : input.toUpperCase(Locale.ENGLISH).charAt(0) + input.toLowerCase(Locale.ENGLISH).substring(1); } - /** - * Attempts to load properties files from the plugin directory before falling back to the jar. - */ + private static class FileResClassLoader extends ClassLoader { private final transient File dataFolder; @@ -146,7 +145,8 @@ public URL getResource(final String string) { if (file.exists()) { try { return file.toURI().toURL(); - } catch (MalformedURLException ignored) {} + } catch (MalformedURLException ignored) { + } } return null; } @@ -157,42 +157,10 @@ public InputStream getResourceAsStream(final String string) { if (file.exists()) { try { return new FileInputStream(file); - } catch (FileNotFoundException ignored) {} - } - return null; - } - } - - /** - * Reads .properties files as UTF-8 instead of ISO-8859-1, which is the default on Java 8/below. - * Java 9 fixes this by defaulting to UTF-8 for .properties files. - */ - private static class UTF8PropertiesControl extends ResourceBundle.Control { - public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IOException { - String resourceName = toResourceName(toBundleName(baseName, locale), "properties"); - ResourceBundle bundle = null; - InputStream stream = null; - if (reload) { - URL url = loader.getResource(resourceName); - if (url != null) { - URLConnection connection = url.openConnection(); - if (connection != null) { - connection.setUseCaches(false); - stream = connection.getInputStream(); - } + } catch (FileNotFoundException ignored) { } - } else { - stream = loader.getResourceAsStream(resourceName); } - if (stream != null) { - try { - // use UTF-8 here, this is the important bit - bundle = new PropertyResourceBundle(new InputStreamReader(stream, StandardCharsets.UTF_8)); - } finally { - stream.close(); - } - } - return bundle; + return null; } } } diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index e7ce055c530..a5393f0f208 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -32,8 +32,6 @@ public interface ISettings extends IConf { long getBackupInterval(); - boolean isAlwaysRunBackup(); - String getChatFormat(String group); int getChatRadius(); @@ -280,8 +278,6 @@ public interface ISettings extends IConf { BigDecimal getMinimumPayAmount(); - boolean isPayExcludesIgnoreList(); - long getLastMessageReplyRecipientTimeout(); boolean isMilkBucketEasterEggEnabled(); @@ -360,6 +356,4 @@ public interface ISettings extends IConf { boolean isSpawnIfNoHome(); - boolean infoAfterDeath(); - } diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index 299afe885b0..cdf5a7d0c46 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -7,10 +7,7 @@ import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.utils.DateUtil; -import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; -import net.ess3.api.events.KitClaimEvent; - import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -152,19 +149,14 @@ public boolean expandItems(final User user, final List items) throws Exc IText input = new SimpleTextInput(items); IText output = new KeywordReplacer(input, user.getSource(), ess, true, true); - KitClaimEvent event = new KitClaimEvent(user, this); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - boolean spew = false; final boolean allowUnsafe = ess.getSettings().allowUnsafeEnchantments(); final boolean currencyIsSuffix = ess.getSettings().isCurrencySymbolSuffixed(); + final String currencySymbol = ess.getSettings().getCurrencySymbol(); List itemList = new ArrayList<>(); for (String kitItem : output.getLines()) { if (!currencyIsSuffix ? kitItem.startsWith(ess.getSettings().getCurrencySymbol()) : kitItem.endsWith(ess.getSettings().getCurrencySymbol())) { - final String valueString = NumberUtil.sanitizeCurrencyString(kitItem, ess); + final String valueString = currencyIsSuffix ? kitItem.substring(0, currencySymbol.length()) : kitItem.substring(currencySymbol.length()); BigDecimal value = new BigDecimal(valueString.trim()); Trade t = new Trade(value, ess); t.pay(user, OverflowType.DROP); diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index d0a03650afd..487b1bc9e91 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -425,11 +425,6 @@ public String getBackupCommand() { return config.getString("backup.command", null); } - @Override - public boolean isAlwaysRunBackup() { - return config.getBoolean("backup.always-run", false); - } - private final Map chatFormats = Collections.synchronizedMap(new HashMap<>()); @Override @@ -570,7 +565,6 @@ public void reloadConfig() { logCommandBlockCommands = _logCommandBlockCommands(); nickBlacklist = _getNickBlacklist(); maxProjectileSpeed = _getMaxProjectileSpeed(); - removeEffectsOnHeal = _isRemovingEffectsOnHeal(); } void _lateLoadItemSpawnBlacklist() { @@ -1259,11 +1253,6 @@ public int getMaxUserCacheCount() { return new BigDecimal(config.getString("minimum-pay-amount", "0.001")); } - @Override - public boolean isPayExcludesIgnoreList() { - return config.getBoolean("pay-excludes-ignore-list", false); - } - @Override public long getLastMessageReplyRecipientTimeout() { return config.getLong("last-message-reply-recipient-timeout", 180); } @@ -1690,9 +1679,4 @@ public boolean isRemovingEffectsOnHeal() { public boolean isSpawnIfNoHome() { return config.getBoolean("spawn-if-no-home", true); } - - @Override - public boolean infoAfterDeath() { - return config.getBoolean("send-info-after-death", false); - } } diff --git a/Essentials/src/com/earth2me/essentials/Teleport.java b/Essentials/src/com/earth2me/essentials/Teleport.java index bab29fb1fde..d63378c3719 100644 --- a/Essentials/src/com/earth2me/essentials/Teleport.java +++ b/Essentials/src/com/earth2me/essentials/Teleport.java @@ -129,9 +129,7 @@ protected void now(IUser teleportee, ITarget target, TeleportCause cause) throws return; } - if (teleportee.isAuthorized("essentials.back.onteleport")) { - teleportee.setLastLocation(); - } + teleportee.setLastLocation(); if (!teleportee.getBase().isEmpty()) { if (!ess.getSettings().isTeleportPassengerDismount()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java index 93c5dff5358..19b217ba541 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java @@ -33,11 +33,9 @@ public void run(final Server server, final User user, final String commandLabel, throw new NotEnoughArgumentsException(); } - final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0); - if (!user.getWorld().getBlockAt(loc).isPassable()) { - throw new Exception(tl("bigTreeFailure")); - } - final boolean success = user.getWorld().generateTree(loc, tree); + final Location loc = LocationUtil.getTarget(user.getBase()); + final Location safeLocation = LocationUtil.getSafeDestination(loc); + final boolean success = user.getWorld().generateTree(safeLocation, tree); if (success) { user.sendMessage(tl("bigTreeSuccess")); } else { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java index 11b0ed5573c..59bd467878c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java @@ -5,7 +5,6 @@ import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; -import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -41,7 +40,7 @@ private void parseCommand(Server server, CommandSource sender, String commandLab Collection players = new ArrayList<>(); User senderUser = ess.getUser(sender.getPlayer()); String previousClearCommand = ""; - + int offset = 0; if (sender.isPlayer()) { @@ -80,65 +79,39 @@ private void parseCommand(Server server, CommandSource sender, String commandLab } } - private static class Item { - private Material material; - private short data; - - public Item(Material material, short data) { - this.material = material; - this.data = data; - } - - public Material getMaterial() { - return material; - } - - public short getData() { - return data; - } - } - - private enum ClearHandlerType { - ALL_EXCEPT_ARMOR, ALL_INCLUDING_ARMOR, SPECIFIC_ITEM - } - - protected void clearHandler(CommandSource sender, Player player, String[] args, int offset, boolean showExtended) { - ClearHandlerType type = ClearHandlerType.ALL_EXCEPT_ARMOR; - final Set items = new HashSet<>(); + protected void clearHandler(CommandSource sender, Player player, String[] args, int offset, boolean showExtended) throws Exception { + short data = -1; + int type = -1; int amount = -1; + final Set mats = new HashSet<>(); if (args.length > (offset + 1) && NumberUtil.isInt(args[(offset + 1)])) { amount = Integer.parseInt(args[(offset + 1)]); } if (args.length > offset) { if (args[offset].equalsIgnoreCase("**")) { - type = ClearHandlerType.ALL_INCLUDING_ARMOR; + type = -2; } else if (!args[offset].equalsIgnoreCase("*")) { final String[] split = args[offset].split(","); - for (String item : split) { - final String[] itemParts = item.split(":"); - short data; - try { - data = Short.parseShort(itemParts[1]); - } catch (Exception e) { - data = 0; - } + + for (String name : split) { try { - items.add(new Item(ess.getItemDb().get(itemParts[0]).getType(), data)); + mats.add(ess.getItemDb().get(name).getType()); } catch (Exception ignored) {} } - type = ClearHandlerType.SPECIFIC_ITEM; + + type = 1; } } - if (type == ClearHandlerType.ALL_EXCEPT_ARMOR) + if (type == -1) // type -1 represents wildcard or all items { if (showExtended) { sender.sendMessage(tl("inventoryClearingAllItems", player.getDisplayName())); } InventoryWorkaround.clearInventoryNoArmor(player.getInventory()); InventoryWorkaround.setItemInOffHand(player, null); - } else if (type == ClearHandlerType.ALL_INCLUDING_ARMOR) + } else if (type == -2) // type -2 represents double wildcard or all items and armor { if (showExtended) { sender.sendMessage(tl("inventoryClearingAllArmor", player.getDisplayName())); @@ -147,21 +120,20 @@ protected void clearHandler(CommandSource sender, Player player, String[] args, InventoryWorkaround.setItemInOffHand(player, null); player.getInventory().setArmorContents(null); } else { - for (Item item : items) { - ItemStack stack = new ItemStack(item.getMaterial()); - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { - stack.setDurability(item.getData()); - } + for (Material mat : mats) { if (amount == -1) // amount -1 means all items will be cleared { - stack.setAmount(BASE_AMOUNT); + ItemStack stack = new ItemStack(mat, BASE_AMOUNT, data); ItemStack removedStack = player.getInventory().removeItem(stack).get(0); final int removedAmount = (BASE_AMOUNT - removedStack.getAmount()); if (removedAmount > 0 || showExtended) { sender.sendMessage(tl("inventoryClearingStack", removedAmount, stack.getType().toString().toLowerCase(Locale.ENGLISH), player.getDisplayName())); } } else { - stack.setAmount(amount < 0 ? 1 : amount); + if (amount < 0) { + amount = 1; + } + ItemStack stack = new ItemStack(mat, amount); if (player.getInventory().containsAtLeast(stack, amount)) { sender.sendMessage(tl("inventoryClearingStack", amount, stack.getType().toString().toLowerCase(Locale.ENGLISH), player.getDisplayName())); player.getInventory().removeItem(stack); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java index 84de07e1090..34aa53526c3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java @@ -13,7 +13,7 @@ public Commanddepth() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - final int depth = user.getLocation().getBlockY() - user.getWorld().getSeaLevel(); + final int depth = user.getLocation().getBlockY() - 63; if (depth > 0) { user.sendMessage(tl("depthAboveSea", depth)); } else if (depth < 0) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java index 401cce52821..89dbb850069 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java @@ -20,7 +20,6 @@ public class Commandeco extends EssentialsLoopCommand { Commandeco.EcoCommands cmd; BigDecimal amount; - boolean isPercent; public Commandeco() { super("eco"); @@ -36,7 +35,6 @@ public void run(final Server server, final CommandSource sender, final String co try { cmd = Commandeco.EcoCommands.valueOf(args[0].toUpperCase(Locale.ENGLISH)); - isPercent = cmd != EcoCommands.RESET && args[2].endsWith("%"); amount = (cmd == Commandeco.EcoCommands.RESET) ? startingBalance : new BigDecimal(args[2].replaceAll("[^0-9\\.]", "")); } catch (Exception ex) { throw new NotEnoughArgumentsException(ex); @@ -55,9 +53,6 @@ public void run(final Server server, final CommandSource sender, final String co @Override protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws NotEnoughArgumentsException, ChargeException, MaxMoneyException { - if (isPercent && cmd != EcoCommands.RESET) { - amount = player.getMoney().multiply(amount).scaleByPowerOfTen(-2); - } switch (cmd) { case GIVE: player.giveMoney(amount, sender, UserBalanceUpdateEvent.Cause.COMMAND_ECO); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java index df7ed87927c..a7c2a7428a6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandexp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandexp.java @@ -79,10 +79,6 @@ public void run(final Server server, final CommandSource sender, final String co expMatch(server, sender, args[1], args[2], false); } else if (args.length > 2 && args[0].equalsIgnoreCase("give")) { expMatch(server, sender, args[1], args[2], true); - } else if (args.length > 2 && args[0].equalsIgnoreCase("take")) { - expMatch(server, sender, args[1], "-" + args[2], true); - } else if (args.length > 2 && args[0].equalsIgnoreCase("reset")) { - expMatch(server, sender, args[1], "0", false); } else { String match = args[0].trim(); if (args.length >= 2 && NumberUtil.isInt(args[0].toLowerCase(Locale.ENGLISH).replace("l", ""))) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/com/earth2me/essentials/commands/Commandext.java index 7cd24eb05ae..b751b1e4c4d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandext.java @@ -27,13 +27,13 @@ protected void run(final Server server, final CommandSource sender, final String @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (args.length > 0 && user.isAuthorized("essentials.ext.others")) { - loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); + if (args.length < 1) { + extPlayer(user.getBase()); + user.sendMessage(tl("extinguish")); return; } - extPlayer(user.getBase()); - user.sendMessage(tl("extinguish")); + loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); } @Override diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java index 3dbd0226bd1..d15cdf2fda3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhat.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhat.java @@ -2,12 +2,10 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; -import com.earth2me.essentials.utils.VersionUtil; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import org.bukkit.Material; import org.bukkit.Server; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.permissions.Permission; @@ -57,8 +55,6 @@ protected void run(final Server server, final User user, final String commandLab final ItemStack head = inv.getHelmet(); if (head == null || head.getType() == Material.AIR) { user.sendMessage(tl("hatEmpty")); - } else if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_9_4_R01) && head.getEnchantments().containsKey(Enchantment.BINDING_CURSE) && !user.isAuthorized("essentials.hat.ignore-binding")) { - user.sendMessage(tl("hatCurse")); } else { final ItemStack air = new ItemStack(Material.AIR); inv.setHelmet(air); @@ -75,10 +71,6 @@ protected void run(final Server server, final User user, final String commandLab if (hand.getType().getMaxDurability() == 0) { final PlayerInventory inv = user.getBase().getInventory(); final ItemStack head = inv.getHelmet(); - if (VersionUtil.getServerBukkitVersion().isHigherThan(VersionUtil.v1_9_4_R01) && head != null && head.getEnchantments().containsKey(Enchantment.BINDING_CURSE) && !user.isAuthorized("essentials.hat.ignore-binding")) { - user.sendMessage(tl("hatCurse")); - return; - } inv.setHelmet(hand); inv.setItemInHand(head); user.sendMessage(tl("hatPlaced")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java index 3215f6c9259..ddf2857b3e9 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java @@ -1,7 +1,6 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.VersionUtil; import org.bukkit.Server; import org.bukkit.inventory.Inventory; @@ -26,9 +25,6 @@ protected void run(final Server server, final User user, final String commandLab if (args.length > 1 && user.isAuthorized("essentials.invsee.equip")) { inv = server.createInventory(invUser.getBase(), 9, "Equipped"); inv.setContents(invUser.getBase().getInventory().getArmorContents()); - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_9_4_R01)) { - inv.setItem(4, invUser.getBase().getInventory().getItemInOffHand()); - } } else { inv = invUser.getBase().getInventory(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index 94ec79cd875..f2fdfcc3385 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -20,7 +20,7 @@ public Commandmsg() { @Override public void run(Server server, CommandSource sender, String commandLabel, String[] args) throws Exception { - if (args.length < 2 || args[0].trim().isEmpty() || args[1].trim().isEmpty()) { + if (args.length < 2 || args[0].trim().length() < 2 || args[1].trim().isEmpty()) { throw new NotEnoughArgumentsException(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java index cf5b515ea50..6e63243bda1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java @@ -59,7 +59,7 @@ public void run(final Server server, final User user, final String commandLabel, protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws ChargeException { User user = ess.getUser(sender.getPlayer()); try { - if (!player.isAcceptingPay() || (ess.getSettings().isPayExcludesIgnoreList() && player.isIgnoredPlayer(user))) { + if (!player.isAcceptingPay()) { sender.sendMessage(tl("notAcceptingPay", player.getDisplayName())); return; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrest.java b/Essentials/src/com/earth2me/essentials/commands/Commandrest.java deleted file mode 100644 index 2a38cda19cd..00000000000 --- a/Essentials/src/com/earth2me/essentials/commands/Commandrest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.earth2me.essentials.commands; - -import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.VersionUtil; -import org.bukkit.Server; -import org.bukkit.Statistic; - -import java.util.Collections; -import java.util.List; - -import static com.earth2me.essentials.I18n.tl; - -public class Commandrest extends EssentialsLoopCommand { - public Commandrest() { - super("rest"); - } - - @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { - user.sendMessage(tl("unsupportedFeature")); - return; - } - if (args.length > 0 && user.isAuthorized("essentials.rest.others")) { - loopOnlinePlayers(server, user.getSource(), true, true, args[0], null); - return; - } - restPlayer(user); - } - - @Override - public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01)) { - sender.sendMessage(tl("unsupportedFeature")); - return; - } - if (args.length < 1) { - throw new NotEnoughArgumentsException(); - } - loopOnlinePlayers(server, sender, true, true, args[0], null); - } - - @Override - protected void updatePlayer(final Server server, final CommandSource sender, final User player, final String[] args) throws PlayerExemptException { - restPlayer(player); - sender.sendMessage(tl("restOther", player.getDisplayName())); - } - - private void restPlayer(final User user) { - user.getBase().setStatistic(Statistic.TIME_SINCE_REST, 0); - user.sendMessage(tl("rest")); - } - - @Override - protected List getTabCompleteOptions(Server server, User user, String commandLabel, String[] args) { - if (args.length == 1 && user.isAuthorized("essentials.rest.others")) { - return getPlayers(server, user); - } else { - return Collections.emptyList(); - } - } - - @Override - protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { - if (args.length == 1) { - return getPlayers(server, sender); - } else { - return Collections.emptyList(); - } - } -} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java deleted file mode 100644 index 4d74c707d43..00000000000 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtempbanip.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.earth2me.essentials.commands; - -import com.earth2me.essentials.CommandSource; -import com.earth2me.essentials.Console; -import com.earth2me.essentials.User; -import com.earth2me.essentials.utils.DateUtil; -import com.earth2me.essentials.utils.FormatUtil; -import org.bukkit.BanList; -import org.bukkit.Server; -import org.bukkit.entity.Player; - -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.logging.Level; - -import static com.earth2me.essentials.I18n.tl; - -public class Commandtempbanip extends EssentialsCommand { - public Commandtempbanip() { - super("tempbanip"); - } - - @Override - public void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { - if (args.length < 2) { - throw new NotEnoughArgumentsException(); - } - - final String senderName = sender.isPlayer() ? sender.getPlayer().getDisplayName() : Console.NAME; - - String ipAddress; - if (FormatUtil.validIP(args[0])) { - ipAddress = args[0]; - } else { - try { - User player = getPlayer(server, args, 0, true, true); - ipAddress = player.getLastLoginAddress(); - } catch (PlayerNotFoundException ex) { - ipAddress = args[0]; - } - } - - if (ipAddress.isEmpty()) { - throw new PlayerNotFoundException(); - } - - final String time = getFinalArg(args, 1); - final long banTimestamp = DateUtil.parseDateDiff(time, true); - String banReason = DateUtil.removeTimePattern(time); - - final long maxBanLength = ess.getSettings().getMaxTempban() * 1000; - if (maxBanLength > 0 && ((banTimestamp - GregorianCalendar.getInstance().getTimeInMillis()) > maxBanLength) && sender.isPlayer() && !(ess.getUser(sender.getPlayer()).isAuthorized("essentials.tempban.unlimited"))) { - sender.sendMessage(tl("oversizedTempban")); - throw new NoChargeException(); - } - - if (banReason.length() < 2) { - banReason = tl("defaultBanReason"); - } - - String banDisplay = tl("banFormat", banReason, senderName); - - ess.getServer().getBanList(BanList.Type.IP).addBan(ipAddress, banReason, new Date(banTimestamp), senderName); - final String message = tl("playerTempBanIpAddress", senderName, ipAddress, DateUtil.formatDateDiff(banTimestamp), banReason); - - for (Player player : ess.getServer().getOnlinePlayers()) { - if (player.getAddress().getAddress().getHostAddress().equalsIgnoreCase(ipAddress)) { - player.kickPlayer(banDisplay); - } - } - - server.getLogger().log(Level.INFO, message); - ess.broadcastMessage("essentials.banip.notify", message); - } - - @Override - protected List getTabCompleteOptions(Server server, CommandSource sender, String commandLabel, String[] args) { - if (args.length == 1) { - // TODO: Also list IP addresses? - return getPlayers(server, sender); - } else { - // Note: following args are both date diffs _and_ messages; ideally we'd mix with the vanilla handler - return COMMON_DATE_DIFFS; - } - } -} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java index a477c18b2d1..f57505057fb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java @@ -42,11 +42,9 @@ public void run(final Server server, final User user, final String commandLabel, } } - final Location loc = LocationUtil.getTarget(user.getBase()).add(0, 1, 0); - if (!user.getWorld().getBlockAt(loc).isPassable()) { - throw new Exception(tl("treeFailure")); - } - final boolean success = user.getWorld().generateTree(loc, tree); + final Location loc = LocationUtil.getTarget(user.getBase()); + final Location safeLocation = LocationUtil.getSafeDestination(loc); + final boolean success = user.getWorld().generateTree(safeLocation, tree); if (success) { user.sendMessage(tl("treeSpawned")); } else { diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java b/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java deleted file mode 100644 index c8febbb6c7e..00000000000 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/ServerState.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.earth2me.essentials.craftbukkit; - -import net.ess3.nms.refl.ReflUtil; -import org.bukkit.Bukkit; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; - -public class ServerState { - - private static final MethodHandle isStopping; //Only in Paper - private static final MethodHandle nmsHasStopped; - private static final MethodHandle nmsIsRunning; - private static final Object nmsServer; - - static { - MethodHandle isStoppingHandle = null; - MethodHandle nmsHasStoppedHandle = null; - MethodHandle nmsIsRunningHandle = null; - Object nmsServerObject = null; - try { - //noinspection JavaLangInvokeHandleSignature - We don't compile against Paper - isStoppingHandle = MethodHandles.lookup().findStatic(Bukkit.class, "isStopping", MethodType.methodType(boolean.class)); - } catch (Throwable e) { - try { - Class nmsClass = ReflUtil.getNMSClass("MinecraftServer"); - if (nmsClass != null) { - nmsServerObject = nmsClass.getMethod("getServer").invoke(null); - nmsIsRunningHandle = MethodHandles.lookup().findVirtual(nmsClass, "isRunning", MethodType.methodType(boolean.class)); - nmsHasStoppedHandle = MethodHandles.lookup().findVirtual(nmsClass, "hasStopped", MethodType.methodType(boolean.class)); - } - } catch (Throwable ignored) { - } - } - isStopping = isStoppingHandle; - nmsHasStopped = nmsHasStoppedHandle; - nmsIsRunning = nmsIsRunningHandle; - nmsServer = nmsServerObject; - } - - public static boolean isStopping() { - boolean stopping = false; - if (isStopping != null) { - try { - stopping = (boolean) isStopping.invoke(); - } catch (Throwable t) { - t.printStackTrace(); - } - } else if (nmsServer != null) { - if (nmsHasStopped != null) { - try { - stopping = (boolean) nmsHasStopped.invoke(nmsServer); - } catch (Throwable t) { - t.printStackTrace(); - } - } else if (nmsIsRunning != null) { - try { - stopping = !(boolean) nmsIsRunning.invoke(nmsServer); - } catch (Throwable t) { - t.printStackTrace(); - } - } - } - return stopping; - } -} diff --git a/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java b/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java index dc3385cd700..d30eb91b9b0 100644 --- a/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java +++ b/Essentials/src/com/earth2me/essentials/messaging/IMessageRecipient.java @@ -91,9 +91,7 @@ enum MessageResponse { /** States that the message was NOT received as a result of the sender being ignored by the recipient. */ SENDER_IGNORED, /** States that the message was NOT received as a result of the recipient being unreachable. */ - UNREACHABLE, - /** States that the message was NOT received as a result of the message pre-send event being cancelled. */ - EVENT_CANCELLED; + UNREACHABLE; /** * Returns whether this response is a success. In other words equal to {@link #SUCCESS} or {@link #SUCCESS_BUT_AFK} diff --git a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java index aea874c30ab..2b6f720659e 100644 --- a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java +++ b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java @@ -3,7 +3,6 @@ import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.IUser; import com.earth2me.essentials.User; -import net.ess3.api.events.PrivateMessagePreSendEvent; import java.lang.ref.WeakReference; @@ -63,13 +62,6 @@ public String getName() { } @Override public MessageResponse sendMessage(IMessageRecipient recipient, String message) { - final PrivateMessagePreSendEvent event = new PrivateMessagePreSendEvent(this, recipient, message); - ess.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return MessageResponse.EVENT_CANCELLED; - } - - message = event.getMessage(); MessageResponse messageResponse = recipient.onReceiveMessage(this.parent, message); switch (messageResponse) { case UNREACHABLE: diff --git a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java index f5cccf7406c..e0d50a10d0e 100644 --- a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java @@ -3,8 +3,6 @@ import org.bukkit.entity.Player; import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; public interface IPermissionsHandler { @@ -25,9 +23,5 @@ public interface IPermissionsHandler { String getSuffix(Player base); - void registerContext(String context, Function> calculator, Supplier> suggestions); - - void unregisterContexts(); - boolean tryProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java index 7a6d5665a2d..847164f25e8 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java @@ -2,14 +2,11 @@ import com.earth2me.essentials.Essentials; import com.earth2me.essentials.perm.impl.*; -import com.google.common.collect.ImmutableSet; import org.bukkit.entity.Player; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; import java.util.logging.Level; public class PermissionsHandler implements IPermissionsHandler { @@ -92,16 +89,6 @@ public String getSuffix(final Player base) { return suffix; } - @Override - public void registerContext(String context, Function> calculator, Supplier> suggestions) { - handler.registerContext(context, calculator, suggestions); - } - - @Override - public void unregisterContexts() { - handler.unregisterContexts(); - } - @Override public boolean tryProvider() { return true; @@ -110,7 +97,6 @@ public boolean tryProvider() { public void checkPermissions() { // load and assign a handler List> providerClazz = Arrays.asList( - LuckPermsHandler.class, ModernVaultHandler.class, GenericVaultHandler.class, SuperpermsHandler.class @@ -119,14 +105,7 @@ public void checkPermissions() { try { IPermissionsHandler provider = providerClass.newInstance(); if (provider.tryProvider()) { - if (provider.getClass().isInstance(this.handler)) { - return; - } - if (this.handler != null) { - unregisterContexts(); - } this.handler = provider; - initContexts(); break; } } catch (Throwable ignored) { @@ -181,10 +160,4 @@ private void checkPermLag(long start, String summary) { } } - private void initContexts() { - registerContext("essentials:afk", player -> Collections.singleton(String.valueOf(ess.getUser(player).isAfk())), () -> ImmutableSet.of("true", "false")); - registerContext("essentials:muted", player -> Collections.singleton(String.valueOf(ess.getUser(player).isMuted())), () -> ImmutableSet.of("true", "false")); - registerContext("essentials:vanished", player -> Collections.singleton(String.valueOf(ess.getUser(player).isHidden())), () -> ImmutableSet.of("true", "false")); - } - } diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java deleted file mode 100644 index 98dbe6fbdc7..00000000000 --- a/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.earth2me.essentials.perm.impl; - -import net.luckperms.api.LuckPerms; -import net.luckperms.api.context.ContextCalculator; -import net.luckperms.api.context.ContextConsumer; -import net.luckperms.api.context.ContextSet; -import net.luckperms.api.context.ImmutableContextSet; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.RegisteredServiceProvider; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Function; -import java.util.function.Supplier; - -public class LuckPermsHandler extends ModernVaultHandler { - private LuckPerms luckPerms; - private Set> contextCalculators; - - @Override - public void registerContext(String context, Function> calculator, Supplier> suggestions) { - ContextCalculator contextCalculator = new ContextCalculator() { - @Override - public void calculate(Player target, ContextConsumer consumer) { - calculator.apply(target).forEach(value -> consumer.accept(context, value)); - } - - @Override - public ContextSet estimatePotentialContexts() { - ImmutableContextSet.Builder builder = ImmutableContextSet.builder(); - suggestions.get().forEach(value -> builder.add(context, value)); - return builder.build(); - } - }; - luckPerms.getContextManager().registerCalculator(contextCalculator); - contextCalculators.add(contextCalculator); - } - - @Override - public void unregisterContexts() { - contextCalculators.forEach(contextCalculator -> luckPerms.getContextManager().unregisterCalculator(contextCalculator)); - contextCalculators.clear(); - } - - @Override - public boolean tryProvider() { - RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); - if (provider != null) { - luckPerms = provider.getProvider(); - contextCalculators = new HashSet<>(); - } - return luckPerms != null && super.tryProvider(); - } -} diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java index e8aa7da866a..fa7a67e17ff 100644 --- a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java @@ -7,8 +7,6 @@ import java.util.Arrays; import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; public class SuperpermsHandler implements IPermissionsHandler { @@ -74,14 +72,6 @@ public String getSuffix(final Player base) { return null; } - @Override - public void registerContext(String context, Function> calculator, Supplier> suggestions) { - } - - @Override - public void unregisterContexts() { - } - @Override public boolean tryProvider() { return getEnabledPermsPlugin() != null; diff --git a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java index 1d045b8bb73..bda414a6322 100644 --- a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java @@ -375,9 +375,9 @@ protected final ItemStack getItemMeta(final ItemStack item, final String meta, f return stack; } - protected final BigDecimal getMoney(final String line, final IEssentials ess) throws SignException { - final boolean isMoney = line.matches("^[^0-9-\\.]?[\\.0-9]+[^0-9-\\.]?$"); - return isMoney ? getBigDecimalPositive(NumberUtil.sanitizeCurrencyString(line, ess)) : null; + protected final BigDecimal getMoney(final String line) throws SignException { + final boolean isMoney = line.matches("^[^0-9-\\.][\\.0-9]+$"); + return isMoney ? getBigDecimalPositive(line.substring(1)) : null; } protected final BigDecimal getBigDecimalPositive(final String line) throws SignException { @@ -410,7 +410,7 @@ protected final Trade getTrade(final ISign sign, final int index, final int decr return new Trade(signName.toLowerCase(Locale.ENGLISH) + "sign", ess); } - final BigDecimal money = getMoney(line, ess); + final BigDecimal money = getMoney(line); if (money == null) { final String[] split = line.split("[ :]+", 2); if (split.length != 2) { diff --git a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java b/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java index c86d0ecbddc..e0de8e0c565 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java @@ -1,6 +1,5 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.User; import net.ess3.api.IEssentials; @@ -12,23 +11,9 @@ public SignDisposal() { super("Disposal"); } - @Override - protected boolean onSignCreate(ISign sign, User player, String username, IEssentials ess) throws SignException, ChargeException { - if (!player.isAuthorized("essentials.signs.disposal.name")) { - sign.setLine(1, ""); - sign.setLine(2, ""); - sign.setLine(3, ""); - } - return true; - } - @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - String title = (sign.getLine(1) + " " + sign.getLine(2) + " " + sign.getLine(3)).trim(); - if (title.isEmpty()) { - title = tl("disposal"); - } - player.getBase().openInventory(ess.getServer().createInventory(player.getBase(), 36, title)); + player.getBase().openInventory(ess.getServer().createInventory(player.getBase(), 36, tl("disposal"))); return true; } } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java index f206faace1b..b7f97fb429e 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/com/earth2me/essentials/signs/SignTrade.java @@ -149,7 +149,7 @@ protected final void validateTrade(final ISign sign, final int index, final bool final String[] split = line.split("[ :]+"); if (split.length == 1 && !amountNeeded) { - final BigDecimal money = getMoney(split[0], ess); + final BigDecimal money = getMoney(split[0]); if (money != null) { if (NumberUtil.shortCurrency(money, ess).length() * 2 > 15) { throw new SignException("Line can be too long!"); @@ -160,7 +160,7 @@ protected final void validateTrade(final ISign sign, final int index, final bool } if (split.length == 2 && amountNeeded) { - final BigDecimal money = getMoney(split[0], ess); + final BigDecimal money = getMoney(split[0]); BigDecimal amount = getBigDecimalPositive(split[1]); if (money != null && amount != null) { amount = amount.subtract(amount.remainder(money)); @@ -218,7 +218,7 @@ protected final Trade getTrade(final ISign sign, final int index, final AmountTy if (split.length == 2) { try { - final BigDecimal money = getMoney(split[0], ess); + final BigDecimal money = getMoney(split[0]); final BigDecimal amount = notEmpty ? getBigDecimalPositive(split[1]) : getBigDecimal(split[1]); if (money != null && amount != null) { return new Trade(amountType == AmountType.COST ? money : amount, ess); @@ -317,7 +317,7 @@ private void setAmount(final ISign sign, final int index, final BigDecimal value final String[] split = line.split("[ :]+"); if (split.length == 2) { - final BigDecimal money = getMoney(split[0], ess); + final BigDecimal money = getMoney(split[0]); final BigDecimal amount = getBigDecimal(split[1]); if (money != null && amount != null) { final String newline = NumberUtil.shortCurrency(money, ess) + ":" + NumberUtil.shortCurrency(value, ess).substring(1); diff --git a/Essentials/src/com/earth2me/essentials/utils/DateUtil.java b/Essentials/src/com/earth2me/essentials/utils/DateUtil.java index 3a5d65505d7..75419fea21a 100644 --- a/Essentials/src/com/earth2me/essentials/utils/DateUtil.java +++ b/Essentials/src/com/earth2me/essentials/utils/DateUtil.java @@ -134,8 +134,6 @@ public static String formatDateDiff(Calendar fromDate, Calendar toDate) { if (toDate.after(fromDate)) { future = true; } - // Temporary 50ms time buffer added to avoid display truncation due to code execution delays - toDate.add(Calendar.MILLISECOND, future ? 50 : -50); StringBuilder sb = new StringBuilder(); int[] types = new int[]{Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND}; String[] names = new String[]{tl("year"), tl("years"), tl("month"), tl("months"), tl("day"), tl("days"), tl("hour"), tl("hours"), tl("minute"), tl("minutes"), tl("second"), tl("seconds")}; @@ -150,8 +148,6 @@ public static String formatDateDiff(Calendar fromDate, Calendar toDate) { sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]); } } - // Preserve correctness in the original date object by removing the extra buffer time - toDate.add(Calendar.MILLISECOND, future ? -50 : 50); if (sb.length() == 0) { return tl("now"); } diff --git a/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java b/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java index 000a7f2363e..0567ee9139b 100644 --- a/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java +++ b/Essentials/src/com/earth2me/essentials/utils/NumberUtil.java @@ -88,15 +88,6 @@ public static String displayCurrencyExactly(final BigDecimal value, final IEssen return sign + tl("currency", ess.getSettings().getCurrencySymbol(), currency); } - public static String sanitizeCurrencyString(final String input, final IEssentials ess) { - String symbol = ess.getSettings().getCurrencySymbol(); - boolean suffix = ess.getSettings().isCurrencySymbolSuffixed(); - if (input.contains(symbol)) { - return suffix ? input.substring(0, input.indexOf(symbol)) : input.substring(symbol.length()); - } - return input; - } - public static boolean isInt(final String sInt) { try { Integer.parseInt(sInt); diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml index 91e766b5593..31a699d9071 100644 --- a/Essentials/src/config.yml +++ b/Essentials/src/config.yml @@ -371,8 +371,6 @@ unprotected-sign-names: backup: # Interval in minutes. interval: 30 - # If true, the backup task will run even if there are no players online. - always-run: false # Unless you add a valid backup command or script here, this feature will be useless. # Use 'save-all' to simply force regular world saving without backup. #command: 'rdiff-backup World1 backups/World1' @@ -459,17 +457,17 @@ broadcast-afk-message: true # You can disable the death messages of Minecraft here. death-messages: true -# When players die, should they receive the coordinates they died at? -send-info-after-death: false - # Should players with permissions be able to join and part silently? # You can control this with essentials.silentjoin and essentials.silentquit permissions if it is enabled. # In addition, people with essentials.silentjoin.vanish will be vanished on join. allow-silent-join-quit: false -# You can set custom join and quit messages here. Set to "none" to use the default message or "" to disable the message entirely. -# You may use color codes, {USERNAME} for the player's name, and {PLAYER} for the player's displayname. +# You can set a custom join message here, set to "none" to disable. +# You may use color codes, use {USERNAME} the player's name or {PLAYER} for the player's displayname. custom-join-message: "none" + +# You can set a custom quit message here, set to "none" to disable. +# You may use color codes, use {USERNAME} the player's name or {PLAYER} for the player's displayname. custom-quit-message: "none" # Add worlds to this list, if you want to automatically disable god mode there. @@ -621,7 +619,6 @@ max-projectile-speed: 8 ############################################################ # Allows people to set their bed during the day. -# This setting has no effect in Minecraft 1.15+, as Minecraft will always allow the player to set their bed location during the day. update-bed-at-daytime: true # Set to true to enable per-world permissions for using homes to teleport between worlds. @@ -703,9 +700,6 @@ economy-log-update-enabled: false # Minimum acceptable amount to be used in /pay. minimum-pay-amount: 0.001 -# Enable this to block users who try to /pay another user which ignore them. -pay-excludes-ignore-list: false - # The format of currency, excluding symbols. See currency-symbol-format-locale for symbol configuration. # # "#,##0.00" is how the majority of countries display currency. diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties index ad9b2432150..29482c65454 100644 --- a/Essentials/src/messages.properties +++ b/Essentials/src/messages.properties @@ -27,7 +27,6 @@ backOther=\u00a76Returned\u00a7c {0}\u00a76 to previous location. backupDisabled=\u00a74An external backup script has not been configured. backupFinished=\u00a76Backup finished. backupStarted=\u00a76Backup started. -backupInProgress=\u00a76An external backup script is currently in progress! Halting plugin disable until finished. backUsageMsg=\u00a76Returning to previous location. balance=\u00a7aBalance\:\u00a7c {0} balanceOther=\u00a7aBalance of {0}\u00a7a\:\u00a7c {1} @@ -163,7 +162,6 @@ godMode=\u00a76God mode\u00a7c {0}\u00a76. groupDoesNotExist=\u00a74There''s no one online in this group\! groupNumber=\u00a7c{0}\u00a7f online, for the full list\:\u00a7c /{1} {2} hatArmor=\u00a74You cannot use this item as a hat\! -hatCurse=\u00a74You cannot remove a hat with the curse of binding\! hatEmpty=\u00a74You are not wearing a hat. hatFail=\u00a74You must have something to wear in your hand. hatPlaced=\u00a76Enjoy your new hat\! @@ -190,7 +188,6 @@ ignoredList=\u00a76Ignored\:\u00a7r {0} ignoreExempt=\u00a74You may not ignore that player. ignorePlayer=\u00a76You ignore player\u00a7c {0} \u00a76from now on. illegalDate=Illegal date format. -infoAfterDeath=\u00a76You died in \u00a7e{0} \u00a76at \u00a7e{1}, {2}, {3}\u00a76. infoChapter=\u00a76Select chapter\: infoChapterPages=\u00a7e ---- \u00a76{0} \u00a7e--\u00a76 Page \u00a7c{1}\u00a76 of \u00a7c{2} \u00a7e---- infoPages=\u00a7e ---- \u00a76{2} \u00a7e--\u00a76 Page \u00a7c{0}\u00a76/\u00a7c{1} \u00a7e---- @@ -393,7 +390,6 @@ payToggleOff=\u00a76You are no longer accepting payments. payToggleOn=\u00a76You are now accepting payments. pendingTeleportCancelled=\u00a74Pending teleportation request cancelled. playerBanIpAddress=\u00a76Player\u00a7c {0} \u00a76banned IP address\u00a7c {1} \u00a76for\: \u00a7c{2}\u00a76. -playerTempBanIpAddress=\u00a76Player\u00a7c {0} \u00a76temporarily banned IP address \u00a7c{1}\u00a76 for \u00a7c{2}\u00a76\: \u00a7c{3}\u00a76. playerBanned=\u00a76Player\u00a7c {0} \u00a76banned\u00a7c {1} \u00a76for\: \u00a7c{2}\u00a76. playerJailed=\u00a76Player\u00a7c {0} \u00a76jailed. playerJailedFor=\u00a76Player\u00a7c {0} \u00a76jailed for\u00a7c {1}\u00a76. @@ -478,8 +474,6 @@ requestSentAlready=\u00a74You have already sent {0}\u00a74 a teleport request. requestTimedOut=\u00a74Teleport request has timed out. resetBal=\u00a76Balance has been reset to \u00a7c{0} \u00a76for all online players. resetBalAll=\u00a76Balance has been reset to \u00a7c{0} \u00a76for all players. -rest=\u00a76You feel well rested. -restOther=\u00a76Resting\u00a7c {0}\u00a76. returnPlayerToJailError=\u00a74Error occurred when trying to return player\u00a7c {0} \u00a74to jail\: \u00a7c{1}\u00a74\! runningPlayerMatch=\u00a76Running search for players matching ''\u00a7c{0}\u00a76'' (this could take a little while). second=second @@ -490,7 +484,6 @@ seenOnline=\u00a76Player\u00a7c {0} \u00a76has been \u00a7aonline\u00a76 since \ sellBulkPermission=\u00a76You do not have permission to bulk sell. sellHandPermission=\u00a76You do not have permission to hand sell. serverFull=Server is full\! -serverReloading=There's a good chance you're reloading your server right now. If that's the case, why do you hate yourself? Expect no support from the EssentialsX team when using /reload. serverTotal=\u00a76Server Total\:\u00a7c {0} serverUnsupported=You are running an unsupported server version! setBal=\u00a7aYour balance was set to {0}. @@ -660,4 +653,3 @@ year=year years=years youAreHealed=\u00a76You have been healed. youHaveNewMail=\u00a76You have\u00a7c {0} \u00a76messages\! Type \u00a7c/mail read\u00a76 to view your mail. -xmppNotConfigured=XMPP is not configured properly. If you do not know what XMPP is, you may wish to remove the EssentialsXXMPP plugin from your server. diff --git a/Essentials/src/net/ess3/api/events/KitClaimEvent.java b/Essentials/src/net/ess3/api/events/KitClaimEvent.java deleted file mode 100644 index 35ba3a7c8a7..00000000000 --- a/Essentials/src/net/ess3/api/events/KitClaimEvent.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.ess3.api.events; - -import org.bukkit.Bukkit; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -import com.earth2me.essentials.Kit; - -import net.ess3.api.IUser; - -/** - * Called when the player is given a kit - */ -public class KitClaimEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - - private Kit kit; - private IUser user; - private boolean cancelled; - - public KitClaimEvent(IUser user, Kit kit) { - super(!Bukkit.getServer().isPrimaryThread()); - this.user = user; - this.kit = kit; - } - - public IUser getUser() { - return user; - } - - public Kit getKit() { - return kit; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean cancel) { - cancelled = cancel; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -} diff --git a/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java b/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java deleted file mode 100644 index 3dac80e9198..00000000000 --- a/Essentials/src/net/ess3/api/events/PrivateMessagePreSendEvent.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.ess3.api.events; - -import com.earth2me.essentials.messaging.IMessageRecipient; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -/** - * Called just before a private message is sent to its recipient - */ -public class PrivateMessagePreSendEvent extends Event implements Cancellable { - - private static final HandlerList handlers = new HandlerList(); - private boolean cancelled; - - private IMessageRecipient sender; - private IMessageRecipient recipient; - private String message; - - public PrivateMessagePreSendEvent(IMessageRecipient sender, IMessageRecipient recipient, String message) { - this.sender = sender; - this.recipient = recipient; - this.message = message; - } - - public IMessageRecipient getSender() { - return sender; - } - - public IMessageRecipient getRecipient() { - return recipient; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public boolean isCancelled() { - return cancelled; - } - - @Override - public void setCancelled(boolean b) { - this.cancelled = b; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -} diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index e0244a123a4..dcbfd2b6b5a 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -5,7 +5,7 @@ main: com.earth2me.essentials.Essentials version: ${full.version} website: http://tiny.cc/EssentialsCommands description: Provides an essential, core set of commands for Bukkit. -softdepend: [Vault, LuckPerms] +softdepend: [Vault] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685] api-version: "1.13" commands: @@ -360,10 +360,6 @@ commands: description: Repairs the durability of one or all items. usage: / [hand|all] aliases: [fix,efix,erepair] - rest: - description: Rests you or the given player. - usage: / [player] - aliases: [erest] rules: description: Views the server rules. usage: / [chapter] [page] @@ -428,10 +424,6 @@ commands: description: Temporary ban a user. usage: / aliases: [etempban] - tempbanip: - description: Temporarily ban an IP Address. - usage: / - aliases: [etempbanip] thunder: description: Enable/disable thunder. usage: / [duration] @@ -636,12 +628,6 @@ permissions: essentials.balancetop.exclude: default: false description: Players with this permission are excluded from the balancetop - essentials.back.onteleport: - default: true - description: Players with this permission will have back location stored during any teleportation - essentials.back.ondeath: - default: false - description: Players with this permission will have back location stored during death essentials.exempt: default: false description: Parent permission to be exempt from many moderator actions diff --git a/Essentials/src/worth.yml b/Essentials/src/worth.yml index 5ee6ada47fb..7d273e45dac 100644 --- a/Essentials/src/worth.yml +++ b/Essentials/src/worth.yml @@ -1,5 +1,3 @@ -# Determines how much items are worth on the server. -# This can be set in this file, or by running the /setworth command. worth: # Items not listed in this file will not be sellable on the server diff --git a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java index c12cd473569..4c82aba5d61 100644 --- a/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java +++ b/EssentialsAntiBuild/src/com/earth2me/essentials/antibuild/EssentialsAntiBuildListener.java @@ -1,27 +1,34 @@ package com.earth2me.essentials.antibuild; +import static com.earth2me.essentials.I18n.tl; + import com.earth2me.essentials.User; import com.earth2me.essentials.utils.VersionUtil; +import java.util.logging.Level; +import java.util.logging.Logger; import net.ess3.api.IEssentials; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.HumanEntity; +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.*; -import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDispenseEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.event.player.*; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; -import java.util.logging.Level; -import java.util.logging.Logger; - -import static com.earth2me.essentials.I18n.tl; - public class EssentialsAntiBuildListener implements Listener { private static final Logger logger = Logger.getLogger("EssentialsAntiBuild"); @@ -158,110 +165,6 @@ public void onHangingBreak(final HangingBreakByEntityEvent event) { } } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onItemFrameInteract(final PlayerInteractEntityEvent event) { - final User user = ess.getUser(event.getPlayer()); - - if (!(event.getRightClicked() instanceof ItemFrame)) { - return; - } - - if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "place", Material.ITEM_FRAME)) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildPlace", Material.ITEM_FRAME.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, Material.ITEM_FRAME) && !user.isAuthorized("essentials.protect.exemptplacement")) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildPlace", Material.ITEM_FRAME.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, Material.ITEM_FRAME) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { - prot.getEssentialsConnect().alert(user, Material.ITEM_FRAME.toString(), tl("alertPlaced")); - } - } - - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onArmorStandInteract(final PlayerInteractAtEntityEvent event) { - final User user = ess.getUser(event.getPlayer()); - - if (!(event.getRightClicked() instanceof ArmorStand)) { - return; - } - - if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "place", Material.ARMOR_STAND)) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildPlace", Material.ARMOR_STAND.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.blacklist_placement, Material.ARMOR_STAND) && !user.isAuthorized("essentials.protect.exemptplacement")) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildPlace", Material.ARMOR_STAND.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.alert_on_placement, Material.ARMOR_STAND) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { - prot.getEssentialsConnect().alert(user, Material.ARMOR_STAND.toString(), tl("alertPlaced")); - } - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onBlockEntityDamage(final EntityDamageByEntityEvent event) { - Player player = null; - - if (event.getDamager() instanceof Player) { - player = (Player) event.getDamager(); - } else if (event.getDamager() instanceof Projectile && ((Projectile)event.getDamager()).getShooter() instanceof Player) { - player = (Player) ((Projectile)event.getDamager()).getShooter(); - } else { - return; - } - - final User user = ess.getUser(player); - Material type = null; - - if (event.getEntity() instanceof ItemFrame) { - type = Material.ITEM_FRAME; - } else if (event.getEntity() instanceof ArmorStand) { - type = Material.ARMOR_STAND; - } else if (event.getEntity() instanceof EnderCrystal) { - type = Material.END_CRYSTAL; - } else { - return; - } - - if (prot.getSettingBool(AntiBuildConfig.disable_build) && !user.canBuild() && !user.isAuthorized("essentials.build") && !metaPermCheck(user, "break", type)) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildBreak", type.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.blacklist_break, type) && !user.isAuthorized("essentials.protect.exemptbreak")) { - if (ess.getSettings().warnOnBuildDisallow()) { - user.sendMessage(tl("antiBuildBreak", type.toString())); - } - event.setCancelled(true); - return; - } - - if (prot.checkProtectionItems(AntiBuildConfig.alert_on_break, type) && !user.isAuthorized("essentials.protect.alerts.notrigger")) { - prot.getEssentialsConnect().alert(user, type.toString(), tl("alertBroke")); - } - } - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockPistonExtend(final BlockPistonExtendEvent event) { for (Block block : event.getBlocks()) { diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index 27ba8799843..38cf0e811d4 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -38,9 +38,9 @@ String getChatType(final String message) { final char prefix = message.charAt(0); if (prefix == ess.getSettings().getChatShout()) { - return message.length() > 1 ? "shout" : ""; + return "shout"; } else if (prefix == ess.getSettings().getChatQuestion()) { - return message.length() > 1 ? "question" : ""; + return "question"; } else { return ""; } diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java index dc7768b89f4..7647a8ed1d0 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java @@ -16,8 +16,6 @@ import java.util.*; import java.util.logging.*; -import static com.earth2me.essentials.I18n.tl; - public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf { private static final Logger logger = Logger.getLogger("EssentialsXMPP"); @@ -88,7 +86,7 @@ public void processMessage(final Chat chat, final Message msg) { private boolean connect() { final String server = config.getString("xmpp.server"); if (server == null || server.equals("example.com")) { - logger.log(Level.WARNING, tl("xmppNotConfigured")); + logger.log(Level.WARNING, "config broken for xmpp"); return false; } final int port = config.getInt("xmpp.port", 5222); @@ -130,14 +128,10 @@ final void disconnect() { if (connection != null) { connection.disconnect(new Presence(Presence.Type.unavailable)); } + } final void updatePresence() { - if (connection == null) { - parent.getEss().getLogger().warning(tl("xmppNotConfigured")); - return; - } - final int usercount; final StringBuilder stringBuilder = new StringBuilder(); diff --git a/README.md b/README.md index a296bbd0cd2..8adad139c26 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![EssentialsX](https://i.imgur.com/CP4SZpB.png)](https://essentialsx.cf) +[![EssentialsX](https://i.imgur.com/CP4SZpB.png)](https://essentialsx.github.io) [Jenkins](http://ci.ender.zone/job/EssentialsX/) @@ -40,8 +40,16 @@ If you need to report a bug or want to suggest a new feature, you can [open an i Building -------- -To build EssentialsX, you need JDK 8 or higher and Maven installed on your system. Then, run the following command: -```sh +EssentialsX builds against the Spigot/CraftBukkit server software for legacy support. + +To compile EssentialsX, you first need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools). +This only needs to be done once. There are two ways to do this: + +* Use the provided script at `scripts/buildtools.sh` to automatically download and run BuildTools if needed. +* Download and run BuildTools yourself for versions `1.8` and `1.8.3`. + +Next, to build EssentialsX with Maven, run the following command: +``` mvn clean install ``` @@ -50,8 +58,7 @@ Each module's jar can be found in `target/` inside each module's directory. Using EssentialsX in your plugin -------------------------------- -Do you want to integrate with EssentialsX in your plugin? EssentialsX is available on the **ender.zone Maven repository** at https://ci.ender.zone/plugin/repository/everything/, and the EssentialsX artifact is `net.ess3:EssentialsX:2.17.2`. -More information at the [wiki](https://github.com/EssentialsX/Essentials/wiki/Common-Issues#how-do-i-add-essentialsx-as-a-dependency). +Writing a plugin and want to support EssentialsX? We have a Maven repository at https://ci.ender.zone/plugin/repository/everything/, and the EssentialsX artifact is `net.ess3:EssentialsX:2.17.0`. More information at the [wiki](https://github.com/EssentialsX/Essentials/wiki/Common-Issues#how-do-i-add-essentialsx-as-a-dependency). Contributing diff --git a/nms/1_8_R1Provider/.gitignore b/nms/1_8_R1Provider/.gitignore new file mode 100644 index 00000000000..415c5104f71 --- /dev/null +++ b/nms/1_8_R1Provider/.gitignore @@ -0,0 +1 @@ +craftbukkit-*.jar \ No newline at end of file diff --git a/nms/1_8_R1Provider/pom.xml b/nms/1_8_R1Provider/pom.xml new file mode 100644 index 00000000000..0c246a6e457 --- /dev/null +++ b/nms/1_8_R1Provider/pom.xml @@ -0,0 +1,28 @@ + + + + EssentialsXParent + net.ess3 + 2.17.2 + ../../pom.xml + + 4.0.0 + + 1_8_R1Provider + + + + org.bukkit + craftbukkit + 1.8-R0.1-SNAPSHOT + provided + + + net.ess3 + NMSProvider + 2.17.2 + + + \ No newline at end of file diff --git a/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java b/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java new file mode 100644 index 00000000000..29e66a5036a --- /dev/null +++ b/nms/1_8_R1Provider/src/net/ess3/nms/v1_8_R1/v1_8_R1SpawnerProvider.java @@ -0,0 +1,46 @@ +package net.ess3.nms.v1_8_R1; + +import net.ess3.nms.SpawnerProvider; +import net.minecraft.server.v1_8_R1.NBTTagCompound; +import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class v1_8_R1SpawnerProvider extends SpawnerProvider { + @Override + public ItemStack setEntityType(ItemStack is, EntityType type) { + net.minecraft.server.v1_8_R1.ItemStack itemStack; + CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); + itemStack = CraftItemStack.asNMSCopy(craftStack); + NBTTagCompound tag = itemStack.getTag(); + if (tag == null) { + tag = new NBTTagCompound(); + itemStack.setTag(tag); + } + if (!tag.hasKey("BlockEntityTag")) { + tag.set("BlockEntityTag", new NBTTagCompound()); + } + tag = itemStack.getTag().getCompound("BlockEntityTag"); + tag.setString("EntityId", type.getName()); + ItemStack bukkitItemStack = CraftItemStack.asCraftMirror(itemStack).clone(); + return setDisplayName(bukkitItemStack, type); + } + + @Override + public EntityType getEntityType(ItemStack is) { + net.minecraft.server.v1_8_R1.ItemStack itemStack; + CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); + itemStack = CraftItemStack.asNMSCopy(craftStack); + NBTTagCompound tag = itemStack.getTag(); + if (tag == null || !tag.hasKey("BlockEntityTag")) { + throw new IllegalArgumentException(); + } + String name = tag.getCompound("BlockEntityTag").getString("EntityId"); + return EntityType.fromName(name); + } + + @Override + public String getHumanName() { + return "CraftBukkit 1.8 NMS-based provider"; + } +} diff --git a/nms/1_8_R2Provider/.gitignore b/nms/1_8_R2Provider/.gitignore new file mode 100644 index 00000000000..415c5104f71 --- /dev/null +++ b/nms/1_8_R2Provider/.gitignore @@ -0,0 +1 @@ +craftbukkit-*.jar \ No newline at end of file diff --git a/nms/1_8_R2Provider/pom.xml b/nms/1_8_R2Provider/pom.xml new file mode 100644 index 00000000000..2cbe5cbbec6 --- /dev/null +++ b/nms/1_8_R2Provider/pom.xml @@ -0,0 +1,28 @@ + + + + EssentialsXParent + net.ess3 + 2.17.2 + ../../pom.xml + + 4.0.0 + + 1_8_R2Provider + + + + org.bukkit + craftbukkit + 1.8.3-R0.1-SNAPSHOT + provided + + + net.ess3 + NMSProvider + 2.17.2 + + + \ No newline at end of file diff --git a/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java b/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java new file mode 100644 index 00000000000..2d8a5458f23 --- /dev/null +++ b/nms/1_8_R2Provider/src/net/ess3/nms/v1_8_R2/v1_8_R2SpawnerProvider.java @@ -0,0 +1,46 @@ +package net.ess3.nms.v1_8_R2; + +import net.ess3.nms.SpawnerProvider; +import net.minecraft.server.v1_8_R2.NBTTagCompound; +import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftItemStack; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class v1_8_R2SpawnerProvider extends SpawnerProvider { + @Override + public ItemStack setEntityType(ItemStack is, EntityType type) { + net.minecraft.server.v1_8_R2.ItemStack itemStack; + CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); + itemStack = CraftItemStack.asNMSCopy(craftStack); + NBTTagCompound tag = itemStack.getTag(); + if (tag == null) { + tag = new NBTTagCompound(); + itemStack.setTag(tag); + } + if (!tag.hasKey("BlockEntityTag")) { + tag.set("BlockEntityTag", new NBTTagCompound()); + } + tag = itemStack.getTag().getCompound("BlockEntityTag"); + tag.setString("EntityId", type.getName()); + ItemStack bukkitItemStack = CraftItemStack.asCraftMirror(itemStack).clone(); + return setDisplayName(bukkitItemStack, type); + } + + @Override + public EntityType getEntityType(ItemStack is) { + net.minecraft.server.v1_8_R2.ItemStack itemStack; + CraftItemStack craftStack = CraftItemStack.asCraftCopy(is); + itemStack = CraftItemStack.asNMSCopy(craftStack); + NBTTagCompound tag = itemStack.getTag(); + if (tag == null || !tag.hasKey("BlockEntityTag")) { + throw new IllegalArgumentException(); + } + String name = tag.getCompound("BlockEntityTag").getString("EntityId"); + return EntityType.fromName(name); + } + + @Override + public String getHumanName() { + return "CraftBukkit 1.8.3 NMS-based provider"; + } +} diff --git a/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java b/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java index bea240ba4f0..b3e5f3f4659 100644 --- a/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java +++ b/nms/FlattenedProvider/src/net/ess3/nms/flattened/FlatSpawnEggProvider.java @@ -24,7 +24,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getDescription() { + public String getHumanName() { return "1.13+ flat spawn egg provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java index 5170d4e90f9..8ffa477d7c2 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacyPotionMetaProvider.java @@ -14,7 +14,7 @@ public ItemStack createPotionItem(Material initial, int effectId) { } @Override - public String getDescription() { + public String getHumanName() { return "legacy potion meta provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java index 27d6a25ff67..63e8be7c671 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnEggProvider.java @@ -24,7 +24,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getDescription() { + public String getHumanName() { return "legacy item data provider"; } } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java index 1a2716149e2..2311df7016b 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java @@ -18,7 +18,7 @@ public EntityType getEntityType(ItemStack is) { } @Override - public String getDescription() { + public String getHumanName() { return "legacy item data provider"; } } diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java index cd83b6c8e87..b52f368f266 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnEggProvider.java @@ -6,7 +6,6 @@ public abstract class SpawnEggProvider implements Provider { public abstract ItemStack createEggItem(EntityType type) throws IllegalArgumentException; - public abstract EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentException; @Override diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java index 4d142cdd27a..387c517a9ad 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java @@ -1,7 +1,7 @@ package net.ess3.nms; -import com.google.common.collect.ImmutableMap; import net.ess3.providers.Provider; +import com.google.common.collect.ImmutableMap; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -25,20 +25,18 @@ public abstract class SpawnerProvider implements Provider { .build(); public abstract ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException; - public abstract EntityType getEntityType(ItemStack is) throws IllegalArgumentException; @Override public boolean tryProvider() { - EntityType type = EntityType.CREEPER; - Material MOB_SPAWNER; - try { - MOB_SPAWNER = Material.valueOf("SPAWNER"); - } catch (Exception e) { - MOB_SPAWNER = Material.valueOf("MOB_SPAWNER"); - } - try { + EntityType type = EntityType.CREEPER; + Material MOB_SPAWNER; + try { + MOB_SPAWNER = Material.SPAWNER; + } catch (Exception e) { + MOB_SPAWNER = Material.valueOf("MOB_SPAWNER"); + } ItemStack is = setEntityType(new ItemStack(MOB_SPAWNER), type); EntityType readType = getEntityType(is); return type == readType; diff --git a/nms/NMSProvider/src/net/ess3/providers/Provider.java b/nms/NMSProvider/src/net/ess3/providers/Provider.java index 0e23e9f6d47..2e7b96a56b8 100644 --- a/nms/NMSProvider/src/net/ess3/providers/Provider.java +++ b/nms/NMSProvider/src/net/ess3/providers/Provider.java @@ -3,5 +3,5 @@ public interface Provider { boolean tryProvider(); - String getDescription(); + String getHumanName(); } diff --git a/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java b/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java index 53b44bf7021..0abda6400d8 100644 --- a/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java +++ b/nms/NMSProvider/src/net/ess3/providers/ProviderFactory.java @@ -5,24 +5,25 @@ public class ProviderFactory { private Logger logger; private String providerType; - private Iterable> providers; + private Iterable> availableProviders; - public ProviderFactory(Logger logger, Iterable> providers, String providerType) { + public ProviderFactory(Logger logger, Iterable> availableProviders, String providerType) { this.logger = logger; this.providerType = providerType; - this.providers = providers; + this.availableProviders = availableProviders; } public T getProvider() { - for (Class providerClass : providers) { - T provider = loadProvider(providerClass); - if (provider != null && provider.tryProvider()) { - logger.info("Using " + provider.getDescription() + " as " + providerType + " provider."); - return provider; + T finalProvider = null; + for (Class providerClass : availableProviders) { + finalProvider = loadProvider(providerClass); + if (finalProvider != null && finalProvider.tryProvider()) { + break; } } - logger.severe("The " + providerType + " provider failed to load! Some parts of Essentials may not function correctly."); - return null; + assert finalProvider != null; + logger.info("Using " + finalProvider.getHumanName() + " as " + providerType + " provider."); + return finalProvider; } private T loadProvider(Class providerClass) { diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java index 93301fd022c..6edc649212b 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnEggProvider.java @@ -30,7 +30,7 @@ public EntityType getSpawnedType(ItemStack eggItem) throws IllegalArgumentExcept } @Override - public String getDescription() { + public String getHumanName() { return "Reflection based provider"; } } diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java index f29bec133a9..fb0e5f61979 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java @@ -36,7 +36,7 @@ public static String getNMSVersion() { } return nmsVersion; } - + public static NMSVersion getNmsVersionObject() { if (nmsVersionObject == null) { nmsVersionObject = NMSVersion.fromString(getNMSVersion()); @@ -224,7 +224,7 @@ public int hashCode() { /** * https://gist.github.com/SupaHam/dad1db6406596c5f8e4b221ff473831c - * + * * @author SupaHam (https://github.com/SupaHam) */ public static class NMSVersion implements Comparable { @@ -232,7 +232,7 @@ public static class NMSVersion implements Comparable { private final int major; private final int minor; private final int release; - + public static NMSVersion fromString(String string) { Preconditions.checkNotNull(string, "string cannot be null."); Matcher matcher = VERSION_PATTERN.matcher(string); @@ -251,19 +251,19 @@ private NMSVersion(int major, int minor, int release) { this.minor = minor; this.release = release; } - + public boolean isHigherThan(NMSVersion o) { return compareTo(o) > 0; } - + public boolean isHigherThanOrEqualTo(NMSVersion o) { return compareTo(o) >= 0; } - + public boolean isLowerThan(NMSVersion o) { return compareTo(o) < 0; } - + public boolean isLowerThanOrEqualTo(NMSVersion o) { return compareTo(o) <= 0; } @@ -290,8 +290,8 @@ public boolean equals(Object o) { } NMSVersion that = (NMSVersion) o; return major == that.major && - minor == that.minor && - release == that.release; + minor == that.minor && + release == that.release; } @Override @@ -301,7 +301,7 @@ public int hashCode() { @Override public String toString() { - return "v" + major + "_" + minor + "_R" + release; + return "v" + major + "_" + minor + "_R" + release; } @Override diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java index b5fc981db91..d17f7c91bf9 100644 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/SpawnEggRefl.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with ASkyBlock. If not, see . ****************************************************************************** - */ +*/ package net.ess3.nms.refl; import org.bukkit.Material; @@ -95,7 +95,7 @@ public ItemStack toItemStack(int amount) throws Exception { } Object id = NBTTagCompoundConstructor.newInstance(); Method tagSetString = ReflUtil.getMethodCached(NBTTagCompoundClass, "setString", String.class, String.class); - + String idString = type.getName(); if (ReflUtil.getNmsVersionObject().isHigherThanOrEqualTo(ReflUtil.V1_11_R1)) { // 1.11 requires domain prefix of minecraft. @@ -152,3 +152,4 @@ static SpawnEggRefl fromItemStack(ItemStack item) throws Exception { } } } + diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java index ed3464c2346..c9aa02eb0ca 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BasePotionDataProvider.java @@ -67,7 +67,7 @@ private static int getBit(int n, int k) { } @Override - public String getDescription() { + public String getHumanName() { return "1.9+ BasePotionData provider"; } } diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java index 0a4b18861f7..28a55220cb4 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java @@ -26,7 +26,7 @@ public EntityType getEntityType(ItemStack is) { } @Override - public String getDescription() { + public String getHumanName() { return "1.8.3+ BlockStateMeta provider"; } } diff --git a/pom.xml b/pom.xml index 85f8a8e944a..fb4bd6a8acc 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,8 @@ EssentialsXMPP nms/NMSProvider nms/UpdatedMetaProvider + nms/1_8_R1Provider + nms/1_8_R2Provider nms/LegacyProvider nms/ReflectionProvider nms/FlattenedProvider @@ -251,6 +253,28 @@ true + + + + org.codehaus.mojo + native2ascii-maven-plugin + 2.0.1 + + + utf8-to-latin1 + + inplace + + process-resources + + ${project.build.outputDirectory} + ${project.build.sourceEncoding} + + **/*.properties + + + + diff --git a/scripts/buildtools.sh b/scripts/buildtools.sh new file mode 100755 index 00000000000..a7e45436381 --- /dev/null +++ b/scripts/buildtools.sh @@ -0,0 +1,61 @@ +#!/bin/bash +mkdir -p .buildtools +pushd .buildtools + +is_installed() { + mvn dependency:get -q -Dartifact=$1 -DremoteRepositories=file://$HOME/.m2/repository 1>/dev/null 2>&1 + return $? +} + +ensure_buildtools() { + if [ ! -f "BuildTools.jar" ]; then + echo "Downloading BuildTools..." + if [[ "$OSTYPE" == "darwin"* ]] || [[ "$OSTYPE" == "msys"* ]]; then + curl https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar -o BuildTools.jar + else + wget -O BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar + fi + fi +} + +run_buildtools() { + ensure_buildtools + # Check if env var isnt empty, then run with xmx flag + if [ ! -z "$BUILDTOOLS_XMX" ]; then + echo "BUILDTOOLS_XMX Environment variable found. Running BuildTools with -Xmx$BUILDTOOLS_XMX" + java -Xmx$BUILDTOOLS_XMX -jar BuildTools.jar --rev $1 + else + java -jar BuildTools.jar --rev $1 + fi + if [ $? -ne 0 ]; then + echo "Running BuildTools for CB $1 failed! Aborting." + popd + exit 255 + else + echo "Successfully built version $1" + fi +} + +# Check CB 1.8 +is_installed org.bukkit:craftbukkit:1.8-R0.1-SNAPSHOT +is_18=$? # 0 = present, 1 = not present + +# Check CB 1.8.3 +is_installed org.bukkit:craftbukkit:1.8.3-R0.1-SNAPSHOT +is_183=$? + +if [ $is_18 -ne 0 ]; then + echo "Installing CraftBukkit 1.8..." + run_buildtools 1.8 +else + echo "CraftBukkit 1.8 installed; skipping BuildTools..." +fi + +if [ $is_183 -ne 0 ]; then + echo "Installing CraftBukkit 1.8.3..." + run_buildtools 1.8.3 +else + echo "CraftBukkit 1.8.3 installed; skipping BuildTools..." +fi + +popd From 4134362d4a9424889b98d70751e7a7c8fb0608e3 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 20:42:45 -0700 Subject: [PATCH 06/10] Spawner block provider --- .../com/earth2me/essentials/Essentials.java | 34 +++++++--- .../essentials/EssentialsBlockListener.java | 2 +- .../com/earth2me/essentials/IEssentials.java | 7 ++- .../essentials/commands/Commandspawner.java | 33 +++------- .../earth2me/essentials/items/FlatItemDb.java | 4 +- .../essentials/items/LegacyItemDb.java | 2 +- ...er.java => LegacySpawnerItemProvider.java} | 4 +- .../net/ess3/nms/SpawnerBlockProvider.java | 10 +++ ...Provider.java => SpawnerItemProvider.java} | 2 +- .../nms/refl/ReflSpawnerBlockProvider.java | 62 +++++++++++++++++++ ...java => BlockMetaSpawnerItemProvider.java} | 4 +- .../BukkitSpawnerBlockProvider.java | 31 ++++++++++ 12 files changed, 148 insertions(+), 47 deletions(-) rename nms/LegacyProvider/src/net/ess3/nms/legacy/{LegacySpawnerProvider.java => LegacySpawnerItemProvider.java} (83%) create mode 100644 nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java rename nms/NMSProvider/src/net/ess3/nms/{SpawnerProvider.java => SpawnerItemProvider.java} (97%) create mode 100644 nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java rename nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/{BlockMetaSpawnerProvider.java => BlockMetaSpawnerItemProvider.java} (89%) create mode 100644 nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 95b13c97179..450d613b311 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -40,14 +40,17 @@ import net.ess3.api.*; import net.ess3.nms.PotionMetaProvider; import net.ess3.nms.SpawnEggProvider; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerBlockProvider; +import net.ess3.nms.SpawnerItemProvider; import net.ess3.nms.flattened.FlatSpawnEggProvider; import net.ess3.nms.legacy.LegacyPotionMetaProvider; import net.ess3.nms.legacy.LegacySpawnEggProvider; -import net.ess3.nms.legacy.LegacySpawnerProvider; +import net.ess3.nms.legacy.LegacySpawnerItemProvider; import net.ess3.nms.refl.ReflSpawnEggProvider; +import net.ess3.nms.refl.ReflSpawnerBlockProvider; import net.ess3.nms.updatedmeta.BasePotionDataProvider; -import net.ess3.nms.updatedmeta.BlockMetaSpawnerProvider; +import net.ess3.nms.updatedmeta.BlockMetaSpawnerItemProvider; +import net.ess3.nms.updatedmeta.BukkitSpawnerBlockProvider; import net.ess3.providers.ProviderFactory; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -108,7 +111,8 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient EssentialsTimer timer; private final transient Set vanishedPlayers = new LinkedHashSet<>(); private transient Method oldGetOnlinePlayers; - private transient SpawnerProvider spawnerProvider; + private transient SpawnerItemProvider spawnerItemProvider; + private transient SpawnerBlockProvider spawnerBlockProvider; private transient SpawnEggProvider spawnEggProvider; private transient PotionMetaProvider potionMetaProvider; private transient Kits kits; @@ -246,11 +250,16 @@ public void onEnable() { confList.add(jails); execTimer.mark("Init(Jails)"); - spawnerProvider = new ProviderFactory<>(getLogger(), + spawnerItemProvider = new ProviderFactory<>(getLogger(), Arrays.asList( - BlockMetaSpawnerProvider.class, - LegacySpawnerProvider.class - ), "mob spawner").getProvider(); + BlockMetaSpawnerItemProvider.class, + LegacySpawnerItemProvider.class + ), "mob spawner item").getProvider(); + spawnerBlockProvider = new ProviderFactory<>(getLogger(), + Arrays.asList( + BukkitSpawnerBlockProvider.class, + ReflSpawnerBlockProvider.class + ), "mob spawner block").getProvider(); spawnEggProvider = new ProviderFactory<>(getLogger(), Arrays.asList( FlatSpawnEggProvider.class, @@ -923,8 +932,13 @@ public Iterable getOnlineUsers() { } @Override - public SpawnerProvider getSpawnerProvider() { - return spawnerProvider; + public SpawnerItemProvider getSpawnerItemProvider() { + return spawnerItemProvider; + } + + @Override + public SpawnerBlockProvider getSpawnerBlockProvider() { + return spawnerBlockProvider; } @Override diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java index 6d2c1024b59..7d2c8ef38c0 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java @@ -37,7 +37,7 @@ public void onBlockPlace(final BlockPlaceEvent event) { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = ess.getSpawnerProvider().getEntityType(event.getItemInHand()); + final EntityType type = ess.getSpawnerItemProvider().getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index 7c34c16982f..776b05d8425 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -6,7 +6,8 @@ import com.earth2me.essentials.metrics.Metrics; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerBlockProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -105,5 +106,7 @@ public interface IEssentials extends Plugin { Iterable getOnlineUsers(); - SpawnerProvider getSpawnerProvider(); + SpawnerItemProvider getSpawnerItemProvider(); + + SpawnerBlockProvider getSpawnerBlockProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index 6aa43035a89..c9909655cd4 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -7,16 +7,13 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; -import com.earth2me.essentials.utils.VersionUtil; -import net.ess3.nms.refl.ReflUtil; +import net.ess3.nms.SpawnerBlockProvider; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; -import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.Locale; import static com.earth2me.essentials.I18n.tl; @@ -62,30 +59,14 @@ protected void run(final Server server, final User user, final String commandLab final Trade charge = new Trade("spawner-" + mob.name.toLowerCase(Locale.ENGLISH), ess); charge.isAffordableFor(user); try { - Block block = target.getBlock(); - CreatureSpawner spawner = (CreatureSpawner) block.getState(); + CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); spawner.setSpawnedType(mob.getType()); if (delay > 0) { - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_12_2_R01)) { - spawner.setMinSpawnDelay(0); - spawner.setMaxSpawnDelay(Integer.MAX_VALUE); - spawner.setMinSpawnDelay(delay); - spawner.setMaxSpawnDelay(delay); - } else { - Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); - Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Method getSpawner = tileEntityMobSpawner.getDeclaredMethod("getSpawner"); - Method getTileEntityAt = craftWorld.getDeclaredMethod("getTileEntityAt", int.class, int.class, int.class); - Object craftTileEntity = getTileEntityAt.invoke(block.getWorld(), block.getX(), block.getY(), block.getZ()); - Object nmsSpawner = getSpawner.invoke(craftTileEntity); - Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); - Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); - if (minSpawnDelay != null && maxSpawnDelay != null) { - minSpawnDelay.setInt(nmsSpawner, delay); - maxSpawnDelay.setInt(nmsSpawner, delay); - } - } + SpawnerBlockProvider spawnerBlockProvider = ess.getSpawnerBlockProvider(); + spawnerBlockProvider.setMinSpawnDelay(spawner, 1); + spawnerBlockProvider.setMaxSpawnDelay(spawner, Integer.MAX_VALUE); + spawnerBlockProvider.setMinSpawnDelay(spawner, delay); + spawnerBlockProvider.setMaxSpawnDelay(spawner, delay); } spawner.setDelay(delay); spawner.update(); diff --git a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java index 90f9e5959b5..07084c4c04f 100644 --- a/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/FlatItemDb.java @@ -145,7 +145,7 @@ public ItemStack get(String id, boolean useResolvers) throws Exception { // setItemMeta to prevent a race condition EntityType entity = data.getEntity(); if (entity != null && material.toString().contains("SPAWNER")) { - ess.getSpawnerProvider().setEntityType(stack, entity); + ess.getSpawnerItemProvider().setEntityType(stack, entity); } return stack; @@ -203,7 +203,7 @@ private ItemData lookup(ItemStack item) { PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData(); return new ItemData(type, potion); } else if (type.toString().contains("SPAWNER")) { - EntityType entity = ess.getSpawnerProvider().getEntityType(item); + EntityType entity = ess.getSpawnerItemProvider().getEntityType(item); return new ItemData(type, entity); } else { return new ItemData(type); diff --git a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java index 759616e3809..68a926ca2bf 100644 --- a/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java +++ b/Essentials/src/com/earth2me/essentials/items/LegacyItemDb.java @@ -185,7 +185,7 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti if (mat == MOB_SPAWNER) { if (metaData == 0) metaData = EntityType.PIG.getTypeId(); try { - retval = ess.getSpawnerProvider().setEntityType(retval, EntityType.fromId(metaData)); + retval = ess.getSpawnerItemProvider().setEntityType(retval, EntityType.fromId(metaData)); } catch (IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); } diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java similarity index 83% rename from nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java rename to nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java index 1a2716149e2..aec11a35a34 100644 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerProvider.java +++ b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java @@ -1,11 +1,11 @@ package net.ess3.nms.legacy; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @SuppressWarnings("deprecation") -public class LegacySpawnerProvider extends SpawnerProvider { +public class LegacySpawnerItemProvider extends SpawnerItemProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { is.getData().setData((byte) type.getTypeId()); diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java new file mode 100644 index 00000000000..8c887e816c5 --- /dev/null +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java @@ -0,0 +1,10 @@ +package net.ess3.nms; + +import net.ess3.providers.Provider; +import org.bukkit.block.CreatureSpawner; + +public abstract class SpawnerBlockProvider implements Provider { + public abstract void setMaxSpawnDelay(CreatureSpawner spawner, int delay); + + public abstract void setMinSpawnDelay(CreatureSpawner spawner, int delay); +} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java similarity index 97% rename from nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java rename to nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java index 4d142cdd27a..b54e086b8a0 100644 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerProvider.java +++ b/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java @@ -10,7 +10,7 @@ import java.util.Map; -public abstract class SpawnerProvider implements Provider { +public abstract class SpawnerItemProvider implements Provider { private Map entityToDisplayName = ImmutableMap.builder() .put(EntityType.CAVE_SPIDER, "Cave Spider") .put(EntityType.PIG_ZOMBIE, "Zombie Pigman") diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java new file mode 100644 index 00000000000..825c5ba0e2d --- /dev/null +++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java @@ -0,0 +1,62 @@ +package net.ess3.nms.refl; + +import net.ess3.nms.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflSpawnerBlockProvider extends SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); + if (maxSpawnDelay != null) { + try { + maxSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) {} + } + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); + if (minSpawnDelay != null) { + try { + minSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) {} + } + } + + @Override + public boolean tryProvider() { + try { + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); + return false; + } catch (NoSuchMethodException e) { + return true; + } + } + + @Override + public String getDescription() { + return "Reflection based provider"; + } + + private Object getNMSSpawner(CreatureSpawner spawner) { + try { + Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); + Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); + Method getSpawner = ReflUtil.getMethodCached(tileEntityMobSpawner, "getSpawner"); + Method getTileEntityAt = ReflUtil.getMethodCached(craftWorld, "getTileEntityAt", int.class, int.class, int.class); + if (getSpawner != null && getTileEntityAt != null) { + Object craftTileEntity = getTileEntityAt.invoke(spawner.getWorld(), spawner.getX(), spawner.getY(), spawner.getZ()); + return getSpawner.invoke(craftTileEntity); + } + } catch (IllegalAccessException | InvocationTargetException ignored) { + } + return null; + } +} diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java similarity index 89% rename from nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java rename to nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java index 0a4b18861f7..a42d64479d3 100644 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerProvider.java +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java @@ -1,13 +1,13 @@ package net.ess3.nms.updatedmeta; -import net.ess3.nms.SpawnerProvider; +import net.ess3.nms.SpawnerItemProvider; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; -public class BlockMetaSpawnerProvider extends SpawnerProvider { +public class BlockMetaSpawnerItemProvider extends SpawnerItemProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) { BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java new file mode 100644 index 00000000000..195516b71a5 --- /dev/null +++ b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java @@ -0,0 +1,31 @@ +package net.ess3.nms.updatedmeta; + +import net.ess3.nms.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +public class BukkitSpawnerBlockProvider extends SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMaxSpawnDelay(delay); + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMinSpawnDelay(delay); + } + + @Override + public boolean tryProvider() { + try { + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); + return true; + } catch (NoSuchMethodException e) { + return false; + } + } + + @Override + public String getDescription() { + return "Bukkit 1.12+ provider"; + } +} From b090fc982fe0270f0e13d6c8e3b9dabe9455f4d5 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Sat, 13 Jun 2020 21:12:02 -0700 Subject: [PATCH 07/10] remove unnecessary import --- .../src/com/earth2me/essentials/commands/Commandspawner.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index c9909655cd4..8371e85a91a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -11,7 +11,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; -import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; import java.util.Locale; From d7da5e9a0afe8e7104717afa4fe9d3ddfa9947f8 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 3 Aug 2020 16:16:32 -0700 Subject: [PATCH 08/10] Refactor everything --- .../com/earth2me/essentials/Essentials.java | 15 ++++- .../com/earth2me/essentials/IEssentials.java | 7 ++- .../essentials/commands/Commandspawner.java | 2 +- .../ess3/provider/SpawnerBlockProvider.java | 9 +++ ...Provider.java => SpawnerItemProvider.java} | 2 +- ...java => BlockMetaSpawnerItemProvider.java} | 4 +- .../providers/BukkitSpawnerBlockProvider.java | 21 +++++++ .../providers/LegacySpawnerItemProvider.java | 24 ++++++++ .../providers/ReflSpawnerBlockProvider.java | 55 +++++++++++++++++++ 9 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 providers/BaseProviders/src/net/ess3/provider/SpawnerBlockProvider.java rename providers/BaseProviders/src/net/ess3/provider/{SpawnerProvider.java => SpawnerItemProvider.java} (96%) rename providers/BaseProviders/src/net/ess3/provider/providers/{BlockMetaSpawnerProvider.java => BlockMetaSpawnerItemProvider.java} (89%) create mode 100644 providers/BaseProviders/src/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java create mode 100644 providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java create mode 100644 providers/NMSReflectionProvider/src/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 638b9db4a23..379c034bac9 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -40,11 +40,13 @@ import net.ess3.api.*; import net.ess3.nms.refl.providers.ReflServerStateProvider; import net.ess3.nms.refl.providers.ReflSpawnEggProvider; +import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.provider.PotionMetaProvider; import net.ess3.provider.ProviderListener; import net.ess3.provider.ServerStateProvider; import net.ess3.provider.SpawnEggProvider; -import net.ess3.provider.SpawnerProvider; +import net.ess3.provider.SpawnerBlockProvider; +import net.ess3.provider.SpawnerItemProvider; import net.ess3.provider.providers.*; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -245,8 +247,15 @@ public void onEnable() { confList.add(jails); execTimer.mark("Init(Jails)"); - //Spawner provider only uses one but it's here for legacy... - spawnerProvider = new BlockMetaSpawnerProvider(); + //Spawner item provider only uses one but it's here for legacy... + spawnerItemProvider = new BlockMetaSpawnerItemProvider(); + + //Spawner block providers + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_12_0_R01)) { + spawnerBlockProvider = new ReflSpawnerBlockProvider(); + } else { + spawnerBlockProvider = new BukkitSpawnerBlockProvider(); + } //Spawn Egg Providers if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_8_8_R01)) { diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java index 3f4d8a6bcfd..4646f638d9a 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/IEssentials.java @@ -6,7 +6,8 @@ import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; import net.ess3.provider.ServerStateProvider; -import net.ess3.provider.SpawnerProvider; +import net.ess3.provider.SpawnerBlockProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -103,7 +104,9 @@ public interface IEssentials extends Plugin { Iterable getOnlineUsers(); - SpawnerProvider getSpawnerProvider(); + SpawnerItemProvider getSpawnerItemProvider(); + + SpawnerBlockProvider getSpawnerBlockProvider(); ServerStateProvider getServerStateProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index 8371e85a91a..a7590eeb9f3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -7,7 +7,7 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.StringUtil; -import net.ess3.nms.SpawnerBlockProvider; +import net.ess3.provider.SpawnerBlockProvider; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; diff --git a/providers/BaseProviders/src/net/ess3/provider/SpawnerBlockProvider.java b/providers/BaseProviders/src/net/ess3/provider/SpawnerBlockProvider.java new file mode 100644 index 00000000000..98f2f8b2665 --- /dev/null +++ b/providers/BaseProviders/src/net/ess3/provider/SpawnerBlockProvider.java @@ -0,0 +1,9 @@ +package net.ess3.provider; + +import org.bukkit.block.CreatureSpawner; + +public interface SpawnerBlockProvider extends Provider { + void setMaxSpawnDelay(CreatureSpawner spawner, int delay); + + void setMinSpawnDelay(CreatureSpawner spawner, int delay); +} diff --git a/providers/BaseProviders/src/net/ess3/provider/SpawnerProvider.java b/providers/BaseProviders/src/net/ess3/provider/SpawnerItemProvider.java similarity index 96% rename from providers/BaseProviders/src/net/ess3/provider/SpawnerProvider.java rename to providers/BaseProviders/src/net/ess3/provider/SpawnerItemProvider.java index 4d479c81057..d377ee8bd53 100644 --- a/providers/BaseProviders/src/net/ess3/provider/SpawnerProvider.java +++ b/providers/BaseProviders/src/net/ess3/provider/SpawnerItemProvider.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public interface SpawnerProvider extends Provider { +public interface SpawnerItemProvider extends Provider { ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException; EntityType getEntityType(ItemStack is) throws IllegalArgumentException; diff --git a/providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerProvider.java b/providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java similarity index 89% rename from providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerProvider.java rename to providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java index ac5c1bd28e2..cc67da3b2d2 100644 --- a/providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerProvider.java +++ b/providers/BaseProviders/src/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java @@ -1,13 +1,13 @@ package net.ess3.provider.providers; -import net.ess3.provider.SpawnerProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; -public class BlockMetaSpawnerProvider implements SpawnerProvider { +public class BlockMetaSpawnerItemProvider implements SpawnerItemProvider { @Override public ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException { BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); diff --git a/providers/BaseProviders/src/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java b/providers/BaseProviders/src/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java new file mode 100644 index 00000000000..eac24e97017 --- /dev/null +++ b/providers/BaseProviders/src/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java @@ -0,0 +1,21 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +public class BukkitSpawnerBlockProvider implements SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMaxSpawnDelay(delay); + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + spawner.setMinSpawnDelay(delay); + } + + @Override + public String getDescription() { + return "Bukkit 1.12+ provider"; + } +} diff --git a/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java b/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java new file mode 100644 index 00000000000..061f934b6a8 --- /dev/null +++ b/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java @@ -0,0 +1,24 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.SpawnerItemProvider; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +@SuppressWarnings("deprecation") +public class LegacySpawnerItemProvider implements SpawnerItemProvider { + @Override + public ItemStack setEntityType(ItemStack is, EntityType type) { + is.getData().setData((byte) type.getTypeId()); + return setDisplayName(is, type); + } + + @Override + public EntityType getEntityType(ItemStack is) { + return EntityType.fromId((int) is.getData().getData()); + } + + @Override + public String getDescription() { + return "legacy item data provider"; + } +} diff --git a/providers/NMSReflectionProvider/src/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java b/providers/NMSReflectionProvider/src/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java new file mode 100644 index 00000000000..554cc990896 --- /dev/null +++ b/providers/NMSReflectionProvider/src/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java @@ -0,0 +1,55 @@ +package net.ess3.nms.refl.providers; + +import net.ess3.nms.refl.ReflUtil; +import net.ess3.provider.SpawnerBlockProvider; +import org.bukkit.block.CreatureSpawner; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflSpawnerBlockProvider implements SpawnerBlockProvider { + @Override + public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); + if (maxSpawnDelay != null) { + try { + maxSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) { + } + } + } + + @Override + public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { + Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); + Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); + if (minSpawnDelay != null) { + try { + minSpawnDelay.setInt(getNMSSpawner(spawner), delay); + } catch (IllegalAccessException ignored) { + } + } + } + + @Override + public String getDescription() { + return "Reflection based provider"; + } + + private Object getNMSSpawner(CreatureSpawner spawner) { + try { + Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); + Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); + Method getSpawner = ReflUtil.getMethodCached(tileEntityMobSpawner, "getSpawner"); + Method getTileEntityAt = ReflUtil.getMethodCached(craftWorld, "getTileEntityAt", int.class, int.class, int.class); + if (getSpawner != null && getTileEntityAt != null) { + Object craftTileEntity = getTileEntityAt.invoke(spawner.getWorld(), spawner.getX(), spawner.getY(), spawner.getZ()); + return getSpawner.invoke(craftTileEntity); + } + } catch (IllegalAccessException | InvocationTargetException ignored) { + } + return null; + } +} From 6588b679c68b01a0da35276bef566c650aec3eb8 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 3 Aug 2020 16:19:19 -0700 Subject: [PATCH 09/10] Remove old files --- .../nms/legacy/LegacySpawnerItemProvider.java | 24 ------- .../net/ess3/nms/SpawnerBlockProvider.java | 10 --- .../src/net/ess3/nms/SpawnerItemProvider.java | 63 ------------------- .../nms/refl/ReflSpawnerBlockProvider.java | 62 ------------------ .../BlockMetaSpawnerItemProvider.java | 32 ---------- .../BukkitSpawnerBlockProvider.java | 31 --------- 6 files changed, 222 deletions(-) delete mode 100644 nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java delete mode 100644 nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java delete mode 100644 nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java delete mode 100644 nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java delete mode 100644 nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java delete mode 100644 nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java diff --git a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java b/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java deleted file mode 100644 index aec11a35a34..00000000000 --- a/nms/LegacyProvider/src/net/ess3/nms/legacy/LegacySpawnerItemProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.ess3.nms.legacy; - -import net.ess3.nms.SpawnerItemProvider; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - -@SuppressWarnings("deprecation") -public class LegacySpawnerItemProvider extends SpawnerItemProvider { - @Override - public ItemStack setEntityType(ItemStack is, EntityType type) { - is.getData().setData((byte) type.getTypeId()); - return setDisplayName(is, type); - } - - @Override - public EntityType getEntityType(ItemStack is) { - return EntityType.fromId((int) is.getData().getData()); - } - - @Override - public String getDescription() { - return "legacy item data provider"; - } -} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java deleted file mode 100644 index 8c887e816c5..00000000000 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerBlockProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.ess3.nms; - -import net.ess3.providers.Provider; -import org.bukkit.block.CreatureSpawner; - -public abstract class SpawnerBlockProvider implements Provider { - public abstract void setMaxSpawnDelay(CreatureSpawner spawner, int delay); - - public abstract void setMinSpawnDelay(CreatureSpawner spawner, int delay); -} diff --git a/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java b/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java deleted file mode 100644 index b54e086b8a0..00000000000 --- a/nms/NMSProvider/src/net/ess3/nms/SpawnerItemProvider.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.ess3.nms; - -import com.google.common.collect.ImmutableMap; -import net.ess3.providers.Provider; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.Map; - -public abstract class SpawnerItemProvider implements Provider { - private Map entityToDisplayName = ImmutableMap.builder() - .put(EntityType.CAVE_SPIDER, "Cave Spider") - .put(EntityType.PIG_ZOMBIE, "Zombie Pigman") - .put(EntityType.MAGMA_CUBE, "Magma Cube") - .put(EntityType.ENDER_DRAGON, "Ender Dragon") - .put(EntityType.MUSHROOM_COW, "Mooshroom") - .put(EntityType.SNOWMAN, "Snow Golem") - .put(EntityType.OCELOT, "Ocelot") - .put(EntityType.IRON_GOLEM, "Iron Golem") - .put(EntityType.WITHER, "Wither") - .put(EntityType.HORSE, "Horse") - .build(); - - public abstract ItemStack setEntityType(ItemStack is, EntityType type) throws IllegalArgumentException; - - public abstract EntityType getEntityType(ItemStack is) throws IllegalArgumentException; - - @Override - public boolean tryProvider() { - EntityType type = EntityType.CREEPER; - Material MOB_SPAWNER; - try { - MOB_SPAWNER = Material.valueOf("SPAWNER"); - } catch (Exception e) { - MOB_SPAWNER = Material.valueOf("MOB_SPAWNER"); - } - - try { - ItemStack is = setEntityType(new ItemStack(MOB_SPAWNER), type); - EntityType readType = getEntityType(is); - return type == readType; - } catch (Throwable t) { - return false; - } - } - - @SuppressWarnings("deprecation") - protected ItemStack setDisplayName(ItemStack is, EntityType type) { - ItemMeta meta = is.getItemMeta(); - String displayName; - if (entityToDisplayName.containsKey(type)) { - displayName = entityToDisplayName.get(type); - } else { - displayName = type.getName(); - } - meta.setDisplayName(ChatColor.RESET + displayName + " Spawner"); - is.setItemMeta(meta); - return is; - } -} diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java deleted file mode 100644 index 825c5ba0e2d..00000000000 --- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflSpawnerBlockProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.ess3.nms.refl; - -import net.ess3.nms.SpawnerBlockProvider; -import org.bukkit.block.CreatureSpawner; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public class ReflSpawnerBlockProvider extends SpawnerBlockProvider { - @Override - public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Field maxSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "maxSpawnDelay"); - if (maxSpawnDelay != null) { - try { - maxSpawnDelay.setInt(getNMSSpawner(spawner), delay); - } catch (IllegalAccessException ignored) {} - } - } - - @Override - public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { - Class mobSpawnerAbstract = ReflUtil.getNMSClass("MobSpawnerAbstract"); - Field minSpawnDelay = ReflUtil.getFieldCached(mobSpawnerAbstract, "minSpawnDelay"); - if (minSpawnDelay != null) { - try { - minSpawnDelay.setInt(getNMSSpawner(spawner), delay); - } catch (IllegalAccessException ignored) {} - } - } - - @Override - public boolean tryProvider() { - try { - CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); - return false; - } catch (NoSuchMethodException e) { - return true; - } - } - - @Override - public String getDescription() { - return "Reflection based provider"; - } - - private Object getNMSSpawner(CreatureSpawner spawner) { - try { - Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); - Class tileEntityMobSpawner = ReflUtil.getNMSClass("TileEntityMobSpawner"); - Method getSpawner = ReflUtil.getMethodCached(tileEntityMobSpawner, "getSpawner"); - Method getTileEntityAt = ReflUtil.getMethodCached(craftWorld, "getTileEntityAt", int.class, int.class, int.class); - if (getSpawner != null && getTileEntityAt != null) { - Object craftTileEntity = getTileEntityAt.invoke(spawner.getWorld(), spawner.getX(), spawner.getY(), spawner.getZ()); - return getSpawner.invoke(craftTileEntity); - } - } catch (IllegalAccessException | InvocationTargetException ignored) { - } - return null; - } -} diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java deleted file mode 100644 index a42d64479d3..00000000000 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BlockMetaSpawnerItemProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.ess3.nms.updatedmeta; - -import net.ess3.nms.SpawnerItemProvider; -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BlockStateMeta; - -public class BlockMetaSpawnerItemProvider extends SpawnerItemProvider { - @Override - public ItemStack setEntityType(ItemStack is, EntityType type) { - BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); - BlockState bs = bsm.getBlockState(); - ((CreatureSpawner) bs).setSpawnedType(type); - bsm.setBlockState(bs); - is.setItemMeta(bsm); - return setDisplayName(is, type); - } - - @Override - public EntityType getEntityType(ItemStack is) { - BlockStateMeta bsm = (BlockStateMeta) is.getItemMeta(); - CreatureSpawner bs = (CreatureSpawner) bsm.getBlockState(); - return bs.getSpawnedType(); - } - - @Override - public String getDescription() { - return "1.8.3+ BlockStateMeta provider"; - } -} diff --git a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java b/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java deleted file mode 100644 index 195516b71a5..00000000000 --- a/nms/UpdatedMetaProvider/src/net/ess3/nms/updatedmeta/BukkitSpawnerBlockProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.ess3.nms.updatedmeta; - -import net.ess3.nms.SpawnerBlockProvider; -import org.bukkit.block.CreatureSpawner; - -public class BukkitSpawnerBlockProvider extends SpawnerBlockProvider { - @Override - public void setMaxSpawnDelay(CreatureSpawner spawner, int delay) { - spawner.setMaxSpawnDelay(delay); - } - - @Override - public void setMinSpawnDelay(CreatureSpawner spawner, int delay) { - spawner.setMinSpawnDelay(delay); - } - - @Override - public boolean tryProvider() { - try { - CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); - return true; - } catch (NoSuchMethodException e) { - return false; - } - } - - @Override - public String getDescription() { - return "Bukkit 1.12+ provider"; - } -} From b525d28278fcdf0427bb5538086df8381fe10c49 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 3 Aug 2020 16:23:19 -0700 Subject: [PATCH 10/10] Remove unused provider --- .../providers/LegacySpawnerItemProvider.java | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java diff --git a/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java b/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java deleted file mode 100644 index 061f934b6a8..00000000000 --- a/providers/BaseProviders/src/net/ess3/provider/providers/LegacySpawnerItemProvider.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.ess3.provider.providers; - -import net.ess3.provider.SpawnerItemProvider; -import org.bukkit.entity.EntityType; -import org.bukkit.inventory.ItemStack; - -@SuppressWarnings("deprecation") -public class LegacySpawnerItemProvider implements SpawnerItemProvider { - @Override - public ItemStack setEntityType(ItemStack is, EntityType type) { - is.getData().setData((byte) type.getTypeId()); - return setDisplayName(is, type); - } - - @Override - public EntityType getEntityType(ItemStack is) { - return EntityType.fromId((int) is.getData().getData()); - } - - @Override - public String getDescription() { - return "legacy item data provider"; - } -}