mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 11:45:51 +00:00
Explosive Bow Functionality Changed.
Explosive Bow now deals an area of effect.
This commit is contained in:
parent
655fb44021
commit
e016ea1180
@ -1,28 +1,67 @@
|
|||||||
package io.github.thebusybiscuit.slimefun4.implementation.items.weapons;
|
package io.github.thebusybiscuit.slimefun4.implementation.items.weapons;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.Category;
|
import me.mrCookieSlime.Slimefun.Objects.Category;
|
||||||
import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler;
|
import me.mrCookieSlime.Slimefun.Objects.handlers.BowShootHandler;
|
||||||
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
public class ExplosiveBow extends SlimefunBow {
|
public class ExplosiveBow extends SlimefunBow {
|
||||||
|
|
||||||
|
private final ItemSetting<Integer> range = new ItemSetting<>("explosion-range", 3);
|
||||||
|
|
||||||
public ExplosiveBow(Category category, SlimefunItemStack item, ItemStack[] recipe) {
|
public ExplosiveBow(Category category, SlimefunItemStack item, ItemStack[] recipe) {
|
||||||
super(category, item, recipe);
|
super(category, item, recipe);
|
||||||
|
addItemSetting(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BowShootHandler onShoot() {
|
public BowShootHandler onShoot() {
|
||||||
return (e, n) -> {
|
return (e, n) -> {
|
||||||
Vector vector = n.getVelocity();
|
Collection<Entity> entites = n.getWorld().getNearbyEntities(n.getLocation(), range.getValue(), range.getValue(), range.getValue(), entity -> entity instanceof LivingEntity);
|
||||||
vector.setY(0.6);
|
for (Entity entity : entites) {
|
||||||
n.setVelocity(vector);
|
if (entity.isValid() && entity instanceof LivingEntity) {
|
||||||
n.getWorld().createExplosion(n.getLocation(), 0F);
|
LivingEntity entityL = (LivingEntity) entity;
|
||||||
n.getWorld().playSound(n.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F);
|
|
||||||
|
double distance = entityL.getLocation().distance(n.getLocation());
|
||||||
|
double damage = calculateDamage(distance, e.getDamage());
|
||||||
|
|
||||||
|
Vector distanceVector = entityL.getLocation().toVector().subtract(n.getLocation().toVector());
|
||||||
|
distanceVector.setY(distanceVector.getY() + 0.6D);
|
||||||
|
Vector entityVelocity = entityL.getVelocity();
|
||||||
|
Vector knockback = entityVelocity.add(distanceVector.normalize().multiply((int) (e.getDamage() / Math.round(damage))));
|
||||||
|
entityL.setVelocity(knockback);
|
||||||
|
|
||||||
|
entityL.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, entityL.getLocation(), 1);
|
||||||
|
entityL.getWorld().playSound(entityL.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F);
|
||||||
|
|
||||||
|
if (!entityL.getUniqueId().equals(n.getUniqueId())) {
|
||||||
|
entityL.damage(damage);
|
||||||
|
EntityDamageByEntityEvent damageEvent = new EntityDamageByEntityEvent(e.getDamager(), entityL, EntityDamageEvent.DamageCause.ENTITY_EXPLOSION, damage);
|
||||||
|
Bukkit.getPluginManager().callEvent(damageEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double calculateDamage(double distance, double ogDamage) {
|
||||||
|
|
||||||
|
if (distance == 0D) return ogDamage;
|
||||||
|
double damage = ogDamage - Math.pow((distance / range.getValue()), 2.5);
|
||||||
|
if (Math.round(damage) == 0D) damage += 1D;
|
||||||
|
return Math.min(damage, ogDamage);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.EntityShootBowEvent;
|
import org.bukkit.event.entity.EntityShootBowEvent;
|
||||||
import org.bukkit.event.entity.ProjectileHitEvent;
|
import org.bukkit.event.entity.ProjectileHitEvent;
|
||||||
|
|
||||||
@ -69,6 +70,7 @@ public class SlimefunBowListener implements Listener {
|
|||||||
@EventHandler
|
@EventHandler
|
||||||
public void onArrowSuccessfulHit(EntityDamageByEntityEvent e) {
|
public void onArrowSuccessfulHit(EntityDamageByEntityEvent e) {
|
||||||
if (e.getDamager() instanceof Arrow && e.getEntity() instanceof LivingEntity) {
|
if (e.getDamager() instanceof Arrow && e.getEntity() instanceof LivingEntity) {
|
||||||
|
if (e.getCause() == EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) return;
|
||||||
SlimefunBow bow = projectiles.get(e.getDamager().getUniqueId());
|
SlimefunBow bow = projectiles.get(e.getDamager().getUniqueId());
|
||||||
|
|
||||||
if (bow != null) {
|
if (bow != null) {
|
||||||
|
@ -16,6 +16,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
|
|||||||
* @see BlockUseHandler
|
* @see BlockUseHandler
|
||||||
* @see EntityKillHandler
|
* @see EntityKillHandler
|
||||||
* @see EntityInteractHandler
|
* @see EntityInteractHandler
|
||||||
|
* @see BowShootHandler
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface ItemHandler {
|
public interface ItemHandler {
|
||||||
|
Loading…
Reference in New Issue
Block a user