diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 79548c2ab..0a97a853e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -561,6 +561,9 @@ consvar_t cv_kartbumpspark = CVAR_INIT("kartbumpspark", consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "Yes", CV_NETVAR, CV_YesNo, NULL); +consvar_t cv_kartexplosion_limitlifetime = CVAR_INIT ("kartexplosion_limitlifetime", "Off", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartexplosion_limitlifetime_cap = CVAR_INIT ("kartexplosion_limitlifetime_cap", "12", CV_NETVAR, CV_Natural, NULL); + consvar_t cv_kartslipdash = CVAR_INIT ("kartslipdash", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartSlipdash_OnChange); consvar_t cv_kartslopeboost = CVAR_INIT ("kartslopeboost", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlopeBoost_OnChange); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 6d188f04d..e8e270783 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -198,6 +198,8 @@ extern consvar_t cv_kartitembreaker; extern consvar_t cv_kartpurpledrift; extern consvar_t cv_kartbumpspark; extern consvar_t cv_kartbumpspring; +extern consvar_t cv_kartexplosion_limitlifetime; +extern consvar_t cv_kartexplosion_limitlifetime_cap; extern consvar_t cv_kartslipdash; extern consvar_t cv_kartslopeboost; extern consvar_t cv_kartinvintype; diff --git a/src/k_kart.c b/src/k_kart.c index d987eb823..3379157ab 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -441,6 +441,9 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_naturalcamera); CV_RegisterVar(&cv_gptest); + + CV_RegisterVar(&cv_kartexplosion_limitlifetime); + CV_RegisterVar(&cv_kartexplosion_limitlifetime_cap); } //} diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index c1ad48ab2..3c7d03c71 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -93,8 +93,10 @@ enum mobj_e { mobj_scalespeed, mobj_extravalue1, mobj_extravalue2, + mobj_extravalue3, mobj_cusval, mobj_cvmem, + mobj_mobjlifetime, mobj_standingslope, mobj_colorized, mobj_mirrored, @@ -188,8 +190,10 @@ static const char *const mobj_opt[] = { "scalespeed", "extravalue1", "extravalue2", + "extravalue3", "cusval", "cvmem", + "mobjlifetime", "standingslope", "colorized", "mirrored", @@ -531,12 +535,18 @@ static int mobj_get(lua_State *L) case mobj_extravalue2: lua_pushinteger(L, mo->extravalue2); break; + case mobj_extravalue3: + lua_pushinteger(L, mo->extravalue3); + break; case mobj_cusval: lua_pushinteger(L, mo->cusval); break; case mobj_cvmem: lua_pushinteger(L, mo->cvmem); break; + case mobj_mobjlifetime: + lua_pushinteger(L, mo->mobjlifetime); + break; case mobj_standingslope: LUA_PushUserdata(L, mo->standingslope, META_SLOPE); break; @@ -1025,12 +1035,18 @@ static int mobj_set(lua_State *L) case mobj_extravalue2: mo->extravalue2 = luaL_checkinteger(L, 3); break; + case mobj_extravalue3: + mo->extravalue3 = luaL_checkinteger(L, 3); + break; case mobj_cusval: mo->cusval = luaL_checkinteger(L, 3); break; case mobj_cvmem: mo->cvmem = luaL_checkinteger(L, 3); break; + case mobj_mobjlifetime: + mo->mobjlifetime = luaL_checkinteger(L, 3); + break; case mobj_standingslope: return NOSET; case mobj_colorized: diff --git a/src/p_mobj.c b/src/p_mobj.c index 9fda585e0..fc5b7fab5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8810,7 +8810,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->health--; break; case MT_MINEEXPLOSION: - if ((mobj->z < mobj->floorz - mobj->height) || (mobj->z > mobj->ceilingz + mobj->height)) + if ((mobj->z < mobj->floorz - mobj->height) + || (mobj->z > mobj->ceilingz + mobj->height) + || (cv_kartexplosion_limitlifetime.value && mobj->mobjlifetime > cv_kartexplosion_limitlifetime_cap.value)) { P_KillMobj(mobj, NULL, NULL, DMG_NORMAL); break; @@ -10451,6 +10453,9 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->itnext && P_MobjWasRemoved(mobj->itnext)) P_SetTarget(&mobj->itnext, NULL); + // Tick lifetime of mobj + mobj->mobjlifetime++; + if (mobj->flags & MF_NOTHINK) return; diff --git a/src/p_mobj.h b/src/p_mobj.h index c3d31cfdb..000dd2613 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -414,6 +414,9 @@ struct mobj_t INT32 cusval; INT32 cvmem; + // Time Mobj has been alive for, useful for stats or gameplay tracking purposes. + UINT16 mobjlifetime; + pslope_t *standingslope; // The slope that the object is standing on (shouldn't need synced in savegames, right?) boolean resetinterp; // if true, some fields should not be interpolated (see R_InterpolateMobjState implementation) diff --git a/src/p_saveg.c b/src/p_saveg.c index 33c80fc2f..281e33a61 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1837,6 +1837,7 @@ enum mobj_diff_t MD3_MISCCAP, MD3_BAKEDOFFSET, MD3_EXTVAL3, + MD3_LIFETIME, MD__MAX }; @@ -1998,6 +1999,7 @@ static void DiffMobj(const mobj_t *mobj, UINT32 diff[]) DIFF(mobj == misccap, MD3_MISCCAP); DIFF(mobj->bakexoff || mobj->bakeyoff || mobj->bakezoff || mobj->bakexpiv || mobj->bakeypiv || mobj->bakezpiv, MD3_BAKEDOFFSET); DIFF(mobj->extravalue3, MD3_EXTVAL3); + DIFF(mobj->mobjlifetime, MD3_LIFETIME); } static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinker_t *th, UINT8 type) @@ -2321,6 +2323,7 @@ static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinke SYNCF(MD3_BAKEDOFFSET, mobj->bakeypiv); SYNCF(MD3_BAKEDOFFSET, mobj->bakezpiv); SYNCF(MD3_EXTVAL3, mobj->extravalue3); + SYNCF(MD3_LIFETIME, mobj->mobjlifetime); if (!save->write) {