Spectral arrows are now considered arrows

This commit is contained in:
Jules 2023-04-15 21:19:14 +02:00
parent d1f2af29c3
commit 3600ce63e4
4 changed files with 19 additions and 20 deletions

View File

@ -4,14 +4,14 @@ import io.lumine.mythic.lib.api.item.NBTItem;
import io.lumine.mythic.lib.gson.JsonParser;
import io.lumine.mythic.lib.player.particle.ParticleInformation;
import net.Indyuce.mmoitems.MMOItems;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.AbstractArrow;
import org.bukkit.scheduler.BukkitRunnable;
public class ArrowParticles extends BukkitRunnable {
private final Arrow arrow;
private final AbstractArrow arrow;
private final ParticleInformation particleInfo;
public ArrowParticles(Arrow arrow, NBTItem item) {
public ArrowParticles(AbstractArrow arrow, NBTItem item) {
this.arrow = arrow;
this.particleInfo = new ParticleInformation(JsonParser.parseString(item.getString("MMOITEMS_ARROW_PARTICLES")).getAsJsonObject());

View File

@ -74,10 +74,8 @@ public class ProjectileData {
}
public void applyPotionEffects(LivingEntity target) {
if (sourceItem.hasTag("MMOITEMS_ARROW_POTION_EFFECTS")) {
for (ArrowPotionEffectArrayItem entry : MythicLib.plugin.getJson().parse(sourceItem.getString("MMOITEMS_ARROW_POTION_EFFECTS"), ArrowPotionEffectArrayItem[].class)) {
if (sourceItem.hasTag("MMOITEMS_ARROW_POTION_EFFECTS"))
for (ArrowPotionEffectArrayItem entry : MythicLib.plugin.getJson().parse(sourceItem.getString("MMOITEMS_ARROW_POTION_EFFECTS"), ArrowPotionEffectArrayItem[].class))
target.addPotionEffect(new PotionEffectData(PotionEffectType.getByName(entry.type), entry.duration, entry.level).toEffect());
}
}
}
}

View File

@ -24,7 +24,7 @@ import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
@ -272,7 +272,7 @@ public class ItemUse implements Listener {
*/
@EventHandler
public void handleCustomBows(EntityShootBowEvent event) {
if (!(event.getProjectile() instanceof Arrow) || !(event.getEntity() instanceof Player))
if (!(event.getProjectile() instanceof AbstractArrow) || !(event.getEntity() instanceof Player))
return;
final NBTItem item = NBTItem.get(event.getBow());
@ -291,7 +291,7 @@ public class ItemUse implements Listener {
final EquipmentSlot bowSlot = itemInMainHand.isSimilar(event.getBow()) ? EquipmentSlot.MAIN_HAND : EquipmentSlot.OFF_HAND;
MMOItems.plugin.getEntities().registerCustomProjectile(item, playerData.getStats().newTemporary(bowSlot), event.getProjectile(), event.getForce());
final Arrow arrow = (Arrow) event.getProjectile();
final AbstractArrow arrow = (AbstractArrow) event.getProjectile();
if (item.getStat("ARROW_VELOCITY") > 0)
arrow.setVelocity(arrow.getVelocity().multiply(item.getStat("ARROW_VELOCITY")));
}

View File

@ -9,11 +9,9 @@ import net.Indyuce.mmoitems.api.interaction.projectile.ArrowParticles;
import net.Indyuce.mmoitems.api.interaction.projectile.EntityData;
import net.Indyuce.mmoitems.api.interaction.projectile.ProjectileData;
import org.bukkit.Bukkit;
import org.bukkit.entity.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.AbstractArrow;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -21,6 +19,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
@ -62,8 +61,8 @@ public class EntityManager implements Listener {
* arrow particles. Currently projectiles are only arrows so there is no
* problem with other projectiles like snowballs etc.
*/
if (entity instanceof Arrow && sourceItem.hasTag("MMOITEMS_ARROW_PARTICLES"))
new ArrowParticles((Arrow) entity, sourceItem);
if (entity instanceof AbstractArrow && sourceItem.hasTag("MMOITEMS_ARROW_PARTICLES"))
new ArrowParticles((AbstractArrow) entity, sourceItem);
projectiles.put(entity.getEntityId(), projectileData);
}
@ -100,11 +99,13 @@ public class EntityManager implements Listener {
* This event is called on LOWEST and only edits the custom bow base damage.
* It does NOT take into account the base damage passed in Bow#getDamage()
* and fully overrides any change.
*
* This applies to tridents, arrows, spectral arrows etc.
* <p>
* Event order: ProjectileHit -> EntityDamage / EntityDeathEvent
*/
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void customBowDamage(EntityDamageByEntityEvent event) {
public void customProjectileDamage(EntityDamageByEntityEvent event) {
if (!(event.getDamager() instanceof Projectile) || !(event.getEntity() instanceof LivingEntity) || event.getEntity().hasMetadata("NPC"))
return;
@ -113,11 +114,11 @@ public class EntityManager implements Listener {
if (data == null)
return;
// Calculate custom base bow damage
// Calculate custom base damage
double baseDamage = data.getDamage();
// Apply power vanilla enchant
if (projectile instanceof Arrow && data.getSourceItem().getItem().hasItemMeta()
if (projectile instanceof AbstractArrow && data.getSourceItem().getItem().hasItemMeta()
&& data.getSourceItem().getItem().getItemMeta().getEnchants().containsKey(Enchantment.ARROW_DAMAGE))
baseDamage *= 1.25 + (.25 * data.getSourceItem().getItem().getItemMeta().getEnchantLevel(Enchantment.ARROW_DAMAGE));
@ -130,7 +131,7 @@ public class EntityManager implements Listener {
return;
final ProjectileAttackMetadata projAttack = (ProjectileAttackMetadata) event.getAttack();
final ProjectileData data = projectiles.get(projAttack.getProjectile().getEntityId());
final @Nullable ProjectileData data = projectiles.get(projAttack.getProjectile().getEntityId());
if (data == null)
return;