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_punt_ref,
mobj_owner,
mobj_relinkplayer,
};
static const char *const mobj_opt[] = {
@ -201,6 +202,7 @@ static const char *const mobj_opt[] = {
"reappear",
"punt_ref",
"owner",
"relinkplayer",
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])
@ -519,6 +521,9 @@ static int mobj_get(lua_State *L)
}
LUA_PushUserdata(L, mo->owner, META_MOBJ);
break;
case mobj_relinkplayer:
lua_pushinteger(L, mo->relinkplayer);
break;
default: // extra custom variables in Lua memory
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1));
@ -934,6 +939,9 @@ static int mobj_set(lua_State *L)
P_SetTarget(&mo->owner, owner);
}
break;
case mobj_relinkplayer:
mo->relinkplayer = luaL_checkinteger(L, 3);
break;
default:
lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS);
I_Assert(lua_istable(L, -1));

View file

@ -10353,9 +10353,24 @@ 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))
{
player_t *link = mobj->target->player;
if (link && playeringame[link-players] && !link->spectator)
mobj->relinkplayer = (link-players) + 1;
}
// Remove dead target/tracer.
if (mobj->target && P_MobjWasRemoved(mobj->target))
{
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))
P_SetTarget(&mobj->tracer, NULL);
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)
UINT8 relinkplayer; // reassociate kartitem target when it dies. ACHTUNG 1-INDEXED
// WARNING: New fields must be added separately to savegame and Lua.
};

View file

@ -2999,6 +2999,7 @@ typedef enum
MD3_REAPPEAR = 1<<1,
MD3_PUNT_REF = 1<<2,
MD3_OWNER = 1<<3,
MD3_RELINK_PLAYER = 1<<4,
} mobj_diff3_t;
typedef enum
@ -3322,6 +3323,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
diff3 |= MD3_PUNT_REF;
if (mobj->owner)
diff3 |= MD3_OWNER;
if (mobj->relinkplayer)
diff3 |= MD3_RELINK_PLAYER;
if (diff3 != 0)
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);
}
if (diff3 & MD3_RELINK_PLAYER)
{
WRITEUINT8(save->p, mobj->relinkplayer);
}
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);
}
if (diff3 & MD3_OWNER)
{
mobj->relinkplayer = READUINT8(save->p);
}
// link tid set earlier
P_AddThingTID(mobj);