SPIGOT-336, SPIGOT-3366, SPIGOT-5768, SPIGOT-6409, SPIGOT-6861, #1008: Add EntityRemoveEvent
By: DerFrZocker <derrieple@gmail.com>
This commit is contained in:
@@ -45,6 +45,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Pose;
|
||||
import org.bukkit.entity.SpawnCategory;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||
import org.bukkit.metadata.MetadataValue;
|
||||
import org.bukkit.permissions.PermissibleBase;
|
||||
@@ -291,7 +292,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
||||
@Override
|
||||
public void remove() {
|
||||
entity.pluginRemoved = true;
|
||||
entity.discard();
|
||||
entity.discard(getHandle().generation ? null : EntityRemoveEvent.Cause.PLUGIN);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -118,7 +118,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
||||
|
||||
// during world generation, we don't want to run logic for dropping items and xp
|
||||
if (getHandle().generation && health == 0) {
|
||||
getHandle().discard();
|
||||
getHandle().discard(null); // Add Bukkit remove cause
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.entity;
|
||||
|
||||
import org.bukkit.craftbukkit.CraftServer;
|
||||
import org.bukkit.entity.WindCharge;
|
||||
import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
|
||||
public class CraftWindCharge extends CraftFireball implements WindCharge {
|
||||
public CraftWindCharge(CraftServer server, net.minecraft.world.entity.projectile.WindCharge entity) {
|
||||
@@ -11,7 +12,7 @@ public class CraftWindCharge extends CraftFireball implements WindCharge {
|
||||
@Override
|
||||
public void explode() {
|
||||
this.getHandle().explode();
|
||||
this.getHandle().discard(); // SPIGOT-7577 - explode doesn't discard the entity, this happens only in tick and onHitBlock
|
||||
this.getHandle().discard(EntityRemoveEvent.Cause.EXPLODE); // SPIGOT-7577 - explode doesn't discard the entity, this happens only in tick and onHitBlock
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -182,6 +182,7 @@ import org.bukkit.event.entity.EntityKnockbackEvent;
|
||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.entity.EntityPlaceEvent;
|
||||
import org.bukkit.event.entity.EntityPotionEffectEvent;
|
||||
import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
import org.bukkit.event.entity.EntityShootBowEvent;
|
||||
import org.bukkit.event.entity.EntitySpawnEvent;
|
||||
import org.bukkit.event.entity.EntitySpellCastEvent;
|
||||
@@ -659,7 +660,7 @@ public class CraftEventFactory {
|
||||
|
||||
if (spawnReason != SpawnReason.CUSTOM) {
|
||||
if (isAnimal && !world.getWorld().getAllowAnimals() || isMonster && !world.getWorld().getAllowMonsters() || isNpc && !world.getCraftServer().getServer().areNpcsEnabled()) {
|
||||
entity.discard();
|
||||
entity.discard(null); // Add Bukkit remove cause
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -697,12 +698,12 @@ public class CraftEventFactory {
|
||||
if (event != null && (event.isCancelled() || entity.isRemoved())) {
|
||||
Entity vehicle = entity.getVehicle();
|
||||
if (vehicle != null) {
|
||||
vehicle.discard();
|
||||
vehicle.discard(null); // Add Bukkit remove cause
|
||||
}
|
||||
for (Entity passenger : entity.getIndirectPassengers()) {
|
||||
passenger.discard();
|
||||
passenger.discard(null); // Add Bukkit remove cause
|
||||
}
|
||||
entity.discard();
|
||||
entity.discard(null); // Add Bukkit remove cause
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1829,4 +1830,20 @@ public class CraftEventFactory {
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
public static void callEntityRemoveEvent(Entity entity, EntityRemoveEvent.Cause cause) {
|
||||
if (entity instanceof EntityPlayer) {
|
||||
return; // Don't call for player
|
||||
}
|
||||
|
||||
if (cause == null) {
|
||||
// Don't call if cause is null
|
||||
// This can happen when an entity changes dimension,
|
||||
// the entity gets removed during world gen or
|
||||
// the entity is removed before it is even spawned (when the spawn event is cancelled for example)
|
||||
return;
|
||||
}
|
||||
|
||||
Bukkit.getPluginManager().callEvent(new EntityRemoveEvent(entity.getBukkitEntity(), cause));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user