mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Relink player to kartitems
This commit is contained in:
parent
80c02ca6db
commit
e8140ae388
4 changed files with 36 additions and 0 deletions
|
|
@ -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));
|
||||||
|
|
|
||||||
15
src/p_mobj.c
15
src/p_mobj.c
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue