From cd19e679a25a660a4831ad719ee4075c7322f646 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Mon, 25 Jul 2022 17:16:37 +0200 Subject: [PATCH] Elemental commit 1 --- .../net/Indyuce/mmoitems/api/CustomSound.java | 1 - .../net/Indyuce/mmoitems/api/Element.java | 179 --------- .../net/Indyuce/mmoitems/api/TypeSet.java | 22 +- .../interaction/weapon/untargeted/Lute.java | 13 +- .../interaction/weapon/untargeted/Musket.java | 4 +- .../interaction/weapon/untargeted/Staff.java | 7 +- .../interaction/weapon/untargeted/Whip.java | 2 +- .../untargeted/lute/BruteLuteAttack.java | 17 +- .../untargeted/lute/CircularLuteAttack.java | 21 +- .../untargeted/lute/LuteAttackHandler.java | 6 +- .../untargeted/lute/SimpleLuteAttack.java | 17 +- .../untargeted/lute/SlashLuteAttack.java | 25 +- .../untargeted/lute/WaveLuteAttack.java | 21 +- .../untargeted/staff/LightningSpirit.java | 11 +- .../weapon/untargeted/staff/ManaSpirit.java | 12 +- .../weapon/untargeted/staff/NetherSpirit.java | 12 +- .../untargeted/staff/StaffAttackHandler.java | 4 +- .../untargeted/staff/SunfireSpirit.java | 12 +- .../untargeted/staff/ThunderSpirit.java | 13 +- .../weapon/untargeted/staff/VoidSpirit.java | 15 +- .../weapon/untargeted/staff/XRaySpirit.java | 13 +- .../Indyuce/mmoitems/comp/rpg/HeroesHook.java | 3 +- .../mmoitems/comp/rpg/ProSkillAPIHook.java | 2 +- .../mmoitems/comp/rpg/SkillAPIHook.java | 2 +- .../gui/edition/EditionInventory.java | 5 +- .../mmoitems/gui/edition/ElementsEdition.java | 194 +++++----- .../mmoitems/skill/Shulker_Missile.java | 39 +- .../net/Indyuce/mmoitems/stat/Elements.java | 353 ++++++++---------- .../mmoitems/stat/data/ElementListData.java | 97 ++--- .../data/random/RandomElementListData.java | 143 ++++--- .../mmoitems/util/ElementStatType.java | 33 ++ .../java/net/Indyuce/mmoitems/util/Pair.java | 40 ++ .../default/language/lore-format.yml | 279 +++++++------- src/main/resources/default/language/stats.yml | 25 +- 34 files changed, 705 insertions(+), 937 deletions(-) delete mode 100644 src/main/java/net/Indyuce/mmoitems/api/Element.java create mode 100644 src/main/java/net/Indyuce/mmoitems/util/ElementStatType.java create mode 100644 src/main/java/net/Indyuce/mmoitems/util/Pair.java diff --git a/src/main/java/net/Indyuce/mmoitems/api/CustomSound.java b/src/main/java/net/Indyuce/mmoitems/api/CustomSound.java index 7ac86cb2..0821ba7e 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/CustomSound.java +++ b/src/main/java/net/Indyuce/mmoitems/api/CustomSound.java @@ -1,6 +1,5 @@ package net.Indyuce.mmoitems.api; -import io.lumine.mythic.lib.damage.AttackMetadata; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/net/Indyuce/mmoitems/api/Element.java b/src/main/java/net/Indyuce/mmoitems/api/Element.java deleted file mode 100644 index e9876093..00000000 --- a/src/main/java/net/Indyuce/mmoitems/api/Element.java +++ /dev/null @@ -1,179 +0,0 @@ -package net.Indyuce.mmoitems.api; - -import io.lumine.mythic.lib.player.PlayerMetadata; -import net.Indyuce.mmoitems.MMOUtils; -import org.bukkit.*; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Consumer; - -public enum Element { - /*FIRE(Material.BLAZE_POWDER, ChatColor.DARK_RED, new ElementParticle(Particle.FLAME, .05f, 8), (attacker, target, relative, absolute) -> { - target.getWorld().spawnParticle(Particle.LAVA, target.getLocation().add(0, target.getHeight() / 2, 0), 14); - target.getWorld().playSound(target.getLocation(), Sound.ENTITY_BLAZE_HURT, 2, .8f); - target.setFireTicks((int) (relative * 2)); - }, 19, 25), - - ICE(VersionMaterial.SNOWBALL.toMaterial(), ChatColor.AQUA, new ElementParticle(Particle.BLOCK_CRACK, .07f, 16, Material.ICE), - (attacker, target, relative, absolute) -> { - new BukkitRunnable() { - double y = 0; - final Location loc = target.getLocation(); - - public void run() { - for (int j = 0; j < 3; j++) { - if ((y += .07) >= 3) - cancel(); - for (double k = 0; k < Math.PI * 2; k += Math.PI * 2 / 3) - loc.getWorld().spawnParticle(Particle.REDSTONE, loc.clone().add(Math.cos(y * Math.PI + k) * (3 - y) / 2.5, - y / 1.1, Math.sin(y * Math.PI + k) * (3 - y) / 2.5), 1, new Particle.DustOptions(Color.WHITE, 1)); - } - } - }.runTaskTimer(MMOItems.plugin, 0, 1); - target.getWorld().playSound(target.getLocation(), Sound.BLOCK_GLASS_BREAK, 2, 0); - target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, (int) (relative * 1.5), 5)); - }, 20, 24), - - WIND(Material.FEATHER, ChatColor.GRAY, new ElementParticle(Particle.EXPLOSION_NORMAL, .06f, 8), (attacker, target, relative, absolute) -> { - target.getWorld().playSound(target.getLocation(), VersionSound.ENTITY_ENDER_DRAGON_GROWL.toSound(), 2, 2f); - Vector vec = target.getLocation().subtract(attacker.getPlayer().getLocation()).toVector().normalize().multiply(1.7).setY(.5); - target.setVelocity(vec); - for (Entity entity : target.getNearbyEntities(3, 1, 3)) - if (UtilityMethods.canTarget(attacker.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) { - entity.playEffect(EntityEffect.HURT); - entity.setVelocity(vec); - } - for (double k = 0; k < Math.PI * 2; k += Math.PI / 16) - target.getWorld().spawnParticle(Particle.CLOUD, target.getLocation().add(0, target.getHeight() / 2, 0), 0, Math.cos(k), .01, - Math.sin(k), .15); - }, 28, 34), - - EARTH(VersionMaterial.OAK_SAPLING.toMaterial(), ChatColor.GREEN, new ElementParticle(Particle.BLOCK_CRACK, .05f, 24, Material.DIRT), - (attacker, target, relative, absolute) -> { - target.getWorld().playSound(target.getLocation(), Sound.BLOCK_GRASS_BREAK, 2, 0); - target.getWorld().spawnParticle(Particle.BLOCK_CRACK, target.getLocation().add(0, .1, 0), 64, 1, 0, 1, - Material.DIRT.createBlockData()); - - target.setVelocity(new Vector(0, 1, 0)); - for (Entity entity : target.getNearbyEntities(3, 1, 3)) - if (UtilityMethods.canTarget(attacker.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) - entity.setVelocity(new Vector(0, 1, 0)); - }, 29, 33), - - THUNDER(VersionMaterial.GUNPOWDER.toMaterial(), ChatColor.YELLOW, new ElementParticle(Particle.FIREWORKS_SPARK, .05f, 8), (attacker, target, relative, absolute) -> { - target.getWorld().playSound(target.getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_LARGE_BLAST.toSound(), 2, 0); - for (Entity entity : target.getNearbyEntities(3, 2, 3)) - if (UtilityMethods.canTarget(attacker.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) - MythicLib.plugin.getDamage().damage(new ItemAttackMetadata(new DamageMetadata(absolute, DamageType.WEAPON), attacker), (LivingEntity) entity); - - for (double k = 0; k < Math.PI * 2; k += Math.PI / 16) - target.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, target.getLocation().add(0, target.getHeight() / 2, 0), 0, Math.cos(k), .01, - Math.sin(k), .18); - }, 30, 32), - - WATER(VersionMaterial.LILY_PAD.toMaterial(), ChatColor.BLUE, new ElementParticle(Particle.BLOCK_CRACK, .07f, 32, Material.WATER), - (attacker, target, damage, absolute) -> { - ElementListener.weaken(target); - new BukkitRunnable() { - double step = Math.PI / 2; - final Location loc = target.getLocation(); - - public void run() { - if ((step -= Math.PI / 30) <= 0) - cancel(); - - for (double i = 0; i < Math.PI * 2; i += Math.PI / 16) - loc.getWorld().spawnParticle(Particle.WATER_DROP, - loc.clone().add(Math.cos(i) * Math.sin(step) * 2, Math.cos(step) * 2, 2 * Math.sin(i) * Math.sin(step)), 0); - } - }.runTaskTimer(MMOItems.plugin, 0, 1); - }, 37, 43), - - LIGHTNESS(Material.GLOWSTONE_DUST, ChatColor.WHITE, new ElementParticle(Particle.BLOCK_CRACK, .07f, 32, Material.WHITE_WOOL), - (attacker, target, relative, absolute) -> { - // TODO - }, 38, 42), - - DARKNESS(Material.COAL, ChatColor.DARK_GRAY, new ElementParticle(Particle.BLOCK_CRACK, .07f, 32, Material.COAL_BLOCK), (attacker, target, relative, absolute) -> { - // TODO - }, 39, 41),*/ - - ; - - private final ItemStack item; - private final String name; - private final ChatColor color; - private final ElementParticle particle; - private final ElementHandler handler; - private final int damageGuiSlot, defenseGuiSlot; - - Element(Material material, ChatColor color, ElementParticle particle, ElementHandler handler, int damageGuiSlot, int defenseGuiSlot) { - this.item = new ItemStack(material); - this.name = MMOUtils.caseOnWords(name().toLowerCase()); - this.color = color; - this.particle = particle; - - this.handler = handler; - this.damageGuiSlot = damageGuiSlot; - this.defenseGuiSlot = defenseGuiSlot; - } - - public ItemStack getItem() { - return item; - } - - public String getName() { - return name; - } - - public ChatColor getPrefix() { - return color; - } - - public ElementParticle getParticle() { - return particle; - } - - public ElementHandler getHandler() { - return handler; - } - - public int getDamageGuiSlot() { - return damageGuiSlot; - } - - public int getDefenseGuiSlot() { - return defenseGuiSlot; - } - - @FunctionalInterface - public interface ElementHandler { - - /** - * @param attacker Player performing elemental attack - * @param target Attack target - * @param damage Relative elemental damage - * @param absolute Absolute elemental damage dealt - */ - void elementAttack(PlayerMetadata attacker, LivingEntity target, double damage, double absolute); - } - - public static class ElementParticle { - public final Consumer display; - - public ElementParticle(Particle particle, double speed, int amount) { - display = (entity) -> entity.getWorld().spawnParticle(particle, entity.getLocation().add(0, entity.getHeight() / 2, 0), amount, 0, 0, 0, - speed); - } - - public ElementParticle(Particle particle, float speed, int amount, Material material) { - display = (entity) -> entity.getWorld().spawnParticle(particle, entity.getLocation().add(0, entity.getHeight() / 2, 0), amount, 0, 0, 0, - speed, material.createBlockData()); - } - - public void displayParticle(Entity entity) { - display.accept(entity); - } - } -} \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java b/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java index 08f3f3ef..998effdf 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java +++ b/src/main/java/net/Indyuce/mmoitems/api/TypeSet.java @@ -3,6 +3,7 @@ package net.Indyuce.mmoitems.api; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.player.modifier.ModifierSource; import io.lumine.mythic.lib.version.VersionSound; import net.Indyuce.mmoitems.MMOItems; @@ -42,11 +43,8 @@ public enum TypeSet { if (entity.getLocation().distanceSquared(loc) < 40 && attack.getPlayer().getEyeLocation().getDirection() .angle(entity.getLocation().subtract(attack.getPlayer().getLocation()).toVector()) < Math.PI / 3 - && UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION) && !entity.equals(target)) { - AttackMetadata subAttack = new AttackMetadata(attack.getDamage().clone(), attack); - subAttack.getDamage().multiplicativeModifier(.4); - subAttack.damage((LivingEntity) entity); - } + && UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION) && !entity.equals(target)) + attack.attack((LivingEntity) entity, attack.getDamage().getDamage() * .4, DamageType.WEAPON, DamageType.PHYSICAL); }), /** @@ -71,11 +69,8 @@ public enum TypeSet { if (!entity.equals(target) && entity.getLocation().distanceSquared(attack.getPlayer().getLocation()) < 40 && attack.getPlayer().getEyeLocation().getDirection() .angle(entity.getLocation().toVector().subtract(attack.getPlayer().getLocation().toVector())) < Math.PI / 12 - && UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) { - AttackMetadata subAttack = new AttackMetadata(attack.getDamage().clone(), attack); - subAttack.getDamage().multiplicativeModifier(.6); - subAttack.damage((LivingEntity) entity); - } + && UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) + attack.attack((LivingEntity) entity, attack.getDamage().getDamage() * .6, DamageType.WEAPON, DamageType.PHYSICAL); }), /** @@ -97,11 +92,8 @@ public enum TypeSet { double bluntRating = weapon.getValue(attack.getStat("BLUNT_RATING"), MMOItems.plugin.getConfig().getDouble("default.blunt-rating")) / 100; for (Entity entity : target.getNearbyEntities(bluntPower, bluntPower, bluntPower)) - if (UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION) && !entity.equals(target)) { - AttackMetadata subAttack = new AttackMetadata(attack.getDamage().clone(), attack); - subAttack.getDamage().multiplicativeModifier(bluntRating); - subAttack.damage((LivingEntity) entity); - } + if (UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION) && !entity.equals(target)) + attack.attack((LivingEntity) entity, attack.getDamage().getDamage() * bluntRating, DamageType.WEAPON, DamageType.PHYSICAL); } } 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 83118b4d..2105a87a 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 @@ -6,8 +6,6 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; -import io.lumine.mythic.lib.damage.DamageMetadata; import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.version.VersionSound; @@ -43,13 +41,10 @@ public class Lute extends UntargetedWeapon { double range = getValue(getNBTItem().getStat(ItemStats.RANGE.getId()), MMOItems.plugin.getConfig().getDouble("default.range")); Vector weight = new Vector(0, -.003 * getNBTItem().getStat(ItemStats.NOTE_WEIGHT.getId()), 0); - // Attack meta - AttackMetadata attackMeta = new AttackMetadata(new DamageMetadata(attackDamage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE), stats); - LuteAttackEffect effect = LuteAttackEffect.get(getNBTItem()); SoundReader sound = new SoundReader(getNBTItem().getString("MMOITEMS_LUTE_ATTACK_SOUND"), VersionSound.BLOCK_NOTE_BLOCK_BELL.toSound()); if (effect != null) { - effect.getAttack().handle(attackMeta, getNBTItem(), range, weight, sound); + effect.getAttack().handle(stats, attackDamage, getNBTItem(), range, weight, sound); return; } @@ -80,10 +75,10 @@ public class Lute extends UntargetedWeapon { loc.getWorld().spawnParticle(Particle.NOTE, loc, 0, 1, 0, 0, 1); } - // play the sound + // Play the sound sound.play(loc, 2, (float) (.5 + (double) ti / range)); - // damage entities + // Damage entities List entities = MMOUtils.getNearbyChunkEntities(loc); for (int j = 0; j < 3; j++) { loc.add(vec.add(weight)); @@ -94,7 +89,7 @@ public class Lute extends UntargetedWeapon { for (Entity target : entities) if (UtilityMethods.canTarget(getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attackMeta.damage((LivingEntity) target); + stats.attack((LivingEntity) target, attackDamage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); return; } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Musket.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Musket.java index 92dae69c..cc159d9b 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Musket.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Musket.java @@ -4,8 +4,6 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; -import io.lumine.mythic.lib.damage.DamageMetadata; import io.lumine.mythic.lib.damage.DamageType; import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.util.RayTrace; @@ -48,7 +46,7 @@ public class Musket extends UntargetedWeapon { RayTrace trace = new RayTrace(loc, vec, range, entity -> UtilityMethods.canTarget(stats.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); if (trace.hasHit()) - new AttackMetadata(new DamageMetadata(attackDamage, DamageType.WEAPON, DamageType.PROJECTILE, DamageType.PHYSICAL), stats).damage(trace.getHit()); + stats.attack(trace.getHit(), attackDamage, DamageType.WEAPON, DamageType.PHYSICAL, DamageType.PROJECTILE); trace.draw(.5, Color.BLACK); getPlayer().getWorld().playSound(getPlayer().getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 2, 2); diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Staff.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Staff.java index 829c7c1a..aabfd030 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Staff.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Staff.java @@ -37,18 +37,15 @@ public class Staff extends UntargetedWeapon { double attackDamage = getValue(stats.getStat("ATTACK_DAMAGE"), 1); double range = getValue(getNBTItem().getStat(ItemStats.RANGE.getId()), MMOItems.plugin.getConfig().getDouble("default.range")); - // Attack meta - AttackMetadata attackMeta = new AttackMetadata(new DamageMetadata(attackDamage, DamageType.WEAPON, DamageType.PROJECTILE, DamageType.MAGIC), stats); - StaffSpirit spirit = StaffSpirit.get(getNBTItem()); if (spirit != null) { - spirit.getAttack().handle(attackMeta, getNBTItem(), slot, range); + spirit.getAttack().handle(stats, attackDamage, getNBTItem(), slot, range); return; } RayTrace trace = new RayTrace(stats.getPlayer(), slot, range, entity -> UtilityMethods.canTarget(stats.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); if (trace.hasHit()) - attackMeta.damage(trace.getHit()); + stats.attack(trace.getHit(), attackDamage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); trace.draw(.5, tick -> tick.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, tick, 0, .1, .1, .1, 0)); getPlayer().getWorld().playSound(getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_TWINKLE.toSound(), 2, 2); diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Whip.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Whip.java index 0fe67499..d420878c 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Whip.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/Whip.java @@ -33,7 +33,7 @@ public class Whip extends UntargetedWeapon { RayTrace trace = new RayTrace(getPlayer(), slot, range, entity -> UtilityMethods.canTarget(stats.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); if (trace.hasHit()) - new AttackMetadata(new DamageMetadata(attackDamage, DamageType.WEAPON, DamageType.PROJECTILE, DamageType.PHYSICAL), stats).damage(trace.getHit()); + stats.attack(trace.getHit(), attackDamage, DamageType.WEAPON, DamageType.PROJECTILE, DamageType.PHYSICAL); trace.draw(.5, tick -> tick.getWorld().spawnParticle(Particle.CRIT, tick, 0, .1, .1, .1, 0)); getPlayer().getWorld().playSound(getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 1, 2); } 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 2243510d..2b36223c 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 @@ -6,6 +6,9 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.util.SoundReader; @@ -22,10 +25,10 @@ import java.util.List; public class BruteLuteAttack implements LuteAttackHandler { @Override - public void handle(AttackMetadata attack, NBTItem nbt, double range, Vector weight, SoundReader sound) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { - final Vector vec = attack.getPlayer().getEyeLocation().getDirection().multiply(.4); - final Location loc = attack.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.4); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; public void run() { @@ -48,10 +51,10 @@ public class BruteLuteAttack implements LuteAttackHandler { double red = Double.parseDouble(String.valueOf(obj.get("Red"))); double green = Double.parseDouble(String.valueOf(obj.get("Green"))); double blue = Double.parseDouble(String.valueOf(obj.get("Blue"))); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc, red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc, red, green, blue); // If it's not colored, just shoot the particle } else { - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc, 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc, 0, 0, 0); } // If no particle has been provided via projectile particle attribute, default to this particle } else @@ -60,8 +63,8 @@ public class BruteLuteAttack implements LuteAttackHandler { if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) - if (UtilityMethods.canTarget(attack.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attack.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); return; } 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 790df255..3226423a 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 @@ -6,6 +6,9 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.util.SoundReader; @@ -22,10 +25,10 @@ import java.util.List; public class CircularLuteAttack implements LuteAttackHandler { @Override - public void handle(AttackMetadata attack, NBTItem nbt, double range, Vector weight, SoundReader sound) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { - final Vector vec = attack.getPlayer().getEyeLocation().getDirection().multiply(.4); - final Location loc = attack.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.4); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; public void run() { @@ -51,12 +54,12 @@ public class CircularLuteAttack implements LuteAttackHandler { double red = Double.parseDouble(String.valueOf(obj.get("Red"))); double green = Double.parseDouble(String.valueOf(obj.get("Green"))); double blue = Double.parseDouble(String.valueOf(obj.get("Blue"))); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec), red, green, blue); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec), red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), red, green, blue); // If it's not colored, just shoot the particle } else { - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec), 0, 0, 0); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec), 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), 0, 0, 0); } // If no particle has been provided via projectile particle attribute, default to this particle } else { @@ -67,8 +70,8 @@ public class CircularLuteAttack implements LuteAttackHandler { if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) - if (UtilityMethods.canTarget(attack.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attack.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); return; } 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 d5b64153..5d075a65 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 @@ -1,14 +1,14 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.lute; import io.lumine.mythic.lib.api.item.NBTItem; -import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.api.util.SoundReader; import org.bukkit.util.Vector; import java.util.Random; public interface LuteAttackHandler { - void handle(AttackMetadata attackMeta, NBTItem nbt, double range, Vector weight, SoundReader sound); + static final Random random = new Random(); - Random random = new Random(); + void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound); } 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 5d031586..89d9921f 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 @@ -6,6 +6,9 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.util.SoundReader; @@ -22,10 +25,10 @@ import java.util.List; public class SimpleLuteAttack implements LuteAttackHandler { @Override - public void handle(AttackMetadata attack, NBTItem nbt, double range, Vector weight, SoundReader sound) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { - final Vector vec = attack.getPlayer().getEyeLocation().getDirection().multiply(.4); - final Location loc = attack.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.4); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; public void run() { @@ -47,10 +50,10 @@ public class SimpleLuteAttack implements LuteAttackHandler { double red = Double.parseDouble(String.valueOf(obj.get("Red"))); double green = Double.parseDouble(String.valueOf(obj.get("Green"))); double blue = Double.parseDouble(String.valueOf(obj.get("Blue"))); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc, red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc, red, green, blue); // If it's not colored, just shoot the particle } else { - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc, 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc, 0, 0, 0); } // If no particle has been provided via projectile particle attribute, default to this particle } else { @@ -60,8 +63,8 @@ public class SimpleLuteAttack implements LuteAttackHandler { if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) - if (UtilityMethods.canTarget(attack.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attack.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); return; } 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 da94e10f..abfb98a2 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 @@ -6,6 +6,9 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.util.SoundReader; @@ -20,10 +23,10 @@ import org.bukkit.util.Vector; public class SlashLuteAttack implements LuteAttackHandler { @Override - public void handle(AttackMetadata attack, NBTItem nbt, double range, Vector weight, SoundReader sound) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { - final Vector vec = attack.getPlayer().getEyeLocation().getDirection(); - final Location loc = attack.getPlayer().getLocation().add(0, 1.3, 0); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection(); + final Location loc = caster.getPlayer().getLocation().add(0, 1.3, 0); double ti = 1; public void run() { @@ -34,7 +37,7 @@ public class SlashLuteAttack implements LuteAttackHandler { if (random.nextBoolean()) { loc.setDirection(vec); loc.setYaw(loc.getYaw() + k); - loc.setPitch(attack.getPlayer().getEyeLocation().getPitch()); + loc.setPitch(caster.getPlayer().getEyeLocation().getPitch()); if (nbt.hasTag("MMOITEMS_PROJECTILE_PARTICLES")) { JsonObject obj = MythicLib.plugin.getJson().parse(nbt.getString("MMOITEMS_PROJECTILE_PARTICLES"), JsonObject.class); @@ -44,10 +47,10 @@ public class SlashLuteAttack implements LuteAttackHandler { double red = Double.parseDouble(String.valueOf(obj.get("Red"))); double green = Double.parseDouble(String.valueOf(obj.get("Green"))); double blue = Double.parseDouble(String.valueOf(obj.get("Blue"))); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(loc.getDirection().multiply(1.5 * ti)), red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(loc.getDirection().multiply(1.5 * ti)), red, green, blue); // If it's not colored, just shoot the particle } else { - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(loc.getDirection().multiply(1.5 * ti)), 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(loc.getDirection().multiply(1.5 * ti)), 0, 0, 0); } // If no particle has been provided via projectile particle attribute, default to this particle } else { @@ -57,10 +60,10 @@ public class SlashLuteAttack implements LuteAttackHandler { } }.runTaskTimer(MMOItems.plugin, 0, 1); - for (Entity entity : MMOUtils.getNearbyChunkEntities(attack.getPlayer().getLocation())) - if (entity.getLocation().distanceSquared(attack.getPlayer().getLocation()) < 40 - && attack.getPlayer().getEyeLocation().getDirection().angle(entity.getLocation().toVector().subtract(attack.getPlayer().getLocation().toVector())) < Math.PI / 6 - && UtilityMethods.canTarget(attack.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) - attack.clone().damage((LivingEntity) entity); + for (Entity entity : MMOUtils.getNearbyChunkEntities(caster.getPlayer().getLocation())) + if (entity.getLocation().distanceSquared(caster.getPlayer().getLocation()) < 40 + && caster.getPlayer().getEyeLocation().getDirection().angle(entity.getLocation().toVector().subtract(caster.getPlayer().getLocation().toVector())) < Math.PI / 6 + && UtilityMethods.canTarget(caster.getPlayer(), entity, InteractionType.OFFENSE_ACTION)) + caster.attack((LivingEntity) entity, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); } } 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 88fcbdcb..1eef891a 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 @@ -6,6 +6,9 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.util.SoundReader; @@ -22,10 +25,10 @@ import java.util.List; public class WaveLuteAttack implements LuteAttackHandler { @Override - public void handle(AttackMetadata attack, NBTItem nbt, double range, Vector weight, SoundReader sound) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, double range, Vector weight, SoundReader sound) { new BukkitRunnable() { - final Vector vec = attack.getPlayer().getEyeLocation().getDirection().multiply(.4); - final Location loc = attack.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.4); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; public void run() { @@ -49,12 +52,12 @@ public class WaveLuteAttack implements LuteAttackHandler { double red = Double.parseDouble(String.valueOf(obj.get("Red"))); double green = Double.parseDouble(String.valueOf(obj.get("Green"))); double blue = Double.parseDouble(String.valueOf(obj.get("Blue"))); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(Math.sin((double) ti / 2))), red, green, blue); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(Math.sin((double) ti / 2))), red, green, blue); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), red, green, blue); // If it's not colored, just shoot the particle } else { - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(Math.sin((double) ti / 2))), 0, 0, 0); - ProjectileParticlesData.shootParticle(attack.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(Math.sin((double) ti / 2))), 0, 0, 0); + ProjectileParticlesData.shootParticle(caster.getPlayer(), particle, loc.clone().add(vec.multiply(-1)), 0, 0, 0); } // If no particle has been provided via projectile particle attribute, default to this particle } else { @@ -65,8 +68,8 @@ public class WaveLuteAttack implements LuteAttackHandler { if (j == 0) sound.play(loc, 2, (float) (.5 + (double) ti / range)); for (Entity target : entities) - if (UtilityMethods.canTarget(attack.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attack.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); return; } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/LightningSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/LightningSpirit.java index 4cbabc90..11c5f441 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/LightningSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/LightningSpirit.java @@ -4,7 +4,8 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.util.RayTrace; import io.lumine.mythic.lib.version.VersionSound; import org.bukkit.Particle; @@ -12,13 +13,13 @@ import org.bukkit.Particle; public class LightningSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 2); + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 2); - RayTrace trace = new RayTrace(attackMeta.getPlayer(), slot, range, entity -> UtilityMethods.canTarget(attackMeta.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); + RayTrace trace = new RayTrace(caster.getPlayer(), slot, range, entity -> UtilityMethods.canTarget(caster.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); if (trace.hasHit()) - attackMeta.damage(trace.getHit()); + caster.attack(trace.getHit(), damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); trace.draw(.5, loc1 -> loc1.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, loc1, 0)); } } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ManaSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ManaSpirit.java index 50d3a2e3..927c504e 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ManaSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ManaSpirit.java @@ -5,6 +5,8 @@ import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import org.bukkit.Color; @@ -21,10 +23,10 @@ import java.util.List; public class ManaSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { new BukkitRunnable() { - final Vector vec = attackMeta.getPlayer().getEyeLocation().getDirection().multiply(.4); - final Location loc = attackMeta.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.4); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; final double r = .2; @@ -48,8 +50,8 @@ public class ManaSpirit implements StaffAttackHandler { loc.getWorld().spawnParticle(Particle.REDSTONE, loc.clone().add(vec), 1, new Particle.DustOptions(Color.AQUA, 1)); } for (Entity target : targets) - if (UtilityMethods.canTarget(attackMeta.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attackMeta.damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); loc.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, loc, 0); cancel(); return; diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/NetherSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/NetherSpirit.java index bba8dec6..a0a9f7d6 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/NetherSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/NetherSpirit.java @@ -5,6 +5,8 @@ import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import org.bukkit.Location; @@ -20,10 +22,10 @@ import java.util.List; public class NetherSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { new BukkitRunnable() { - final Vector vec = attackMeta.getPlayer().getEyeLocation().getDirection().multiply(.3); - final Location loc = attackMeta.getPlayer().getEyeLocation(); + final Vector vec = caster.getPlayer().getEyeLocation().getDirection().multiply(.3); + final Location loc = caster.getPlayer().getEyeLocation(); int ti = 0; public void run() { @@ -40,8 +42,8 @@ public class NetherSpirit implements StaffAttackHandler { loc.getWorld().spawnParticle(Particle.FLAME, loc, 2, .07, .07, .07, 0); loc.getWorld().spawnParticle(Particle.SMOKE_NORMAL, loc, 0); for (Entity target : targets) - if (UtilityMethods.canTarget(attackMeta.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { - attackMeta.damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), loc, target, InteractionType.OFFENSE_ACTION)) { + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); loc.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, loc, 0); cancel(); return; diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/StaffAttackHandler.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/StaffAttackHandler.java index 09331f7e..45975bcf 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/StaffAttackHandler.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/StaffAttackHandler.java @@ -2,7 +2,7 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.staff; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; -import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.player.PlayerMetadata; import org.bukkit.Location; import java.util.Random; @@ -10,7 +10,7 @@ import java.util.Random; public interface StaffAttackHandler { static final Random RANDOM = new Random(); - void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range); + void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range); default Location getGround(Location loc) { for (int j = 0; j < 20; j++) { diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/SunfireSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/SunfireSpirit.java index 56db31c4..d7c4fbfb 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/SunfireSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/SunfireSpirit.java @@ -5,6 +5,8 @@ import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.version.VersionSound; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; @@ -19,10 +21,10 @@ import org.bukkit.util.Vector; public class SunfireSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); new BukkitRunnable() { - final Location target = getGround(attackMeta.getPlayer().getTargetBlock(null, (int) range * 2).getLocation()).add(0, 1.2, 0); + final Location target = getGround(caster.getPlayer().getTargetBlock(null, (int) range * 2).getLocation()).add(0, 1.2, 0); final double a = RANDOM.nextDouble() * Math.PI * 2; final Location loc = target.clone().add(Math.cos(a) * 4, 10, Math.sin(a) * 4); final Vector vec = target.toVector().subtract(loc.toVector()).multiply(.015); @@ -40,8 +42,8 @@ public class SunfireSpirit implements StaffAttackHandler { loc.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, loc, 0); loc.getWorld().playSound(loc, VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 2); for (Entity target : MMOUtils.getNearbyChunkEntities(loc)) - if (UtilityMethods.canTarget(attackMeta.getPlayer(), target, InteractionType.OFFENSE_ACTION) && target.getLocation().distanceSquared(loc) <= 9) - attackMeta.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), target, InteractionType.OFFENSE_ACTION) && target.getLocation().distanceSquared(loc) <= 9) + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); break; } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ThunderSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ThunderSpirit.java index ee156759..948b565e 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ThunderSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/ThunderSpirit.java @@ -4,7 +4,8 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.version.VersionSound; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; @@ -19,10 +20,10 @@ import org.bukkit.util.Vector; public class ThunderSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); new BukkitRunnable() { - final Location target = getGround(attackMeta.getPlayer().getTargetBlock(null, (int) range * 2).getLocation()).add(0, 1.2, 0); + final Location target = getGround(caster.getPlayer().getTargetBlock(null, (int) range * 2).getLocation()).add(0, 1.2, 0); final double a = RANDOM.nextDouble() * Math.PI * 2; final Location loc = target.clone().add(Math.cos(a) * 4, 10, Math.sin(a) * 4); final Vector vec = target.toVector().subtract(loc.toVector()).multiply(.015); @@ -38,8 +39,8 @@ public class ThunderSpirit implements StaffAttackHandler { loc.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, loc, 24, 0, 0, 0, .12); loc.getWorld().playSound(loc, VersionSound.ENTITY_FIREWORK_ROCKET_BLAST.toSound(), 2, 2); for (Entity target : MMOUtils.getNearbyChunkEntities(loc)) - if (UtilityMethods.canTarget(attackMeta.getPlayer(), target, InteractionType.OFFENSE_ACTION) && target.getLocation().distanceSquared(loc) <= 9) - attackMeta.clone().damage((LivingEntity) target); + if (UtilityMethods.canTarget(caster.getPlayer(), target, InteractionType.OFFENSE_ACTION) && target.getLocation().distanceSquared(loc) <= 9) + caster.attack((LivingEntity) target, damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); cancel(); } } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/VoidSpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/VoidSpirit.java index 28a40e95..57aa444f 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/VoidSpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/VoidSpirit.java @@ -3,6 +3,9 @@ package net.Indyuce.mmoitems.api.interaction.weapon.untargeted.staff; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.skill.Shulker_Missile; import org.bukkit.Sound; @@ -14,11 +17,11 @@ import org.bukkit.util.Vector; public class VoidSpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { - Vector vec = attackMeta.getPlayer().getEyeLocation().getDirection(); - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); - ShulkerBullet shulkerBullet = (ShulkerBullet) attackMeta.getPlayer().getWorld().spawnEntity(attackMeta.getPlayer().getLocation().add(0, 1, 0), EntityType.valueOf("SHULKER_BULLET")); - shulkerBullet.setShooter(attackMeta.getPlayer()); + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { + Vector vec = caster.getPlayer().getEyeLocation().getDirection(); + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2); + ShulkerBullet shulkerBullet = (ShulkerBullet) caster.getPlayer().getWorld().spawnEntity(caster.getPlayer().getLocation().add(0, 1, 0), EntityType.valueOf("SHULKER_BULLET")); + shulkerBullet.setShooter(caster.getPlayer()); new BukkitRunnable() { double ti = 0; @@ -31,6 +34,6 @@ public class VoidSpirit implements StaffAttackHandler { shulkerBullet.setVelocity(vec); } }.runTaskTimer(MMOItems.plugin, 0, 1); - MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new Shulker_Missile.ShulkerMissileEntityData(attackMeta, nbt)); + MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new Shulker_Missile.ShulkerMissileEntityData(caster, new DamageMetadata(damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE), 0, nbt)); } } diff --git a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/XRaySpirit.java b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/XRaySpirit.java index 40accb76..20840c34 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/XRaySpirit.java +++ b/src/main/java/net/Indyuce/mmoitems/api/interaction/weapon/untargeted/staff/XRaySpirit.java @@ -4,7 +4,8 @@ import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.api.player.EquipmentSlot; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; +import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.util.RayTrace; import org.bukkit.Color; import org.bukkit.Sound; @@ -12,13 +13,13 @@ import org.bukkit.Sound; public class XRaySpirit implements StaffAttackHandler { @Override - public void handle(AttackMetadata attackMeta, NBTItem nbt, EquipmentSlot slot, double range) { - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 2, 2); + public void handle(PlayerMetadata caster, double damage, NBTItem nbt, EquipmentSlot slot, double range) { + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 2, 2); - RayTrace trace = new RayTrace(attackMeta.getPlayer(), slot, range, entity -> UtilityMethods.canTarget(attackMeta.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); + RayTrace trace = new RayTrace(caster.getPlayer(), slot, range, entity -> UtilityMethods.canTarget(caster.getPlayer(), entity, InteractionType.OFFENSE_ACTION)); if (trace.hasHit()) - attackMeta.damage(trace.getHit()); + caster.attack(trace.getHit(), damage, DamageType.WEAPON, DamageType.MAGIC, DamageType.PROJECTILE); trace.draw(.5, Color.BLACK); - attackMeta.getPlayer().getWorld().playSound(attackMeta.getPlayer().getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 0.40f, 2); + caster.getPlayer().getWorld().playSound(caster.getPlayer().getLocation(), Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR, 0.40f, 2); } } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java index 66f84608..b68c7a5e 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java @@ -19,6 +19,7 @@ import net.Indyuce.mmoitems.api.player.RPGPlayer; import net.Indyuce.mmoitems.stat.type.DoubleStat; import net.Indyuce.mmoitems.stat.type.ItemStat; import org.bukkit.Material; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -50,7 +51,7 @@ public class HeroesHook implements RPGHandler, Listener, AttackHandler { Player player = (Player) info.getCharacter().getEntity(); DamageMetadata damageMeta = new DamageMetadata(event.getDamage(), info.getSkill().getTypes().stream().filter(damages::containsKey).map(damages::get).toArray(DamageType[]::new)); - return new AttackMetadata(damageMeta, MMOPlayerData.get(player).getStatMap().cache(EquipmentSlot.MAIN_HAND)); + return new AttackMetadata(damageMeta, (LivingEntity) event.getEntity(), MMOPlayerData.get(player).getStatMap().cache(EquipmentSlot.MAIN_HAND)); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/ProSkillAPIHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/ProSkillAPIHook.java index 0b12b30c..32094687 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/ProSkillAPIHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/ProSkillAPIHook.java @@ -47,7 +47,7 @@ public class ProSkillAPIHook implements RPGHandler, Listener, AttackHandler { return; DamageMetadata damageMeta = new DamageMetadata(event.getDamage(), DamageType.SKILL); - AttackMetadata attackMeta = new AttackMetadata(damageMeta, MMOPlayerData.get(event.getDamager().getUniqueId()).getStatMap().cache(EquipmentSlot.MAIN_HAND)); + AttackMetadata attackMeta = new AttackMetadata(damageMeta, event.getTarget(), MMOPlayerData.get(event.getDamager().getUniqueId()).getStatMap().cache(EquipmentSlot.MAIN_HAND)); damageInfo.put(event.getTarget().getEntityId(), attackMeta); } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java index 714dbbfd..cb0db8c0 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java @@ -47,7 +47,7 @@ public class SkillAPIHook implements RPGHandler, Listener, AttackHandler { return; DamageMetadata damageMeta = new DamageMetadata(event.getDamage(), DamageType.SKILL); - AttackMetadata attackMeta = new AttackMetadata(damageMeta, MMOPlayerData.get(event.getDamager().getUniqueId()).getStatMap().cache(EquipmentSlot.MAIN_HAND)); + AttackMetadata attackMeta = new AttackMetadata(damageMeta, event.getTarget(), MMOPlayerData.get(event.getDamager().getUniqueId()).getStatMap().cache(EquipmentSlot.MAIN_HAND)); damageInfo.put(event.getTarget().getEntityId(), attackMeta); } diff --git a/src/main/java/net/Indyuce/mmoitems/gui/edition/EditionInventory.java b/src/main/java/net/Indyuce/mmoitems/gui/edition/EditionInventory.java index fb7d44ad..b3a694a9 100644 --- a/src/main/java/net/Indyuce/mmoitems/gui/edition/EditionInventory.java +++ b/src/main/java/net/Indyuce/mmoitems/gui/edition/EditionInventory.java @@ -10,6 +10,7 @@ import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.util.message.FFPMMOItems; import net.Indyuce.mmoitems.gui.PluginInventory; import net.Indyuce.mmoitems.stat.data.random.RandomStatData; +import net.Indyuce.mmoitems.stat.data.type.StatData; import net.Indyuce.mmoitems.stat.type.ItemStat; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; @@ -95,7 +96,7 @@ public abstract class EditionInventory extends PluginInventory { * @param stat The stat which data we are looking for * @return Optional which contains the corresponding random stat data */ - public Optional getEventualStatData(ItemStat stat) { + public , S extends StatData> Optional getEventualStatData(ItemStat stat) { /* * The item data map used to display what the player is currently @@ -103,7 +104,7 @@ public abstract class EditionInventory extends PluginInventory { * map. Otherwise, use the base item data map */ Map map = editedModifier != null ? editedModifier.getItemData() : template.getBaseItemData(); - return map.containsKey(stat) ? Optional.of(map.get(stat)) : Optional.empty(); + return map.containsKey(stat) ? Optional.of((R) map.get(stat)) : Optional.empty(); } public void registerTemplateEdition() { diff --git a/src/main/java/net/Indyuce/mmoitems/gui/edition/ElementsEdition.java b/src/main/java/net/Indyuce/mmoitems/gui/edition/ElementsEdition.java index 0067943e..50425c20 100644 --- a/src/main/java/net/Indyuce/mmoitems/gui/edition/ElementsEdition.java +++ b/src/main/java/net/Indyuce/mmoitems/gui/edition/ElementsEdition.java @@ -1,16 +1,19 @@ package net.Indyuce.mmoitems.gui.edition; +import io.lumine.mythic.lib.MythicLib; +import io.lumine.mythic.lib.api.util.AltChar; +import io.lumine.mythic.lib.element.Element; import net.Indyuce.mmoitems.ItemStats; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; -import net.Indyuce.mmoitems.api.Element; import net.Indyuce.mmoitems.api.edition.StatEdition; import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; import net.Indyuce.mmoitems.stat.data.random.RandomElementListData; -import net.Indyuce.mmoitems.stat.data.random.RandomStatData; -import io.lumine.mythic.lib.api.util.AltChar; +import net.Indyuce.mmoitems.util.ElementStatType; +import net.Indyuce.mmoitems.util.Pair; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; @@ -18,102 +21,125 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; public class ElementsEdition extends EditionInventory { - private static final int[] slots = { 19, 25, 20, 24, 28, 34, 29, 33, 30, 32, 37, 43, 38, 42, 39, 41 }; + private final List elements = new ArrayList<>(); + private final int maxPage; + private final Map> editableStats = new HashMap<>(); - public ElementsEdition(Player player, MMOItemTemplate template) { - super(player, template); - } + private int page = 1; - @Override - public Inventory getInventory() { - Inventory inv = Bukkit.createInventory(this, 54, "Elements E.: " + template.getId()); - int n = 0; + private static final int[] INIT_SLOTS = {19, 28, 37}; + private static final int ELEMENTS_PER_PAGE = 3; - for (Element element : Element.values()) { - ItemStack attack = element.getItem().clone(); - ItemMeta attackMeta = attack.getItemMeta(); - attackMeta.setDisplayName(ChatColor.GREEN + element.getName() + " Damage"); - List attackLore = new ArrayList<>(); - Optional statData = getEventualStatData(ItemStats.ELEMENTS); - attackLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GREEN - + (statData.isPresent() && ((RandomElementListData) statData.get()).hasDamage(element) - ? ((RandomElementListData) statData.get()).getDamage(element) + " (%)" - : "---")); - attackLore.add(""); - attackLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); - attackLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove this value."); - attackMeta.setLore(attackLore); - attack.setItemMeta(attackMeta); + public ElementsEdition(Player player, MMOItemTemplate template) { + super(player, template); - ItemStack defense = element.getItem().clone(); - ItemMeta defenseMeta = defense.getItemMeta(); - defenseMeta.setDisplayName(ChatColor.GREEN + element.getName() + " Defense"); - List defenseLore = new ArrayList<>(); - defenseLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GREEN - + (statData.isPresent() && ((RandomElementListData) statData.get()).hasDefense(element) - ? ((RandomElementListData) statData.get()).getDefense(element) + " (%)" - : "---")); - defenseLore.add(""); - defenseLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); - defenseLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove this value."); - defenseMeta.setLore(defenseLore); - defense.setItemMeta(defenseMeta); + elements.addAll(MythicLib.plugin.getElements().getAll()); + maxPage = 1 + (MythicLib.plugin.getElements().getAll().size() - 1) / ELEMENTS_PER_PAGE; + } - inv.setItem(slots[n], attack); - inv.setItem(slots[n + 1], defense); - n += 2; - } + @Override + public Inventory getInventory() { + Inventory inv = Bukkit.createInventory(this, 54, "Elements: " + template.getId()); - addEditionInventoryItems(inv, true); + final Optional statData = getEventualStatData(ItemStats.ELEMENTS); - return inv; - } + ItemStack prevPage = new ItemStack(Material.ARROW); + ItemMeta prevPageMeta = prevPage.getItemMeta(); + prevPageMeta.setDisplayName(ChatColor.GREEN + "Previous Page"); + prevPage.setItemMeta(prevPageMeta); + inv.setItem(25, prevPage); - @Override - public void whenClicked(InventoryClickEvent event) { - ItemStack item = event.getCurrentItem(); + ItemStack nextPage = new ItemStack(Material.ARROW); + ItemMeta nextPageMeta = nextPage.getItemMeta(); + nextPageMeta.setDisplayName(ChatColor.GREEN + "Next Page"); + nextPage.setItemMeta(nextPageMeta); + inv.setItem(43, nextPage); - event.setCancelled(true); - if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false)) - return; + editableStats.clear(); - String elementPath = getElementPath(event.getSlot()); - if (elementPath == null) - return; + final int startingIndex = (page - 1) * ELEMENTS_PER_PAGE; + for (int i = 0; i < ELEMENTS_PER_PAGE; i++) { + final int index = startingIndex + i; + if (index >= elements.size()) + break; - if (event.getAction() == InventoryAction.PICKUP_ALL) - new StatEdition(this, ItemStats.ELEMENTS, elementPath).enable("Write in the value you want."); + Element element = elements.get(index); + int k = 0; + for (ElementStatType statType : ElementStatType.values()) { + ItemStack statItem = new ItemStack(element.getIcon()); + ItemMeta statMeta = statItem.getItemMeta(); + statMeta.setDisplayName(ChatColor.GREEN + element.getName() + " " + statType.getName()); + List statLore = new ArrayList<>(); + statLore.add(ChatColor.GRAY + "Current Value: " + ChatColor.GREEN + + (statData.isPresent() && statData.get().hasStat(element, statType) + ? statData.get().getStat(element, statType) + : "---")); + statLore.add(""); + statLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to change this value."); + statLore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove this value."); + statMeta.setLore(statLore); + statItem.setItemMeta(statMeta); - else if (event.getAction() == InventoryAction.PICKUP_HALF) { - getEditedSection().set("element." + elementPath, null); + final int slot = INIT_SLOTS[i] + k; + inv.setItem(slot, statItem); + editableStats.put(slot, Pair.of(element, statType)); + k++; + } + } - // clear element config section - String elementName = elementPath.split("\\.")[0]; - if (getEditedSection().contains("element." + elementName) - && getEditedSection().getConfigurationSection("element." + elementName).getKeys(false).isEmpty()) { - getEditedSection().set("element." + elementName, null); - if (getEditedSection().getConfigurationSection("element").getKeys(false).isEmpty()) - getEditedSection().set("element", null); - } + addEditionInventoryItems(inv, true); - registerTemplateEdition(); - new ElementsEdition(player, template).open(getPreviousPage()); - player.sendMessage(MMOItems.plugin.getPrefix() + ChatColor.RED + MMOUtils.caseOnWords(elementPath.replace(".", " ")) + ChatColor.GRAY - + " successfully removed."); - } - } + return inv; + } - public String getElementPath(int guiSlot) { - for (Element element : Element.values()) - if (element.getDamageGuiSlot() == guiSlot) - return element.name().toLowerCase() + ".damage"; - else if (element.getDefenseGuiSlot() == guiSlot) - return element.name().toLowerCase() + ".defense"; - return null; - } + @Override + public void whenClicked(InventoryClickEvent event) { + ItemStack item = event.getCurrentItem(); + + event.setCancelled(true); + if (event.getInventory() != event.getClickedInventory() || !MMOUtils.isMetaItem(item, false)) + return; + + if (page > 1 && item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Previous Page")) { + page--; + open(); + return; + } + + if (page < maxPage && item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Next Page")) { + page++; + open(); + return; + } + + Pair edited = editableStats.get(event.getSlot()); + if (edited == null) + return; + + final String elementPath = edited.getValue().getConcatenatedConfigPath(edited.getKey()); + + if (event.getAction() == InventoryAction.PICKUP_ALL) + new StatEdition(this, ItemStats.ELEMENTS, elementPath).enable("Write in the value you want."); + + else if (event.getAction() == InventoryAction.PICKUP_HALF) { + getEditedSection().set("element." + elementPath, null); + + // Clear element config section + String elementName = edited.getKey().getId(); + if (getEditedSection().contains("element." + elementName) + && getEditedSection().getConfigurationSection("element." + elementName).getKeys(false).isEmpty()) { + getEditedSection().set("element." + elementName, null); + if (getEditedSection().getConfigurationSection("element").getKeys(false).isEmpty()) + getEditedSection().set("element", null); + } + + registerTemplateEdition(); + new ElementsEdition(player, template).open(getPreviousPage()); + player.sendMessage(MMOItems.plugin.getPrefix() + ChatColor.RED + edited.getKey().getName() + " " + edited.getValue().getName() + ChatColor.GRAY + + " successfully removed."); + } + } } \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmoitems/skill/Shulker_Missile.java b/src/main/java/net/Indyuce/mmoitems/skill/Shulker_Missile.java index ebea6b33..7e6e2d63 100644 --- a/src/main/java/net/Indyuce/mmoitems/skill/Shulker_Missile.java +++ b/src/main/java/net/Indyuce/mmoitems/skill/Shulker_Missile.java @@ -3,9 +3,9 @@ package net.Indyuce.mmoitems.skill; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.api.item.NBTItem; import io.lumine.mythic.lib.comp.target.InteractionType; -import io.lumine.mythic.lib.damage.AttackMetadata; import io.lumine.mythic.lib.damage.DamageMetadata; import io.lumine.mythic.lib.damage.DamageType; +import io.lumine.mythic.lib.player.PlayerMetadata; import io.lumine.mythic.lib.skill.SkillMetadata; import io.lumine.mythic.lib.skill.handler.SkillHandler; import io.lumine.mythic.lib.skill.result.def.VectorSkillResult; @@ -62,8 +62,7 @@ public class Shulker_Missile extends SkillHandler implements EntityType.SHULKER_BULLET); shulkerBullet.setShooter(caster); - AttackMetadata attackMeta = new AttackMetadata(new DamageMetadata(skillMeta.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE), skillMeta.getCaster()); - MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new ShulkerMissileEntityData(attackMeta, skillMeta.getModifier("effect-duration"))); + MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new ShulkerMissileEntityData(skillMeta.getCaster(), new DamageMetadata(skillMeta.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE), skillMeta.getModifier("effect-duration"), null)); new BukkitRunnable() { double ti = 0; @@ -89,12 +88,12 @@ public class Shulker_Missile extends SkillHandler implements return; ShulkerMissileEntityData data = (ShulkerMissileEntityData) MMOItems.plugin.getEntities().getEntityData(damager); - if (!UtilityMethods.canTarget(data.attackMeta.getPlayer(), null, entity, data.isWeaponAttack() ? InteractionType.OFFENSE_ACTION : InteractionType.OFFENSE_SKILL)) { + if (!UtilityMethods.canTarget(data.caster.getPlayer(), null, entity, data.isWeaponAttack() ? InteractionType.OFFENSE_ACTION : InteractionType.OFFENSE_SKILL)) { event.setCancelled(true); return; } - event.setDamage(data.attackMeta.getDamage().getDamage()); + event.setDamage(data.damage.getDamage()); new BukkitRunnable() { final Location loc = entity.getLocation(); @@ -124,40 +123,22 @@ public class Shulker_Missile extends SkillHandler implements } public static class ShulkerMissileEntityData implements EntityData { - private final AttackMetadata attackMeta; + private final PlayerMetadata caster; + private final DamageMetadata damage; private final double duration; @Nullable private final NBTItem weapon; - /** - * Used for the Shulker missile ability - * - * @param attackMeta Attack meta - * @param duration Duration of levitation effect in seconds - */ - public ShulkerMissileEntityData(AttackMetadata attackMeta, double duration) { - this(attackMeta, duration, null); - } - - /** - * Used for the void staff attack spirit (no levitation effect) - * - * @param attackMeta Attack meta - * @param weapon Item used for the attack - */ - public ShulkerMissileEntityData(AttackMetadata attackMeta, NBTItem weapon) { - this(attackMeta, 0, weapon); - } - - private ShulkerMissileEntityData(AttackMetadata attackMeta, double duration, NBTItem weapon) { - this.attackMeta = attackMeta; + public ShulkerMissileEntityData(PlayerMetadata caster, DamageMetadata damage, double duration, NBTItem weapon) { + this.caster = caster; + this.damage = damage; this.duration = duration; this.weapon = weapon; } public boolean isWeaponAttack() { - return attackMeta.getDamage().hasType(DamageType.WEAPON); + return damage.hasType(DamageType.WEAPON); } } } diff --git a/src/main/java/net/Indyuce/mmoitems/stat/Elements.java b/src/main/java/net/Indyuce/mmoitems/stat/Elements.java index 57fddbb1..7877e725 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/Elements.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/Elements.java @@ -4,9 +4,9 @@ import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.SupportedNBTTagValues; import io.lumine.mythic.lib.api.util.AltChar; import io.lumine.mythic.lib.api.util.ui.SilentNumbers; +import io.lumine.mythic.lib.element.Element; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; -import net.Indyuce.mmoitems.api.Element; import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder; import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem; import net.Indyuce.mmoitems.api.util.NumericStatFormula; @@ -14,11 +14,12 @@ import net.Indyuce.mmoitems.gui.edition.EditionInventory; import net.Indyuce.mmoitems.gui.edition.ElementsEdition; import net.Indyuce.mmoitems.stat.data.ElementListData; import net.Indyuce.mmoitems.stat.data.random.RandomElementListData; -import net.Indyuce.mmoitems.stat.data.random.RandomStatData; import net.Indyuce.mmoitems.stat.data.type.StatData; import net.Indyuce.mmoitems.stat.type.DoubleStat; import net.Indyuce.mmoitems.stat.type.ItemStat; import net.Indyuce.mmoitems.stat.type.Previewable; +import net.Indyuce.mmoitems.util.ElementStatType; +import net.Indyuce.mmoitems.util.Pair; import org.apache.commons.lang.Validate; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -29,246 +30,192 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Optional; public class Elements extends ItemStat implements Previewable { - public Elements() { - super("ELEMENT", Material.SLIME_BALL, "Elements", new String[] { "The elements of your item." }, - new String[] { "slashing", "piercing", "blunt", "offhand", "range", "tool", "armor", "gem_stone" }); + public Elements() { + super("ELEMENT", Material.SLIME_BALL, "Elements", new String[]{"The elements of your item."}, + new String[]{"slashing", "piercing", "blunt", "offhand", "range", "tool", "armor", "gem_stone"}); + } - // Initialize paths - if (defenseNBTpaths == null) { + @Override + public RandomElementListData whenInitialized(Object object) { + Validate.isTrue(object instanceof ConfigurationSection, "Must specify a config section"); + return new RandomElementListData((ConfigurationSection) object); + } - // Initialize - defenseNBTpaths = new HashMap<>(); - damageNBTpaths = new HashMap<>(); + @Override + public void whenClicked(@NotNull EditionInventory inv, @NotNull InventoryClickEvent event) { + if (event.getAction() == InventoryAction.PICKUP_ALL) + new ElementsEdition(inv.getPlayer(), inv.getEdited()).open(inv.getPage()); - // Initialize - for (Element element : Element.values()) { + if (event.getAction() == InventoryAction.PICKUP_HALF) + if (inv.getEditedSection().contains("element")) { + inv.getEditedSection().set("element", null); + inv.registerTemplateEdition(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Elements successfully removed."); + } + } - // Add I guess - defenseNBTpaths.put(element, "MMOITEMS_" + element.name() + "_DEFENSE"); - damageNBTpaths.put(element, "MMOITEMS_" + element.name() + "_DAMAGE"); - } + @Override + public void whenInput(@NotNull EditionInventory inv, @NotNull String message, Object... info) { + String elementPath = info[0].toString(); - } - } + NumericStatFormula formula = new NumericStatFormula(message); + formula.fillConfigurationSection(inv.getEditedSection(), "element." + elementPath); - @Override - public RandomElementListData whenInitialized(Object object) { - Validate.isTrue(object instanceof ConfigurationSection, "Must specify a config section"); - return new RandomElementListData((ConfigurationSection) object); - } + // clear element config section + String elementName = elementPath.split("\\.")[0]; + if (inv.getEditedSection().contains("element")) { + if (inv.getEditedSection().getConfigurationSection("element").contains(elementName) + && inv.getEditedSection().getConfigurationSection("element." + elementName).getKeys(false).isEmpty()) + inv.getEditedSection().set("element." + elementName, null); + if (inv.getEditedSection().getConfigurationSection("element").getKeys(false).isEmpty()) + inv.getEditedSection().set("element", null); + } - @Override - public void whenClicked(@NotNull EditionInventory inv, @NotNull InventoryClickEvent event) { - if (event.getAction() == InventoryAction.PICKUP_ALL) - new ElementsEdition(inv.getPlayer(), inv.getEdited()).open(inv.getPage()); + inv.registerTemplateEdition(); + inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + ChatColor.RED + MMOUtils.caseOnWords(elementPath.replace(".", " ")) + ChatColor.GRAY + + " successfully changed to " + ChatColor.GOLD + formula.toString() + ChatColor.GRAY + "."); + } - if (event.getAction() == InventoryAction.PICKUP_HALF) - if (inv.getEditedSection().contains("element")) { - inv.getEditedSection().set("element", null); - inv.registerTemplateEdition(); - inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Elements successfully removed."); - } - } + @Override + public void whenDisplayed(List lore, Optional statData) { - @Override - public void whenInput(@NotNull EditionInventory inv, @NotNull String message, Object... info) { - String elementPath = info[0].toString(); + if (statData.isPresent()) { + lore.add(ChatColor.GRAY + "Current Value:"); + RandomElementListData data = statData.get(); + data.getKeys().forEach(key -> lore.add(ChatColor.GRAY + "* " + key + ": " + ChatColor.RED + data.getStat(key.getKey(), key.getValue()))); - NumericStatFormula formula = new NumericStatFormula(message); - formula.fillConfigurationSection(inv.getEditedSection(), "element." + elementPath); + } else + lore.add(ChatColor.GRAY + "Current Value: " + ChatColor.RED + "None"); - // clear element config section - String elementName = elementPath.split("\\.")[0]; - if (inv.getEditedSection().contains("element")) { - if (inv.getEditedSection().getConfigurationSection("element").contains(elementName) - && inv.getEditedSection().getConfigurationSection("element." + elementName).getKeys(false).isEmpty()) - inv.getEditedSection().set("element." + elementName, null); - if (inv.getEditedSection().getConfigurationSection("element").getKeys(false).isEmpty()) - inv.getEditedSection().set("element", null); - } + lore.add(""); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Click to access the elements edition menu."); + lore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove all the elements."); + } - inv.registerTemplateEdition(); - inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + ChatColor.RED + MMOUtils.caseOnWords(elementPath.replace(".", " ")) + ChatColor.GRAY - + " successfully changed to " + ChatColor.GOLD + formula.toString() + ChatColor.GRAY + "."); - } + @NotNull + @Override + public ElementListData getClearStatData() { + return new ElementListData(); + } - @Override - public void whenDisplayed(List lore, Optional statData) { + @Override + public void whenApplied(@NotNull ItemStackBuilder item, @NotNull ElementListData data) { - if (statData.isPresent()) { - lore.add(ChatColor.GRAY + "Current Value:"); - RandomElementListData data = (RandomElementListData) statData.get(); - data.getDamageElements().forEach( - element -> lore.add(ChatColor.GRAY + "* " + element.getName() + " Damage: " + ChatColor.RED + data.getDamage(element) + " (%)")); - data.getDefenseElements().forEach( - element -> lore.add(ChatColor.GRAY + "* " + element.getName() + " Damage: " + ChatColor.RED + data.getDefense(element) + " (%)")); + List lore = new ArrayList<>(); - } else - lore.add(ChatColor.GRAY + "Current Value: " + ChatColor.RED + "None"); + // Write Lore + for (Pair pair : data.getKeys()) { + final String format = ItemStat.translate("elemental-" + pair.getValue().lowerCaseName()) + .replace("#color", pair.getKey().getColor()) + .replace("#icon", pair.getKey().getLoreIcon()) + .replace("#name", pair.getKey().getName()); + double value = data.getStat(pair.getKey(), pair.getValue()); + lore.add(DoubleStat.formatPath(format, true, value)); + } - lore.add(""); - lore.add(ChatColor.YELLOW + AltChar.listDash + " Click to access the elements edition menu."); - lore.add(ChatColor.YELLOW + AltChar.listDash + " Right click to remove all the elements."); - } + // Insert non-empty lore + if (!lore.isEmpty()) + item.getLore().insert("elements", lore); - @NotNull - @Override - public ElementListData getClearStatData() { return new ElementListData(); } + // Addtags + item.addItemTag(getAppliedNBT(data)); + } - @Override - public void whenApplied(@NotNull ItemStackBuilder item, @NotNull ElementListData data) { + @NotNull + @Override + public ArrayList getAppliedNBT(@NotNull ElementListData data) { - // Write Lore - ElementListData elements = data; - for (Element element : elements.getDamageElements()) { - String path = element.name().toLowerCase() + "-damage"; - double value = elements.getDamage(element); - item.getLore().insert(path, DoubleStat.formatPath(ItemStat.translate(path), true, value)); } - for (Element element : elements.getDefenseElements()) { - String path = element.name().toLowerCase() + "-defense"; - double value = elements.getDefense(element); - item.getLore().insert(path, DoubleStat.formatPath(ItemStat.translate(path), true, value)); } + // Create Array + ArrayList ret = new ArrayList<>(); + for (Pair pair : data.getKeys()) + ret.add(new ItemTag("MMOITEMS_" + pair, data.getStat(pair.getKey(), pair.getValue()))); - // Addtags - item.addItemTag(getAppliedNBT(data)); - } + // Thats it + return ret; + } - @NotNull - @Override - public ArrayList getAppliedNBT(@NotNull ElementListData data) { + @Override + public void whenLoaded(@NotNull ReadMMOItem mmoitem) { - // Must be element list data - ElementListData elements = data; + // Seek the relevant tags + ArrayList relevantTags = new ArrayList<>(); + for (Element element : Element.values()) + for (ElementStatType statType : ElementStatType.values()) { + final String path = "MMOITEMS_" + element.getName() + "_" + statType.name(); + if (mmoitem.getNBT().hasTag(path)) + relevantTags.add(ItemTag.getTagAtPath(path, mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE)); + } - // Create Array - ArrayList ret = new ArrayList<>(); + // Generate Data + StatData data = getLoadedNBT(relevantTags); - // Add damages - for (Element element : elements.getDamageElements()) { + // Found? + if (data != null) { + mmoitem.setData(this, data); + } + } - // Obtain damage - double value = elements.getDamage(element); + @Nullable + @Override + public ElementListData getLoadedNBT(@NotNull ArrayList storedTags) { - // Create Tag - ret.add(new ItemTag(damageNBTpaths.get(element), value)); - } + // Create new + ElementListData elements = new ElementListData(); + boolean success = false; - // Add defenses - for (Element element : elements.getDefenseElements()) { + // Try to find every existing element + for (Element element : Element.values()) + for (ElementStatType statType : ElementStatType.values()) { + final String path = "MMOITEMS_" + element.getName() + "_" + statType.name(); + ItemTag tag = ItemTag.getTagAtPath(path, storedTags); + if (tag != null) + elements.setStat(element, statType, (double) tag.getValue()); + } - // Obtain defense - double value = elements.getDefense(element); + if (success) { + return elements; + } + return null; + } - // Create Tag - ret.add(new ItemTag(defenseNBTpaths.get(element), value)); - } + @Override + public void whenPreviewed(@NotNull ItemStackBuilder item, @NotNull ElementListData currentData, @NotNull RandomElementListData templateData) throws IllegalArgumentException { + Validate.isTrue(currentData instanceof ElementListData, "Current Data is not ElementListData"); + Validate.isTrue(templateData instanceof RandomElementListData, "Template Data is not RandomElementListData"); - // Thats it - return ret; - } + // Examine every element stat possible + for (Element element : Element.values()) + for (ElementStatType statType : ElementStatType.values()) { - @Override - public void whenLoaded(@NotNull ReadMMOItem mmoitem) { + NumericStatFormula nsf = templateData.getStat(element, statType); - // Seek the relevant tags - ArrayList relevantTags = new ArrayList<>(); - for (Element element : Element.values()) { + // Get Value + double techMinimum = nsf.calculate(0, -2.5); + double techMaximum = nsf.calculate(0, 2.5); - // Add I guess - if (mmoitem.getNBT().hasTag(damageNBTpaths.get(element))) - relevantTags.add(ItemTag.getTagAtPath(damageNBTpaths.get(element), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE)); + // Display if not ZERO + if (techMinimum != 0 || techMaximum != 0) { + // Get path + String path = element.getId().toLowerCase() + "-" + statType.name().toLowerCase().replace("_", "-"); - if (mmoitem.getNBT().hasTag(defenseNBTpaths.get(element))) - relevantTags.add(ItemTag.getTagAtPath(defenseNBTpaths.get(element), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE)); - } + String builtRange; + if (SilentNumbers.round(techMinimum, 2) == SilentNumbers.round(techMaximum, 2)) { + builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimum); + } else { + builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimum, techMaximum); + } - // Generate Data - StatData data = getLoadedNBT(relevantTags); + // Just display normally + item.getLore().insert(path, builtRange); + } + } - // Found? - if (data != null) { mmoitem.setData(this, data); } - } - - @Nullable - @Override - public ElementListData getLoadedNBT(@NotNull ArrayList storedTags) { - - // Create new - ElementListData elements = new ElementListData(); - boolean success = false; - - // Try to find every existing element - for (Element element : Element.values()) { - - // Find Damage and Defense Tags - ItemTag damTag = ItemTag.getTagAtPath(damageNBTpaths.get(element), storedTags); - ItemTag defTag = ItemTag.getTagAtPath(defenseNBTpaths.get(element), storedTags); - - // Found? - if (damTag != null) { elements.setDamage(element, (double) damTag.getValue()); success = true; } - if (defTag != null) { elements.setDefense(element, (double) defTag.getValue()); success = true; } - } - - if (success) { return elements; } - return null; - } - - static HashMap defenseNBTpaths = null; - static HashMap damageNBTpaths = null; - - @Override - public void whenPreviewed(@NotNull ItemStackBuilder item, @NotNull ElementListData currentData, @NotNull RandomElementListData templateData) throws IllegalArgumentException { - Validate.isTrue(currentData instanceof ElementListData, "Current Data is not ElementListData"); - Validate.isTrue(templateData instanceof RandomElementListData, "Template Data is not RandomElementListData"); - - // Examine every element - for (Element element : Element.values()) { - - NumericStatFormula nsf = ((RandomElementListData) templateData).getDamage(element); - NumericStatFormula nsfDEF = ((RandomElementListData) templateData).getDefense(element); - - // Get Value - double techMinimum = nsf.calculate(0, -2.5); - double techMaximum = nsf.calculate(0, 2.5); - - // Get Value - double techMinimumDEF = nsfDEF.calculate(0, -2.5); - double techMaximumDEF = nsfDEF.calculate(0, 2.5); - - // Display if not ZERO - if (techMinimum != 0 || techMaximum != 0) { - - // Get path - String path = element.name().toLowerCase() + "-damage"; - - String builtRange; - if (SilentNumbers.round(techMinimum, 2) == SilentNumbers.round(techMaximum, 2)) { builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimum); } - else { builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimum, techMaximum); } - - // Just display normally - item.getLore().insert(path, builtRange); } - - // Display if not ZERO - if (techMinimumDEF != 0 || techMaximumDEF != 0) { - - // Get path - String path = element.name().toLowerCase() + "-defense"; - - String builtRange; - if (SilentNumbers.round(techMinimumDEF, 2) == SilentNumbers.round(techMaximumDEF, 2)) { builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimumDEF); } - else { builtRange = DoubleStat.formatPath(ItemStat.translate(path), true, techMinimumDEF, techMaximumDEF); } - - // Just display normally - item.getLore().insert(path, builtRange); } - } - - // Addtags - item.addItemTag(getAppliedNBT(currentData)); - } + // Add tags + item.addItemTag(getAppliedNBT(currentData)); + } } diff --git a/src/main/java/net/Indyuce/mmoitems/stat/data/ElementListData.java b/src/main/java/net/Indyuce/mmoitems/stat/data/ElementListData.java index 3beeae3b..f335f456 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/data/ElementListData.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/data/ElementListData.java @@ -1,111 +1,64 @@ package net.Indyuce.mmoitems.stat.data; -import net.Indyuce.mmoitems.api.Element; +import io.lumine.mythic.lib.element.Element; import net.Indyuce.mmoitems.stat.data.type.Mergeable; import net.Indyuce.mmoitems.stat.data.type.StatData; +import net.Indyuce.mmoitems.util.ElementStatType; +import net.Indyuce.mmoitems.util.Pair; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Objects; import java.util.Set; public class ElementListData implements Mergeable { - @NotNull - private final Map damage = new HashMap<>(), defense = new HashMap<>(); + private final Map, Double> stats = new LinkedHashMap<>(); - /** - * No way to add the elements directly from the constructor. - *

- * Use the set methods for that. - */ - public ElementListData() { + public double getStat(Element element, ElementStatType statType) { + Double found = stats.get(Pair.of(element, statType)); + return found == null ? 0 : found; } - public double getDefense(Element element) { - return defense.getOrDefault(element, 0d); + public Set> getKeys() { + return stats.keySet(); } - public double getDamage(Element element) { - return damage.getOrDefault(element, 0d); - } - - public Set getDefenseElements() { - return defense.keySet(); - } - - public Set getDamageElements() { - return damage.keySet(); - } - - public void setDamage(Element element, double value) { - if (value == 0) - damage.remove(element); - else - damage.put(element, value); - } - - public void setDefense(Element element, double value) { - if (value == 0) - defense.remove(element); - else - defense.put(element, value); - } - - /** - * @return Total amount of stats (damage or defense) registered in that stat data. - */ - public int total() { - return damage.size() + defense.size(); + public void setStat(Element element, ElementStatType statType, double value) { + stats.put(Pair.of(element, statType), value); } @Override public void merge(StatData data) { Validate.isTrue(data instanceof ElementListData, "Cannot merge two different stat data types"); ElementListData extra = (ElementListData) data; - - for (Element element : extra.damage.keySet()) - damage.put(element, extra.damage.get(element) + damage.getOrDefault(element, 0d)); - for (Element element : extra.defense.keySet()) - defense.put(element, extra.defense.get(element) + defense.getOrDefault(element, 0d)); + extra.stats.forEach((key, value) -> stats.put(key, value)); } @NotNull @Override public StatData cloneData() { ElementListData ret = new ElementListData(); - damage.forEach((el, val) -> ret.damage.put(el, val)); - defense.forEach((el, val) -> ret.defense.put(el, val)); + stats.forEach((key, value) -> ret.stats.put(key, value)); return ret; } @Override public boolean isEmpty() { - return damage.isEmpty() && defense.isEmpty(); + return stats.isEmpty(); } @Override - public boolean equals(Object obj) { - if (!(obj instanceof ElementListData)) { - return false; - } - if (((ElementListData) obj).damage.size() != damage.size() || ((ElementListData) obj).defense.size() != defense.size()) { - return false; - } + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ElementListData that = (ElementListData) o; + return stats.equals(that.stats); + } - for (Element e : Element.values()) { - - double expectedDA = getDamage(e); - double expectedDE = getDefense(e); - double realDA = ((ElementListData) obj).getDamage(e); - double realDE = ((ElementListData) obj).getDefense(e); - - // Any differene? - if (expectedDA != realDA || expectedDE != realDE) { - return false; - } - } - - return true; + @Override + public int hashCode() { + return Objects.hash(stats); } } \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmoitems/stat/data/random/RandomElementListData.java b/src/main/java/net/Indyuce/mmoitems/stat/data/random/RandomElementListData.java index 7e9caf0c..e4fcd860 100644 --- a/src/main/java/net/Indyuce/mmoitems/stat/data/random/RandomElementListData.java +++ b/src/main/java/net/Indyuce/mmoitems/stat/data/random/RandomElementListData.java @@ -1,100 +1,85 @@ package net.Indyuce.mmoitems.stat.data.random; -import java.util.HashMap; +import io.lumine.mythic.lib.element.Element; +import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder; +import net.Indyuce.mmoitems.api.util.NumericStatFormula; +import net.Indyuce.mmoitems.stat.data.DoubleData; +import net.Indyuce.mmoitems.stat.data.ElementListData; +import net.Indyuce.mmoitems.stat.data.type.StatData; +import net.Indyuce.mmoitems.stat.type.ItemStat; +import net.Indyuce.mmoitems.util.ElementStatType; +import net.Indyuce.mmoitems.util.Pair; +import org.apache.commons.lang.Validate; +import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; -import net.Indyuce.mmoitems.stat.data.DoubleData; -import net.Indyuce.mmoitems.stat.type.ItemStat; -import org.apache.commons.lang.Validate; -import org.bukkit.configuration.ConfigurationSection; - -import net.Indyuce.mmoitems.api.Element; -import net.Indyuce.mmoitems.api.item.build.MMOItemBuilder; -import net.Indyuce.mmoitems.api.util.NumericStatFormula; -import net.Indyuce.mmoitems.stat.data.ElementListData; -import net.Indyuce.mmoitems.stat.data.type.StatData; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - public class RandomElementListData implements StatData, RandomStatData, UpdatableRandomStatData { - private final Map damage = new HashMap<>(), defense = new HashMap<>(); + private final Map, NumericStatFormula> stats = new LinkedHashMap<>(); - public RandomElementListData(ConfigurationSection config) { - Validate.notNull(config, "Config cannot be null"); + public RandomElementListData(ConfigurationSection config) { + Validate.notNull(config, "Config cannot be null"); - for (String key : config.getKeys(false)) { - Element element = Element.valueOf(key.toUpperCase()); - if (config.contains(key + ".damage")) - damage.put(element, new NumericStatFormula(config.get(key + ".damage"))); - if (config.contains(key + ".defense")) - defense.put(element, new NumericStatFormula(config.get(key + ".defense"))); - } - } + for (Element element : Element.values()) + for (ElementStatType statType : ElementStatType.values()) { + final String path = statType.getConcatenatedConfigPath(element); + if (config.contains(path)) + stats.put(Pair.of(element, statType), new NumericStatFormula(config.get(path))); + } + } - public boolean hasDamage(Element element) { - return damage.containsKey(element); - } + public boolean hasStat(Element element, ElementStatType statType) { + return stats.containsKey(statType.getConcatenatedTagPath(element)); + } - public boolean hasDefense(Element element) { - return defense.containsKey(element); - } + @NotNull + public NumericStatFormula getStat(Element element, ElementStatType statType) { + return stats.getOrDefault(Pair.of(element, statType), NumericStatFormula.ZERO); + } - @NotNull public NumericStatFormula getDefense(@NotNull Element element) { return defense.getOrDefault(element, NumericStatFormula.ZERO); } - @NotNull public NumericStatFormula getDamage(@NotNull Element element) { return damage.getOrDefault(element, NumericStatFormula.ZERO); } + public Set> getKeys() { + return stats.keySet(); + } - public Set getDefenseElements() { - return defense.keySet(); - } + public void setStat(Element element, ElementStatType statType, NumericStatFormula formula) { + stats.put(Pair.of(element, statType), formula); + } - public Set getDamageElements() { - return damage.keySet(); - } + @Override + public ElementListData randomize(MMOItemBuilder builder) { + ElementListData elements = new ElementListData(); + stats.forEach((key, value) -> elements.setStat(key.getKey(), key.getValue(), value.calculate(builder.getLevel()))); + return elements; + } - public void setDamage(Element element, NumericStatFormula formula) { - damage.put(element, formula); - } + @NotNull + @Override + @SuppressWarnings("unchecked") + public T reroll(@NotNull ItemStat stat, @NotNull T original, int determinedItemLevel) { - public void setDefense(Element element, NumericStatFormula formula) { - defense.put(element, formula); - } + // Start brand new + ElementListData elements = new ElementListData(); + ElementListData originalElements = (ElementListData) original; - @Override - public ElementListData randomize(MMOItemBuilder builder) { - ElementListData elements = new ElementListData(); - damage.forEach((element, formula) -> elements.setDamage(element, formula.calculate(builder.getLevel()))); - defense.forEach((element, formula) -> elements.setDefense(element, formula.calculate(builder.getLevel()))); - return elements; - } + // Evaluate each + for (Element element : Element.values()) + for (ElementStatType statType : ElementStatType.values()) { - @NotNull - @Override - @SuppressWarnings("unchecked") - public T reroll(@NotNull ItemStat stat, @NotNull T original, int determinedItemLevel) { + // Whats its + NumericStatFormula currentTemplateData = getStat(element, statType); + DoubleData itemData = new DoubleData(originalElements.getStat(element, statType)); - // Start brand new - ElementListData elements = new ElementListData(); - ElementListData originalElements = (ElementListData) original; + // Evaluate + DoubleData result = currentTemplateData.reroll(stat, itemData, determinedItemLevel); - // Evaluate each - for (Element elm : Element.values()) { + // Apply + elements.setStat(element, statType, result.getValue()); + } - // Whats its - NumericStatFormula damageGen = getDamage(elm); - NumericStatFormula defenseGen = getDefense(elm); - DoubleData damageVal = new DoubleData(originalElements.getDamage(elm)); - DoubleData defenseVal = new DoubleData(originalElements.getDefense(elm)); - - // Evaluate - DoubleData damageResult = damageGen.reroll(stat, damageVal, determinedItemLevel); - DoubleData defenseResult = defenseGen.reroll(stat, defenseVal, determinedItemLevel); - - // Apply - elements.setDamage(elm, damageResult.getValue()); - elements.setDefense(elm, defenseResult.getValue()); - } - - // THats it - return (T) elements; - } + // THats it + return (T) elements; + } } \ No newline at end of file diff --git a/src/main/java/net/Indyuce/mmoitems/util/ElementStatType.java b/src/main/java/net/Indyuce/mmoitems/util/ElementStatType.java new file mode 100644 index 00000000..869872ed --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/util/ElementStatType.java @@ -0,0 +1,33 @@ +package net.Indyuce.mmoitems.util; + +import io.lumine.mythic.lib.element.Element; + +public enum ElementStatType { + DAMAGE("Flat Damage"), + DAMAGE_PERCENT("Extra Damage (%)"), + WEAKNESS("Weakness (%)"), + DEFENSE("Defense"), + DEFENSE_PERCENT("Extra Defense (%)"); + + private final String name; + + ElementStatType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public String lowerCaseName() { + return name().toLowerCase().replace("_", "-"); + } + + public String getConcatenatedTagPath(Element element) { + return element.getId() + "_" + name(); + } + + public String getConcatenatedConfigPath(Element element) { + return element.getId().toLowerCase().replace("_", "-") + "." + name().toLowerCase().replace("_", "-"); + } +} diff --git a/src/main/java/net/Indyuce/mmoitems/util/Pair.java b/src/main/java/net/Indyuce/mmoitems/util/Pair.java new file mode 100644 index 00000000..f9ac317b --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/util/Pair.java @@ -0,0 +1,40 @@ +package net.Indyuce.mmoitems.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class Pair { + private final K key; + private final V value; + + public Pair(@NotNull K var1, @NotNull V var2) { + this.key = var1; + this.value = var2; + } + + public static Pair of(@NotNull K var0, @NotNull V var1) { + return new Pair(var0, var1); + } + + public K getKey() { + return this.key; + } + + public V getValue() { + return this.value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair pair = (Pair) o; + return key.equals(pair.key) && value.equals(pair.value); + } + + @Override + public int hashCode() { + return Objects.hash(key, value); + } +} \ No newline at end of file diff --git a/src/main/resources/default/language/lore-format.yml b/src/main/resources/default/language/lore-format.yml index 502bd819..88005986 100644 --- a/src/main/resources/default/language/lore-format.yml +++ b/src/main/resources/default/language/lore-format.yml @@ -8,150 +8,135 @@ # # Reload with /mmoitems reload lore-format: -# - '{bar}&8&m--------&f&l &nGeneral&8 &m--------------' -- '#item-type#' -- '{bar}' -- '#required-class#' -- '#required-level#' -- '#required-dexterity#' -- '#required-strength#' -- '#required-intelligence#' -- '#success-rate#' -- '{bar}' -- '#soulbound#' -# - '{bar}&8&m--------&f&l &nProfessions&8 &m--------------' -- '#profession-alchemy#' -- '#profession-enchanting#' -- '#profession-farming#' -- '#profession-fishing#' -- '#profession-mining#' -- '#profession-smelting#' -- '#profession-smithing#' -- '#profession-woodcutting#' -# - '{bar}&8&m--------&f&l &nStatistics&8 &m-------------' -- '{bar}' -- '#can-identify#' -- '#can-deconstruct#' -- '#can-deskin#' -- '#attack-damage#' -- '#knockback#' -- '#recoil#' -- '#note-weight#' -- '#attack-speed#' -- '#arrow-velocity#' -- '#critical-strike-chance#' -- '#critical-strike-power#' -- '#skill-critical-strike-chance#' -- '#skill-critical-strike-power#' -- '#range#' -- '#pvp-damage#' -- '#pve-damage#' -- '#blunt-power#' -- '#blunt-rating#' -- '#weapon-damage#' -- '#magic-damage#' -- '#skill-damage#' -- '#physical-damage#' -- '#projectile-damage#' -- '#defense#' -- '#damage-reduction#' -- '#fall-damage-reduction#' -- '#fire-damage-reduction#' -- '#magic-damage-reduction#' -- '#projectile-damage-reduction#' -- '#physical-damage-reduction#' -- '#pve-damage-reduction#' -- '#pvp-damage-reduction#' -- '#undead-damage#' -- '#faction-damage-undead#' -- '#block-power#' -- '#block-rating#' -- '#dodge-rating#' -- '#parry-rating#' -- '#block-cooldown-reduction#' -- '#dodge-cooldown-reduction#' -- '#parry-cooldown-reduction#' -- '#armor#' -- '#armor-toughness#' -- '#knockback-resistance#' -- '#max-health#' -- '#max-mana#' -- '#max-stamina#' -- '#health-regeneration#' -- '#mana-regeneration#' -- '#stamina-regeneration#' -- '#movement-speed#' -- '#staff-spirit#' -- '#lute-attack-effect#' -- '#two-handed#' -- '#handworn#' -- '#autosmelt#' -- '#bouncing-crack#' -- '#pickaxe-power#' -- '#restore-health#' -- '#restore-food#' -- '#restore-saturation#' -- '#restore-mana#' -- '#restore-stamina#' -- '#soulbinding-chance#' -- '#soulbound-break-chance#' -- '#soulbound-level#' -- '#repair#' -- '#repair-percent#' -- '#item-cooldown#' -- '#lifesteal#' -- '#spell-vampirism#' -- '#additional-experience#' -- '#additional-experience-alchemy#' -- '#additional-experience-enchanting#' -- '#additional-experience-farming#' -- '#additional-experience-fishing#' -- '#additional-experience-mining#' -- '#additional-experience-smelting#' -- '#additional-experience-smithing#' -- '#additional-experience-woodcutting#' -- '#cooldown-reduction#' -- '#mana-cost#' -- '#stamina-cost#' -- '#max-consume#' -# - '{bar}&8&m--------&2&l &nElements&8 &m--------------' -- '{bar}' -- '#fire-damage#' -- '#fire-defense#' -- '#ice-damage#' -- '#ice-defense#' -- '#wind-damage#' -- '#wind-defense#' -- '#earth-damage#' -- '#earth-defense#' -- '#thunder-damage#' -- '#thunder-defense#' -- '#water-damage#' -- '#water-defense#' -- '#darkness-damage#' -- '#darkness-defense#' -- '#lightness-damage#' -- '#lightness-defense#' -# - '{bar}&8&m--------&b&l &nEffects&8 &m---------------' -- '{bar}' -- '#effects#' -# - '{bar}&8&m--------&b&l &nAbilities&8 &m--------------' -- '{bar}' -- '#abilities#' -- '{bar}' -- '#commands#' -# - '{bar}&8&m--------&b&l &nEffects&8 &m---------------' -# - '#perm-effects#' -# - '#arrow-potion-effects#' -# - '{bar}&8&m--------&e&l &nGem Stones&8 &m-----------' -- '{bar}' -- '#gem-stones#' -# - '{sbar}&8&m--------------------------------' -- '{bar}' -- '#lore#' -- '#gem-stone-lore#' -- '{bar}' -- '#set#' -- '{bar}' -- '#tier#' -- '#durability#' \ No newline at end of file + # - '{bar}&8&m--------&f&l &nGeneral&8 &m--------------' + - '#item-type#' + - '{bar}' + - '#required-class#' + - '#required-level#' + - '#required-dexterity#' + - '#required-strength#' + - '#required-intelligence#' + - '#success-rate#' + - '{bar}' + - '#soulbound#' + # - '{bar}&8&m--------&f&l &nProfessions&8 &m--------------' + - '#profession-alchemy#' + - '#profession-enchanting#' + - '#profession-farming#' + - '#profession-fishing#' + - '#profession-mining#' + - '#profession-smelting#' + - '#profession-smithing#' + - '#profession-woodcutting#' + # - '{bar}&8&m--------&f&l &nStatistics&8 &m-------------' + - '{bar}' + - '#can-identify#' + - '#can-deconstruct#' + - '#can-deskin#' + - '#attack-damage#' + - '#knockback#' + - '#recoil#' + - '#note-weight#' + - '#attack-speed#' + - '#arrow-velocity#' + - '#critical-strike-chance#' + - '#critical-strike-power#' + - '#skill-critical-strike-chance#' + - '#skill-critical-strike-power#' + - '#range#' + - '#pvp-damage#' + - '#pve-damage#' + - '#blunt-power#' + - '#blunt-rating#' + - '#weapon-damage#' + - '#magic-damage#' + - '#skill-damage#' + - '#physical-damage#' + - '#projectile-damage#' + - '#defense#' + - '#damage-reduction#' + - '#fall-damage-reduction#' + - '#fire-damage-reduction#' + - '#magic-damage-reduction#' + - '#projectile-damage-reduction#' + - '#physical-damage-reduction#' + - '#pve-damage-reduction#' + - '#pvp-damage-reduction#' + - '#undead-damage#' + - '#faction-damage-undead#' + - '#block-power#' + - '#block-rating#' + - '#dodge-rating#' + - '#parry-rating#' + - '#block-cooldown-reduction#' + - '#dodge-cooldown-reduction#' + - '#parry-cooldown-reduction#' + - '#armor#' + - '#armor-toughness#' + - '#knockback-resistance#' + - '#max-health#' + - '#max-mana#' + - '#max-stamina#' + - '#health-regeneration#' + - '#mana-regeneration#' + - '#stamina-regeneration#' + - '#movement-speed#' + - '#staff-spirit#' + - '#lute-attack-effect#' + - '#two-handed#' + - '#handworn#' + - '#autosmelt#' + - '#bouncing-crack#' + - '#pickaxe-power#' + - '#restore-health#' + - '#restore-food#' + - '#restore-saturation#' + - '#restore-mana#' + - '#restore-stamina#' + - '#soulbinding-chance#' + - '#soulbound-break-chance#' + - '#soulbound-level#' + - '#repair#' + - '#repair-percent#' + - '#item-cooldown#' + - '#lifesteal#' + - '#spell-vampirism#' + - '#additional-experience#' + - '#additional-experience-alchemy#' + - '#additional-experience-enchanting#' + - '#additional-experience-farming#' + - '#additional-experience-fishing#' + - '#additional-experience-mining#' + - '#additional-experience-smelting#' + - '#additional-experience-smithing#' + - '#additional-experience-woodcutting#' + - '#cooldown-reduction#' + - '#mana-cost#' + - '#stamina-cost#' + - '#max-consume#' + # - '{bar}&8&m--------&2&l &nElements&8 &m--------------' + - '{bar}' + - '#elements#' + # - '{bar}&8&m--------&b&l &nEffects&8 &m---------------' + - '{bar}' + - '#effects#' + # - '{bar}&8&m--------&b&l &nAbilities&8 &m--------------' + - '{bar}' + - '#abilities#' + - '{bar}' + - '#commands#' + # - '{bar}&8&m--------&b&l &nEffects&8 &m---------------' + # - '#perm-effects#' + # - '#arrow-potion-effects#' + # - '{bar}&8&m--------&e&l &nGem Stones&8 &m-----------' + - '{bar}' + - '#gem-stones#' + # - '{sbar}&8&m--------------------------------' + - '{bar}' + - '#lore#' + - '#gem-stone-lore#' + - '{bar}' + - '#set#' + - '{bar}' + - '#tier#' + - '#durability#' \ No newline at end of file diff --git a/src/main/resources/default/language/stats.yml b/src/main/resources/default/language/stats.yml index 5c6861b4..daa054a0 100644 --- a/src/main/resources/default/language/stats.yml +++ b/src/main/resources/default/language/stats.yml @@ -136,22 +136,9 @@ profession-smelting: '&eSmelting Level: &c#' profession-smithing: '&eSmithing Level: &c#' profession-woodcutting: '&eWoodcutting Level: &c#' -# Elemental Damage -fire-damage: '&c ❖ #% Fire Damage' -ice-damage: '&b ❖ #% Ice Damage' -earth-damage: '&2 ❖ #% Earth Damage' -wind-damage: '&3 &7❖ #% Wind Damage' -thunder-damage: '&e ❖ #% Thunder Damage' -water-damage: '&3 ❖ #% Water Damage' -darkness-damage: '&8 ❖ #% Darkness Damage' -lightness-damage: '&f ❖ #% Light Damage' - -# Elemental Defense -fire-defense: '&c ❖ #% Fire Defense' -ice-defense: '&b ❖ #% Ice Defense' -earth-defense: '&2 ❖ #% Earth Defense' -wind-defense: '&3 &7❖ #% Wind Defense' -thunder-defense: '&e ❖ #% Thunder Defense' -water-defense: '&3 ❖ #% Water Defense' -darkness-defense: '&8 ❖ #% Darkness Defense' -lightness-defense: '&f ❖ #% Light Defense' +# Elemental Stat Format +elemental-damage: '#color#icon&7 # #name Damage' +elemental-damage-percent: '#color#icon&7 +#% #name Damage' +elemental-defense: '#color#icon&7 # #name Defense' +elemental-defense-percent: '#color#icon&7 +#% #name Defense' +elemental-weakness: '#color#icon&7 #% #name Weakness' \ No newline at end of file