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:
pop4959 2021-02-05 10:57:32 -08:00 committed by GitHub
parent 74131f816c
commit cb168b0c8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 158 additions and 3 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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)));
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}
}