mirror of
https://github.com/EssentialsX/Essentials.git
synced 2024-09-28 23:57:27 +02: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.nms.refl.providers.ReflSpawnerBlockProvider;
|
||||||
import net.ess3.provider.ContainerProvider;
|
import net.ess3.provider.ContainerProvider;
|
||||||
import net.ess3.provider.KnownCommandsProvider;
|
import net.ess3.provider.KnownCommandsProvider;
|
||||||
|
import net.ess3.provider.MaterialTagProvider;
|
||||||
import net.ess3.provider.PotionMetaProvider;
|
import net.ess3.provider.PotionMetaProvider;
|
||||||
import net.ess3.provider.ProviderListener;
|
import net.ess3.provider.ProviderListener;
|
||||||
import net.ess3.provider.ServerStateProvider;
|
import net.ess3.provider.ServerStateProvider;
|
||||||
@ -57,12 +58,14 @@ import net.ess3.provider.SpawnerBlockProvider;
|
|||||||
import net.ess3.provider.SpawnerItemProvider;
|
import net.ess3.provider.SpawnerItemProvider;
|
||||||
import net.ess3.provider.providers.BasePotionDataProvider;
|
import net.ess3.provider.providers.BasePotionDataProvider;
|
||||||
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
|
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
|
||||||
|
import net.ess3.provider.providers.BukkitMaterialTagProvider;
|
||||||
import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
|
import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
|
||||||
import net.ess3.provider.providers.FlatSpawnEggProvider;
|
import net.ess3.provider.providers.FlatSpawnEggProvider;
|
||||||
import net.ess3.provider.providers.LegacyPotionMetaProvider;
|
import net.ess3.provider.providers.LegacyPotionMetaProvider;
|
||||||
import net.ess3.provider.providers.LegacySpawnEggProvider;
|
import net.ess3.provider.providers.LegacySpawnEggProvider;
|
||||||
import net.ess3.provider.providers.PaperContainerProvider;
|
import net.ess3.provider.providers.PaperContainerProvider;
|
||||||
import net.ess3.provider.providers.PaperKnownCommandsProvider;
|
import net.ess3.provider.providers.PaperKnownCommandsProvider;
|
||||||
|
import net.ess3.provider.providers.PaperMaterialTagProvider;
|
||||||
import net.ess3.provider.providers.PaperRecipeBookListener;
|
import net.ess3.provider.providers.PaperRecipeBookListener;
|
||||||
import net.ess3.provider.providers.PaperServerStateProvider;
|
import net.ess3.provider.providers.PaperServerStateProvider;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -136,6 +139,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
|||||||
private transient ContainerProvider containerProvider;
|
private transient ContainerProvider containerProvider;
|
||||||
private transient KnownCommandsProvider knownCommandsProvider;
|
private transient KnownCommandsProvider knownCommandsProvider;
|
||||||
private transient ProviderListener recipeBookEventProvider;
|
private transient ProviderListener recipeBookEventProvider;
|
||||||
|
private transient MaterialTagProvider materialTagProvider;
|
||||||
private transient Kits kits;
|
private transient Kits kits;
|
||||||
private transient RandomTeleport randomTeleport;
|
private transient RandomTeleport randomTeleport;
|
||||||
|
|
||||||
@ -338,6 +342,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
|||||||
knownCommandsProvider = new ReflKnownCommandsProvider();
|
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)");
|
execTimer.mark("Init(Providers)");
|
||||||
reload();
|
reload();
|
||||||
|
|
||||||
@ -1023,6 +1032,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
|
|||||||
return serverStateProvider;
|
return serverStateProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MaterialTagProvider getMaterialTagProvider() {
|
||||||
|
return materialTagProvider;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ContainerProvider getContainerProvider() {
|
public ContainerProvider getContainerProvider() {
|
||||||
return containerProvider;
|
return containerProvider;
|
||||||
|
@ -4,6 +4,7 @@ import com.earth2me.essentials.api.IItemDb;
|
|||||||
import com.earth2me.essentials.api.IJails;
|
import com.earth2me.essentials.api.IJails;
|
||||||
import com.earth2me.essentials.api.IWarps;
|
import com.earth2me.essentials.api.IWarps;
|
||||||
import com.earth2me.essentials.perm.PermissionsHandler;
|
import com.earth2me.essentials.perm.PermissionsHandler;
|
||||||
|
import net.ess3.provider.MaterialTagProvider;
|
||||||
import net.ess3.provider.ContainerProvider;
|
import net.ess3.provider.ContainerProvider;
|
||||||
import net.ess3.provider.KnownCommandsProvider;
|
import net.ess3.provider.KnownCommandsProvider;
|
||||||
import net.ess3.provider.ServerStateProvider;
|
import net.ess3.provider.ServerStateProvider;
|
||||||
@ -115,6 +116,8 @@ public interface IEssentials extends Plugin {
|
|||||||
|
|
||||||
ServerStateProvider getServerStateProvider();
|
ServerStateProvider getServerStateProvider();
|
||||||
|
|
||||||
|
MaterialTagProvider getMaterialTagProvider();
|
||||||
|
|
||||||
ContainerProvider getContainerProvider();
|
ContainerProvider getContainerProvider();
|
||||||
|
|
||||||
KnownCommandsProvider getKnownCommandsProvider();
|
KnownCommandsProvider getKnownCommandsProvider();
|
||||||
|
@ -5,6 +5,7 @@ import com.earth2me.essentials.Enchantments;
|
|||||||
import com.earth2me.essentials.Trade;
|
import com.earth2me.essentials.Trade;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
import net.ess3.api.IEssentials;
|
import net.ess3.api.IEssentials;
|
||||||
|
import net.ess3.provider.MaterialTagProvider;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
@ -20,8 +21,10 @@ public class SignEnchant extends EssentialsSign {
|
|||||||
@Override
|
@Override
|
||||||
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
|
protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
|
||||||
final ItemStack stack;
|
final ItemStack stack;
|
||||||
|
final String itemName = sign.getLine(1);
|
||||||
|
final MaterialTagProvider tagProvider = ess.getMaterialTagProvider();
|
||||||
try {
|
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) {
|
} catch (final SignException e) {
|
||||||
sign.setLine(1, "§c<item|any>");
|
sign.setLine(1, "§c<item|any>");
|
||||||
throw e;
|
throw e;
|
||||||
@ -63,7 +66,10 @@ public class SignEnchant extends EssentialsSign {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException {
|
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);
|
final Trade charge = getTrade(sign, 3, ess);
|
||||||
charge.isAffordableFor(player);
|
charge.isAffordableFor(player);
|
||||||
final String[] enchantLevel = sign.getLine(2).split(":");
|
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)) {
|
if (playerHand == null || playerHand.getAmount() != 1 || (playerHand.containsEnchantment(enchantment) && playerHand.getEnchantmentLevel(enchantment) == level)) {
|
||||||
throw new SignException(tl("missingItems", 1, sign.getLine(1)));
|
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