From 6e692e55711d7d88dfe99cad69ddc4566f730a57 Mon Sep 17 00:00:00 2001 From: nashmuhandes Date: Wed, 30 Sep 2020 09:56:36 +0800 Subject: [PATCH] Allow retrieval of the custom Crush state in WorldThingGround --- src/events.cpp | 10 ++++++---- src/events.h | 6 ++++-- src/playsim/p_mobj.cpp | 4 ++-- wadsrc/static/zscript/events.zs | 1 + 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/events.cpp b/src/events.cpp index f71fd9e9ec8..623d222039a 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -331,16 +331,16 @@ void EventManager::WorldThingDied(AActor* actor, AActor* inflictor) handler->WorldThingDied(actor, inflictor); } -void EventManager::WorldThingGround(AActor* actor) +void EventManager::WorldThingGround(AActor* actor, FState* st) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - if (ShouldCallStatic(true)) staticEventManager.WorldThingGround(actor); + if (ShouldCallStatic(true)) staticEventManager.WorldThingGround(actor, st); for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) - handler->WorldThingGround(actor); + handler->WorldThingGround(actor, st); } void EventManager::WorldThingRevived(AActor* actor) @@ -646,6 +646,7 @@ DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageLineSide); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamagePosition); DEFINE_FIELD_X(WorldEvent, FWorldEvent, DamageIsRadius); DEFINE_FIELD_X(WorldEvent, FWorldEvent, NewDamage); +DEFINE_FIELD_X(WorldEvent, FWorldEvent, CrushedState); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber); DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn); @@ -807,7 +808,7 @@ void DStaticEventHandler::WorldThingDied(AActor* actor, AActor* inflictor) } } -void DStaticEventHandler::WorldThingGround(AActor* actor) +void DStaticEventHandler::WorldThingGround(AActor* actor, FState* st) { IFVIRTUAL(DStaticEventHandler, WorldThingGround) { @@ -815,6 +816,7 @@ void DStaticEventHandler::WorldThingGround(AActor* actor) if (isEmpty(func)) return; FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; + e.CrushedState = st; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } diff --git a/src/events.h b/src/events.h index b803f76d6dd..86e8e941e88 100755 --- a/src/events.h +++ b/src/events.h @@ -4,6 +4,7 @@ #include "serializer.h" #include "d_event.h" #include "sbar.h" +#include "info.h" class DStaticEventHandler; struct EventManager; @@ -80,7 +81,7 @@ class DStaticEventHandler : public DObject // make it a part of normal GC proces void WorldUnloaded(); void WorldThingSpawned(AActor* actor); void WorldThingDied(AActor* actor, AActor* inflictor); - void WorldThingGround(AActor* actor); + void WorldThingGround(AActor* actor, FState* st); void WorldThingRevived(AActor* actor); void WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle); void WorldThingDestroyed(AActor* actor); @@ -163,6 +164,7 @@ struct FWorldEvent DVector3 DamagePosition; bool DamageIsRadius; // radius damage yes/no int NewDamage = 0; // sector/line damaged. allows modifying damage + FState* CrushedState = nullptr; // custom crush state set in thingground }; struct FPlayerEvent @@ -236,7 +238,7 @@ struct EventManager // called after AActor::Die of each actor. void WorldThingDied(AActor* actor, AActor* inflictor); // called inside AActor::Grind just before the corpse is destroyed - void WorldThingGround(AActor* actor); + void WorldThingGround(AActor* actor, FState* st); // called after AActor::Revive. void WorldThingRevived(AActor* actor); // called before P_DamageMobj and before AActor::DamageMobj virtuals. diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index b85ad788786..b7a2a035255 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -1204,7 +1204,7 @@ bool AActor::Grind(bool items) S_Sound (this, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE); Translation = BloodTranslation; } - Level->localEventManager->WorldThingGround(this); + Level->localEventManager->WorldThingGround(this, state); return false; } if (!(flags & MF_NOBLOOD)) @@ -1247,7 +1247,7 @@ bool AActor::Grind(bool items) gib->Translation = BloodTranslation; } S_Sound (this, CHAN_BODY, 0, "misc/fallingsplat", 1, ATTN_IDLE); - Level->localEventManager->WorldThingGround(this); + Level->localEventManager->WorldThingGround(this, nullptr); } if (flags & MF_ICECORPSE) { diff --git a/wadsrc/static/zscript/events.zs b/wadsrc/static/zscript/events.zs index 67921880044..26989b8ef87 100644 --- a/wadsrc/static/zscript/events.zs +++ b/wadsrc/static/zscript/events.zs @@ -37,6 +37,7 @@ struct WorldEvent native play version("2.4") native readonly vector3 DamagePosition; native readonly bool DamageIsRadius; native int NewDamage; + native readonly State CrushedState; } struct PlayerEvent native play version("2.4")