From 0568c46005e46e59e8b1bdea843641904360dda0 Mon Sep 17 00:00:00 2001
From: AJ Martinez <aj@worldsbe.st>
Date: Sat, 18 May 2024 20:16:07 -0700
Subject: [PATCH] Add automatic generic bump unstuck

---
 src/d_player.h      |  1 +
 src/k_kart.c        | 10 ++++++++++
 src/lua_playerlib.c |  4 ++++
 src/p_map.c         |  3 +++
 src/p_saveg.c       |  2 ++
 5 files changed, 20 insertions(+)

diff --git a/src/d_player.h b/src/d_player.h
index dbc76b3e39..69a4207c98 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -1010,6 +1010,7 @@ struct player_t
 	UINT8 preventfailsafe; // Set when taking damage to prevent cheesing eggboxes
 
 	UINT8 tripwireUnstuck;
+	UINT8 bumpUnstuck;
 
 	UINT8 handtimer;
 	angle_t besthanddirection;
diff --git a/src/k_kart.c b/src/k_kart.c
index 19989c7317..206aef4ffc 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -9162,6 +9162,16 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
 	if (player->hyudorotimer)
 		player->hyudorotimer--;
 
+	if (player->bumpUnstuck > 30*5)
+	{
+		player->bumpUnstuck = 0;
+		K_DoIngameRespawn(player);
+	}
+	else if (player->bumpUnstuck)
+	{
+		player->bumpUnstuck--;
+	}
+
 	if (player->fakeBoost)
 		player->fakeBoost--;
 
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index 432af513a3..8bd5821db0 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -388,6 +388,8 @@ static int player_get(lua_State *L)
 		lua_pushinteger(L, plr->preventfailsafe);
 	else if (fastcmp(field,"tripwireunstuck"))
 		lua_pushinteger(L, plr->tripwireUnstuck);
+	else if (fastcmp(field,"bumpunstuck"))
+		lua_pushinteger(L, plr->bumpUnstuck);
 	/*
 	else if (fastcmp(field,"itemroulette"))
 		lua_pushinteger(L, plr->itemroulette);
@@ -946,6 +948,8 @@ static int player_set(lua_State *L)
 		plr->preventfailsafe = luaL_checkinteger(L, 3);
 	else if (fastcmp(field,"tripwireunstuck"))
 		plr->tripwireUnstuck = luaL_checkinteger(L, 3);
+	else if (fastcmp(field,"bumpunstuck"))
+		plr->bumpUnstuck = luaL_checkinteger(L, 3);
 	/*
 	else if (fastcmp(field,"itemroulette"))
 		plr->itemroulette = luaL_checkinteger(L, 3);
diff --git a/src/p_map.c b/src/p_map.c
index bb7868dd44..7f1965aeea 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -4085,6 +4085,9 @@ static void P_BouncePlayerMove(mobj_t *mo, TryMoveResult_t *result)
 	P_PlayerHitBounceLine(bestslideline, &result->normal);
 	mo->eflags |= MFE_JUSTBOUNCEDWALL;
 
+	if (mo->player)
+		mo->player->bumpUnstuck += 5;
+
 	// Combo avoidance!
 	if (mo->player && P_PlayerInPain(mo->player) && gametyperules & GTR_BUMPERS && mo->health == 1)
 	{
diff --git a/src/p_saveg.c b/src/p_saveg.c
index a75274b056..6c5e8dc2ee 100644
--- a/src/p_saveg.c
+++ b/src/p_saveg.c
@@ -608,6 +608,7 @@ static void P_NetArchivePlayers(savebuffer_t *save)
 		WRITEUINT8(save->p, players[i].preventfailsafe);
 
 		WRITEUINT8(save->p, players[i].tripwireUnstuck);
+		WRITEUINT8(save->p, players[i].bumpUnstuck);
 
 		WRITEUINT8(save->p, players[i].handtimer);
 		WRITEANGLE(save->p, players[i].besthanddirection);
@@ -1211,6 +1212,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
 		players[i].preventfailsafe = READUINT8(save->p);
 
 		players[i].tripwireUnstuck = READUINT8(save->p);
+		players[i].bumpUnstuck = READUINT8(save->p);
 
 		players[i].handtimer = READUINT8(save->p);
 		players[i].besthanddirection = READANGLE(save->p);
-- 
GitLab