Update to Java 8 and Minecraft 1.8.8
This commit is contained in:
13
api/pom.xml
13
api/pom.xml
@@ -29,11 +29,14 @@
|
|||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bukkit</groupId>
|
<groupId>org.jetbrains</groupId>
|
||||||
<artifactId>bukkit</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<version>1.4.5-R1.0</version>
|
<version>17.0.0</version>
|
||||||
<scope>system</scope>
|
</dependency>
|
||||||
<systemPath>${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar</systemPath>
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>1.8.8-R0.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@@ -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
|
* 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
|
* 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.ISpecialEnderChest;
|
||||||
import com.lishid.openinv.internal.ISpecialInventory;
|
import com.lishid.openinv.internal.ISpecialInventory;
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
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.OfflinePlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.InventoryView;
|
import org.bukkit.inventory.InventoryView;
|
||||||
@@ -59,7 +64,10 @@ public interface IOpenInv {
|
|||||||
* @return the IInventoryAccess
|
* @return the IInventoryAccess
|
||||||
* @throws IllegalStateException if the server version is unsupported
|
* @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.
|
* Gets the provided player's AnyChest setting.
|
||||||
@@ -78,7 +86,9 @@ public interface IOpenInv {
|
|||||||
* @return the identifier
|
* @return the identifier
|
||||||
* @throws IllegalStateException if the server version is unsupported
|
* @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.
|
* Gets a player's SilentChest setting.
|
||||||
@@ -137,7 +147,76 @@ public interface IOpenInv {
|
|||||||
* @param name the name of the Player
|
* @param name the name of the Player
|
||||||
* @return the OfflinePlayer with the closest matching name or null if no players have ever logged in
|
* @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.
|
* Open an ISpecialInventory for a Player.
|
||||||
@@ -225,4 +304,6 @@ public interface IOpenInv {
|
|||||||
*/
|
*/
|
||||||
void unload(@NotNull OfflinePlayer offline);
|
void unload(@NotNull OfflinePlayer offline);
|
||||||
|
|
||||||
|
Logger getLogger();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@ import org.bukkit.inventory.Inventory;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public interface IInventoryAccess {
|
public interface IInventoryAccess {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -29,6 +30,7 @@ public interface IInventoryAccess {
|
|||||||
* @param inventory the Inventory
|
* @param inventory the Inventory
|
||||||
* @return the ISpecialEnderChest or null
|
* @return the ISpecialEnderChest or null
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Nullable ISpecialEnderChest getSpecialEnderChest(@NotNull Inventory inventory);
|
@Nullable ISpecialEnderChest getSpecialEnderChest(@NotNull Inventory inventory);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,6 +40,7 @@ public interface IInventoryAccess {
|
|||||||
* @param inventory the Inventory
|
* @param inventory the Inventory
|
||||||
* @return the ISpecialPlayerInventory or null
|
* @return the ISpecialPlayerInventory or null
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
@Nullable ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull Inventory inventory);
|
@Nullable ISpecialPlayerInventory getSpecialPlayerInventory(@NotNull Inventory inventory);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -46,6 +49,7 @@ public interface IInventoryAccess {
|
|||||||
* @param inventory the Inventory
|
* @param inventory the Inventory
|
||||||
* @return true if the Inventory is backed by an ISpecialEnderChest
|
* @return true if the Inventory is backed by an ISpecialEnderChest
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
boolean isSpecialEnderChest(@NotNull Inventory inventory);
|
boolean isSpecialEnderChest(@NotNull Inventory inventory);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,6 +58,7 @@ public interface IInventoryAccess {
|
|||||||
* @param inventory the Inventory
|
* @param inventory the Inventory
|
||||||
* @return true if the Inventory is backed by an ISpecialPlayerInventory
|
* @return true if the Inventory is backed by an ISpecialPlayerInventory
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
boolean isSpecialPlayerInventory(@NotNull Inventory inventory);
|
boolean isSpecialPlayerInventory(@NotNull Inventory inventory);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
145
api/src/main/java/com/lishid/openinv/util/InventoryAccess.java
Normal file
145
api/src/main/java/com/lishid/openinv/util/InventoryAccess.java
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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> T grabFieldOfTypeFromObject(final Class<T> 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);
|
||||||
|
}
|
||||||
|
}
|
165
api/src/main/java/com/lishid/openinv/util/StringMetric.java
Normal file
165
api/src/main/java/com/lishid/openinv/util/StringMetric.java
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
* *
|
||||||
|
* 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(){}
|
||||||
|
|
||||||
|
}
|
@@ -28,13 +28,6 @@
|
|||||||
<name>OpenInvCommon</name>
|
<name>OpenInvCommon</name>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>bukkit</artifactId>
|
|
||||||
<version>1.4.5-R1.0</version>
|
|
||||||
<scope>system</scope>
|
|
||||||
<systemPath>${project.basedir}/../lib/bukkit-1.4.5-R1.0.jar</systemPath>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lishid</groupId>
|
<groupId>com.lishid</groupId>
|
||||||
<artifactId>openinvapi</artifactId>
|
<artifactId>openinvapi</artifactId>
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package com.lishid.openinv.internal;
|
package com.lishid.openinv.internal;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.InventoryView;
|
import org.bukkit.inventory.InventoryView;
|
||||||
@@ -35,29 +34,6 @@ public interface IPlayerDataManager {
|
|||||||
*/
|
*/
|
||||||
@Nullable Player loadPlayer(@NotNull OfflinePlayer offline);
|
@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<? extends Player> getOnlinePlayers();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens an ISpecialInventory for a Player.
|
* Opens an ISpecialInventory for a Player.
|
||||||
*
|
*
|
||||||
|
@@ -17,41 +17,20 @@
|
|||||||
package com.lishid.openinv.util;
|
package com.lishid.openinv.util;
|
||||||
|
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
import com.lishid.openinv.internal.IAnySilentContainer;
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
import com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
public class InternalAccessor {
|
public class InternalAccessor {
|
||||||
|
|
||||||
public static <T> T grabFieldOfTypeFromObject(final Class<T> 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 Plugin plugin;
|
||||||
private final String version;
|
private final String version;
|
||||||
private boolean supported = false;
|
private boolean supported = false;
|
||||||
private IPlayerDataManager playerDataManager;
|
private IPlayerDataManager playerDataManager;
|
||||||
private IInventoryAccess inventoryAccess;
|
|
||||||
|
|
||||||
private IAnySilentContainer anySilentContainer;
|
private IAnySilentContainer anySilentContainer;
|
||||||
|
|
||||||
public InternalAccessor(final Plugin plugin) {
|
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 + ".SpecialPlayerInventory");
|
||||||
Class.forName("com.lishid.openinv.internal." + this.version + ".SpecialEnderChest");
|
Class.forName("com.lishid.openinv.internal." + this.version + ".SpecialEnderChest");
|
||||||
this.playerDataManager = this.createObject(IPlayerDataManager.class, "PlayerDataManager");
|
this.playerDataManager = this.createObject(IPlayerDataManager.class, "PlayerDataManager");
|
||||||
this.inventoryAccess = this.createObject(IInventoryAccess.class, "InventoryAccess");
|
|
||||||
this.anySilentContainer = this.createObject(IAnySilentContainer.class, "AnySilentContainer");
|
this.anySilentContainer = this.createObject(IAnySilentContainer.class, "AnySilentContainer");
|
||||||
this.supported = true;
|
this.supported = InventoryAccess.isUseable();
|
||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,19 +106,6 @@ public class InternalAccessor {
|
|||||||
return this.anySilentContainer;
|
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.
|
* Creates an instance of the IPlayerDataManager implementation for the current server version.
|
||||||
*
|
*
|
||||||
|
@@ -41,17 +41,4 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.6.1</version>
|
|
||||||
<configuration>
|
|
||||||
<source>1.8</source>
|
|
||||||
<target>1.8</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_13_R2;
|
|||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.internal.ISpecialInventory;
|
import com.lishid.openinv.internal.ISpecialInventory;
|
||||||
import com.mojang.authlib.GameProfile;
|
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.DimensionManager;
|
||||||
import net.minecraft.server.v1_13_R2.EntityPlayer;
|
import net.minecraft.server.v1_13_R2.EntityPlayer;
|
||||||
import net.minecraft.server.v1_13_R2.MinecraftServer;
|
import net.minecraft.server.v1_13_R2.MinecraftServer;
|
||||||
@@ -56,32 +54,6 @@ public class PlayerDataManager implements IPlayerDataManager {
|
|||||||
return nmsPlayer;
|
return nmsPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Collection<? extends Player> 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
|
@Override
|
||||||
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
||||||
// Ensure player has data
|
// Ensure player has data
|
||||||
|
@@ -42,18 +42,4 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.6.1</version>
|
|
||||||
<configuration>
|
|
||||||
<source>1.8</source>
|
|
||||||
<target>1.8</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
@@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_14_R1;
|
|||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.internal.ISpecialInventory;
|
import com.lishid.openinv.internal.ISpecialInventory;
|
||||||
import com.mojang.authlib.GameProfile;
|
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.ChatComponentText;
|
||||||
import net.minecraft.server.v1_14_R1.Container;
|
import net.minecraft.server.v1_14_R1.Container;
|
||||||
import net.minecraft.server.v1_14_R1.Containers;
|
import net.minecraft.server.v1_14_R1.Containers;
|
||||||
@@ -67,32 +65,6 @@ public class PlayerDataManager implements IPlayerDataManager {
|
|||||||
return nmsPlayer;
|
return nmsPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull Collection<? extends Player> 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
|
@Override
|
||||||
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
||||||
// Ensure player has data
|
// Ensure player has data
|
||||||
|
@@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -19,8 +19,6 @@ package com.lishid.openinv.internal.v1_8_R3;
|
|||||||
import com.lishid.openinv.internal.IPlayerDataManager;
|
import com.lishid.openinv.internal.IPlayerDataManager;
|
||||||
import com.lishid.openinv.internal.ISpecialInventory;
|
import com.lishid.openinv.internal.ISpecialInventory;
|
||||||
import com.mojang.authlib.GameProfile;
|
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.EntityPlayer;
|
||||||
import net.minecraft.server.v1_8_R3.MinecraftServer;
|
import net.minecraft.server.v1_8_R3.MinecraftServer;
|
||||||
import net.minecraft.server.v1_8_R3.PlayerInteractManager;
|
import net.minecraft.server.v1_8_R3.PlayerInteractManager;
|
||||||
@@ -58,32 +56,6 @@ public class PlayerDataManager implements IPlayerDataManager {
|
|||||||
return target;
|
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<? extends Player> getOnlinePlayers() {
|
|
||||||
return Bukkit.getOnlinePlayers();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static EntityPlayer getHandle(Player player) {
|
public static EntityPlayer getHandle(Player player) {
|
||||||
if (player instanceof CraftPlayer) {
|
if (player instanceof CraftPlayer) {
|
||||||
return ((CraftPlayer) player).getHandle();
|
return ((CraftPlayer) player).getHandle();
|
||||||
|
@@ -28,11 +28,6 @@
|
|||||||
<name>OpenInvPlugin</name>
|
<name>OpenInvPlugin</name>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
|
||||||
<groupId>org.bukkit</groupId>
|
|
||||||
<artifactId>bukkit</artifactId>
|
|
||||||
<version>1.8.8-R0.1-SNAPSHOT</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lishid</groupId>
|
<groupId>com.lishid</groupId>
|
||||||
<artifactId>openinvcommon</artifactId>
|
<artifactId>openinvcommon</artifactId>
|
||||||
|
@@ -24,7 +24,6 @@ import com.lishid.openinv.commands.SearchEnchantPluginCommand;
|
|||||||
import com.lishid.openinv.commands.SearchInvPluginCommand;
|
import com.lishid.openinv.commands.SearchInvPluginCommand;
|
||||||
import com.lishid.openinv.commands.SilentChestPluginCommand;
|
import com.lishid.openinv.commands.SilentChestPluginCommand;
|
||||||
import com.lishid.openinv.internal.IAnySilentContainer;
|
import com.lishid.openinv.internal.IAnySilentContainer;
|
||||||
import com.lishid.openinv.internal.IInventoryAccess;
|
|
||||||
import com.lishid.openinv.internal.ISpecialEnderChest;
|
import com.lishid.openinv.internal.ISpecialEnderChest;
|
||||||
import com.lishid.openinv.internal.ISpecialInventory;
|
import com.lishid.openinv.internal.ISpecialInventory;
|
||||||
import com.lishid.openinv.internal.ISpecialPlayerInventory;
|
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.Function;
|
||||||
import com.lishid.openinv.util.InternalAccessor;
|
import com.lishid.openinv.util.InternalAccessor;
|
||||||
import com.lishid.openinv.util.Permissions;
|
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.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -72,50 +66,52 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
*/
|
*/
|
||||||
public class OpenInv extends JavaPlugin implements IOpenInv {
|
public class OpenInv extends JavaPlugin implements IOpenInv {
|
||||||
|
|
||||||
private final Map<String, ISpecialPlayerInventory> inventories = new HashMap<String, ISpecialPlayerInventory>();
|
private final Map<String, ISpecialPlayerInventory> inventories = new HashMap<>();
|
||||||
private final Map<String, ISpecialEnderChest> enderChests = new HashMap<String, ISpecialEnderChest>();
|
private final Map<String, ISpecialEnderChest> enderChests = new HashMap<>();
|
||||||
private final Multimap<String, Class<? extends Plugin>> pluginUsage = HashMultimap.create();
|
private final Multimap<String, Class<? extends Plugin>> pluginUsage = HashMultimap.create();
|
||||||
|
|
||||||
private final Cache<String, Player> playerCache = new Cache<String, Player>(300000L,
|
private final Cache<String, Player> playerCache = new Cache<>(300000L,
|
||||||
new Function<Player>() {
|
new Function<Player>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean run(final Player value) {
|
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)
|
return OpenInv.this.inventories.containsKey(key)
|
||||||
&& OpenInv.this.inventories.get(key).isInUse()
|
&& OpenInv.this.inventories.get(key).isInUse()
|
||||||
|| OpenInv.this.enderChests.containsKey(key)
|
|| OpenInv.this.enderChests.containsKey(key)
|
||||||
&& OpenInv.this.enderChests.get(key).isInUse()
|
&& OpenInv.this.enderChests.get(key).isInUse()
|
||||||
|| OpenInv.this.pluginUsage.containsKey(key);
|
|| OpenInv.this.pluginUsage.containsKey(key);
|
||||||
}
|
}
|
||||||
}, new Function<Player>() {
|
}, new Function<Player>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean run(final Player value) {
|
public boolean run(final Player value) {
|
||||||
String key = OpenInv.this.accessor.getPlayerDataManager().getPlayerDataID(value);
|
|
||||||
|
|
||||||
// Check if inventory is stored, and if it is, remove it and eject all viewers
|
String key = OpenInv.this.getPlayerID(value);
|
||||||
if (OpenInv.this.inventories.containsKey(key)) {
|
|
||||||
Inventory inv = OpenInv.this.inventories.remove(key).getBukkitInventory();
|
|
||||||
List<HumanEntity> 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
|
// Check if inventory is stored, and if it is, remove it and eject all viewers
|
||||||
if (OpenInv.this.enderChests.containsKey(key)) {
|
if (OpenInv.this.inventories.containsKey(key)) {
|
||||||
Inventory inv = OpenInv.this.enderChests.remove(key).getBukkitInventory();
|
Inventory inv = OpenInv.this.inventories.remove(key).getBukkitInventory();
|
||||||
List<HumanEntity> viewers = inv.getViewers();
|
List<HumanEntity> viewers = inv.getViewers();
|
||||||
for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) {
|
for (HumanEntity entity : viewers.toArray(new HumanEntity[0])) {
|
||||||
entity.closeInventory();
|
entity.closeInventory();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!OpenInv.this.disableSaving() && !value.isOnline()) {
|
|
||||||
value.saveData();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
// 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<HumanEntity> 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;
|
private InternalAccessor accessor;
|
||||||
|
|
||||||
@@ -126,7 +122,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
*/
|
*/
|
||||||
public void changeWorld(final Player player) {
|
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.
|
// Check if the player is cached. If not, neither of their inventories is open.
|
||||||
if (!this.playerCache.containsKey(key)) {
|
if (!this.playerCache.containsKey(key)) {
|
||||||
@@ -171,12 +167,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
return this.accessor.getAnySilentContainer();
|
return this.accessor.getAnySilentContainer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public IInventoryAccess getInventoryAccess() {
|
|
||||||
return this.accessor.getInventoryAccess();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getLevenshteinDistance(final String string1, final String string2) {
|
private int getLevenshteinDistance(final String string1, final String string2) {
|
||||||
if (string1 == null || string2 == null) {
|
if (string1 == null || string2 == null) {
|
||||||
throw new IllegalArgumentException("Strings must not be null");
|
throw new IllegalArgumentException("Strings must not be null");
|
||||||
@@ -221,36 +211,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
return prevDistances[len1];
|
return prevDistances[len1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Collection<? extends Player> 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<Player>) onlinePlayers;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Arrays.asList((Player[]) onlinePlayers);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getPlayerAnyChestStatus(@NotNull final OfflinePlayer player) {
|
public boolean getPlayerAnyChestStatus(@NotNull final OfflinePlayer player) {
|
||||||
boolean defaultState = false;
|
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);
|
return this.getConfig().getBoolean("toggles.any-chest." + this.getPlayerID(player), defaultState);
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getPlayerID(@NotNull final OfflinePlayer offline) {
|
|
||||||
return this.accessor.getPlayerDataManager().getPlayerDataID(offline);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public ISpecialEnderChest getSpecialEnderChest(@NotNull final Player player, final boolean online)
|
public ISpecialEnderChest getSpecialEnderChest(@NotNull final Player player, final boolean online)
|
||||||
throws InstantiationException {
|
throws InstantiationException {
|
||||||
String id = this.accessor.getPlayerDataManager().getPlayerDataID(player);
|
String id = this.getPlayerID(player);
|
||||||
if (this.enderChests.containsKey(id)) {
|
if (this.enderChests.containsKey(id)) {
|
||||||
return this.enderChests.get(id);
|
return this.enderChests.get(id);
|
||||||
}
|
}
|
||||||
@@ -303,7 +257,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
@Override
|
@Override
|
||||||
public ISpecialPlayerInventory getSpecialInventory(@NotNull final Player player, final boolean online)
|
public ISpecialPlayerInventory getSpecialInventory(@NotNull final Player player, final boolean online)
|
||||||
throws InstantiationException {
|
throws InstantiationException {
|
||||||
String id = this.accessor.getPlayerDataManager().getPlayerDataID(player);
|
String id = this.getPlayerID(player);
|
||||||
if (this.inventories.containsKey(id)) {
|
if (this.inventories.containsKey(id)) {
|
||||||
return this.inventories.get(id);
|
return this.inventories.get(id);
|
||||||
}
|
}
|
||||||
@@ -322,7 +276,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
@Override
|
@Override
|
||||||
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
public Player loadPlayer(@NotNull final OfflinePlayer offline) {
|
||||||
|
|
||||||
String key = this.accessor.getPlayerDataManager().getPlayerDataID(offline);
|
String key = this.getPlayerID(offline);
|
||||||
if (this.playerCache.containsKey(key)) {
|
if (this.playerCache.containsKey(key)) {
|
||||||
return this.playerCache.get(key);
|
return this.playerCache.get(key);
|
||||||
}
|
}
|
||||||
@@ -345,12 +299,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<Player> future = Bukkit.getScheduler().callSyncMethod(this,
|
Future<Player> future = Bukkit.getScheduler().callSyncMethod(this,
|
||||||
new Callable<Player>() {
|
() -> OpenInv.this.accessor.getPlayerDataManager().loadPlayer(offline));
|
||||||
@Override
|
|
||||||
public Player call() {
|
|
||||||
return OpenInv.this.accessor.getPlayerDataManager().loadPlayer(offline);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
int ticks = 0;
|
int ticks = 0;
|
||||||
while (!future.isDone() && !future.isCancelled() && ticks < 10) {
|
while (!future.isDone() && !future.isCancelled() && ticks < 10) {
|
||||||
@@ -369,10 +318,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
loaded = future.get();
|
loaded = future.get();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException | ExecutionException e) {
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -384,83 +330,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
return loaded;
|
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
|
@Override
|
||||||
public @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) {
|
public @Nullable InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) {
|
||||||
return this.accessor.getPlayerDataManager().openInventory(player, inventory);
|
return this.accessor.getPlayerDataManager().openInventory(player, inventory);
|
||||||
@@ -507,10 +376,10 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
// Register listeners
|
// Register listeners
|
||||||
pm.registerEvents(new PlayerListener(this), this);
|
pm.registerEvents(new PlayerListener(this), this);
|
||||||
pm.registerEvents(new PluginListener(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);
|
pm.registerEvents(new InventoryCloseListener(this), this);
|
||||||
// Bukkit will handle missing events for us, attempt to register InventoryDragEvent without a version check
|
// 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
|
// Register commands to their executors
|
||||||
OpenInvPluginCommand openInv = new OpenInvPluginCommand(this);
|
OpenInvPluginCommand openInv = new OpenInvPluginCommand(this);
|
||||||
@@ -557,7 +426,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void releasePlayer(@NotNull final Player player, @NotNull final Plugin plugin) {
|
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())) {
|
if (!this.pluginUsage.containsEntry(key, plugin.getClass())) {
|
||||||
return;
|
return;
|
||||||
@@ -568,7 +437,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void retainPlayer(@NotNull final Player player, @NotNull final Plugin plugin) {
|
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())) {
|
if (this.pluginUsage.containsEntry(key, plugin.getClass())) {
|
||||||
return;
|
return;
|
||||||
@@ -579,7 +448,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerAnyChestStatus(@NotNull final OfflinePlayer offline, final boolean status) {
|
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();
|
this.saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -591,7 +460,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
*/
|
*/
|
||||||
public void setPlayerOffline(final Player player) {
|
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.
|
// Check if the player is cached. If not, neither of their inventories is open.
|
||||||
if (!this.playerCache.containsKey(key)) {
|
if (!this.playerCache.containsKey(key)) {
|
||||||
@@ -615,7 +484,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
*/
|
*/
|
||||||
public void setPlayerOnline(final Player player) {
|
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.
|
// Check if the player is cached. If not, neither of their inventories is open.
|
||||||
if (!this.playerCache.containsKey(key)) {
|
if (!this.playerCache.containsKey(key)) {
|
||||||
@@ -627,7 +496,6 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
if (this.inventories.containsKey(key)) {
|
if (this.inventories.containsKey(key)) {
|
||||||
this.inventories.get(key).setPlayerOnline(player);
|
this.inventories.get(key).setPlayerOnline(player);
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@SuppressWarnings("deprecation") // Unlikely to ever be a viable alternative, Spigot un-deprecated.
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (player.isOnline()) {
|
if (player.isOnline()) {
|
||||||
@@ -644,7 +512,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerSilentChestStatus(@NotNull final OfflinePlayer offline, final boolean status) {
|
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();
|
this.saveConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -685,7 +553,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unload(@NotNull final OfflinePlayer offline) {
|
public void unload(@NotNull final OfflinePlayer offline) {
|
||||||
this.playerCache.invalidate(this.accessor.getPlayerDataManager().getPlayerDataID(offline));
|
this.playerCache.invalidate(this.getPlayerID(offline));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -67,7 +67,7 @@ public class SearchEnchantPluginCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder players = new StringBuilder();
|
StringBuilder players = new StringBuilder();
|
||||||
for (Player player : plugin.getOnlinePlayers()) {
|
for (Player player : plugin.getServer().getOnlinePlayers()) {
|
||||||
boolean flagInventory = containsEnchantment(player.getInventory(), enchant, level);
|
boolean flagInventory = containsEnchantment(player.getInventory(), enchant, level);
|
||||||
boolean flagEnder = containsEnchantment(player.getEnderChest(), enchant, level);
|
boolean flagEnder = containsEnchantment(player.getEnderChest(), enchant, level);
|
||||||
|
|
||||||
|
@@ -59,7 +59,7 @@ public class SearchInvPluginCommand implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder players = new StringBuilder();
|
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();
|
Inventory inventory = command.getName().equals("searchinv") ? player.getInventory() : player.getEnderChest();
|
||||||
if (inventory.contains(material, count)) {
|
if (inventory.contains(material, count)) {
|
||||||
players.append(player.getName()).append(", ");
|
players.append(player.getName()).append(", ");
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package com.lishid.openinv.listeners;
|
package com.lishid.openinv.listeners;
|
||||||
|
|
||||||
import com.lishid.openinv.IOpenInv;
|
import com.lishid.openinv.util.InventoryAccess;
|
||||||
import com.lishid.openinv.util.Permissions;
|
import com.lishid.openinv.util.Permissions;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@@ -27,20 +27,12 @@ import org.bukkit.inventory.Inventory;
|
|||||||
|
|
||||||
public class InventoryClickListener implements Listener {
|
public class InventoryClickListener implements Listener {
|
||||||
|
|
||||||
private final IOpenInv plugin;
|
|
||||||
|
|
||||||
public InventoryClickListener(IOpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||||
public void onInventoryClick(InventoryClickEvent event) {
|
public void onInventoryClick(InventoryClickEvent event) {
|
||||||
HumanEntity entity = event.getWhoClicked();
|
HumanEntity entity = event.getWhoClicked();
|
||||||
Inventory inventory = event.getInventory();
|
Inventory inventory = event.getInventory();
|
||||||
if (plugin.getInventoryAccess().isSpecialPlayerInventory(inventory)
|
if (InventoryAccess.isPlayerInventory(inventory) && !Permissions.EDITINV.hasPermission(entity)
|
||||||
&& !Permissions.EDITINV.hasPermission(entity)
|
|| InventoryAccess.isEnderChest(inventory) && !Permissions.EDITENDER.hasPermission(entity)) {
|
||||||
|| plugin.getInventoryAccess().isSpecialEnderChest(inventory)
|
|
||||||
&& !Permissions.EDITENDER.hasPermission(entity)) {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,11 +22,6 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @author Jikoo
|
|
||||||
*/
|
|
||||||
public class InventoryCloseListener implements Listener {
|
public class InventoryCloseListener implements Listener {
|
||||||
|
|
||||||
private final IOpenInv plugin;
|
private final IOpenInv plugin;
|
||||||
|
@@ -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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package com.lishid.openinv.listeners;
|
package com.lishid.openinv.listeners;
|
||||||
|
|
||||||
import com.lishid.openinv.IOpenInv;
|
import com.lishid.openinv.util.InventoryAccess;
|
||||||
import com.lishid.openinv.util.Permissions;
|
import com.lishid.openinv.util.Permissions;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@@ -32,20 +32,12 @@ import org.bukkit.inventory.Inventory;
|
|||||||
*/
|
*/
|
||||||
public class InventoryDragListener implements Listener {
|
public class InventoryDragListener implements Listener {
|
||||||
|
|
||||||
private final IOpenInv plugin;
|
|
||||||
|
|
||||||
public InventoryDragListener(IOpenInv plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||||
public void onInventoryDrag(InventoryDragEvent event) {
|
public void onInventoryDrag(InventoryDragEvent event) {
|
||||||
HumanEntity entity = event.getWhoClicked();
|
HumanEntity entity = event.getWhoClicked();
|
||||||
Inventory inventory = event.getInventory();
|
Inventory inventory = event.getInventory();
|
||||||
if (plugin.getInventoryAccess().isSpecialPlayerInventory(inventory)
|
if (InventoryAccess.isPlayerInventory(inventory) && !Permissions.EDITINV.hasPermission(entity)
|
||||||
&& !Permissions.EDITINV.hasPermission(entity)
|
|| InventoryAccess.isEnderChest(inventory) && !Permissions.EDITENDER.hasPermission(entity)) {
|
||||||
|| plugin.getInventoryAccess().isSpecialEnderChest(inventory)
|
|
||||||
&& !Permissions.EDITENDER.hasPermission(entity)) {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -61,22 +61,22 @@ public class PlayerListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
boolean anychest = Permissions.ANYCHEST.hasPermission(player) && plugin.getPlayerAnyChestStatus(player);
|
boolean any = Permissions.ANYCHEST.hasPermission(player) && plugin.getPlayerAnyChestStatus(player);
|
||||||
boolean needsAnyChest = plugin.getAnySilentContainer().isAnyContainerNeeded(player, event.getClickedBlock());
|
boolean needsAny = plugin.getAnySilentContainer().isAnyContainerNeeded(player, event.getClickedBlock());
|
||||||
|
|
||||||
if (!anychest && needsAnyChest) {
|
if (!any && needsAny) {
|
||||||
return;
|
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 anycontainer or silentcontainer is active
|
||||||
if ((anychest || silentchest) && plugin.getAnySilentContainer().activateContainer(player, silentchest, event.getClickedBlock())) {
|
if ((any || silent) && plugin.getAnySilentContainer().activateContainer(player, silent, event.getClickedBlock())) {
|
||||||
if (silentchest && plugin.notifySilentChest() && needsAnyChest && plugin.notifyAnyChest()) {
|
if (silent && plugin.notifySilentChest() && needsAny && plugin.notifyAnyChest()) {
|
||||||
player.sendMessage("You are opening a blocked container silently.");
|
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.");
|
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.");
|
player.sendMessage("You are opening a blocked container.");
|
||||||
}
|
}
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
@@ -22,7 +22,6 @@ import java.io.IOException;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
@@ -78,6 +77,7 @@ public class ConfigUpdater {
|
|||||||
public void run() {
|
public void run() {
|
||||||
plugin.getConfig().set("config-version", 3);
|
plugin.getConfig().set("config-version", 3);
|
||||||
plugin.getConfig().set("items.open-inv", null);
|
plugin.getConfig().set("items.open-inv", null);
|
||||||
|
plugin.getConfig().set("ItemOpenInv", null);
|
||||||
plugin.getConfig().set("toggles.items.open-inv", null);
|
plugin.getConfig().set("toggles.items.open-inv", null);
|
||||||
plugin.getConfig().set("settings.disable-saving",
|
plugin.getConfig().set("settings.disable-saving",
|
||||||
plugin.getConfig().getBoolean("DisableSaving", false));
|
plugin.getConfig().getBoolean("DisableSaving", false));
|
||||||
@@ -91,22 +91,18 @@ public class ConfigUpdater {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
// Get the old config settings
|
// Get the old config settings
|
||||||
int itemOpenInvItemId = plugin.getConfig().getInt("ItemOpenInvItemID", 280);
|
|
||||||
boolean notifySilentChest = plugin.getConfig().getBoolean("NotifySilentChest", true);
|
boolean notifySilentChest = plugin.getConfig().getBoolean("NotifySilentChest", true);
|
||||||
boolean notifyAnyChest = plugin.getConfig().getBoolean("NotifyAnyChest", true);
|
boolean notifyAnyChest = plugin.getConfig().getBoolean("NotifyAnyChest", true);
|
||||||
plugin.getConfig().set("ItemOpenInvItemID", null);
|
plugin.getConfig().set("ItemOpenInvItemID", null);
|
||||||
plugin.getConfig().set("NotifySilentChest", null);
|
plugin.getConfig().set("NotifySilentChest", null);
|
||||||
plugin.getConfig().set("NotifyAnyChest", null);
|
plugin.getConfig().set("NotifyAnyChest", null);
|
||||||
plugin.getConfig().set("config-version", 2);
|
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.any-chest", notifyAnyChest);
|
||||||
plugin.getConfig().set("notify.silent-chest", notifySilentChest);
|
plugin.getConfig().set("notify.silent-chest", notifySilentChest);
|
||||||
}
|
}
|
||||||
}.runTask(plugin);
|
}.runTask(plugin);
|
||||||
|
|
||||||
updateToggles("AnyChest", "toggles.any-chest");
|
updateToggles("AnyChest", "toggles.any-chest");
|
||||||
updateToggles("ItemOpenInv", "toggles.items.open-inv");
|
|
||||||
updateToggles("SilentChest", "toggles.silent-chest");
|
updateToggles("SilentChest", "toggles.silent-chest");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +120,7 @@ public class ConfigUpdater {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Map<String, Boolean> toggles = new HashMap<String, Boolean>();
|
final Map<String, Boolean> toggles = new HashMap<>();
|
||||||
|
|
||||||
for (String playerName : keys) {
|
for (String playerName : keys) {
|
||||||
OfflinePlayer player = plugin.matchPlayer(playerName);
|
OfflinePlayer player = plugin.matchPlayer(playerName);
|
||||||
@@ -154,13 +150,4 @@ public class ConfigUpdater {
|
|||||||
}.runTask(plugin);
|
}.runTask(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Material getMaterialById(int id) {
|
|
||||||
Material material = Material.getMaterial(id);
|
|
||||||
|
|
||||||
if (material == null) {
|
|
||||||
material = Material.STICK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return material;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
14
pom.xml
14
pom.xml
@@ -84,14 +84,6 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jetbrains</groupId>
|
|
||||||
<artifactId>annotations</artifactId>
|
|
||||||
<version>17.0.0</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
@@ -121,10 +113,10 @@
|
|||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.6.1</version>
|
<version>3.8.1</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<source>1.6</source>
|
<source>1.8</source>
|
||||||
<target>1.6</target>
|
<target>1.8</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
Reference in New Issue
Block a user