From 51e8979a3c00b9a04cfb5255dde0067ced3b8ae1 Mon Sep 17 00:00:00 2001 From: Aria Date: Mon, 9 Dec 2019 21:44:48 +0100 Subject: [PATCH] Added 'SKIN' item type Applies CMD and other cosmetic things when applied to another item. Updated version number to 5.1.2 --- pom.xml | 2 +- .../java/net/Indyuce/mmoitems/api/Type.java | 1 + .../mmoitems/api/interaction/ItemSkin.java | 120 ++++++++++++++++++ .../mmoitems/api/interaction/UseItem.java | 2 + .../mmoitems/api/util/message/Message.java | 4 + .../Indyuce/mmoitems/listener/ItemUse.java | 29 ++++- .../Indyuce/mmoitems/manager/TypeManager.java | 2 +- .../mmoitems/stat/Compatible_Types.java | 110 ++++++++++++++++ .../mmoitems/stat/Hide_Potion_Effects.java | 2 +- .../Indyuce/mmoitems/stat/Potion_Effects.java | 4 +- .../Indyuce/mmoitems/stat/type/ItemStat.java | 6 +- src/main/resources/config.yml | 3 + src/main/resources/default/item-types.yml | 13 ++ 13 files changed, 284 insertions(+), 14 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java create mode 100644 src/main/java/net/Indyuce/mmoitems/stat/Compatible_Types.java diff --git a/pom.xml b/pom.xml index 96669eff..691edab3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.Indyuce MMOItems - 5.1.1-SNAPSHOT + 5.1.2-SNAPSHOT MMOItems A great item solution for your RPG server. diff --git a/src/main/java/net/Indyuce/mmoitems/api/Type.java b/src/main/java/net/Indyuce/mmoitems/api/Type.java index 02113bc9..a0c727a8 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/Type.java +++ b/src/main/java/net/Indyuce/mmoitems/api/Type.java @@ -46,6 +46,7 @@ public class Type { public static final Type CONSUMABLE = new Type(TypeSet.EXTRA, "CONSUMABLE", false, false, true, EquipmentSlot.MAIN_HAND); public static final Type MISCELLANEOUS = new Type(TypeSet.EXTRA, "MISCELLANEOUS", false, false, true, EquipmentSlot.MAIN_HAND); public static final Type GEM_STONE = new Type(TypeSet.EXTRA, "GEM_STONE", false, false, true, EquipmentSlot.OTHER); + public static final Type SKIN = new Type(TypeSet.EXTRA, "SKIN", false, false, true, EquipmentSlot.OTHER); public static final Type ACCESSORY = new Type(TypeSet.EXTRA, "ACCESSORY", false, false, true, EquipmentSlot.ACCESSORY); private final String id; diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java new file mode 100644 index 00000000..0b3b3fcf --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java @@ -0,0 +1,120 @@ +package net.Indyuce.mmoitems.api.interaction; + +import java.lang.reflect.Field; + +import org.bukkit.ChatColor; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.MMOUtils; +import net.Indyuce.mmoitems.api.Type; +import net.Indyuce.mmoitems.api.item.NBTItem; +import net.Indyuce.mmoitems.api.util.message.Message; +import net.Indyuce.mmoitems.stat.Skull_Texture.SkullTextureData; +import net.Indyuce.mmoitems.stat.data.StringListData; +import net.Indyuce.mmoitems.stat.type.ItemStat; +import net.Indyuce.mmoitems.version.VersionMaterial; +import net.Indyuce.mmoitems.version.nms.ItemTag; + +public class ItemSkin extends UseItem { + public ItemSkin(Player player, NBTItem item, Type type) { + super(player, item, type); + } + + public ApplyResult applyOntoItem(NBTItem target, Type targetType) { + if(targetType == Type.SKIN) + return new ApplyResult(ResultType.NONE); + + if(MMOItems.plugin.getConfig().getBoolean("locked-skins") && target.getBoolean("MMOITEMS_HAS_SKIN")) { + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 2); + Message.SKIN_REJECTED.format(ChatColor.RED, "#item#", MMOUtils.getDisplayName(target.getItem())).send(player); + return new ApplyResult(ResultType.NONE); + } + + boolean compatible = false; + if(getMMOItem().hasData(ItemStat.COMPATIBLE_TYPES)) { + for(String type : ((StringListData) getMMOItem().getData(ItemStat.COMPATIBLE_TYPES)).getList()) { + if(type.equalsIgnoreCase(targetType.getId())) { + compatible = true; + break; + } + } + + if(!compatible){ + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 2); + Message.SKIN_INCOMPATIBLE.format(ChatColor.RED, "#item#", MMOUtils.getDisplayName(target.getItem())).send(player); + return new ApplyResult(ResultType.NONE); + } + } + + // check for success rate + double successRate = getNBTItem().getStat(ItemStat.SUCCESS_RATE); + if (successRate != 0) + if (random.nextDouble() < 1 - successRate / 100) { + player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1); + Message.SKIN_BROKE.format(ChatColor.RED, "#item#", MMOUtils.getDisplayName(target.getItem())).send(player); + return new ApplyResult(ResultType.FAILURE); + } + + // Apply skin + target.addTag(new ItemTag("MMOITEMS_HAS_SKIN", true)); + if(getNBTItem().getInteger("CustomModelData") != 0) target.addTag(new ItemTag("CustomModelData", getNBTItem().getInteger("CustomModelData"))); + if(!getNBTItem().getString("MMOITEMS_ITEM_PARTICLES").isEmpty()) target.addTag(new ItemTag("MMOITEMS_ITEM_PARTICLES", getNBTItem().getString("MMOITEMS_ITEM_PARTICLES"))); + + ItemStack item = target.toItem(); + if(item.getType() != getNBTItem().getItem().getType()) + item.setType(getNBTItem().getItem().getType()); + + ItemMeta meta = item.getItemMeta(); + if (getMMOItem().hasData(ItemStat.SKULL_TEXTURE) && item.getType() == VersionMaterial.PLAYER_HEAD.toMaterial() && + getNBTItem().getItem().getType() == VersionMaterial.PLAYER_HEAD.toMaterial()) { + try { + Field profileField = meta.getClass().getDeclaredField("profile"); profileField.setAccessible(true); + profileField.set(meta, ((SkullTextureData) getMMOItem().getData(ItemStat.SKULL_TEXTURE)).getGameProfile()); + } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) { + MMOItems.plugin.getLogger().warning("Could not read skull texture"); + } + } + item.setItemMeta(meta); + + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 2); + Message.SKIN_APPLIED.format(ChatColor.YELLOW, "#item#", MMOUtils.getDisplayName(target.getItem())).send(player); + + return new ApplyResult(item); + } + + public class ApplyResult { + private ResultType type; + private ItemStack result; + + public ApplyResult(ResultType type) { + this(null, type); + } + + public ApplyResult(ItemStack result) { + this(result, ResultType.SUCCESS); + } + + public ApplyResult(ItemStack result, ResultType type) { + this.type = type; + this.result = result; + } + + public ResultType getType() { + return type; + } + + public ItemStack getResult() { + return result; + } + } + + public enum ResultType { + FAILURE, + NONE, + SUCCESS; + } +} diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/UseItem.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/UseItem.java index 39a40398..81f03370 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/UseItem.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/UseItem.java @@ -100,6 +100,8 @@ public class UseItem { public static UseItem getItem(Player player, NBTItem item, Type type) { if (type.corresponds(Type.CONSUMABLE)) return new Consumable(player, item, type); + if (type.corresponds(Type.SKIN)) + return new ItemSkin(player, item, type); if (type.corresponds(Type.GEM_STONE)) return new GemStone(player, item, type); if (type.corresponds(Type.MUSKET)) diff --git a/src/main/java/net/Indyuce/mmoitems/api/util/message/Message.java b/src/main/java/net/Indyuce/mmoitems/api/util/message/Message.java index ad20c869..7e824632 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/util/message/Message.java +++ b/src/main/java/net/Indyuce/mmoitems/api/util/message/Message.java @@ -39,6 +39,10 @@ public enum Message { GEM_STONE_APPLIED("You successfully applied &6#gem#&e onto your &6#item#&e."), GEM_STONE_BROKE("Your gem stone &6#gem#&c broke while trying to apply it onto &6#item#&c."), REPAIRED_ITEM("You successfully repaired &6#item#&e for &6#amount# &euses."), + SKIN_APPLIED("You successfully applied the skin onto your &6#item#&e!"), + SKIN_BROKE("Your skin broke while trying to apply it onto your &6#item#&c."), + SKIN_REJECTED("A skin has already been applied onto your &6#item#&c!"), + SKIN_INCOMPATIBLE("This skin is not compatible with your &6#item#&c!"), // advanced workbennch ADVANCED_WORKBENCH("Advanced Workbench"), diff --git a/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java b/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java index c4e2e285..e45f022f 100644 --- a/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java +++ b/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java @@ -31,8 +31,7 @@ import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.TypeSet; import net.Indyuce.mmoitems.api.interaction.Consumable; import net.Indyuce.mmoitems.api.interaction.GemStone; -import net.Indyuce.mmoitems.api.interaction.GemStone.ApplyResult; -import net.Indyuce.mmoitems.api.interaction.GemStone.ResultType; +import net.Indyuce.mmoitems.api.interaction.ItemSkin; import net.Indyuce.mmoitems.api.interaction.Tool; import net.Indyuce.mmoitems.api.interaction.UseItem; import net.Indyuce.mmoitems.api.interaction.weapon.Gauntlet; @@ -232,19 +231,37 @@ public class ItemUse implements Listener { if (!useItem.canBeUsed()) return; - if (useItem instanceof GemStone) { + if (useItem instanceof ItemSkin) { NBTItem picked = MMOItems.plugin.getNMS().getNBTItem(event.getCurrentItem()); if (!picked.hasType()) return; - ApplyResult result = ((GemStone) useItem).applyOntoItem(picked, picked.getType()); - if (result.getType() == ResultType.NONE) + ItemSkin.ApplyResult result = ((ItemSkin) useItem).applyOntoItem(picked, picked.getType()); + if (result.getType() == ItemSkin.ResultType.NONE) return; event.setCancelled(true); item.getItem().setAmount(item.getItem().getAmount() - 1); - if (result.getType() == ResultType.FAILURE) + if (result.getType() == ItemSkin.ResultType.FAILURE) + return; + + event.setCurrentItem(result.getResult()); + } + + if (useItem instanceof GemStone) { + NBTItem picked = MMOItems.plugin.getNMS().getNBTItem(event.getCurrentItem()); + if (!picked.hasType()) + return; + + GemStone.ApplyResult result = ((GemStone) useItem).applyOntoItem(picked, picked.getType()); + if (result.getType() == GemStone.ResultType.NONE) + return; + + event.setCancelled(true); + item.getItem().setAmount(item.getItem().getAmount() - 1); + + if (result.getType() == GemStone.ResultType.FAILURE) return; event.setCurrentItem(result.getResult()); diff --git a/src/main/java/net/Indyuce/mmoitems/manager/TypeManager.java b/src/main/java/net/Indyuce/mmoitems/manager/TypeManager.java index 8095fafa..e0c5aa5f 100644 --- a/src/main/java/net/Indyuce/mmoitems/manager/TypeManager.java +++ b/src/main/java/net/Indyuce/mmoitems/manager/TypeManager.java @@ -22,7 +22,7 @@ public class TypeManager { public void reload() { map.clear(); addAll(Type.ACCESSORY, Type.ARMOR, Type.BOW, Type.CATALYST, Type.CONSUMABLE, Type.CROSSBOW, Type.DAGGER, - Type.GAUNTLET,Type.GEM_STONE, Type.HAMMER, Type.LUTE, Type.MISCELLANEOUS, Type.MUSKET, Type.OFF_CATALYST, + Type.GAUNTLET,Type.GEM_STONE, Type.SKIN, Type.HAMMER, Type.LUTE, Type.MISCELLANEOUS, Type.MUSKET, Type.OFF_CATALYST, Type.ORNAMENT, Type.SPEAR, Type.STAFF, Type.SWORD, Type.TOOL, Type.WHIP); /* diff --git a/src/main/java/net/Indyuce/mmoitems/stat/Compatible_Types.java b/src/main/java/net/Indyuce/mmoitems/stat/Compatible_Types.java new file mode 100644 index 00000000..30c11f67 --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/stat/Compatible_Types.java @@ -0,0 +1,110 @@ +package net.Indyuce.mmoitems.stat; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; + +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.ConfigFile; +import net.Indyuce.mmoitems.api.edition.StatEdition; +import net.Indyuce.mmoitems.api.item.MMOItem; +import net.Indyuce.mmoitems.api.item.NBTItem; +import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder; +import net.Indyuce.mmoitems.api.util.AltChar; +import net.Indyuce.mmoitems.gui.edition.EditionInventory; +import net.Indyuce.mmoitems.stat.data.StatData; +import net.Indyuce.mmoitems.stat.data.StringListData; +import net.Indyuce.mmoitems.stat.type.ItemStat; +import net.Indyuce.mmoitems.stat.type.StringStat; +import net.Indyuce.mmoitems.version.nms.ItemTag; + +public class Compatible_Types extends StringStat { + public Compatible_Types() { + super(new ItemStack(Material.COMMAND_BLOCK), "Compatible Types", new String[] { "The item types this skin is", "compatible with." }, "compatible-types", new String[] { "skin" }); + } + + @Override + public boolean whenClicked(EditionInventory inv, InventoryClickEvent event) { + ConfigFile config = inv.getItemType().getConfigFile(); + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(inv, ItemStat.COMPATIBLE_TYPES).enable("Write in the chat the name of the type you want to add."); + + if (event.getAction() == InventoryAction.PICKUP_HALF) { + if (config.getConfig().getConfigurationSection(inv.getItemId()).contains("compatible-types")) { + List lore = config.getConfig().getStringList(inv.getItemId() + ".compatible-types"); + if (lore.size() < 1) + return true; + + String last = lore.get(lore.size() - 1); + lore.remove(last); + config.getConfig().set(inv.getItemId() + ".compatible-types", lore); + inv.registerItemEdition(config); + inv.open(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Successfully removed '" + ChatColor.translateAlternateColorCodes('&', last) + ChatColor.GRAY + "'."); + } + } + return true; + } + + @Override + public boolean whenInput(EditionInventory inv, ConfigFile config, String message, Object... info) { + List lore = config.getConfig().getConfigurationSection(inv.getItemId()).contains("compatible-types") ? config.getConfig().getStringList(inv.getItemId() + ".compatible-types") : new ArrayList<>(); + lore.add(message.toUpperCase()); + config.getConfig().set(inv.getItemId() + ".compatible-types", lore); + inv.registerItemEdition(config); + inv.open(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Compatible Types successfully added."); + return true; + } + + @Override + public void whenDisplayed(List lore, FileConfiguration config, String path) { + lore.add(""); + lore.add(ChatColor.GRAY + "Current Value:"); + if (!config.getConfigurationSection(path).contains("compatible-types")) + lore.add(ChatColor.RED + "No compatible types."); + else if (config.getStringList(path + ".compatible-types").isEmpty()) + lore.add(ChatColor.RED + "No compatible types."); + else + config.getStringList(path + ".compatible-types").forEach(str -> lore.add(ChatColor.GRAY + ChatColor.translateAlternateColorCodes('&', str))); + lore.add(""); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Click to add a new type."); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove the last type."); + } + + @Override + public boolean whenLoaded(MMOItem item, ConfigurationSection config) { + item.setData(ItemStat.COMPATIBLE_TYPES, new StringListData(config.getStringList("compatible-types"))); + return true; + } + + @Override + public boolean whenApplied(MMOItemBuilder item, StatData data) { + List compatibleTypes = new ArrayList<>(); + JsonArray array = new JsonArray(); + ((StringListData) data).getList().forEach(line -> { + line = ChatColor.translateAlternateColorCodes('&', line); + array.add(line); + compatibleTypes.add(line); + }); + item.getLore().insert("compatible-types", compatibleTypes); + item.addItemTag(new ItemTag("MMOITEMS_COMPATIBLE_TYPES", array.toString())); + return true; + } + + @Override + public void whenLoaded(MMOItem mmoitem, NBTItem item) { + if (item.hasTag("MMOITEMS_COMPATIBLE_TYPES")) + mmoitem.setData(ItemStat.COMPATIBLE_TYPES, new StringListData(new JsonParser().parse(item.getString("MMOITEMS_COMPATIBLE_TYPES")).getAsJsonArray())); + } +} diff --git a/src/main/java/net/Indyuce/mmoitems/stat/Hide_Potion_Effects.java b/src/main/java/net/Indyuce/mmoitems/stat/Hide_Potion_Effects.java index bbf23443..94ad99d1 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/Hide_Potion_Effects.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/Hide_Potion_Effects.java @@ -13,7 +13,7 @@ import net.Indyuce.mmoitems.stat.type.ItemStat; public class Hide_Potion_Effects extends BooleanStat { public Hide_Potion_Effects() { - super(new ItemStack(Material.POTION), "Hide Potion Effects", new String[] { "Hides potion effects & 'No Effects'", "from your item lore." }, "hide-potion-effects", new String[] { "all" }, Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION); + super(new ItemStack(Material.POTION), "Hide Potion Effects", new String[] { "Hides potion effects & 'No Effects'", "from your item lore." }, "hide-potion-effects", new String[] { "all" }, Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION, Material.TIPPED_ARROW); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/stat/Potion_Effects.java b/src/main/java/net/Indyuce/mmoitems/stat/Potion_Effects.java index 1d7a1b9d..f8acae00 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/Potion_Effects.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/Potion_Effects.java @@ -185,10 +185,8 @@ public class Potion_Effects extends StringStat { @Override public boolean whenApplied(MMOItemBuilder item, StatData data) { if (item.getMaterial().name().contains("POTION") || item.getMaterial() == Material.TIPPED_ARROW) - ((EffectListData) data).getEffects().forEach(effect -> { - ((PotionMeta) item.getMeta()).clearCustomEffects(); + for(PotionEffectData effect : ((EffectListData) data).getEffects()) ((PotionMeta) item.getMeta()).addCustomEffect(effect.toEffect(), false); - }); return true; } } diff --git a/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java b/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java index 34633cb5..4ad9ee89 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/type/ItemStat.java @@ -25,6 +25,7 @@ import net.Indyuce.mmoitems.stat.Arrow_Particles; import net.Indyuce.mmoitems.stat.Attack_Damage; import net.Indyuce.mmoitems.stat.Attack_Speed; import net.Indyuce.mmoitems.stat.Commands; +import net.Indyuce.mmoitems.stat.Compatible_Types; import net.Indyuce.mmoitems.stat.Crafting_Recipe; import net.Indyuce.mmoitems.stat.CustomSounds; import net.Indyuce.mmoitems.stat.Custom_Model_Data; @@ -138,8 +139,9 @@ public abstract class ItemStat { public static final ItemStat DISABLE_RIGHT_CLICK_CONSUME = new DisableStat(Material.BARRIER, "right-click-consume", "Disable Right Click Consume", new String[] { "consumable" }, "This item will not be consumed", "when eaten by players."); public static final ItemStat VANILLA_EATING_ANIMATION = new Vanilla_Eating_Animation(), INEDIBLE = new Inedible(), GEM_COLOR = new Gem_Color(), ITEM_TYPE_RESTRICTION = new Item_Type_Restriction(); - public static final ItemStat SUCCESS_RATE = new DoubleStat(new ItemStack(Material.EMERALD), "Success Rate", new String[] { "The chance of your gem to successfully", "apply onto an item. This value is 100%", "by default. If it is not successfully", "applied, the gem stone will be lost." }, "success-rate", new String[] { "gem_stone" }); - + public static final ItemStat SUCCESS_RATE = new DoubleStat(new ItemStack(Material.EMERALD), "Success Rate", new String[] { "The chance of your gem to successfully", "apply onto an item. This value is 100%", "by default. If it is not successfully", "applied, the gem stone will be lost." }, "success-rate", new String[] { "gem_stone", "skin" }); + public static final ItemStat COMPATIBLE_TYPES = new Compatible_Types(); + public static final ItemStat CRAFTING_RECIPE = new Crafting_Recipe(), FURNACE_RECIPE = new Furnace_Recipe(), SHAPELESS_RECIPE = new Shapeless_Recipe(), ADVANCED_CRAFTING_RECIPE = new Advanced_Crafting_Recipe(), ADVANCED_CRAFTING_RECIPE_PERMISSION = new Advanced_Crafting_Recipe_Permission(); public static final ItemStat AUTOSMELT = new BooleanStat(new ItemStack(Material.COAL), "Autosmelt", new String[] { "If set to true, your tool will", "automaticaly smelt mined ores." }, "autosmelt", new String[] { "tool" }); public static final ItemStat BOUNCING_CRACK = new BooleanStat(new ItemStack(VersionMaterial.COBBLESTONE_WALL.toMaterial()), "Bouncing Crack", new String[] { "If set to true, your tool will", "also break nearby blocks." }, "bouncing-crack", new String[] { "tool" }); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6d02fd5a..31c33564 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -25,6 +25,9 @@ use-item-caching: true # it CAN cause lag and/or take a lot of memory. iterate-whole-inventory: false +# When this is set to true, skins can only be applied to an item ONCE. +locked-skins: true + # Enable/Disable abilities in the players offhand, stops # players using abilities when interacting with chests, mining etc. # Very useful if your have a lot of items that your players use in their diff --git a/src/main/resources/default/item-types.yml b/src/main/resources/default/item-types.yml index 9ba8b405..9677d706 100644 --- a/src/main/resources/default/item-types.yml +++ b/src/main/resources/default/item-types.yml @@ -265,6 +265,19 @@ MISCELLANEOUS: - '{range}&8- &7Lvl Range: &e#range#' - '{tier}&8- &7Item Tier: #prefix##tier#' +SKIN: + display: LEATHER + name: 'Skin' + unident-item: + name: '&f#prefix#Unidentified Skin Item' + lore: + - '&7This item is unidentified. I must' + - '&7find a way to identify it!' + - '{tier}' + - '{tier}&8Item Info:' + - '{range}&8- &7Lvl Range: &e#range#' + - '{tier}&8- &7Item Tier: #prefix##tier#' + GEM_STONE: display: EMERALD name: 'Gem Stone'