Reworked EntityDamageByEntityEvent, finally
This commit is contained in:
@@ -62,7 +62,7 @@ import com.willfp.eco.internal.spigot.data.PlayerBlockListener
|
||||
import com.willfp.eco.internal.spigot.data.ProfileHandler
|
||||
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
|
||||
import com.willfp.eco.internal.spigot.drops.CollatedRunnable
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListener
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersPaper
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersSpigot
|
||||
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
|
||||
@@ -389,7 +389,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
|
||||
override fun loadListeners(): List<Listener> {
|
||||
val listeners = mutableListOf(
|
||||
ArmorListener(),
|
||||
EntityDeathByEntityListeners(this),
|
||||
EntityDeathByEntityListener,
|
||||
CraftingRecipeListener(),
|
||||
StackedRecipeListener(this),
|
||||
GUIListener(this),
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.eventlisteners
|
||||
|
||||
import com.willfp.eco.core.events.EntityDeathByEntityEvent
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.entity.Entity
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.event.entity.EntityDeathEvent
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
internal class EntityDeathByEntityBuilder {
|
||||
var victim: LivingEntity? = null
|
||||
var damager: Entity? = null
|
||||
var deathEvent: EntityDeathEvent? = null
|
||||
var drops: List<ItemStack>? = null
|
||||
var xp = 0
|
||||
|
||||
fun push() {
|
||||
val event = EntityDeathByEntityEvent(victim!!, damager!!, drops!!, xp, deathEvent!!)
|
||||
Bukkit.getPluginManager().callEvent(event)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.willfp.eco.internal.spigot.eventlisteners
|
||||
|
||||
import com.willfp.eco.core.events.EntityDeathByEntityEvent
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
||||
import org.bukkit.event.entity.EntityDeathEvent
|
||||
|
||||
object EntityDeathByEntityListener: Listener {
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
fun onEntityDeath(event: EntityDeathEvent) {
|
||||
val damageEvent = event.entity.lastDamageCause as? EntityDamageByEntityEvent ?: return
|
||||
val killer = damageEvent.damager
|
||||
|
||||
Bukkit.getPluginManager().callEvent(
|
||||
EntityDeathByEntityEvent(
|
||||
event.entity,
|
||||
killer,
|
||||
event.drops,
|
||||
event.droppedExp,
|
||||
event
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.eventlisteners
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.EventPriority
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
||||
import org.bukkit.event.entity.EntityDeathEvent
|
||||
|
||||
class EntityDeathByEntityListeners(
|
||||
private val plugin: EcoPlugin
|
||||
) : Listener {
|
||||
private val events = mutableSetOf<EntityDeathByEntityBuilder>()
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
fun onEntityDamage(event: EntityDamageByEntityEvent) {
|
||||
if ((event.entity !is LivingEntity)) {
|
||||
return
|
||||
}
|
||||
|
||||
val victim = event.entity as LivingEntity
|
||||
|
||||
if (victim.health > event.finalDamage) {
|
||||
return
|
||||
}
|
||||
|
||||
val builtEvent = EntityDeathByEntityBuilder()
|
||||
builtEvent.victim = victim
|
||||
builtEvent.damager = event.damager
|
||||
|
||||
events += builtEvent
|
||||
|
||||
this.plugin.scheduler.runLater(5) { // Fixes conflicts with WildStacker
|
||||
events.remove(builtEvent)
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
fun onEntityDeath(event: EntityDeathEvent) {
|
||||
val victim = event.entity
|
||||
val drops = event.drops
|
||||
val xp = event.droppedExp
|
||||
|
||||
var builtEvent: EntityDeathByEntityBuilder? = null
|
||||
|
||||
for (builder in events) {
|
||||
if (builder.victim == victim) {
|
||||
builtEvent = builder
|
||||
}
|
||||
}
|
||||
|
||||
if (builtEvent == null) {
|
||||
return
|
||||
}
|
||||
|
||||
events.remove(builtEvent)
|
||||
builtEvent.drops = drops
|
||||
builtEvent.xp = xp
|
||||
builtEvent.deathEvent = event
|
||||
|
||||
builtEvent.push()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user