From a134465e65f73b75deab350516c69b1a8b35e261 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 17 Mar 2023 21:27:19 +0000 Subject: [PATCH 1/2] S3K Shields: remove splitscreen-dependent mobj position behaviour Was especially egregrious for bubble shield, which literally has a hitbox and could've caused live desync. --- src/p_mobj.c | 76 +++------------------------------------------------- 1 file changed, 3 insertions(+), 73 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4e466e937..f56f4f731 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8085,7 +8085,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } case MT_LIGHTNINGSHIELD: { - fixed_t destx, desty; if (!mobj->target || !mobj->target->health || !mobj->target->player || mobj->target->player->curshield != KSHIELD_LIGHTNING) { @@ -8094,36 +8093,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } P_SetScale(mobj, (mobj->destscale = (5*mobj->target->scale)>>2)); - if (!r_splitscreen /*&& rendermode != render_soft*/) - { - angle_t viewingangle; - statenum_t curstate = ((mobj->tics == 1) ? (mobj->state->nextstate) : ((statenum_t)(mobj->state-states))); - - if (players[displayplayers[0]].awayview.tics) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y); - else if (!camera[0].chase && players[displayplayers[0]].mo) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); - else - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - - if (curstate > S_LIGHTNINGSHIELD15 && curstate <= S_LIGHTNINGSHIELD24) - viewingangle += ANGLE_180; - - destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); - desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); - } - else - { - destx = mobj->target->x; - desty = mobj->target->y; - } - - P_MoveOrigin(mobj, destx, desty, mobj->target->z); + P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; } case MT_BUBBLESHIELD: { - fixed_t destx, desty; fixed_t scale; statenum_t curstate; @@ -8226,34 +8200,13 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->extravalue2 = mobj->target->player->bubbleblowup; P_SetScale(mobj, (mobj->destscale = scale)); - if (!splitscreen /*&& rendermode != render_soft*/) - { - angle_t viewingangle; - - if (players[displayplayers[0]].awayview.tics) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y); - else if (!camera[0].chase && players[displayplayers[0]].mo) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); - else - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - - destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); - desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); - } - else - { - destx = mobj->target->x; - desty = mobj->target->y; - } - mobj->flags &= ~(MF_NOCLIPTHING); - P_MoveOrigin(mobj, destx, desty, mobj->target->z); + P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); mobj->flags |= MF_NOCLIPTHING; break; } case MT_FLAMESHIELD: { - fixed_t destx, desty; statenum_t curstate; statenum_t underlayst = S_NULL; INT32 flamemax = 0; @@ -8333,30 +8286,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } } - if (!splitscreen /*&& rendermode != render_soft*/) - { - angle_t viewingangle; - - if (players[displayplayers[0]].awayview.tics) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].awayview.mobj->x, players[displayplayers[0]].awayview.mobj->y); - else if (!camera[0].chase && players[displayplayers[0]].mo) - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, players[displayplayers[0]].mo->x, players[displayplayers[0]].mo->y); - else - viewingangle = R_PointToAngle2(mobj->target->x, mobj->target->y, camera[0].x, camera[0].y); - - if (curstate >= S_FLAMESHIELD1 && curstate < S_FLAMESHIELDDASH1 && ((curstate-S_FLAMESHIELD1) & 1)) - viewingangle += ANGLE_180; - - destx = mobj->target->x + P_ReturnThrustX(mobj->target, viewingangle, mobj->scale>>4); - desty = mobj->target->y + P_ReturnThrustY(mobj->target, viewingangle, mobj->scale>>4); - } - else - { - destx = mobj->target->x; - desty = mobj->target->y; - } - - P_MoveOrigin(mobj, destx, desty, mobj->target->z); + P_MoveOrigin(mobj, mobj->target->x, mobj->target->y, mobj->target->z); mobj->angle = K_MomentumAngle(mobj->target); if (underlayst != S_NULL) From fcfaf1321ceca8b850633c8b71abe2d0ea80982a Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 17 Mar 2023 21:31:50 +0000 Subject: [PATCH 2/2] Flame shield polish - MT_FLAMESHIELD: Flicker dispoffset depending on whether frame is supposed to be behind or in front of player - MT_FLAMESHILEDUNDERLAY: Use P_SpawnMobjFromMobj to match interpolation coordintes, any other relevant properties, etc --- src/p_mobj.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f56f4f731..a020137a1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8226,6 +8226,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (mobj->target->player->flamedash) { + mobj->dispoffset = 1; + if (!(curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12)) P_SetMobjState(mobj, S_FLAMESHIELDDASH1); @@ -8267,6 +8269,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { if (curstate >= S_FLAMESHIELDDASH1 && curstate <= S_FLAMESHIELDDASH12) P_SetMobjState(mobj, S_FLAMESHIELD1); + mobj->dispoffset = ((curstate - S_FLAMESHIELD1) & 1) ? -1 : 1; } mobj->extravalue1 = mobj->target->player->flamedash; @@ -8291,8 +8294,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (underlayst != S_NULL) { - mobj_t *underlay = P_SpawnMobj(mobj->target->x, mobj->target->y, mobj->target->z, MT_FLAMESHIELDUNDERLAY); - underlay->angle = mobj->angle; + mobj_t *underlay = P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_FLAMESHIELDUNDERLAY); P_SetMobjState(underlay, underlayst); } break;