From 3096e4354066dd10be72ad912e0c0f3b02b8a8e0 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Sun, 5 May 2019 22:20:43 -0400 Subject: [PATCH] Update to Java 8 and Minecraft 1.8.8 --- api/pom.xml | 13 +- .../java/com/lishid/openinv/IOpenInv.java | 89 ++++++- .../openinv/internal/IInventoryAccess.java | 5 + .../lishid/openinv/util/InventoryAccess.java | 145 +++++++++++ .../com/lishid/openinv/util/StringMetric.java | 165 +++++++++++++ common/pom.xml | 7 - .../openinv/internal/IPlayerDataManager.java | 24 -- .../lishid/openinv/util/InternalAccessor.java | 37 +-- internal/v1_13_R2/pom.xml | 13 - .../internal/v1_13_R2/InventoryAccess.java | 78 ------ .../internal/v1_13_R2/PlayerDataManager.java | 28 --- internal/v1_14_R1/pom.xml | 14 -- .../internal/v1_14_R1/InventoryAccess.java | 78 ------ .../internal/v1_14_R1/PlayerDataManager.java | 28 --- .../internal/v1_8_R3/InventoryAccess.java | 76 ------ .../internal/v1_8_R3/PlayerDataManager.java | 28 --- plugin/pom.xml | 5 - .../main/java/com/lishid/openinv/OpenInv.java | 230 ++++-------------- .../commands/SearchEnchantPluginCommand.java | 2 +- .../commands/SearchInvPluginCommand.java | 2 +- .../listeners/InventoryClickListener.java | 14 +- .../listeners/InventoryCloseListener.java | 5 - .../listeners/InventoryDragListener.java | 16 +- .../openinv/listeners/PlayerListener.java | 18 +- .../lishid/openinv/util/ConfigUpdater.java | 17 +- pom.xml | 14 +- 26 files changed, 481 insertions(+), 670 deletions(-) create mode 100644 api/src/main/java/com/lishid/openinv/util/InventoryAccess.java create mode 100644 api/src/main/java/com/lishid/openinv/util/StringMetric.java delete mode 100644 internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/InventoryAccess.java delete mode 100644 internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/InventoryAccess.java delete mode 100644 internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java diff --git a/api/pom.xml b/api/pom.xml index 6197976..bab3ba3 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -29,11 +29,14 @@ - org.bukkit - bukkit - 1.4.5-R1.0 - system - ${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar + org.jetbrains + annotations + 17.0.0 + + + org.spigotmc + spigot-api + 1.8.8-R0.1-SNAPSHOT diff --git a/api/src/main/java/com/lishid/openinv/IOpenInv.java b/api/src/main/java/com/lishid/openinv/IOpenInv.java index d968b63..0fb4a0b 100644 --- a/api/src/main/java/com/lishid/openinv/IOpenInv.java +++ b/api/src/main/java/com/lishid/openinv/IOpenInv.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018 lishid. All rights reserved. + * Copyright (C) 2011-2019 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,11 @@ import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory; +import com.lishid.openinv.util.InventoryAccess; +import com.lishid.openinv.util.StringMetric; +import java.util.UUID; +import java.util.logging.Logger; +import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; @@ -59,7 +64,10 @@ public interface IOpenInv { * @return the IInventoryAccess * @throws IllegalStateException if the server version is unsupported */ - @NotNull IInventoryAccess getInventoryAccess(); + @Deprecated + default @NotNull IInventoryAccess getInventoryAccess() { + return new InventoryAccess(); + } /** * Gets the provided player's AnyChest setting. @@ -78,7 +86,9 @@ public interface IOpenInv { * @return the identifier * @throws IllegalStateException if the server version is unsupported */ - @NotNull String getPlayerID(@NotNull OfflinePlayer offline); + default @NotNull String getPlayerID(@NotNull OfflinePlayer offline) { + return offline.getUniqueId().toString(); + } /** * Gets a player's SilentChest setting. @@ -137,7 +147,76 @@ public interface IOpenInv { * @param name the name of the Player * @return the OfflinePlayer with the closest matching name or null if no players have ever logged in */ - @Nullable OfflinePlayer matchPlayer(@NotNull String name); + default @Nullable OfflinePlayer matchPlayer(@NotNull String name) { + + // Warn if called on the main thread - if we resort to searching offline players, this may take several seconds. + if (Bukkit.getServer().isPrimaryThread()) { + this.getLogger().warning("Call to OpenInv#matchPlayer made on the main thread!"); + this.getLogger().warning("This can cause the server to hang, potentially severely."); + this.getLogger().warning("Trace:"); + for (StackTraceElement element : new Throwable().fillInStackTrace().getStackTrace()) { + this.getLogger().warning(element.toString()); + } + } + + OfflinePlayer player; + + try { + UUID uuid = UUID.fromString(name); + player = Bukkit.getOfflinePlayer(uuid); + // Ensure player is a real player, otherwise return null + if (player.hasPlayedBefore() || player.isOnline()) { + return player; + } + } catch (IllegalArgumentException ignored) { + // Not a UUID + } + + // Ensure name is valid if server is in online mode to avoid unnecessary searching + if (Bukkit.getServer().getOnlineMode() && !name.matches("[a-zA-Z0-9_]{3,16}")) { + return null; + } + + player = Bukkit.getServer().getPlayerExact(name); + + if (player != null) { + return player; + } + + player = Bukkit.getServer().getOfflinePlayer(name); + + if (player.hasPlayedBefore()) { + return player; + } + + player = Bukkit.getServer().getPlayer(name); + + if (player != null) { + return player; + } + + float bestMatch = 0; + for (OfflinePlayer offline : Bukkit.getServer().getOfflinePlayers()) { + if (offline.getName() == null) { + // Loaded by UUID only, name has never been looked up. + continue; + } + + float currentMatch = StringMetric.compareJaroWinkler(name, offline.getName()); + + if (currentMatch == 1.0F) { + return offline; + } + + if (currentMatch > bestMatch) { + bestMatch = currentMatch; + player = offline; + } + } + + // Only null if no players have played ever, otherwise even the worst match will do. + return player; + } /** * Open an ISpecialInventory for a Player. @@ -225,4 +304,6 @@ public interface IOpenInv { */ void unload(@NotNull OfflinePlayer offline); + Logger getLogger(); + } diff --git a/api/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java b/api/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java index 97f1160..f0eb40e 100644 --- a/api/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java +++ b/api/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java @@ -20,6 +20,7 @@ import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +@Deprecated public interface IInventoryAccess { /** @@ -29,6 +30,7 @@ public interface IInventoryAccess { * @param inventory the Inventory * @return the ISpecialEnderChest or null */ + @Deprecated @Nullable ISpecialEnderChest getSpecialEnderChest(@NotNull Inventory inventory); /** @@ -38,6 +40,7 @@ public interface IInventoryAccess { * @param inventory the Inventory * @return the ISpecialPlayerInventory or null */ + @Deprecated @Nullable ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull Inventory inventory); /** @@ -46,6 +49,7 @@ public interface IInventoryAccess { * @param inventory the Inventory * @return true if the Inventory is backed by an ISpecialEnderChest */ + @Deprecated boolean isSpecialEnderChest(@NotNull Inventory inventory); /** @@ -54,6 +58,7 @@ public interface IInventoryAccess { * @param inventory the Inventory * @return true if the Inventory is backed by an ISpecialPlayerInventory */ + @Deprecated boolean isSpecialPlayerInventory(@NotNull Inventory inventory); } diff --git a/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java b/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java new file mode 100644 index 0000000..fe35475 --- /dev/null +++ b/api/src/main/java/com/lishid/openinv/util/InventoryAccess.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2011-2019 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.util; + +import com.lishid.openinv.internal.IInventoryAccess; +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.internal.ISpecialPlayerInventory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class InventoryAccess implements IInventoryAccess { + + private static Class craftInventory = null; + private static Method getInventory = null; + + static { + String packageName = Bukkit.getServer().getClass().getPackage().getName(); + String version = packageName.substring(packageName.lastIndexOf('.') + 1); + try { + craftInventory = Class.forName("org.bukkit.craftbukkit." + version + ".inventory.CraftInventory"); + } catch (ClassNotFoundException ignored) {} + try { + getInventory = craftInventory.getDeclaredMethod("getInventory"); + } catch (NoSuchMethodException ignored) {} + } + + public static boolean isUseable() { + return craftInventory != null && getInventory != null; + } + + public static boolean isPlayerInventory(@NotNull Inventory inventory) { + if (craftInventory.isAssignableFrom(inventory.getClass())) { + try { + return getInventory.invoke(inventory) instanceof ISpecialPlayerInventory; + } catch (ReflectiveOperationException ignored) {} + } + return grabFieldOfTypeFromObject(ISpecialPlayerInventory.class, inventory) != null; + } + + public static ISpecialPlayerInventory getPlayerInventory(@NotNull Inventory inventory) { + Object inv = null; + if (craftInventory.isAssignableFrom(inventory.getClass())) { + try { + inv = getInventory.invoke(inventory); + } catch (ReflectiveOperationException ignored) {} + } + + if (inv == null) { + inv = grabFieldOfTypeFromObject(ISpecialPlayerInventory.class, inventory); + } + + if (inv instanceof ISpecialPlayerInventory) { + return (ISpecialPlayerInventory) inv; + } + + return null; + } + + public static boolean isEnderChest(@NotNull Inventory inventory) { + if (craftInventory.isAssignableFrom(inventory.getClass())) { + try { + return getInventory.invoke(inventory) instanceof ISpecialEnderChest; + } catch (ReflectiveOperationException ignored) {} + } + return grabFieldOfTypeFromObject(ISpecialEnderChest.class, inventory) != null; + } + + public static ISpecialEnderChest getEnderChest(@NotNull Inventory inventory) { + Object inv = null; + if (craftInventory.isAssignableFrom(inventory.getClass())) { + try { + inv = getInventory.invoke(inventory); + } catch (ReflectiveOperationException ignored) {} + } + + if (inv == null) { + inv = grabFieldOfTypeFromObject(ISpecialEnderChest.class, inventory); + } + + if (inv instanceof ISpecialEnderChest) { + return (ISpecialEnderChest) inv; + } + + return null; + } + + private static T grabFieldOfTypeFromObject(final Class type, final Object object) { + // Use reflection to find the IInventory + Class clazz = object.getClass(); + T result = null; + for (Field f : clazz.getDeclaredFields()) { + f.setAccessible(true); + if (type.isAssignableFrom(f.getDeclaringClass())) { + try { + result = type.cast(f.get(object)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return result; + } + + @Deprecated + @Override + public @Nullable ISpecialEnderChest getSpecialEnderChest(@NotNull Inventory inventory) { + return getEnderChest(inventory); + } + + @Deprecated + @Override + public @Nullable ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull Inventory inventory) { + return getPlayerInventory(inventory); + } + + @Deprecated + @Override + public boolean isSpecialEnderChest(@NotNull Inventory inventory) { + return isEnderChest(inventory); + } + + @Deprecated + @Override + public boolean isSpecialPlayerInventory(@NotNull Inventory inventory) { + return isPlayerInventory(inventory); + } +} diff --git a/api/src/main/java/com/lishid/openinv/util/StringMetric.java b/api/src/main/java/com/lishid/openinv/util/StringMetric.java new file mode 100644 index 0000000..6a85ada --- /dev/null +++ b/api/src/main/java/com/lishid/openinv/util/StringMetric.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2011-2019 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * * + * Copyright (C) 2014 - 2018 Simmetrics Authors + * Copyright (C) 2010 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.lishid.openinv.util; + +public class StringMetric { + + public static float compareJaroWinkler(String a, String b) { + final float jaroScore = compareJaro(a, b); + + if (jaroScore < (float) 0.1) { + return jaroScore; + } + + String prefix = commonPrefix(a, b); + int prefixLength = Math.min(prefix.codePointCount(0, prefix.length()), 4); + + return jaroScore + (prefixLength * (float) 0.7 * (1.0f - jaroScore)); + + } + + private static float compareJaro(String a, String b) { + if (a.isEmpty() && b.isEmpty()) { + return 1.0f; + } + + if (a.isEmpty() || b.isEmpty()) { + return 0.0f; + } + + final int[] charsA = a.codePoints().toArray(); + final int[] charsB = b.codePoints().toArray(); + + // Intentional integer division to round down. + final int halfLength = Math.max(0, Math.max(charsA.length, charsB.length) / 2 - 1); + + final int[] commonA = getCommonCodePoints(charsA, charsB, halfLength); + final int[] commonB = getCommonCodePoints(charsB, charsA, halfLength); + + // commonA and commonB will always contain the same multi-set of + // characters. Because getCommonCharacters has been optimized, commonA + // and commonB are -1-padded. So in this loop we count transposition + // and use commonCharacters to determine the length of the multi-set. + float transpositions = 0; + int commonCharacters = 0; + for (int length = commonA.length; commonCharacters < length + && commonA[commonCharacters] > -1; commonCharacters++) { + if (commonA[commonCharacters] != commonB[commonCharacters]) { + transpositions++; + } + } + + if (commonCharacters == 0) { + return 0.0f; + } + + float aCommonRatio = commonCharacters / (float) charsA.length; + float bCommonRatio = commonCharacters / (float) charsB.length; + float transpositionRatio = (commonCharacters - transpositions / 2.0f) / commonCharacters; + + return (aCommonRatio + bCommonRatio + transpositionRatio) / 3.0f; + } + + /* + * Returns an array of code points from a within b. A character in b is + * counted as common when it is within separation distance from the position + * in a. + */ + private static int[] getCommonCodePoints(final int[] charsA, final int[] charsB, final int separation) { + final int[] common = new int[Math.min(charsA.length, charsB.length)]; + final boolean[] matched = new boolean[charsB.length]; + + // Iterate of string a and find all characters that occur in b within + // the separation distance. Mark any matches found to avoid + // duplicate matchings. + int commonIndex = 0; + for (int i = 0, length = charsA.length; i < length; i++) { + final int character = charsA[i]; + final int index = indexOf(character, charsB, i - separation, i + + separation + 1, matched); + if (index > -1) { + common[commonIndex++] = character; + matched[index] = true; + } + } + + if (commonIndex < common.length) { + common[commonIndex] = -1; + } + + // Both invocations will yield the same multi-set terminated by -1, so + // they can be compared for transposition without making a copy. + return common; + } + + /* + * Search for code point in buffer starting at fromIndex to toIndex - 1. + * + * Returns -1 when not found. + */ + private static int indexOf(int character, int[] buffer, int fromIndex, int toIndex, boolean[] matched) { + + // compare char with range of characters to either side + for (int j = Math.max(0, fromIndex), length = Math.min(toIndex, buffer.length); j < length; j++) { + // check if found + if (buffer[j] == character && !matched[j]) { + return j; + } + } + + return -1; + } + + private static String commonPrefix(CharSequence a, CharSequence b) { + int maxPrefixLength = Math.min(a.length(), b.length()); + + int p; + + p = 0; + while (p < maxPrefixLength && a.charAt(p) == b.charAt(p)) { + ++p; + } + + if (validSurrogatePairAt(a, p - 1) || validSurrogatePairAt(b, p - 1)) { + --p; + } + + return a.subSequence(0, p).toString(); + } + + private static boolean validSurrogatePairAt(CharSequence string, int index) { + return index >= 0 && index <= string.length() - 2 && Character.isHighSurrogate(string.charAt(index)) && Character.isLowSurrogate(string.charAt(index + 1)); + } + + private StringMetric(){} + +} diff --git a/common/pom.xml b/common/pom.xml index 42ecea5..abc47e9 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -28,13 +28,6 @@ OpenInvCommon - - org.bukkit - bukkit - 1.4.5-R1.0 - system - ${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar - com.lishid openinvapi diff --git a/common/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java b/common/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java index 4419118..24cf49d 100644 --- a/common/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java +++ b/common/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal; -import java.util.Collection; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; @@ -35,29 +34,6 @@ public interface IPlayerDataManager { */ @Nullable Player loadPlayer(@NotNull OfflinePlayer offline); - /** - * Gets a unique identifying string for an OfflinePlayer. - * - * @param offline the OfflinePlayer - * @return the unique identifier - */ - @NotNull String getPlayerDataID(@NotNull OfflinePlayer offline); - - /** - * Gets an OfflinePlayer by the given unique identifier. - * - * @param identifier the unique identifier - * @return the OfflinePlayer, or null if no exact match was found - */ - @Nullable OfflinePlayer getPlayerByID(@NotNull String identifier); - - /** - * Gets a Collection of all Players currently online. - * - * @return the Collection of Players - */ - @NotNull Collection getOnlinePlayers(); - /** * Opens an ISpecialInventory for a Player. * diff --git a/common/src/main/java/com/lishid/openinv/util/InternalAccessor.java b/common/src/main/java/com/lishid/openinv/util/InternalAccessor.java index 74153b5..3099a08 100644 --- a/common/src/main/java/com/lishid/openinv/util/InternalAccessor.java +++ b/common/src/main/java/com/lishid/openinv/util/InternalAccessor.java @@ -17,41 +17,20 @@ package com.lishid.openinv.util; import com.lishid.openinv.internal.IAnySilentContainer; -import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialPlayerInventory; import java.lang.reflect.Constructor; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; public class InternalAccessor { - public static T grabFieldOfTypeFromObject(final Class type, final Object object) { - // Use reflection to find the IInventory - Class clazz = object.getClass(); - T result = null; - for (Field f : clazz.getDeclaredFields()) { - f.setAccessible(true); - if (type.isAssignableFrom(f.getDeclaringClass())) { - try { - result = type.cast(f.get(object)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return result; - } - private final Plugin plugin; private final String version; private boolean supported = false; private IPlayerDataManager playerDataManager; - private IInventoryAccess inventoryAccess; - private IAnySilentContainer anySilentContainer; public InternalAccessor(final Plugin plugin) { @@ -65,9 +44,8 @@ public class InternalAccessor { Class.forName("com.lishid.openinv.internal." + this.version + ".SpecialPlayerInventory"); Class.forName("com.lishid.openinv.internal." + this.version + ".SpecialEnderChest"); this.playerDataManager = this.createObject(IPlayerDataManager.class, "PlayerDataManager"); - this.inventoryAccess = this.createObject(IInventoryAccess.class, "InventoryAccess"); this.anySilentContainer = this.createObject(IAnySilentContainer.class, "AnySilentContainer"); - this.supported = true; + this.supported = InventoryAccess.isUseable(); } catch (Exception ignored) {} } @@ -128,19 +106,6 @@ public class InternalAccessor { return this.anySilentContainer; } - /** - * Creates an instance of the IInventoryAccess implementation for the current server version. - * - * @return the IInventoryAccess - * @throws IllegalStateException if server version is unsupported - */ - public IInventoryAccess getInventoryAccess() { - if (!this.supported) { - throw new IllegalStateException(String.format("Unsupported server version %s!", this.version)); - } - return this.inventoryAccess; - } - /** * Creates an instance of the IPlayerDataManager implementation for the current server version. * diff --git a/internal/v1_13_R2/pom.xml b/internal/v1_13_R2/pom.xml index d0fc421..ddf76cf 100644 --- a/internal/v1_13_R2/pom.xml +++ b/internal/v1_13_R2/pom.xml @@ -41,17 +41,4 @@ - - - - maven-compiler-plugin - 3.6.1 - - 1.8 - 1.8 - - - - - diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/InventoryAccess.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/InventoryAccess.java deleted file mode 100644 index 60022cf..0000000 --- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/InventoryAccess.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2011-2018 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.lishid.openinv.internal.v1_13_R2; - -import com.lishid.openinv.internal.IInventoryAccess; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.util.InternalAccessor; -import net.minecraft.server.v1_13_R2.IInventory; -import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventory; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; - -public class InventoryAccess implements IInventoryAccess { - - @Override - public ISpecialEnderChest getSpecialEnderChest(@NotNull final Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialEnderChest) { - return (SpecialEnderChest) inv; - } - return null; - } - - @Override - public ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull final Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialPlayerInventory) { - return (SpecialPlayerInventory) inv; - } - return null; - } - - @Override - public boolean isSpecialEnderChest(@NotNull final Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, - inventory) instanceof ISpecialEnderChest; - } - - @Override - public boolean isSpecialPlayerInventory(@NotNull final Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, - inventory) instanceof ISpecialPlayerInventory; - } - -} diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java index b5b5a23..01e5daa 100644 --- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java +++ b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java @@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_13_R2; import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.ISpecialInventory; import com.mojang.authlib.GameProfile; -import java.util.Collection; -import java.util.UUID; import net.minecraft.server.v1_13_R2.DimensionManager; import net.minecraft.server.v1_13_R2.EntityPlayer; import net.minecraft.server.v1_13_R2.MinecraftServer; @@ -56,32 +54,6 @@ public class PlayerDataManager implements IPlayerDataManager { return nmsPlayer; } - @Override - public @NotNull Collection getOnlinePlayers() { - return Bukkit.getOnlinePlayers(); - } - - @Override - public OfflinePlayer getPlayerByID(@NotNull final String identifier) { - try { - UUID uuid = UUID.fromString(identifier); - OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); - // Ensure player is a real player, otherwise return null - if (!player.hasPlayedBefore() && !player.isOnline()) { - return null; - } - return player; - } catch (IllegalArgumentException e) { - // Not a UUID - return null; - } - } - - @Override - public @NotNull String getPlayerDataID(@NotNull final OfflinePlayer offline) { - return offline.getUniqueId().toString(); - } - @Override public Player loadPlayer(@NotNull final OfflinePlayer offline) { // Ensure player has data diff --git a/internal/v1_14_R1/pom.xml b/internal/v1_14_R1/pom.xml index c8573f8..47249c8 100644 --- a/internal/v1_14_R1/pom.xml +++ b/internal/v1_14_R1/pom.xml @@ -42,18 +42,4 @@ - - - - maven-compiler-plugin - 3.6.1 - - 1.8 - 1.8 - - - - - - \ No newline at end of file diff --git a/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/InventoryAccess.java b/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/InventoryAccess.java deleted file mode 100644 index 2830c43..0000000 --- a/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/InventoryAccess.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2011-2019 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.lishid.openinv.internal.v1_14_R1; - -import com.lishid.openinv.internal.IInventoryAccess; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.util.InternalAccessor; -import net.minecraft.server.v1_14_R1.IInventory; -import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventory; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; - -public class InventoryAccess implements IInventoryAccess { - - @Override - public ISpecialEnderChest getSpecialEnderChest(@NotNull final Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialEnderChest) { - return (SpecialEnderChest) inv; - } - return null; - } - - @Override - public ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull final Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialPlayerInventory) { - return (SpecialPlayerInventory) inv; - } - return null; - } - - @Override - public boolean isSpecialEnderChest(@NotNull final Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, - inventory) instanceof ISpecialEnderChest; - } - - @Override - public boolean isSpecialPlayerInventory(@NotNull final Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, - inventory) instanceof ISpecialPlayerInventory; - } - -} diff --git a/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/PlayerDataManager.java b/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/PlayerDataManager.java index 8144f21..eeac2cb 100644 --- a/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/PlayerDataManager.java +++ b/internal/v1_14_R1/src/main/java/com/lishid/openinv/internal/v1_14_R1/PlayerDataManager.java @@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_14_R1; import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.ISpecialInventory; import com.mojang.authlib.GameProfile; -import java.util.Collection; -import java.util.UUID; import net.minecraft.server.v1_14_R1.ChatComponentText; import net.minecraft.server.v1_14_R1.Container; import net.minecraft.server.v1_14_R1.Containers; @@ -67,32 +65,6 @@ public class PlayerDataManager implements IPlayerDataManager { return nmsPlayer; } - @Override - public @NotNull Collection getOnlinePlayers() { - return Bukkit.getOnlinePlayers(); - } - - @Override - public OfflinePlayer getPlayerByID(@NotNull final String identifier) { - try { - UUID uuid = UUID.fromString(identifier); - OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); - // Ensure player is a real player, otherwise return null - if (!player.hasPlayedBefore() && !player.isOnline()) { - return null; - } - return player; - } catch (IllegalArgumentException e) { - // Not a UUID - return null; - } - } - - @Override - public @NotNull String getPlayerDataID(@NotNull final OfflinePlayer offline) { - return offline.getUniqueId().toString(); - } - @Override public Player loadPlayer(@NotNull final OfflinePlayer offline) { // Ensure player has data diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java deleted file mode 100644 index 537437a..0000000 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2011-2018 lishid. All rights reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.lishid.openinv.internal.v1_8_R3; - -import com.lishid.openinv.internal.IInventoryAccess; -import com.lishid.openinv.internal.ISpecialEnderChest; -import com.lishid.openinv.internal.ISpecialPlayerInventory; -import com.lishid.openinv.util.InternalAccessor; -import net.minecraft.server.v1_8_R3.IInventory; -import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; -import org.bukkit.inventory.Inventory; -import org.jetbrains.annotations.NotNull; - -public class InventoryAccess implements IInventoryAccess { - - @Override - public boolean isSpecialPlayerInventory(@NotNull Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialPlayerInventory; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialPlayerInventory; - } - - @Override - public ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialPlayerInventory) { - return (SpecialPlayerInventory) inv; - } - return null; - } - - @Override - public boolean isSpecialEnderChest(@NotNull Inventory inventory) { - if (inventory instanceof CraftInventory) { - return ((CraftInventory) inventory).getInventory() instanceof ISpecialEnderChest; - } - return InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory) instanceof ISpecialEnderChest; - } - - @Override - public ISpecialEnderChest getSpecialEnderChest(@NotNull Inventory inventory) { - IInventory inv; - if (inventory instanceof CraftInventory) { - inv = ((CraftInventory) inventory).getInventory(); - } else { - inv = InternalAccessor.grabFieldOfTypeFromObject(IInventory.class, inventory); - } - - if (inv instanceof SpecialEnderChest) { - return (SpecialEnderChest) inv; - } - return null; - } - -} diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java index 74d5c79..648f15a 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java @@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_8_R3; import com.lishid.openinv.internal.IPlayerDataManager; import com.lishid.openinv.internal.ISpecialInventory; import com.mojang.authlib.GameProfile; -import java.util.Collection; -import java.util.UUID; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.MinecraftServer; import net.minecraft.server.v1_8_R3.PlayerInteractManager; @@ -58,32 +56,6 @@ public class PlayerDataManager implements IPlayerDataManager { return target; } - @Override - public @NotNull String getPlayerDataID(@NotNull OfflinePlayer offline) { - return offline.getUniqueId().toString(); - } - - @Override - public OfflinePlayer getPlayerByID(@NotNull String identifier) { - try { - UUID uuid = UUID.fromString(identifier); - OfflinePlayer player = Bukkit.getOfflinePlayer(uuid); - // Ensure player is a real player, otherwise return null - if (player == null || !player.hasPlayedBefore() && !player.isOnline()) { - return null; - } - return player; - } catch (IllegalArgumentException e) { - // Not a UUID - return null; - } - } - - @Override - public @NotNull Collection getOnlinePlayers() { - return Bukkit.getOnlinePlayers(); - } - public static EntityPlayer getHandle(Player player) { if (player instanceof CraftPlayer) { return ((CraftPlayer) player).getHandle(); diff --git a/plugin/pom.xml b/plugin/pom.xml index 4cf7c7f..0e90cb6 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -28,11 +28,6 @@ OpenInvPlugin - - org.bukkit - bukkit - 1.8.8-R0.1-SNAPSHOT - com.lishid openinvcommon diff --git a/plugin/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java index b89c176..e70879d 100644 --- a/plugin/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -24,7 +24,6 @@ import com.lishid.openinv.commands.SearchEnchantPluginCommand; import com.lishid.openinv.commands.SearchInvPluginCommand; import com.lishid.openinv.commands.SilentChestPluginCommand; import com.lishid.openinv.internal.IAnySilentContainer; -import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialInventory; import com.lishid.openinv.internal.ISpecialPlayerInventory; @@ -38,15 +37,10 @@ import com.lishid.openinv.util.ConfigUpdater; import com.lishid.openinv.util.Function; import com.lishid.openinv.util.InternalAccessor; import com.lishid.openinv.util.Permissions; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.bukkit.Bukkit; @@ -72,50 +66,52 @@ import org.jetbrains.annotations.Nullable; */ public class OpenInv extends JavaPlugin implements IOpenInv { - private final Map inventories = new HashMap(); - private final Map enderChests = new HashMap(); + private final Map inventories = new HashMap<>(); + private final Map enderChests = new HashMap<>(); private final Multimap> pluginUsage = HashMultimap.create(); - private final Cache playerCache = new Cache(300000L, + private final Cache playerCache = new Cache<>(300000L, new Function() { @Override public boolean run(final Player value) { - String key = OpenInv.this.accessor.getPlayerDataManager().getPlayerDataID(value); + + String key = OpenInv.this.getPlayerID(value); return OpenInv.this.inventories.containsKey(key) && OpenInv.this.inventories.get(key).isInUse() || OpenInv.this.enderChests.containsKey(key) - && OpenInv.this.enderChests.get(key).isInUse() + && OpenInv.this.enderChests.get(key).isInUse() || OpenInv.this.pluginUsage.containsKey(key); } }, new Function() { - @Override - public boolean run(final Player value) { - String key = OpenInv.this.accessor.getPlayerDataManager().getPlayerDataID(value); + @Override + public boolean run(final Player value) { - // Check if inventory is stored, and if it is, remove it and eject all viewers - if (OpenInv.this.inventories.containsKey(key)) { - Inventory inv = OpenInv.this.inventories.remove(key).getBukkitInventory(); - List viewers = inv.getViewers(); - for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) { - entity.closeInventory(); - } - } + String key = OpenInv.this.getPlayerID(value); - // Check if ender chest is stored, and if it is, remove it and eject all viewers - if (OpenInv.this.enderChests.containsKey(key)) { - Inventory inv = OpenInv.this.enderChests.remove(key).getBukkitInventory(); - List viewers = inv.getViewers(); - for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) { - entity.closeInventory(); - } - } - - if (!OpenInv.this.disableSaving() && !value.isOnline()) { - value.saveData(); - } - return true; + // Check if inventory is stored, and if it is, remove it and eject all viewers + if (OpenInv.this.inventories.containsKey(key)) { + Inventory inv = OpenInv.this.inventories.remove(key).getBukkitInventory(); + List viewers = inv.getViewers(); + for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) { + entity.closeInventory(); } - }); + } + + // Check if ender chest is stored, and if it is, remove it and eject all viewers + if (OpenInv.this.enderChests.containsKey(key)) { + Inventory inv = OpenInv.this.enderChests.remove(key).getBukkitInventory(); + List viewers = inv.getViewers(); + for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) { + entity.closeInventory(); + } + } + + if (!OpenInv.this.disableSaving() && !value.isOnline()) { + value.saveData(); + } + return true; + } + }); private InternalAccessor accessor; @@ -126,7 +122,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { */ public void changeWorld(final Player player) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String key = this.getPlayerID(player); // Check if the player is cached. If not, neither of their inventories is open. if (!this.playerCache.containsKey(key)) { @@ -171,12 +167,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv { return this.accessor.getAnySilentContainer(); } - @NotNull - @Override - public IInventoryAccess getInventoryAccess() { - return this.accessor.getInventoryAccess(); - } - private int getLevenshteinDistance(final String string1, final String string2) { if (string1 == null || string2 == null) { throw new IllegalArgumentException("Strings must not be null"); @@ -221,36 +211,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv { return prevDistances[len1]; } - @SuppressWarnings("unchecked") - public Collection getOnlinePlayers() { - - if (this.accessor.isSupported()) { - return this.accessor.getPlayerDataManager().getOnlinePlayers(); - } - - Method getOnlinePlayers; - try { - getOnlinePlayers = Bukkit.class.getDeclaredMethod("getOnlinePlayers"); - } catch (Exception e) { - e.printStackTrace(); - return Collections.emptyList(); - } - - Object onlinePlayers; - try { - onlinePlayers = getOnlinePlayers.invoke(null); - } catch (Exception e) { - e.printStackTrace(); - return Collections.emptyList(); - } - - if (onlinePlayers instanceof List) { - return (Collection) onlinePlayers; - } - - return Arrays.asList((Player[]) onlinePlayers); - } - @Override public boolean getPlayerAnyChestStatus(@NotNull final OfflinePlayer player) { boolean defaultState = false; @@ -262,13 +222,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { } } - return this.getConfig().getBoolean("toggles.any-chest." + this.accessor.getPlayerDataManager().getPlayerDataID(player), defaultState); - } - - @NotNull - @Override - public String getPlayerID(@NotNull final OfflinePlayer offline) { - return this.accessor.getPlayerDataManager().getPlayerDataID(offline); + return this.getConfig().getBoolean("toggles.any-chest." + this.getPlayerID(player), defaultState); } @Override @@ -282,14 +236,14 @@ public class OpenInv extends JavaPlugin implements IOpenInv { } } - return this.getConfig().getBoolean("toggles.silent-chest." + this.accessor.getPlayerDataManager().getPlayerDataID(offline), defaultState); + return this.getConfig().getBoolean("toggles.silent-chest." + this.getPlayerID(offline), defaultState); } @NotNull @Override public ISpecialEnderChest getSpecialEnderChest(@NotNull final Player player, final boolean online) throws InstantiationException { - String id = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String id = this.getPlayerID(player); if (this.enderChests.containsKey(id)) { return this.enderChests.get(id); } @@ -303,7 +257,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public ISpecialPlayerInventory getSpecialInventory(@NotNull final Player player, final boolean online) throws InstantiationException { - String id = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String id = this.getPlayerID(player); if (this.inventories.containsKey(id)) { return this.inventories.get(id); } @@ -322,7 +276,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public Player loadPlayer(@NotNull final OfflinePlayer offline) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(offline); + String key = this.getPlayerID(offline); if (this.playerCache.containsKey(key)) { return this.playerCache.get(key); } @@ -345,12 +299,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { } Future future = Bukkit.getScheduler().callSyncMethod(this, - new Callable() { - @Override - public Player call() { - return OpenInv.this.accessor.getPlayerDataManager().loadPlayer(offline); - } - }); + () -> OpenInv.this.accessor.getPlayerDataManager().loadPlayer(offline)); int ticks = 0; while (!future.isDone() && !future.isCancelled() && ticks < 10) { @@ -369,10 +318,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { try { loaded = future.get(); - } catch (InterruptedException e) { - e.printStackTrace(); - return null; - } catch (ExecutionException e) { + } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); return null; } @@ -384,83 +330,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv { return loaded; } - @Nullable - @Override - public OfflinePlayer matchPlayer(@NotNull final String name) { - - // Warn if called on the main thread - if we resort to searching offline players, this may take several seconds. - if (this.getServer().isPrimaryThread()) { - this.getLogger().warning("Call to OpenInv#matchPlayer made on the main thread!"); - this.getLogger().warning("This can cause the server to hang, potentially severely."); - this.getLogger().warning("Trace:"); - for (StackTraceElement element : new Throwable().fillInStackTrace().getStackTrace()) { - this.getLogger().warning(element.toString()); - } - } - - OfflinePlayer player; - - if (this.isSupportedVersion()) { - // Attempt exact offline match first - adds UUID support for later versions - player = this.accessor.getPlayerDataManager().getPlayerByID(name); - - if (player != null) { - return player; - } - } - - // Ensure name is valid if server is in online mode to avoid unnecessary searching - if (this.getServer().getOnlineMode() && !name.matches("[a-zA-Z0-9_]{3,16}")) { - return null; - } - - player = this.getServer().getPlayerExact(name); - - if (player != null) { - return player; - } - - player = this.getServer().getOfflinePlayer(name); - - /* - * Compatibility: Pre-UUID, getOfflinePlayer always returns an OfflinePlayer. Post-UUID, - * getOfflinePlayer will return null if no matching player is found. To preserve - * compatibility, only return the player if they have played before. Ignoring current online - * status is fine, they'd have been found by getPlayerExact otherwise. - */ - if (player != null && player.hasPlayedBefore()) { - return player; - } - - player = this.getServer().getPlayer(name); - - if (player != null) { - return player; - } - - int bestMatch = Integer.MAX_VALUE; - for (OfflinePlayer offline : this.getServer().getOfflinePlayers()) { - if (offline.getName() == null) { - // Loaded by UUID only, name has never been looked up. - continue; - } - - int currentMatch = this.getLevenshteinDistance(name, offline.getName()); - - if (currentMatch == 0) { - return offline; - } - - if (currentMatch < bestMatch) { - bestMatch = currentMatch; - player = offline; - } - } - - // Only null if no players have played ever, otherwise even the worst match will do. - return player; - } - @Override public @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) { return this.accessor.getPlayerDataManager().openInventory(player, inventory); @@ -507,10 +376,10 @@ public class OpenInv extends JavaPlugin implements IOpenInv { // Register listeners pm.registerEvents(new PlayerListener(this), this); pm.registerEvents(new PluginListener(this), this); - pm.registerEvents(new InventoryClickListener(this), this); + pm.registerEvents(new InventoryClickListener(), this); pm.registerEvents(new InventoryCloseListener(this), this); // Bukkit will handle missing events for us, attempt to register InventoryDragEvent without a version check - pm.registerEvents(new InventoryDragListener(this), this); + pm.registerEvents(new InventoryDragListener(), this); // Register commands to their executors OpenInvPluginCommand openInv = new OpenInvPluginCommand(this); @@ -557,7 +426,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public void releasePlayer(@NotNull final Player player, @NotNull final Plugin plugin) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String key = this.getPlayerID(player); if (!this.pluginUsage.containsEntry(key, plugin.getClass())) { return; @@ -568,7 +437,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public void retainPlayer(@NotNull final Player player, @NotNull final Plugin plugin) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String key = this.getPlayerID(player); if (this.pluginUsage.containsEntry(key, plugin.getClass())) { return; @@ -579,7 +448,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public void setPlayerAnyChestStatus(@NotNull final OfflinePlayer offline, final boolean status) { - this.getConfig().set("toggles.any-chest." + this.accessor.getPlayerDataManager().getPlayerDataID(offline), status); + this.getConfig().set("toggles.any-chest." + this.getPlayerID(offline), status); this.saveConfig(); } @@ -591,7 +460,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { */ public void setPlayerOffline(final Player player) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String key = this.getPlayerID(player); // Check if the player is cached. If not, neither of their inventories is open. if (!this.playerCache.containsKey(key)) { @@ -615,7 +484,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { */ public void setPlayerOnline(final Player player) { - String key = this.accessor.getPlayerDataManager().getPlayerDataID(player); + String key = this.getPlayerID(player); // Check if the player is cached. If not, neither of their inventories is open. if (!this.playerCache.containsKey(key)) { @@ -627,7 +496,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv { if (this.inventories.containsKey(key)) { this.inventories.get(key).setPlayerOnline(player); new BukkitRunnable() { - @SuppressWarnings("deprecation") // Unlikely to ever be a viable alternative, Spigot un-deprecated. @Override public void run() { if (player.isOnline()) { @@ -644,7 +512,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public void setPlayerSilentChestStatus(@NotNull final OfflinePlayer offline, final boolean status) { - this.getConfig().set("toggles.silent-chest." + this.accessor.getPlayerDataManager().getPlayerDataID(offline), status); + this.getConfig().set("toggles.silent-chest." + this.getPlayerID(offline), status); this.saveConfig(); } @@ -685,7 +553,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { @Override public void unload(@NotNull final OfflinePlayer offline) { - this.playerCache.invalidate(this.accessor.getPlayerDataManager().getPlayerDataID(offline)); + this.playerCache.invalidate(this.getPlayerID(offline)); } } diff --git a/plugin/src/main/java/com/lishid/openinv/commands/SearchEnchantPluginCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/SearchEnchantPluginCommand.java index ce2f687..989a85f 100644 --- a/plugin/src/main/java/com/lishid/openinv/commands/SearchEnchantPluginCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/commands/SearchEnchantPluginCommand.java @@ -67,7 +67,7 @@ public class SearchEnchantPluginCommand implements CommandExecutor { } StringBuilder players = new StringBuilder(); - for (Player player : plugin.getOnlinePlayers()) { + for (Player player : plugin.getServer().getOnlinePlayers()) { boolean flagInventory = containsEnchantment(player.getInventory(), enchant, level); boolean flagEnder = containsEnchantment(player.getEnderChest(), enchant, level); diff --git a/plugin/src/main/java/com/lishid/openinv/commands/SearchInvPluginCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/SearchInvPluginCommand.java index 98c9912..372b264 100644 --- a/plugin/src/main/java/com/lishid/openinv/commands/SearchInvPluginCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/commands/SearchInvPluginCommand.java @@ -59,7 +59,7 @@ public class SearchInvPluginCommand implements CommandExecutor { } StringBuilder players = new StringBuilder(); - for (Player player : plugin.getOnlinePlayers()) { + for (Player player : plugin.getServer().getOnlinePlayers()) { Inventory inventory = command.getName().equals("searchinv") ? player.getInventory() : player.getEnderChest(); if (inventory.contains(material, count)) { players.append(player.getName()).append(", "); diff --git a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryClickListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryClickListener.java index e806214..29dbe11 100644 --- a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryClickListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryClickListener.java @@ -16,7 +16,7 @@ package com.lishid.openinv.listeners; -import com.lishid.openinv.IOpenInv; +import com.lishid.openinv.util.InventoryAccess; import com.lishid.openinv.util.Permissions; import org.bukkit.entity.HumanEntity; import org.bukkit.event.EventHandler; @@ -27,20 +27,12 @@ import org.bukkit.inventory.Inventory; public class InventoryClickListener implements Listener { - private final IOpenInv plugin; - - public InventoryClickListener(IOpenInv plugin) { - this.plugin = plugin; - } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryClick(InventoryClickEvent event) { HumanEntity entity = event.getWhoClicked(); Inventory inventory = event.getInventory(); - if (plugin.getInventoryAccess().isSpecialPlayerInventory(inventory) - && !Permissions.EDITINV.hasPermission(entity) - || plugin.getInventoryAccess().isSpecialEnderChest(inventory) - && !Permissions.EDITENDER.hasPermission(entity)) { + if (InventoryAccess.isPlayerInventory(inventory) && !Permissions.EDITINV.hasPermission(entity) + || InventoryAccess.isEnderChest(inventory) && !Permissions.EDITENDER.hasPermission(entity)) { event.setCancelled(true); } } diff --git a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java index a6bf404..264c333 100644 --- a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java @@ -22,11 +22,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryCloseEvent; -/** - * - * - * @author Jikoo - */ public class InventoryCloseListener implements Listener { private final IOpenInv plugin; diff --git a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryDragListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryDragListener.java index 603073f..c52df2d 100644 --- a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryDragListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryDragListener.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018 lishid. All rights reserved. + * Copyright (C) 2011-2019 lishid. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ package com.lishid.openinv.listeners; -import com.lishid.openinv.IOpenInv; +import com.lishid.openinv.util.InventoryAccess; import com.lishid.openinv.util.Permissions; import org.bukkit.entity.HumanEntity; import org.bukkit.event.EventHandler; @@ -32,20 +32,12 @@ import org.bukkit.inventory.Inventory; */ public class InventoryDragListener implements Listener { - private final IOpenInv plugin; - - public InventoryDragListener(IOpenInv plugin) { - this.plugin = plugin; - } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryDrag(InventoryDragEvent event) { HumanEntity entity = event.getWhoClicked(); Inventory inventory = event.getInventory(); - if (plugin.getInventoryAccess().isSpecialPlayerInventory(inventory) - && !Permissions.EDITINV.hasPermission(entity) - || plugin.getInventoryAccess().isSpecialEnderChest(inventory) - && !Permissions.EDITENDER.hasPermission(entity)) { + if (InventoryAccess.isPlayerInventory(inventory) && !Permissions.EDITINV.hasPermission(entity) + || InventoryAccess.isEnderChest(inventory) && !Permissions.EDITENDER.hasPermission(entity)) { event.setCancelled(true); } } diff --git a/plugin/src/main/java/com/lishid/openinv/listeners/PlayerListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/PlayerListener.java index acc3e3d..c4a32c7 100644 --- a/plugin/src/main/java/com/lishid/openinv/listeners/PlayerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/PlayerListener.java @@ -61,22 +61,22 @@ public class PlayerListener implements Listener { } Player player = event.getPlayer(); - boolean anychest = Permissions.ANYCHEST.hasPermission(player) && plugin.getPlayerAnyChestStatus(player); - boolean needsAnyChest = plugin.getAnySilentContainer().isAnyContainerNeeded(player, event.getClickedBlock()); + boolean any = Permissions.ANYCHEST.hasPermission(player) && plugin.getPlayerAnyChestStatus(player); + boolean needsAny = plugin.getAnySilentContainer().isAnyContainerNeeded(player, event.getClickedBlock()); - if (!anychest && needsAnyChest) { + if (!any && needsAny) { return; } - boolean silentchest = Permissions.SILENT.hasPermission(player) && plugin.getPlayerSilentChestStatus(player); + boolean silent = Permissions.SILENT.hasPermission(player) && plugin.getPlayerSilentChestStatus(player); - // If anychest or silentchest is active - if ((anychest || silentchest) && plugin.getAnySilentContainer().activateContainer(player, silentchest, event.getClickedBlock())) { - if (silentchest && plugin.notifySilentChest() && needsAnyChest && plugin.notifyAnyChest()) { + // If anycontainer or silentcontainer is active + if ((any || silent) && plugin.getAnySilentContainer().activateContainer(player, silent, event.getClickedBlock())) { + if (silent && plugin.notifySilentChest() && needsAny && plugin.notifyAnyChest()) { player.sendMessage("You are opening a blocked container silently."); - } else if (silentchest && plugin.notifySilentChest()) { + } else if (silent && plugin.notifySilentChest()) { player.sendMessage("You are opening a container silently."); - } else if (needsAnyChest && plugin.notifyAnyChest()) { + } else if (needsAny && plugin.notifyAnyChest()) { player.sendMessage("You are opening a blocked container."); } event.setCancelled(true); diff --git a/plugin/src/main/java/com/lishid/openinv/util/ConfigUpdater.java b/plugin/src/main/java/com/lishid/openinv/util/ConfigUpdater.java index 3658d67..e83d4bb 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/ConfigUpdater.java +++ b/plugin/src/main/java/com/lishid/openinv/util/ConfigUpdater.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; -import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.scheduler.BukkitRunnable; @@ -78,6 +77,7 @@ public class ConfigUpdater { public void run() { plugin.getConfig().set("config-version", 3); plugin.getConfig().set("items.open-inv", null); + plugin.getConfig().set("ItemOpenInv", null); plugin.getConfig().set("toggles.items.open-inv", null); plugin.getConfig().set("settings.disable-saving", plugin.getConfig().getBoolean("DisableSaving", false)); @@ -91,22 +91,18 @@ public class ConfigUpdater { @Override public void run() { // Get the old config settings - int itemOpenInvItemId = plugin.getConfig().getInt("ItemOpenInvItemID", 280); boolean notifySilentChest = plugin.getConfig().getBoolean("NotifySilentChest", true); boolean notifyAnyChest = plugin.getConfig().getBoolean("NotifyAnyChest", true); plugin.getConfig().set("ItemOpenInvItemID", null); plugin.getConfig().set("NotifySilentChest", null); plugin.getConfig().set("NotifyAnyChest", null); plugin.getConfig().set("config-version", 2); - plugin.getConfig().set("items.open-inv", - getMaterialById(itemOpenInvItemId).toString()); plugin.getConfig().set("notify.any-chest", notifyAnyChest); plugin.getConfig().set("notify.silent-chest", notifySilentChest); } }.runTask(plugin); updateToggles("AnyChest", "toggles.any-chest"); - updateToggles("ItemOpenInv", "toggles.items.open-inv"); updateToggles("SilentChest", "toggles.silent-chest"); } @@ -124,7 +120,7 @@ public class ConfigUpdater { return; } - final Map toggles = new HashMap(); + final Map toggles = new HashMap<>(); for (String playerName : keys) { OfflinePlayer player = plugin.matchPlayer(playerName); @@ -154,13 +150,4 @@ public class ConfigUpdater { }.runTask(plugin); } - private Material getMaterialById(int id) { - Material material = Material.getMaterial(id); - - if (material == null) { - material = Material.STICK; - } - - return material; - } } diff --git a/pom.xml b/pom.xml index 102035c..7527719 100644 --- a/pom.xml +++ b/pom.xml @@ -84,14 +84,6 @@ - - - org.jetbrains - annotations - 17.0.0 - - - @@ -121,10 +113,10 @@ maven-compiler-plugin - 3.6.1 + 3.8.1 - 1.6 - 1.6 + 1.8 + 1.8