1
0
mirror of https://e.coding.net/circlecloud/QuickShop.git synced 2024-11-22 01:58:54 +00:00

Accept Merge Request #10 : 修复java.lang.NoSuchMethod的问题

From -> To: (  17jiong : master   ->   502647092 : master  )

Merge Request: 修复java.lang.NoSuchMethod的问题

Created By: @17jiong
Accepted By: @502647092
URL:https://coding.net/u/502647092/p/QuickShop/git/pull/10
This commit is contained in:
502647092 2018-02-03 10:16:27 +08:00
commit 0948887e4b

View File

@ -1,5 +1,6 @@
package org.maxgamer.QuickShop.Util;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.List;
@ -29,6 +30,7 @@ import pw.yumc.YumCore.global.L10N;
@SuppressWarnings("deprecation")
public class Util {
private static HashSet<Material> blacklist = new HashSet<>();
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.##");
private static QuickShop plugin;
@ -36,6 +38,9 @@ public class Util {
private static HashSet<Material> tools = new HashSet<>();
private static HashSet<Material> transparent = new HashSet<>();
private static boolean hasCheckedMethodCompatibility = false;
private static boolean useNewGetContentMethod = false;
public static void addTransparentBlock(final Material m) {
if (!transparent.add(m)) {
System.out.println("已添加透明方块: " + m.toString());
@ -72,6 +77,34 @@ public class Util {
* @return The number of items that match in this inventory.
*/
public static int countItems(final Inventory inv, final ItemStack item) {
if (!hasCheckedMethodCompatibility) {
if (hasGetStorageContentsMethod()) {
useNewGetContentMethod = true;
hasCheckedMethodCompatibility = true;
return newCountItems(inv, item);
} else {
useNewGetContentMethod = false;
hasCheckedMethodCompatibility = true;
return oldCountItems(inv, item);
}
}
return useNewGetContentMethod ? newCountItems(inv, item) : oldCountItems(inv, item);
}
public static int oldCountItems(final Inventory inv, final ItemStack item) {
int items = 0;
for (final ItemStack iStack : inv.getContents()) {
if (iStack == null) {
continue;
}
if (Util.matches(item, iStack)) {
items += iStack.getAmount();
}
}
return items;
}
public static int newCountItems(final Inventory inv, final ItemStack item) {
int items = 0;
for (final ItemStack iStack : inv.getStorageContents()) {
if (iStack == null) {
@ -95,6 +128,21 @@ public class Util {
* @return The number of items that can be given to the inventory safely.
*/
public static int countSpace(final Inventory inv, final ItemStack item) {
if (!hasCheckedMethodCompatibility) {
if (hasGetStorageContentsMethod()) {
useNewGetContentMethod = true;
hasCheckedMethodCompatibility = true;
return newCountSpace(inv, item);
} else {
useNewGetContentMethod = false;
hasCheckedMethodCompatibility = true;
return oldCountSpace(inv, item);
}
}
return useNewGetContentMethod ? newCountSpace(inv, item) : oldCountSpace(inv, item);
}
public static int newCountSpace(final Inventory inv, final ItemStack item) {
int space = 0;
for (final ItemStack iStack : inv.getStorageContents()) {
if (iStack == null || iStack.getType() == Material.AIR) {
@ -106,6 +154,18 @@ public class Util {
return space;
}
public static int oldCountSpace(final Inventory inv, final ItemStack item) {
int space = 0;
for (final ItemStack iStack : inv.getContents()) {
if (iStack == null || iStack.getType() == Material.AIR) {
space += item.getMaxStackSize();
} else if (matches(item, iStack)) {
space += item.getMaxStackSize() - iStack.getAmount();
}
}
return space;
}
public static ItemStack deserialize(final String config) throws InvalidConfigurationException {
final YamlConfiguration cfg = new YamlConfiguration();
cfg.loadFromString(config);
@ -594,4 +654,20 @@ public class Util {
cfg.set("item", iStack);
return cfg.saveToString();
}
public static boolean hasGetStorageContentsMethod() {
try {
Class<?> inventory = Class.forName("org.bukkit.inventory.Inventory");
if (inventory != null) {
for (Method method : inventory.getDeclaredMethods()) {
if (method != null && method.getName().equals("getStorageContents")) {
return true;
}
}
}
return false;
} catch (Exception e) {
return false;
}
}
}