diff --git a/lib/MMOLib.jar b/lib/MMOLib.jar index ab582917..68d9093e 100644 Binary files a/lib/MMOLib.jar and b/lib/MMOLib.jar differ diff --git a/src/main/java/net/Indyuce/mmoitems/ItemStats.java b/src/main/java/net/Indyuce/mmoitems/ItemStats.java index 63ff4336..cda97e82 100644 --- a/src/main/java/net/Indyuce/mmoitems/ItemStats.java +++ b/src/main/java/net/Indyuce/mmoitems/ItemStats.java @@ -1,5 +1,6 @@ package net.Indyuce.mmoitems; +import net.Indyuce.mmoitems.stat.CompatibleIds; import org.bukkit.Material; import net.Indyuce.mmoitems.stat.Abilities; @@ -208,6 +209,7 @@ public class ItemStats { MAX_CONSUME = new DoubleStat("MAX_CONSUME", Material.BLAZE_POWDER, "Max Consume", new String[]{"Max amount of usage before", "item disappears."}, new String[]{"consumable"}), SUCCESS_RATE = new SuccessRate(), COMPATIBLE_TYPES = new CompatibleTypes(), + COMPATIBLE_IDS = new CompatibleIds(), // Crafting Stats CRAFTING = new Crafting(), diff --git a/src/main/java/net/Indyuce/mmoitems/ability/Hoearthquake.java b/src/main/java/net/Indyuce/mmoitems/ability/Hoearthquake.java index efa560bf..c8217f26 100644 --- a/src/main/java/net/Indyuce/mmoitems/ability/Hoearthquake.java +++ b/src/main/java/net/Indyuce/mmoitems/ability/Hoearthquake.java @@ -1,11 +1,13 @@ package net.Indyuce.mmoitems.ability; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; @@ -49,8 +51,12 @@ public class Hoearthquake extends Ability { for (int x = -1; x < 2; x++) for (int z = -1; z < 2; z++) { Block b = loc.clone().add(x, -1, z).getBlock(); - if (b.getType() == Material.GRASS || b.getType() == Material.DIRT) - b.setType(Material.FARMLAND); + if (b.getType() == Material.GRASS || b.getType() == Material.DIRT) { + BlockBreakEvent event = new BlockBreakEvent(b, stats.getPlayer()); + event.setDropItems(false); + Bukkit.getPluginManager().callEvent(event); + if(!event.isCancelled()) b.setType(Material.FARMLAND); + } } } }.runTaskTimer(MMOItems.plugin, 0, 1); diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java index db418f10..962e0f5c 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/ItemSkin.java @@ -53,6 +53,22 @@ public class ItemSkin extends UseItem { } } + if (getMMOItem().hasData(ItemStats.COMPATIBLE_IDS)) { + for (String id : ((StringListData) getMMOItem().getData(ItemStats.COMPATIBLE_IDS)).getList()) { + if (id.equalsIgnoreCase(target.getString("MMOITEMS_ITEM_ID"))) { + 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(ItemStats.SUCCESS_RATE.getId()); if (successRate != 0) diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Lute.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Lute.java index f9bc5320..c3dc6e3d 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Lute.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Lute.java @@ -14,7 +14,6 @@ import net.mmogroup.mmolib.api.item.NBTItem; import net.mmogroup.mmolib.version.VersionSound; import org.bukkit.Location; import org.bukkit.Particle; -import org.bukkit.Sound; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -46,7 +45,7 @@ public class Lute extends UntargetedWeapon { Vector weight = new Vector(0, -.003 * getNBTItem().getStat(ItemStats.NOTE_WEIGHT.getId()), 0); LuteAttackEffect effect = LuteAttackEffect.get(getNBTItem()); - Sound sound = new SoundReader(getNBTItem().getString("MMOITEMS_LUTE_ATTACK_SOUND"), VersionSound.BLOCK_NOTE_BLOCK_BELL.toSound()).getSound(); + SoundReader sound = new SoundReader(getNBTItem().getString("MMOITEMS_LUTE_ATTACK_SOUND"), VersionSound.BLOCK_NOTE_BLOCK_BELL.toSound()); if (effect != null) { effect.getAttack().handle(stats, getNBTItem(), attackDamage, range, weight, sound); return; @@ -63,7 +62,7 @@ public class Lute extends UntargetedWeapon { List entities = MMOUtils.getNearbyChunkEntities(loc); loc.getWorld().spawnParticle(Particle.NOTE, loc, 0); - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + (double) ti / range)); + sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (int j = 0; j < 3; j++) { loc.add(vec.add(weight)); if (loc.getBlock().getType().isSolid()) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/BruteLuteAttack.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/BruteLuteAttack.java index 16574d89..9264af41 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/BruteLuteAttack.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/BruteLuteAttack.java @@ -1,34 +1,32 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.ItemAttackResult; import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; +import net.Indyuce.mmoitems.api.util.SoundReader; import net.mmogroup.mmolib.api.DamageType; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; public class BruteLuteAttack implements LuteAttackHandler { @Override - public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound) { + public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { final Vector vec = stats.getPlayer().getEyeLocation().getDirection().multiply(.4); final Location loc = stats.getPlayer().getEyeLocation(); int ti = 0; public void run() { - if (ti++ > range) - cancel(); + if (ti++ > range) cancel(); List entities = MMOUtils.getNearbyChunkEntities(loc); for (int j = 0; j < 3; j++) { @@ -39,8 +37,7 @@ public class BruteLuteAttack implements LuteAttackHandler { } loc.getWorld().spawnParticle(Particle.NOTE, loc, 2, .1, .1, .1, 0); - if (j == 0) - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + (double) ti / range)); + if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) if (MMOUtils.canDamage(stats.getPlayer(), loc, target)) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/CircularLuteAttack.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/CircularLuteAttack.java index f8b3b637..416d54ff 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/CircularLuteAttack.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/CircularLuteAttack.java @@ -1,34 +1,32 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.ItemAttackResult; import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; +import net.Indyuce.mmoitems.api.util.SoundReader; import net.mmogroup.mmolib.api.DamageType; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; public class CircularLuteAttack implements LuteAttackHandler { @Override - public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound) { + public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { final Vector vec = stats.getPlayer().getEyeLocation().getDirection().multiply(.4); final Location loc = stats.getPlayer().getEyeLocation(); int ti = 0; public void run() { - if (ti++ > range) - cancel(); + if (ti++ > range) cancel(); List entities = MMOUtils.getNearbyChunkEntities(loc); for (int j = 0; j < 3; j++) { @@ -42,8 +40,7 @@ public class CircularLuteAttack implements LuteAttackHandler { Vector vec = MMOUtils.rotateFunc(new Vector(Math.cos(a), Math.sin(a), 0).multiply(.3), loc); loc.getWorld().spawnParticle(Particle.NOTE, loc.clone().add(vec), 0); loc.getWorld().spawnParticle(Particle.NOTE, loc.clone().add(vec.multiply(-1)), 0); - if (j == 0) - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + (double) ti / range)); + if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) if (MMOUtils.canDamage(stats.getPlayer(), loc, target)) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/LuteAttackHandler.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/LuteAttackHandler.java index 6fffe0c4..ff5a98ed 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/LuteAttackHandler.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/LuteAttackHandler.java @@ -2,6 +2,7 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; import java.util.Random; +import net.Indyuce.mmoitems.api.util.SoundReader; import org.bukkit.Sound; import org.bukkit.util.Vector; @@ -9,7 +10,7 @@ import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; import net.mmogroup.mmolib.api.item.NBTItem; public interface LuteAttackHandler { - void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound); + void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound); Random random = new Random(); } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SimpleLuteAttack.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SimpleLuteAttack.java index ced9252f..445eeb02 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SimpleLuteAttack.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SimpleLuteAttack.java @@ -1,34 +1,32 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.ItemAttackResult; import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; +import net.Indyuce.mmoitems.api.util.SoundReader; import net.mmogroup.mmolib.api.DamageType; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; public class SimpleLuteAttack implements LuteAttackHandler { @Override - public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound) { + public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { final Vector vec = stats.getPlayer().getEyeLocation().getDirection().multiply(.4); final Location loc = stats.getPlayer().getEyeLocation(); int ti = 0; public void run() { - if (ti++ > range) - cancel(); + if (ti++ > range) cancel(); List entities = MMOUtils.getNearbyChunkEntities(loc); for (int j = 0; j < 3; j++) { @@ -39,8 +37,7 @@ public class SimpleLuteAttack implements LuteAttackHandler { } loc.getWorld().spawnParticle(Particle.NOTE, loc, 0); - if (j == 0) - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + (double) ti / range)); + if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) if (MMOUtils.canDamage(stats.getPlayer(), loc, target)) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SlashLuteAttack.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SlashLuteAttack.java index aacfdcd2..b551053b 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SlashLuteAttack.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/SlashLuteAttack.java @@ -1,34 +1,32 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.ItemAttackResult; import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; +import net.Indyuce.mmoitems.api.util.SoundReader; import net.mmogroup.mmolib.api.DamageType; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; public class SlashLuteAttack implements LuteAttackHandler { @Override - public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound) { + public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { final Vector vec = stats.getPlayer().getEyeLocation().getDirection(); final Location loc = stats.getPlayer().getLocation().add(0, 1.3, 0); double ti = 1; public void run() { - if ((ti += .6) > 5) - cancel(); + if ((ti += .6) > 5) cancel(); - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + ti / 5)); + sound.play(loc, 2, (float) (.5 + ti / range)); for (int k = -30; k < 30; k += 3) if (random.nextBoolean()) { loc.setDirection(vec); diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/WaveLuteAttack.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/WaveLuteAttack.java index 486e762d..bccfab2b 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/WaveLuteAttack.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/lute/WaveLuteAttack.java @@ -1,34 +1,32 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.Sound; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.ItemAttackResult; import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats; +import net.Indyuce.mmoitems.api.util.SoundReader; import net.mmogroup.mmolib.api.DamageType; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; public class WaveLuteAttack implements LuteAttackHandler { @Override - public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, Sound sound) { + public void handle(CachedStats stats, NBTItem nbt, double attackDamage, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { final Vector vec = stats.getPlayer().getEyeLocation().getDirection().multiply(.4); final Location loc = stats.getPlayer().getEyeLocation(); int ti = 0; public void run() { - if (ti++ > range) - cancel(); + if (ti++ > range) cancel(); List entities = MMOUtils.getNearbyChunkEntities(loc); for (int j = 0; j < 3; j++) { @@ -41,8 +39,7 @@ public class WaveLuteAttack implements LuteAttackHandler { Vector vec = MMOUtils.rotateFunc(new Vector(.5, 0, 0), loc); loc.getWorld().spawnParticle(Particle.NOTE, loc.clone().add(vec.multiply(Math.sin((double) ti / 2))), 0); loc.getWorld().spawnParticle(Particle.NOTE, loc.clone().add(vec.multiply(-1)), 0); - if (j == 0) - loc.getWorld().playSound(loc, sound, 2, (float) (.5 + (double) ti / range)); + if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) if (MMOUtils.canDamage(stats.getPlayer(), loc, target)) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/util/SoundReader.java b/src/main/java/net/Indyuce/mmoitems/api/util/SoundReader.java index c1e884b6..af7cfb1b 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/util/SoundReader.java +++ b/src/main/java/net/Indyuce/mmoitems/api/util/SoundReader.java @@ -1,5 +1,6 @@ package net.Indyuce.mmoitems.api.util; +import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.Player; @@ -25,7 +26,7 @@ public class SoundReader { } this.sound = sound; - this.soundKey = soundKey; + this.soundKey = soundKey.toLowerCase(); } public Sound getSound() { @@ -46,4 +47,15 @@ public class SoundReader { else player.playSound(player.getLocation(), soundKey, vol, pitch); } + + public void play(Location loc) { + play(loc, 1, 1); + } + + public void play(Location loc, float vol, float pitch) { + if(soundKey.isEmpty()) + loc.getWorld().playSound(loc, sound, vol, pitch); + else + loc.getWorld().playSound(loc, soundKey, vol, pitch); + } } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsProHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsProHook.java index 40be0490..b2308a73 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsProHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsProHook.java @@ -1,5 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; +import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -44,7 +45,7 @@ public class SkillsProHook implements RPGHandler, Listener { @Override public String getClassName() { - return info.getSkillName(); + return ChatColor.stripColor(info.getSkill().getDisplayName()); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/stat/CompatibleIds.java b/src/main/java/net/Indyuce/mmoitems/stat/CompatibleIds.java new file mode 100644 index 00000000..f8fad75e --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/stat/CompatibleIds.java @@ -0,0 +1,103 @@ +package net.Indyuce.mmoitems.stat; + +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; +import net.Indyuce.mmoitems.ItemStats; +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.edition.StatEdition; +import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder; +import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem; +import net.Indyuce.mmoitems.gui.edition.EditionInventory; +import net.Indyuce.mmoitems.stat.data.StringListData; +import net.Indyuce.mmoitems.stat.data.random.RandomStatData; +import net.Indyuce.mmoitems.stat.data.type.StatData; +import net.Indyuce.mmoitems.stat.type.ItemStat; +import net.mmogroup.mmolib.api.item.ItemTag; +import net.mmogroup.mmolib.api.util.AltChar; +import net.mmogroup.mmolib.version.VersionMaterial; +import org.apache.commons.lang.Validate; +import org.bukkit.ChatColor; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class CompatibleIds extends ItemStat { + public CompatibleIds() { + super("COMPATIBLE_IDS", VersionMaterial.COMMAND_BLOCK.toMaterial(), "Compatible IDs", + new String[] { "The item ids this skin is", "compatible with." }, new String[] { "skin" }); + } + + @Override + @SuppressWarnings("unchecked") + public StringListData whenInitialized(Object object) { + Validate.isTrue(object instanceof List, "Must specify a string list"); + return new StringListData((List) object); + } + + @Override + public void whenClicked(EditionInventory inv, InventoryClickEvent event) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(inv, ItemStats.COMPATIBLE_IDS).enable("Write in the chat the item id you want to add."); + + if (event.getAction() == InventoryAction.PICKUP_HALF) { + if (inv.getEditedSection().contains("compatible-ids")) { + List lore = inv.getEditedSection().getStringList("compatible-ids"); + if (lore.size() < 1) + return; + + String last = lore.get(lore.size() - 1); + lore.remove(last); + inv.getEditedSection().set("compatible-ids", lore); + inv.registerTemplateEdition(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Successfully removed '" + last + "'."); + } + } + } + + @Override + public void whenInput(EditionInventory inv, String message, Object... info) { + List lore = inv.getEditedSection().contains("compatible-ids") ? inv.getEditedSection().getStringList("compatible-ids") + : new ArrayList<>(); + lore.add(message.toUpperCase()); + inv.getEditedSection().set("compatible-ids", lore); + inv.registerTemplateEdition(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Compatible IDs successfully added."); + } + + @Override + public void whenDisplayed(List lore, Optional statData) { + + if (statData.isPresent()) { + lore.add(ChatColor.GRAY + "Current Value:"); + ((StringListData) statData.get()).getList().forEach(str -> lore.add(ChatColor.GRAY + str)); + + } else + lore.add(ChatColor.GRAY + "Current Value: " + ChatColor.RED + "Compatible with any item."); + + lore.add(""); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Click to add a new id."); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove the last id."); + } + + @Override + public void whenApplied(ItemStackBuilder item, StatData data) { + List compatibleIds = new ArrayList<>(); + JsonArray array = new JsonArray(); + ((StringListData) data).getList().forEach(line -> { + array.add(line); + compatibleIds.add(line); + }); + item.getLore().insert("compatible-ids", compatibleIds); + item.addItemTag(new ItemTag("MMOITEMS_COMPATIBLE_IDS", array.toString())); + } + + @Override + public void whenLoaded(ReadMMOItem mmoitem) { + if (mmoitem.getNBT().hasTag("MMOITEMS_COMPATIBLE_IDS")) + mmoitem.setData(ItemStats.COMPATIBLE_IDS, + new StringListData(new JsonParser().parse(mmoitem.getNBT().getString("MMOITEMS_COMPATIBLE_IDS")).getAsJsonArray())); + } +} diff --git a/src/main/java/net/Indyuce/mmoitems/stat/type/StringStat.java b/src/main/java/net/Indyuce/mmoitems/stat/type/StringStat.java index 606732ea..6374ce9a 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/type/StringStat.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/type/StringStat.java @@ -63,7 +63,7 @@ public class StringStat extends ItemStat { @Override public void whenDisplayed(List lore, Optional statData) { if (statData.isPresent()) { - String value = MMOLib.plugin.parseColors(statData.toString()); + String value = MMOLib.plugin.parseColors(statData.get().toString()); value = value.length() > 40 ? value.substring(0, 40) + "..." : value; lore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GREEN + value);