From 885a8c2557c4e3fbd2940f39eb2884128af63805 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 3 Jun 2025 15:53:09 -0700 Subject: [PATCH] Add P_IsRelinkItem, fix Hyudoro not being relinked correctly - MT_HYUDORO itself was being relinked, causing the Hyudoro to not disappear after delivery - MT_HYUDORO_CENTER is relinked instead; this is the object that actually holds a player reference --- src/p_mobj.c | 37 +++++++++++++++++++++++++++++++++++-- src/p_mobj.h | 1 + 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index b0ce8a6d6..60a3a6409 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -5337,6 +5337,39 @@ boolean P_IsKartFieldItem(INT32 type) } } +// This item keeps track of its owner by the mobj target +boolean P_IsRelinkItem(INT32 type) +{ + switch (type) + { + case MT_POGOSPRING: + case MT_EGGMANITEM: + case MT_EGGMANITEM_SHIELD: + case MT_BANANA: + case MT_BANANA_SHIELD: + case MT_ORBINAUT: + case MT_ORBINAUT_SHIELD: + case MT_JAWZ: + case MT_JAWZ_SHIELD: + case MT_SSMINE: + case MT_SSMINE_SHIELD: + case MT_LANDMINE: + case MT_DROPTARGET: + case MT_DROPTARGET_SHIELD: + case MT_BALLHOG: + case MT_SPB: + case MT_BUBBLESHIELDTRAP: + case MT_GARDENTOP: + case MT_HYUDORO_CENTER: + case MT_SINK: + case MT_GACHABOM: + return true; + + default: + return false; + } +} + boolean K_IsMissileOrKartItem(mobj_t *mo) { if (mo->flags & MF_MISSILE) @@ -10355,7 +10388,7 @@ void P_MobjThinker(mobj_t *mobj) I_Assert(mobj != NULL); I_Assert(!P_MobjWasRemoved(mobj)); - if (P_IsKartItem(mobj->type) && mobj->target && !P_MobjWasRemoved(mobj->target)) + if (P_IsRelinkItem(mobj->type) && mobj->target && !P_MobjWasRemoved(mobj->target)) { player_t *link = mobj->target->player; if (link && playeringame[link-players] && !link->spectator) @@ -10366,7 +10399,7 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target && P_MobjWasRemoved(mobj->target)) { P_SetTarget(&mobj->target, NULL); - if (P_IsKartItem(mobj->type) && mobj->relinkplayer && mobj->relinkplayer <= MAXPLAYERS) + if (P_IsRelinkItem(mobj->type) && mobj->relinkplayer && mobj->relinkplayer <= MAXPLAYERS) { player_t *relink = &players[mobj->relinkplayer-1]; if (playeringame[relink-players] && !relink->spectator && relink->mo && !P_MobjWasRemoved(relink->mo)) diff --git a/src/p_mobj.h b/src/p_mobj.h index 353011ddf..eec956024 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -547,6 +547,7 @@ void P_AddCachedAction(mobj_t *mobj, INT32 statenum); boolean P_IsKartItem(INT32 type); boolean P_IsKartFieldItem(INT32 type); +boolean P_IsRelinkItem(INT32 type); boolean K_IsMissileOrKartItem(mobj_t *mo); boolean P_CanDeleteKartItem(INT32 type);