ability cleanup

This commit is contained in:
Indyuce 2021-12-30 09:56:00 +01:00
parent 6278b50460
commit 392eaceaaf
16 changed files with 122 additions and 65 deletions

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.Indyuce</groupId>
<artifactId>MMOItems</artifactId>
<version>6.6.5</version>
<version>6.7</version>
<name>MMOItems</name>
<description>A great item solution for your RPG server!!</description>
@ -141,7 +141,7 @@
<dependency>
<groupId>io.lumine</groupId>
<artifactId>MythicLib-dist</artifactId>
<version>1.2</version>
<version>1.3</version>
<scope>provided</scope>
</dependency>

View File

@ -8,19 +8,17 @@ import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.ItemAbility;
import net.Indyuce.mmoitems.ability.metadata.ItemAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.api.util.NoClipItem;
import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
public class Item_Bomb extends ItemAbility implements Listener {
public class Item_Bomb extends ItemAbility {
public Item_Bomb() {
super();

View File

@ -13,11 +13,10 @@ import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
public class Item_Throw extends ItemAbility implements Listener {
public class Item_Throw extends ItemAbility {
public Item_Throw() {
super();

View File

@ -65,7 +65,7 @@ public class Chicken_Wraith extends SimpleAbility {
private final double damage;
public EggHandler(double damage) {
super(EntityDamageByEntityEvent.getHandlerList());
super(EntityDamageByEntityEvent.getHandlerList(), PlayerEggThrowEvent.getHandlerList());
this.damage = damage;
}

View File

@ -7,10 +7,9 @@ import net.Indyuce.mmoitems.ability.metadata.SimpleAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
public class Frog_Mode extends SimpleAbility implements Listener {
public class Frog_Mode extends SimpleAbility {
public Frog_Mode() {
super();

View File

@ -9,12 +9,11 @@ import org.bukkit.Particle;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Listener;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
public class Frozen_Aura extends SimpleAbility implements Listener {
public class Frozen_Aura extends SimpleAbility {
public Frozen_Aura() {
super();

View File

@ -75,8 +75,7 @@ public class Magical_Shield extends SimpleAbility {
@Override
public void run() {
ti++;
if (ti > duration * 20. / 3.)
if (ti++ > duration * 20. / 3.)
close();
for (double j = 0; j < Math.PI / 2; j += Math.PI / (28 + random.nextInt(5)))

View File

@ -17,7 +17,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.scheduler.BukkitRunnable;
public class Shadow_Veil extends SimpleAbility implements Listener {
public class Shadow_Veil extends SimpleAbility {
public Shadow_Veil() {
super();

View File

@ -7,16 +7,14 @@ import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.SimpleAbility;
import net.Indyuce.mmoitems.ability.metadata.SimpleAbilityMetadata;
import io.lumine.mythic.lib.damage.AttackMetadata;
import net.Indyuce.mmoitems.api.util.NoClipItem;
import org.bukkit.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
public class Throw_Up extends SimpleAbility implements Listener {
public class Throw_Up extends SimpleAbility {
public Throw_Up() {
super();

View File

@ -12,7 +12,6 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.EvokerFangs;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
@ -20,7 +19,7 @@ import org.bukkit.util.Vector;
import java.util.HashSet;
import java.util.Set;
public class Corrupted_Fangs extends VectorAbility implements Listener {
public class Corrupted_Fangs extends VectorAbility {
public Corrupted_Fangs() {
super();

View File

@ -16,12 +16,11 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
public class Explosive_Turkey extends VectorAbility implements Listener {
public class Explosive_Turkey extends VectorAbility {
public Explosive_Turkey() {
super();

View File

@ -12,11 +12,10 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.util.Vector;
public class TNT_Throw extends VectorAbility implements Listener {
public class TNT_Throw extends VectorAbility {
public TNT_Throw() {
super();

View File

@ -358,9 +358,14 @@ public class PlayerData {
* @param attack Current attack
* @param target Ability target, can be null
* @param ability Ability to cast
* @deprecated
*/
@Deprecated
public void cast(AttackMetadata attack, LivingEntity target, AbilityData ability) {
/*
* Apply simple conditions including mana and stamina cost, permission
* and cooldown checks
@ -385,14 +390,7 @@ public class PlayerData {
* The player can cast the ability, and it was successfully cast on its
* target, removes resources needed from the player
*/
if (ability.hasModifier("mana"))
rpgPlayer.giveMana(-abilityMetadata.getModifier("mana"));
if (ability.hasModifier("stamina"))
rpgPlayer.giveStamina(-abilityMetadata.getModifier("stamina"));
double cooldown = abilityMetadata.getModifier("cooldown") * (1 - Math.min(.8, stats.getStat(ItemStats.COOLDOWN_REDUCTION) / 100));
if (cooldown > 0)
mmoData.getCooldownMap().applyCooldown(ability.getAbility(), cooldown);
/*
* Finally cast the ability; BUG FIX: cooldown MUST be applied BEFORE

View File

@ -2,6 +2,7 @@ package net.Indyuce.mmoitems.api.player;
import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.player.cooldown.CooldownInfo;
import io.lumine.mythic.lib.skill.SkillMetadata;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.api.util.message.Message;
import net.Indyuce.mmoitems.stat.data.AbilityData;
@ -136,7 +137,9 @@ public abstract class RPGPlayer {
*
* @param data Ability being cast
* @return If the player can cast the ability
* @deprecated Replaced by {@link AbilityData#getResult(SkillMetadata)}
*/
@Deprecated
public boolean canCast(AbilityData data) {
if (playerData.getMMOPlayerData().getCooldownMap().isOnCooldown(data.getAbility())) {

View File

@ -1,13 +1,14 @@
package net.Indyuce.mmoitems.command.mmoitems;
import io.lumine.mythic.lib.api.player.EquipmentSlot;
import io.lumine.mythic.lib.damage.DamageMetadata;
import io.lumine.mythic.lib.commands.mmolib.api.CommandTreeNode;
import io.lumine.mythic.lib.commands.mmolib.api.Parameter;
import io.lumine.mythic.lib.damage.AttackMetadata;
import io.lumine.mythic.lib.damage.DamageMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.ItemAttackMetadata;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.stat.data.AbilityData;
import org.bukkit.Bukkit;
@ -75,7 +76,8 @@ public class AbilityCommandTreeNode extends CommandTreeNode {
}
PlayerData data = PlayerData.get(target);
data.cast(new ItemAttackMetadata(new DamageMetadata(), data.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND)), null, ability);
AttackMetadata attackMeta = new AttackMetadata(new DamageMetadata(), data.getMMOPlayerData().getStatMap().cache(EquipmentSlot.MAIN_HAND));
ability.cast(new TriggerMetadata(attackMeta, null));
return CommandResult.SUCCESS;
}
}

View File

@ -1,56 +1,38 @@
package net.Indyuce.mmoitems.stat.data;
import com.google.gson.JsonObject;
import io.lumine.mythic.lib.comp.mythicmobs.MythicSkillInfo;
import io.lumine.mythic.lib.player.cooldown.CooldownInfo;
import io.lumine.mythic.lib.skill.Skill;
import io.lumine.mythic.lib.skill.SkillMetadata;
import io.lumine.mythic.lib.skill.handler.SkillHandler;
import io.lumine.mythic.lib.skill.trigger.TriggerMetadata;
import io.lumine.mythic.lib.skill.trigger.TriggerType;
import io.lumine.mythic.lib.skill.trigger.TriggeredSkill;
import net.Indyuce.mmoitems.ItemStats;
import net.Indyuce.mmoitems.MMOItems;
import net.Indyuce.mmoitems.MMOUtils;
import net.Indyuce.mmoitems.ability.Ability;
import net.Indyuce.mmoitems.api.player.PlayerData;
import net.Indyuce.mmoitems.api.player.RPGPlayer;
import net.Indyuce.mmoitems.api.util.message.Message;
import org.apache.commons.lang.Validate;
import org.bukkit.ChatColor;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class AbilityData implements MythicSkillInfo, TriggeredSkill {
public class AbilityData extends Skill {
private final Ability ability;
private final TriggerType triggerType;
private final Map<String, Double> modifiers = new HashMap<>();
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AbilityData)) { return false; }
// Compare casitng mode
if (((AbilityData) obj).getTriggerType() != getTriggerType()) { return false; }
// Not same ability
if (!((AbilityData) obj).getAbility().equals(getAbility())) { return false; }
// Check modifiers
for (String mod : ((AbilityData) obj).getModifiers()) {
// Any difference?
double objMod = ((AbilityData) obj).getModifier(mod);
double thisMod = getModifier(mod);
if (objMod != thisMod) { return false; } }
// Success
return true;
}
@Override
public void execute(@Nullable TriggerMetadata triggerMetadata) {
PlayerData playerData = PlayerData.get(triggerMetadata.getAttack().getPlayer().getUniqueId());
playerData.cast(triggerMetadata.getAttack(), triggerMetadata.getTarget() instanceof LivingEntity ? (LivingEntity) triggerMetadata.getTarget() : null, this);
}
public AbilityData(JsonObject object) {
ability = MMOItems.plugin.getAbilities().getAbility(object.get("Id").getAsString());
triggerType = MMOUtils.backwardsCompatibleTriggerType(object.get("CastMode").getAsString());
@ -92,6 +74,7 @@ public class AbilityData implements MythicSkillInfo, TriggeredSkill {
}
public void setModifier(String path, double value) {
// Validate.isTrue(getHandler().getModifiers().contains(path), "Could not find modifier called '" + path + "'");
modifiers.put(path, value);
}
@ -99,6 +82,75 @@ public class AbilityData implements MythicSkillInfo, TriggeredSkill {
return modifiers.containsKey(path);
}
@NotNull
@Override
public boolean getResult(SkillMetadata meta) {
PlayerData playerData = PlayerData.get(meta.getCaster().getUniqueId());
RPGPlayer rpgPlayer = playerData.getRPG();
Player player = meta.getCaster().getPlayer();
// Check for cooldown
if (meta.getCaster().getCooldownMap().isOnCooldown(this)) {
CooldownInfo info = playerData.getMMOPlayerData().getCooldownMap().getInfo(this);
if (!triggerType.isSilent()) {
StringBuilder progressBar = new StringBuilder(ChatColor.YELLOW + "");
double progress = (double) (info.getInitialCooldown() - info.getRemaining()) / info.getInitialCooldown() * 10;
String barChar = MMOItems.plugin.getConfig().getString("cooldown-progress-bar-char");
for (int j = 0; j < 10; j++)
progressBar.append(progress >= j ? ChatColor.GREEN : ChatColor.WHITE).append(barChar);
Message.SPELL_ON_COOLDOWN.format(ChatColor.RED, "#left#", "" + new DecimalFormat("0.#").format(info.getRemaining() / 1000d), "#progress#",
progressBar.toString(), "#s#", (info.getRemaining() > 1999 ? "s" : "")).send(player);
}
return false;
}
// Check for permission
if (MMOItems.plugin.getConfig().getBoolean("permissions.abilities")
&& !player.hasPermission("mmoitems.ability." + getHandler().getId().toLowerCase().replace("_", "-"))
&& !player.hasPermission("mmoitems.bypass.ability"))
return false;
// Check for mana cost
if (hasModifier("mana") && rpgPlayer.getMana() < getModifier("mana")) {
Message.NOT_ENOUGH_MANA.format(ChatColor.RED).send(player);
return false;
}
// Check for stamina cost
if (hasModifier("stamina") && rpgPlayer.getStamina() < getModifier("stamina")) {
Message.NOT_ENOUGH_STAMINA.format(ChatColor.RED).send(player);
return false;
}
return true;
}
@Override
public void whenCast(SkillMetadata meta) {
PlayerData playerData = PlayerData.get(meta.getCaster().getUniqueId());
RPGPlayer rpgPlayer = playerData.getRPG();
// Apply mana cost
if (hasModifier("mana"))
rpgPlayer.giveMana(-meta.getModifier("mana"));
// Apply stamina cost
if (hasModifier("stamina"))
rpgPlayer.giveStamina(-meta.getModifier("stamina"));
// Apply cooldown
double cooldown = meta.getModifier("cooldown") * (1 - Math.min(.8, meta.getStats().getStat("COOLDOWN_REDUCTION") / 100));
if (cooldown > 0)
meta.getCaster().getCooldownMap().applyCooldown(this, cooldown);
}
@Override
public SkillHandler getHandler() {
// TODO
return null;
}
@Override
public double getModifier(String path) {
return modifiers.getOrDefault(path, ability.getDefaultValue(path));
@ -115,4 +167,17 @@ public class AbilityData implements MythicSkillInfo, TriggeredSkill {
return object;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbilityData that = (AbilityData) o;
return ability.equals(that.ability) && triggerType == that.triggerType && modifiers.equals(that.modifiers);
}
@Override
public int hashCode() {
return Objects.hash(ability, triggerType, modifiers);
}
}