diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index be8d07f06..6400ca171 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -117,6 +117,7 @@ void CallInitialize(DDukeActor* actor); void CallTick(DDukeActor* actor); void CallAction(DDukeActor* actor); void CallOnHit(DDukeActor* actor, DDukeActor* hitter); +void CallOnUse(DDukeActor* actor, player_struct* user); bool CallAnimate(DDukeActor* actor, tspritetype* hitter); diff --git a/source/games/duke/src/game.cpp b/source/games/duke/src/game.cpp index 6fad5fc22..e102d6010 100644 --- a/source/games/duke/src/game.cpp +++ b/source/games/duke/src/game.cpp @@ -435,6 +435,14 @@ void CallOnHit(DDukeActor* actor, DDukeActor* hitter) } } +void CallOnUse(DDukeActor* actor, player_struct* user) +{ + IFVIRTUALPTR(actor, DDukeActor, onUse) + { + VMValue val[2] = { actor, user }; + VMCall(func, val, 2, nullptr, 0); + } +} bool CallAnimate(DDukeActor* actor, tspritetype* tspr) { diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index 1a8a04c97..77e9b29c5 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -1661,6 +1661,11 @@ void checksectors_d(int snum) { if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return; + if (neartagsprite->GetClass() != RUNTIME_CLASS(DDukeActor)) + { + CallOnUse(neartagsprite, p); + } + else switch (neartagsprite->spr.picnum) { case TOILET: diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index 764daf65c..4b0b9b29d 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -2591,6 +2591,11 @@ void checksectors_r(int snum) { if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return; + if (neartagsprite->GetClass() != RUNTIME_CLASS(DDukeActor)) + { + CallOnUse(neartagsprite, p); + } + else switch (neartagsprite->spr.picnum) { case RRTILE8448: diff --git a/wadsrc/static/zscript/games/duke/dukeactor.zs b/wadsrc/static/zscript/games/duke/dukeactor.zs index bc0420c23..6885e942e 100644 --- a/wadsrc/static/zscript/games/duke/dukeactor.zs +++ b/wadsrc/static/zscript/games/duke/dukeactor.zs @@ -74,6 +74,7 @@ class DukeActor : CoreActor native virtual void Initialize() {} virtual void Tick() {} virtual void onHit(DukeActor hitter) {} + virtual void onUse(DukePlayer user) {} virtual bool animate(tspritetype tspr) { return false; } virtual void RunState() {} // this is the CON function. }