From 2aa43f04b2d7ca68bab8432c8355a7bdb193a7b6 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 8 Jan 2023 16:45:14 +0000 Subject: [PATCH 1/2] Additional memory safety for follower handling --- src/k_follower.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/k_follower.c b/src/k_follower.c index 0a8869077..41623d57e 100644 --- a/src/k_follower.c +++ b/src/k_follower.c @@ -315,7 +315,8 @@ void K_HandleFollower(player_t *player) // don't do anything if we can't have a follower to begin with. // (It gets removed under those conditions) - if (player->spectator || player->followerskin < 0) + if (player->spectator || player->followerskin < 0 + || player->mo == NULL || P_MobjWasRemoved(player->mo)) { if (player->follower) { @@ -377,12 +378,15 @@ void K_HandleFollower(player_t *player) // Set follower colour color = K_GetEffectiveFollowerColor(player->followercolor, player->skincolor); - if (player->follower == NULL) // follower doesn't exist / isn't valid + if (player->follower == NULL || P_MobjWasRemoved(player->follower)) // follower doesn't exist / isn't valid { //CONS_Printf("Spawning follower...\n"); // so let's spawn one! P_SetTarget(&player->follower, P_SpawnMobj(sx, sy, sz, MT_FOLLOWER)); + if (player->follower == NULL) + return; + K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); P_SetTarget(&player->follower->target, player->mo); // we need that to know when we need to disappear @@ -402,14 +406,6 @@ void K_HandleFollower(player_t *player) } else // follower exists, woo! { - // Safety net (2) - - if (P_MobjWasRemoved(player->follower)) - { - P_SetTarget(&player->follower, NULL); // Remove this and respawn one, don't crash the game if Lua decides to P_RemoveMobj this thing. - return; - } - // first of all, handle states following the same model as above: if (player->follower->tics == 1) { From ba3a3f4203b6ba23dbbf596a0c7e875c88428356 Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 8 Jan 2023 16:51:58 +0000 Subject: [PATCH 2/2] Follower hitlag - If a player enters hitlag, put their follower in hitlag too - If a follower exists and is in hitlag, don't update it in K_HandleFollower --- src/k_follower.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/k_follower.c b/src/k_follower.c index 41623d57e..f0a1d7748 100644 --- a/src/k_follower.c +++ b/src/k_follower.c @@ -406,6 +406,12 @@ void K_HandleFollower(player_t *player) } else // follower exists, woo! { + if (player->follower->hitlag != 0) + { + // Don't update frames in hitlag + return; + } + // first of all, handle states following the same model as above: if (player->follower->tics == 1) { @@ -621,4 +627,11 @@ void K_HandleFollower(player_t *player) K_UpdateFollowerState(player->follower, fl.idlestate, FOLLOWERSTATE_IDLE); } } + + if (player->mo->hitlag) + { + player->follower->hitlag = player->mo->hitlag; + player->follower->eflags |= (player->mo->eflags & MFE_DAMAGEHITLAG); + return; + } }