@@ -47,12 +49,13 @@ public class EntityManager implements Listener {
*
* @param sourceItem Item used to shoot the projectile
* @param attacker Cached stats of the player shooting the projectile
+ * @param shootEvent Event that caused this projectile registration.
* @param entity The custom entity
* @param customWeapon Is the source weapon is a custom item
* @param damageMultiplicator The damage coefficient. For bows, this is basically the pull force.
* For tridents or anything else this is always set to 1
*/
- public void registerCustomProjectile(NBTItem sourceItem, PlayerMetadata attacker, Entity entity, boolean customWeapon, double damageMultiplicator) {
+ public void registerCustomProjectile(@NotNull NBTItem sourceItem, @NotNull PlayerMetadata attacker, @NotNull Entity entity, @Nullable EntityShootBowEvent shootEvent, boolean customWeapon, double damageMultiplicator) {
/*
* For bows, MC default value is 7. When using custom bows, the attack
@@ -64,10 +67,16 @@ public class EntityManager implements Listener {
* and 1 for bows, and it's always 1 for tridents or crossbows.
*/
double damage = attacker.getStat("ATTACK_DAMAGE");
- damage = (customWeapon ? damage : 5 + damage) * damageMultiplicator;
- ItemAttackMetadata attackMeta = new ItemAttackMetadata(new DamageMetadata(damage, DamageType.WEAPON, DamageType.PHYSICAL, DamageType.PROJECTILE), attacker);
- attacker.setStat("ATTACK_DAMAGE", damage);
+ // Sweet event
+ MMOItemsProjectileFireEvent event = new MMOItemsProjectileFireEvent(attacker, entity, sourceItem, shootEvent, (customWeapon ? damage : 5 + damage), damageMultiplicator);
+ Bukkit.getPluginManager().callEvent(event);
+
+ // Update based one vent
+ double finalDamage = event.getFinalDamage();
+
+ ItemAttackMetadata attackMeta = new ItemAttackMetadata(new DamageMetadata(finalDamage, event.getDamageTypes()), attacker);
+ attacker.setStat("ATTACK_DAMAGE", finalDamage);
/*
* Load arrow particles if the entity is an arrow and if the item has
diff --git a/src/main/java/net/Indyuce/mmoitems/stat/Abilities.java b/src/main/java/net/Indyuce/mmoitems/stat/Abilities.java
index 61138261..7357e8f7 100644
--- a/src/main/java/net/Indyuce/mmoitems/stat/Abilities.java
+++ b/src/main/java/net/Indyuce/mmoitems/stat/Abilities.java
@@ -113,7 +113,8 @@ public class Abilities extends ItemStat {
String configKey = (String) info[0];
String edited = (String) info[1];
- String format = message.toUpperCase().replace("-", "_").replace(" ", "_").replaceAll("[^A-Z_]", "");
+ String format = message.toUpperCase().replace("-", "_").replace(" ", "_").replaceAll("[^A-Z0-9_]", "");
+
if (edited.equals("ability")) {
Validate.isTrue(MMOItems.plugin.getSkills().hasSkill(format),
"format is not a valid ability! You may check the ability list using /mi list ability.");
@@ -128,7 +129,9 @@ public class Abilities extends ItemStat {
}
if (edited.equals("mode")) {
+
TriggerType castMode = TriggerType.valueOf(format);
+
inv.getEditedSection().set("ability." + configKey + ".mode", castMode.name());
inv.registerTemplateEdition();
inv.getPlayer().sendMessage(MMOItems.plugin.getPrefix() + "Successfully set the trigger to " + ChatColor.GOLD + castMode.getName()
diff --git a/src/main/java/net/Indyuce/mmoitems/stat/data/AbilityData.java b/src/main/java/net/Indyuce/mmoitems/stat/data/AbilityData.java
index 0230bf46..448a7b43 100644
--- a/src/main/java/net/Indyuce/mmoitems/stat/data/AbilityData.java
+++ b/src/main/java/net/Indyuce/mmoitems/stat/data/AbilityData.java
@@ -28,8 +28,8 @@ import java.util.Set;
public class AbilityData extends Skill {
private final RegisteredSkill ability;
- private final TriggerType triggerType;
- private final Map