mirror of
https://github.com/EssentialsX/Essentials.git
synced 2025-02-21 23:01:28 +01:00
Add support for material tags in enchant signs (#3694)
Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> Closes #3653.
This commit is contained in:
parent
74131f816c
commit
cb168b0c8a
@ -49,6 +49,7 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider;
|
||||
import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider;
|
||||
import net.ess3.provider.ContainerProvider;
|
||||
import net.ess3.provider.KnownCommandsProvider;
|
||||
import net.ess3.provider.MaterialTagProvider;
|
||||
import net.ess3.provider.PotionMetaProvider;
|
||||
import net.ess3.provider.ProviderListener;
|
||||
import net.ess3.provider.ServerStateProvider;
|
||||
@ -57,12 +58,14 @@ import net.ess3.provider.SpawnerBlockProvider;
|
||||
import net.ess3.provider.SpawnerItemProvider;
|
||||
import net.ess3.provider.providers.BasePotionDataProvider;
|
||||
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
|
||||
import net.ess3.provider.providers.BukkitMaterialTagProvider;
|
||||
import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
|
||||
import net.ess3.provider.providers.FlatSpawnEggProvider;
|
||||
import net.ess3.provider.providers.LegacyPotionMetaProvider;
|
||||
import net.ess3.provider.providers.LegacySpawnEggProvider;
|
||||
import net.ess3.provider.providers.PaperContainerProvider;
|
||||
import net.ess3.provider.providers.PaperKnownCommandsProvider;
|
||||
import net.ess3.provider.providers.PaperMaterialTagProvider;
|
||||
import net.ess3.provider.providers.PaperRecipeBookListener;
|
||||
import net.ess3.provider.providers.PaperServerStateProvider;
|
||||
import org.bukkit.Bukkit;
|
||||
@ -136,6 +139,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
||||
private transient ContainerProvider containerProvider;
|
||||
private transient KnownCommandsProvider knownCommandsProvider;
|
||||
private transient ProviderListener recipeBookEventProvider;
|
||||
private transient MaterialTagProvider materialTagProvider;
|
||||
private transient Kits kits;
|
||||
private transient RandomTeleport randomTeleport;
|
||||
|
||||
@ -338,6 +342,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
||||
knownCommandsProvider = new ReflKnownCommandsProvider();
|
||||
}
|
||||
|
||||
//Material Tag Providers
|
||||
if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_13_0_R01)) {
|
||||
materialTagProvider = PaperLib.isPaper() ? new PaperMaterialTagProvider() : new BukkitMaterialTagProvider();
|
||||
}
|
||||
|
||||
execTimer.mark("Init(Providers)");
|
||||
reload();
|
||||
|
||||
@ -1023,6 +1032,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
||||
return serverStateProvider;
|
||||
}
|
||||
|
||||
public MaterialTagProvider getMaterialTagProvider() {
|
||||
return materialTagProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContainerProvider getContainerProvider() {
|
||||
return containerProvider;
|
||||
|
@ -4,6 +4,7 @@ import com.earth2me.essentials.api.IItemDb;
|
||||
import com.earth2me.essentials.api.IJails;
|
||||
import com.earth2me.essentials.api.IWarps;
|
||||
import com.earth2me.essentials.perm.PermissionsHandler;
|
||||
import net.ess3.provider.MaterialTagProvider;
|
||||
import net.ess3.provider.ContainerProvider;
|
||||
import net.ess3.provider.KnownCommandsProvider;
|
||||
import net.ess3.provider.ServerStateProvider;
|
||||
@ -115,6 +116,8 @@ public interface IEssentials extends Plugin {
|
||||
|
||||
ServerStateProvider getServerStateProvider();
|
||||
|
||||
MaterialTagProvider getMaterialTagProvider();
|
||||
|
||||
ContainerProvider getContainerProvider();
|
||||
|
||||
KnownCommandsProvider getKnownCommandsProvider();
|
||||
|
@ -5,6 +5,7 @@ import com.earth2me.essentials.Enchantments;
|
||||
import com.earth2me.essentials.Trade;
|
||||
import com.earth2me.essentials.User;
|
||||
import net.ess3.api.IEssentials;
|
||||
import net.ess3.provider.MaterialTagProvider;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@ -20,8 +21,10 @@ public class SignEnchant extends EssentialsSign {
|
||||
@Override
|
||||
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
|
||||
final ItemStack stack;
|
||||
final String itemName = sign.getLine(1);
|
||||
final MaterialTagProvider tagProvider = ess.getMaterialTagProvider();
|
||||
try {
|
||||
stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess);
|
||||
stack = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName)) ? null : getItemStack(sign.getLine(1), 1, ess);
|
||||
} catch (final SignException e) {
|
||||
sign.setLine(1, "§c<item|any>");
|
||||
throw e;
|
||||
@ -63,7 +66,10 @@ public class SignEnchant extends EssentialsSign {
|
||||
|
||||
@Override
|
||||
protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
|
||||
final ItemStack search = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess);
|
||||
final ItemStack playerHand = player.getBase().getItemInHand();
|
||||
final MaterialTagProvider tagProvider = ess.getMaterialTagProvider();
|
||||
final String itemName = sign.getLine(1);
|
||||
final ItemStack search = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName) && tagProvider.isTagged(itemName, playerHand.getType())) ? null : getItemStack(itemName, 1, ess);
|
||||
final Trade charge = getTrade(sign, 3, ess);
|
||||
charge.isAffordableFor(player);
|
||||
final String[] enchantLevel = sign.getLine(2).split(":");
|
||||
@ -80,7 +86,6 @@ public class SignEnchant extends EssentialsSign {
|
||||
}
|
||||
}
|
||||
|
||||
final ItemStack playerHand = player.getBase().getItemInHand();
|
||||
if (playerHand == null || playerHand.getAmount() != 1 || (playerHand.containsEnchantment(enchantment) && playerHand.getEnchantmentLevel(enchantment) == level)) {
|
||||
throw new SignException(tl("missingItems", 1, sign.getLine(1)));
|
||||
}
|
||||
|
@ -0,0 +1,9 @@
|
||||
package net.ess3.provider;
|
||||
|
||||
import org.bukkit.Material;
|
||||
|
||||
public interface MaterialTagProvider {
|
||||
boolean tagExists(String tagName);
|
||||
|
||||
boolean isTagged(String tagName, Material material);
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package net.ess3.provider.providers;
|
||||
|
||||
import net.ess3.provider.MaterialTagProvider;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Tag;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class BukkitMaterialTagProvider implements MaterialTagProvider {
|
||||
private final Map<String, Tag<Material>> stringToTagMap = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public boolean tagExists(String tagName) {
|
||||
if (tagName == null) {
|
||||
return false;
|
||||
}
|
||||
return getTag(tagName) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTagged(String tagName, Material material) {
|
||||
if (tagName == null || material == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Tag<Material> tag = getTag(tagName);
|
||||
return tag != null && tag.isTagged(material);
|
||||
}
|
||||
|
||||
private Tag<Material> getTag(String tagName) {
|
||||
if (tagName == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
tagName = tagName.toUpperCase();
|
||||
if (!stringToTagMap.containsKey(tagName)) {
|
||||
try {
|
||||
final Field field = Tag.class.getDeclaredField(tagName.toUpperCase());
|
||||
//noinspection unchecked
|
||||
stringToTagMap.put(tagName, (Tag<Material>) field.get(null));
|
||||
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
|
||||
stringToTagMap.put(tagName, null);
|
||||
}
|
||||
}
|
||||
return stringToTagMap.get(tagName);
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package net.ess3.provider.providers;
|
||||
|
||||
import com.destroystokyo.paper.MaterialSetTag;
|
||||
import com.destroystokyo.paper.MaterialTags;
|
||||
import net.ess3.provider.MaterialTagProvider;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Tag;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class PaperMaterialTagProvider implements MaterialTagProvider {
|
||||
private final Map<String, Tag<Material>> bukkitTagMap = new HashMap<>();
|
||||
private final Map<String, MaterialSetTag> paperTagMap = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public boolean tagExists(String tagName) {
|
||||
if (tagName == null) {
|
||||
return false;
|
||||
}
|
||||
return getBukkitTag(tagName) != null || getPaperTag(tagName) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTagged(String tagName, Material material) {
|
||||
if (tagName == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (getBukkitTag(tagName) != null) {
|
||||
return getBukkitTag(tagName).isTagged(material);
|
||||
}
|
||||
|
||||
if (getPaperTag(tagName) != null) {
|
||||
return getPaperTag(tagName).isTagged(material);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private MaterialSetTag getPaperTag(String tagName) {
|
||||
if (tagName == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
tagName = tagName.toUpperCase();
|
||||
if (!paperTagMap.containsKey(tagName)) {
|
||||
try {
|
||||
final Field field = MaterialTags.class.getDeclaredField(tagName.toUpperCase());
|
||||
paperTagMap.put(tagName, (MaterialSetTag) field.get(null));
|
||||
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
|
||||
paperTagMap.put(tagName, null);
|
||||
}
|
||||
}
|
||||
return paperTagMap.get(tagName);
|
||||
}
|
||||
|
||||
private Tag<Material> getBukkitTag(String tagName) {
|
||||
if (tagName == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
tagName = tagName.toUpperCase();
|
||||
if (!bukkitTagMap.containsKey(tagName)) {
|
||||
try {
|
||||
final Field field = Tag.class.getDeclaredField(tagName.toUpperCase());
|
||||
//noinspection unchecked
|
||||
bukkitTagMap.put(tagName, (Tag<Material>) field.get(null));
|
||||
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
|
||||
bukkitTagMap.put(tagName, null);
|
||||
}
|
||||
}
|
||||
return bukkitTagMap.get(tagName);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user