diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java index c0a8d23b..38528af4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEventFactoryMixin.java @@ -1,13 +1,17 @@ package io.izzel.arclight.common.mixin.bukkit; import com.google.common.base.Function; +import io.izzel.arclight.common.bridge.entity.EntityBridge; +import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.util.ArclightCaptures; import net.minecraft.entity.Entity; import net.minecraft.util.DamageSource; import net.minecraft.util.math.BlockPos; +import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -40,4 +44,23 @@ public class CraftEventFactoryMixin { } } } + + @Inject(method = "handleEntityDamageEvent(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/DamageSource;Ljava/util/Map;Ljava/util/Map;Z)Lorg/bukkit/event/entity/EntityDamageEvent;", cancellable = true, at = @At(value = "NEW", target = "java/lang/IllegalStateException")) + private static void arclight$unhandledDamage(Entity entity, DamageSource source, Map modifiers, Map> modifierFunctions, boolean cancelled, CallbackInfoReturnable cir) { + // todo blockDamage is lost + EntityDamageEvent event; + if (source.getTrueSource() != null) { + ArclightMod.LOGGER.debug("Unhandled damage of {} by {} from {}", entity, source.getTrueSource(), source.damageType); + event = new EntityDamageByEntityEvent(((EntityBridge) source.getTrueSource()).bridge$getBukkitEntity(), ((EntityBridge) entity).bridge$getBukkitEntity(), EntityDamageEvent.DamageCause.CUSTOM, modifiers, modifierFunctions); + } else { + ArclightMod.LOGGER.debug("Unhandled damage of {} from {}", entity, source.damageType); + event = new EntityDamageEvent(((EntityBridge) entity).bridge$getBukkitEntity(), EntityDamageEvent.DamageCause.CUSTOM, modifiers, modifierFunctions); + } + event.setCancelled(cancelled); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + ((EntityBridge) entity).bridge$getBukkitEntity().setLastDamageCause(event); + } + cir.setReturnValue(event); + } }