Reworked EntityDamageByEntityEvent, finally

This commit is contained in:
Auxilor
2023-07-22 14:16:34 +01:00
parent ee237f9c58
commit 5cfb87e03c
4 changed files with 29 additions and 87 deletions

View File

@@ -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.ProfileHandler
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
import com.willfp.eco.internal.spigot.drops.CollatedRunnable 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.NaturalExpGainListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersSpigot import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
@@ -389,7 +389,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
override fun loadListeners(): List<Listener> { override fun loadListeners(): List<Listener> {
val listeners = mutableListOf( val listeners = mutableListOf(
ArmorListener(), ArmorListener(),
EntityDeathByEntityListeners(this), EntityDeathByEntityListener,
CraftingRecipeListener(), CraftingRecipeListener(),
StackedRecipeListener(this), StackedRecipeListener(this),
GUIListener(this), GUIListener(this),

View File

@@ -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)
}
}

View File

@@ -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
)
)
}
}

View File

@@ -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()
}
}