Relink player to kartitems

This commit is contained in:
Antonio Martinez 2025-06-02 12:02:58 -04:00
parent 80c02ca6db
commit e8140ae388
4 changed files with 36 additions and 0 deletions

View file

@ -111,6 +111,7 @@ enum mobj_e {
mobj_reappear, mobj_reappear,
mobj_punt_ref, mobj_punt_ref,
mobj_owner, mobj_owner,
mobj_relinkplayer,
}; };
static const char *const mobj_opt[] = { static const char *const mobj_opt[] = {
@ -201,6 +202,7 @@ static const char *const mobj_opt[] = {
"reappear", "reappear",
"punt_ref", "punt_ref",
"owner", "owner",
"relinkplayer",
NULL}; NULL};
#define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field]) #define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field])
@ -519,6 +521,9 @@ static int mobj_get(lua_State *L)
} }
LUA_PushUserdata(L, mo->owner, META_MOBJ); LUA_PushUserdata(L, mo->owner, META_MOBJ);
break; break;
case mobj_relinkplayer:
lua_pushinteger(L, mo->relinkplayer);
break;
default: // extra custom variables in Lua memory default: // extra custom variables in Lua memory
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1)); I_Assert(lua_istable(L, -1));
@ -934,6 +939,9 @@ static int mobj_set(lua_State *L)
P_SetTarget(&mo->owner, owner); P_SetTarget(&mo->owner, owner);
} }
break; break;
case mobj_relinkplayer:
mo->relinkplayer = luaL_checkinteger(L, 3);
break;
default: default:
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1)); I_Assert(lua_istable(L, -1));

View file

@ -10353,9 +10353,24 @@ void P_MobjThinker(mobj_t *mobj)
I_Assert(mobj != NULL); I_Assert(mobj != NULL);
I_Assert(!P_MobjWasRemoved(mobj)); I_Assert(!P_MobjWasRemoved(mobj));
if (P_IsKartItem(mobj->type) && mobj->target && !P_MobjWasRemoved(mobj->target))
{
player_t *link = mobj->target->player;
if (link && playeringame[link-players] && !link->spectator)
mobj->relinkplayer = (link-players) + 1;
}
// Remove dead target/tracer. // Remove dead target/tracer.
if (mobj->target && P_MobjWasRemoved(mobj->target)) if (mobj->target && P_MobjWasRemoved(mobj->target))
{
P_SetTarget(&mobj->target, NULL); P_SetTarget(&mobj->target, NULL);
if (P_IsKartItem(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))
P_SetTarget(&mobj->target, relink->mo);
}
}
if (mobj->tracer && P_MobjWasRemoved(mobj->tracer)) if (mobj->tracer && P_MobjWasRemoved(mobj->tracer))
P_SetTarget(&mobj->tracer, NULL); P_SetTarget(&mobj->tracer, NULL);
if (mobj->hnext && P_MobjWasRemoved(mobj->hnext)) if (mobj->hnext && P_MobjWasRemoved(mobj->hnext))

View file

@ -450,6 +450,8 @@ struct mobj_t
INT32 po_movecount; // Polyobject carrying (NOT savegame, NOT Lua) INT32 po_movecount; // Polyobject carrying (NOT savegame, NOT Lua)
UINT8 relinkplayer; // reassociate kartitem target when it dies. ACHTUNG 1-INDEXED
// WARNING: New fields must be added separately to savegame and Lua. // WARNING: New fields must be added separately to savegame and Lua.
}; };

View file

@ -2999,6 +2999,7 @@ typedef enum
MD3_REAPPEAR = 1<<1, MD3_REAPPEAR = 1<<1,
MD3_PUNT_REF = 1<<2, MD3_PUNT_REF = 1<<2,
MD3_OWNER = 1<<3, MD3_OWNER = 1<<3,
MD3_RELINK_PLAYER = 1<<4,
} mobj_diff3_t; } mobj_diff3_t;
typedef enum typedef enum
@ -3322,6 +3323,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
diff3 |= MD3_PUNT_REF; diff3 |= MD3_PUNT_REF;
if (mobj->owner) if (mobj->owner)
diff3 |= MD3_OWNER; diff3 |= MD3_OWNER;
if (mobj->relinkplayer)
diff3 |= MD3_RELINK_PLAYER;
if (diff3 != 0) if (diff3 != 0)
diff2 |= MD2_MORE; diff2 |= MD2_MORE;
@ -3612,6 +3615,10 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
{ {
WRITEUINT32(save->p, mobj->owner->mobjnum); WRITEUINT32(save->p, mobj->owner->mobjnum);
} }
if (diff3 & MD3_RELINK_PLAYER)
{
WRITEUINT8(save->p, mobj->relinkplayer);
}
WRITEUINT32(save->p, mobj->mobjnum); WRITEUINT32(save->p, mobj->mobjnum);
} }
@ -4925,6 +4932,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
{ {
mobj->owner = (mobj_t *)(size_t)READUINT32(save->p); mobj->owner = (mobj_t *)(size_t)READUINT32(save->p);
} }
if (diff3 & MD3_OWNER)
{
mobj->relinkplayer = READUINT8(save->p);
}
// link tid set earlier // link tid set earlier
P_AddThingTID(mobj); P_AddThingTID(mobj);