Skip to content

Commit 6dd3dcd

Browse files
committed
fix: fix onMobHurt #236
1 parent 32ce7d0 commit 6dd3dcd

File tree

2 files changed

+44
-29
lines changed

2 files changed

+44
-29
lines changed

src/legacy/api/EventAPI.cpp

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -538,32 +538,6 @@ void EnableEventListener(int eventId) {
538538
break;
539539

540540
case EVENT_TYPES::onMobHurt:
541-
bus.emplaceListener<ActorHurtEvent>([](ActorHurtEvent& ev) {
542-
IF_LISTENED(EVENT_TYPES::onMobHurt) {
543-
if (ev.self().hasType(ActorType::Mob)) {
544-
Actor* damageSource = nullptr;
545-
if (ev.source().isEntitySource()) {
546-
if (ev.source().isChildEntitySource()) {
547-
damageSource = ll::service::getLevel()->fetchEntity(ev.source().getEntityUniqueID(), false);
548-
} else {
549-
damageSource =
550-
ll::service::getLevel()->fetchEntity(ev.source().getDamagingEntityUniqueID(), false);
551-
}
552-
}
553-
554-
if (!CallEvent(
555-
EVENT_TYPES::onMobHurt,
556-
EntityClass::newEntity(&ev.self()),
557-
damageSource ? EntityClass::newEntity(damageSource) : Local<Value>(),
558-
Number::newNumber(ev.damage()),
559-
Number::newNumber((int)ev.source().getCause())
560-
)) {
561-
ev.cancel();
562-
}
563-
}
564-
}
565-
IF_LISTENED_END(EVENT_TYPES::onMobHurt)
566-
});
567541
lse::events::entity::MobHurtEvent();
568542
break;
569543

src/lse/events/EntityEvents.cpp

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,16 +203,54 @@ LL_TYPE_INSTANCE_HOOK(
203203
origin(region, pos, projectile);
204204
}
205205

206+
LL_TYPE_INSTANCE_HOOK(
207+
MobHurtHook,
208+
HookPriority::Normal,
209+
Mob,
210+
&Mob::$_hurt,
211+
bool,
212+
::ActorDamageSource const& source,
213+
float damage,
214+
bool knock,
215+
bool ignite
216+
) {
217+
IF_LISTENED(EVENT_TYPES::onMobHurt) {
218+
// LeviLamina's ActorHurtEvent can't handle fire hurt, so we just hook Mob::$_hurt.
219+
Actor* damageSource = nullptr;
220+
if (source.isEntitySource()) {
221+
if (source.isChildEntitySource()) {
222+
damageSource = ll::service::getLevel()->fetchEntity(source.getEntityUniqueID(), false);
223+
} else {
224+
damageSource = ll::service::getLevel()->fetchEntity(source.getDamagingEntityUniqueID(), false);
225+
}
226+
}
227+
228+
if (!CallEvent(
229+
EVENT_TYPES::onMobHurt,
230+
EntityClass::newEntity(this),
231+
damageSource ? EntityClass::newEntity(damageSource) : Local<Value>(),
232+
Number::newNumber(damage < 0.0f ? -damage : damage),
233+
Number::newNumber((int)source.getCause())
234+
)) {
235+
return false;
236+
}
237+
}
238+
IF_LISTENED_END(EVENT_TYPES::onMobHurt)
239+
return origin(source, damage, knock, ignite);
240+
}
241+
206242
LL_TYPE_INSTANCE_HOOK(
207243
MobHurtEffectHook,
208244
HookPriority::Normal,
209245
Mob,
210246
&Mob::getDamageAfterResistanceEffect,
211247
float,
212-
ActorDamageSource const& source,
213-
float damage
248+
::ActorDamageSource const& source,
249+
float damage
214250
) {
215251
IF_LISTENED(EVENT_TYPES::onMobHurt) {
252+
// Mob is still hurt after hook Mob::$hurtEffects, and all hurt events are handled by this function, but we just
253+
// need magic damage.
216254
if (source.getCause() == ActorDamageCause::Magic || source.getCause() == ActorDamageCause::Wither) {
217255
Actor* damageSource = nullptr;
218256
if (source.isEntitySource()) {
@@ -381,7 +419,10 @@ void ActorRideEvent() { ActorRideHook::hook(); }
381419
void WitherDestroyEvent() { WitherDestroyHook::hook(); }
382420
void ProjectileHitEntityEvent() { ProjectileHitEntityHook::hook(); }
383421
void ProjectileHitBlockEvent() { ProjectileHitBlockHook::hook(); }
384-
void MobHurtEvent() { MobHurtEffectHook::hook(); }
422+
void MobHurtEvent() {
423+
MobHurtHook::hook();
424+
MobHurtEffectHook::hook();
425+
}
385426
void NpcCommandEvent() { NpcCommandHook::hook(); }
386427
void EffectApplyEvent() { EffectApplyHook::hook(); }
387428
void EffectExpiredEvent() { EffectExpiredHook::hook(); }

0 commit comments

Comments
 (0)