From 6c1629868fe84414d4f7595d28c8030dffab35d7 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Fri, 7 Mar 2025 01:11:17 -0300 Subject: [PATCH 1/9] fix bubble shield trap respawn softlock --- src/d_player.h | 2 ++ src/k_respawn.c | 6 ++++++ src/lua_playerlib.c | 13 +++++++++++++ src/p_inter.c | 2 ++ src/p_mobj.c | 1 + 5 files changed, 24 insertions(+) diff --git a/src/d_player.h b/src/d_player.h index f1458f7fc..3c010fbfc 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -775,6 +775,8 @@ struct player_t UINT8 curshield; // see kartshields_t UINT8 bubblecool; // Bubble Shield use cooldown UINT8 bubbleblowup; // Bubble Shield usage blowup + mobj_t *bubbletrap; // Bubble player is trapped inside + boolean gotbubbletrapped; //to know if player was got trapped UINT16 flamedash; // Flame Shield dash power UINT16 flamemeter; // Flame Shield dash meter left UINT8 flamelength; // Flame Shield dash meter, number of segments diff --git a/src/k_respawn.c b/src/k_respawn.c index 6fe2f9897..e8ba03976 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -726,6 +726,12 @@ static void K_DropDashWait(player_t *player) if (player->pflags & PF_FAULT) return; + // if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag + if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY) + { + player->mo->flags &= ~MF_NOGRAVITY; + } + if (leveltime % 8 == 0) { const UINT8 ns = 8; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index ee56da06f..daabaa701 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -430,6 +430,10 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->bubblecool); else if (fastcmp(field,"bubbleblowup")) lua_pushinteger(L, plr->bubbleblowup); + else if (fastcmp(field,"bubbletrap")) + LUA_PushUserdata(L, plr->bubbletrap, META_MOBJ); + else if (fastcmp(field,"gotbubbletrapped")) + lua_pushboolean(L, plr->gotbubbletrapped); else if (fastcmp(field,"flamedash")) lua_pushinteger(L, plr->flamedash); else if (fastcmp(field,"counterdash")) @@ -994,6 +998,15 @@ static int player_set(lua_State *L) plr->bubblecool = luaL_checkinteger(L, 3); else if (fastcmp(field,"bubbleblowup")) plr->bubbleblowup = luaL_checkinteger(L, 3); + else if (fastcmp(field,"bubbletrap")) + { + mobj_t *mo = NULL; + if (!lua_isnil(L, 3)) + mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); + P_SetTarget(&plr->bubbletrap, mo); + } + else if (fastcmp(field,"gotbubbletrapped")) + plr->gotbubbletrapped = luaL_checkboolean(L, 3); else if (fastcmp(field,"flamedash")) plr->flamedash = luaL_checkinteger(L, 3); else if (fastcmp(field,"counterdash")) diff --git a/src/p_inter.c b/src/p_inter.c index 49cae6cab..ed35a65b0 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -642,6 +642,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); + toucher->player->gotbubbletrapped = true; + P_SetTarget(&toucher->player->bubbletrap, special); //allow it to access later on and to know if player is trapped // Snap to the unfortunate player and quit moving laterally, or we can end up quite far away special->momx = 0; diff --git a/src/p_mobj.c b/src/p_mobj.c index 896af74d6..3eebff507 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9387,6 +9387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY; + mobj->tracer->player->gotbubbletrapped = false; P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL); break; } -- GitLab From c622ee9c90cdb1eee6962cac8bf1c5e8ffd164c1 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Fri, 7 Mar 2025 16:41:59 -0300 Subject: [PATCH 2/9] fix missing ) --- src/k_respawn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_respawn.c b/src/k_respawn.c index e8ba03976..785d67370 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -727,7 +727,7 @@ static void K_DropDashWait(player_t *player) return; // if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag - if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY) + if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY)) { player->mo->flags &= ~MF_NOGRAVITY; } -- GitLab From ed5adc5b78ff233058240ee31bb5d3809b3f02cf Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Tue, 11 Mar 2025 02:03:35 -0300 Subject: [PATCH 3/9] use player->carry and player->mobj->tracer --- src/d_player.h | 3 +-- src/deh_tables.c | 1 + src/k_respawn.c | 5 +++-- src/lua_playerlib.c | 13 ------------- src/p_inter.c | 4 ++-- src/p_mobj.c | 2 +- 6 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 3c010fbfc..80ebacc25 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -150,6 +150,7 @@ typedef enum CR_SLIDING, CR_ZOOMTUBE, CR_DASHRING, + CR_TRAPBUBBLE, } carrytype_t; // carry /* @@ -775,8 +776,6 @@ struct player_t UINT8 curshield; // see kartshields_t UINT8 bubblecool; // Bubble Shield use cooldown UINT8 bubbleblowup; // Bubble Shield usage blowup - mobj_t *bubbletrap; // Bubble player is trapped inside - boolean gotbubbletrapped; //to know if player was got trapped UINT16 flamedash; // Flame Shield dash power UINT16 flamemeter; // Flame Shield dash meter left UINT8 flamelength; // Flame Shield dash meter, number of segments diff --git a/src/deh_tables.c b/src/deh_tables.c index 6a5255e8e..1b7a8fcb7 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4671,6 +4671,7 @@ struct int_const_s const INT_CONST[] = { // Carrying {"CR_NONE",CR_NONE}, {"CR_ZOOMTUBE",CR_ZOOMTUBE}, + {"CR_TRAPBUBBLE",CR_TRAPBUBBLE}, // Character flags (skinflags_t) {"SF_MACHINE",SF_MACHINE}, diff --git a/src/k_respawn.c b/src/k_respawn.c index 785d67370..748b9aaae 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -726,10 +726,11 @@ static void K_DropDashWait(player_t *player) if (player->pflags & PF_FAULT) return; - // if player got trapped inside a ubble but lost its bubble object in a unintended way, remove no gravity flag - if ((P_MobjWasRemoved(player->bubbletrap) && player->gotbubbletrapped == true) && (player->mo->flags & MF_NOGRAVITY)) + // if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag + if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY)) { player->mo->flags &= ~MF_NOGRAVITY; + player->carry = CR_NONE; } if (leveltime % 8 == 0) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index daabaa701..ee56da06f 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -430,10 +430,6 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->bubblecool); else if (fastcmp(field,"bubbleblowup")) lua_pushinteger(L, plr->bubbleblowup); - else if (fastcmp(field,"bubbletrap")) - LUA_PushUserdata(L, plr->bubbletrap, META_MOBJ); - else if (fastcmp(field,"gotbubbletrapped")) - lua_pushboolean(L, plr->gotbubbletrapped); else if (fastcmp(field,"flamedash")) lua_pushinteger(L, plr->flamedash); else if (fastcmp(field,"counterdash")) @@ -998,15 +994,6 @@ static int player_set(lua_State *L) plr->bubblecool = luaL_checkinteger(L, 3); else if (fastcmp(field,"bubbleblowup")) plr->bubbleblowup = luaL_checkinteger(L, 3); - else if (fastcmp(field,"bubbletrap")) - { - mobj_t *mo = NULL; - if (!lua_isnil(L, 3)) - mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); - P_SetTarget(&plr->bubbletrap, mo); - } - else if (fastcmp(field,"gotbubbletrapped")) - plr->gotbubbletrapped = luaL_checkboolean(L, 3); else if (fastcmp(field,"flamedash")) plr->flamedash = luaL_checkinteger(L, 3); else if (fastcmp(field,"counterdash")) diff --git a/src/p_inter.c b/src/p_inter.c index ed35a65b0..1c696327a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -642,8 +642,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) P_SetTarget(&special->tracer, toucher); toucher->flags |= MF_NOGRAVITY; toucher->momz = (8*toucher->scale) * P_MobjFlip(toucher); - toucher->player->gotbubbletrapped = true; - P_SetTarget(&toucher->player->bubbletrap, special); //allow it to access later on and to know if player is trapped + toucher->player->carry = CR_TRAPBUBBLE; + P_SetTarget(&toucher->tracer, special); //use tracer to acces the object // Snap to the unfortunate player and quit moving laterally, or we can end up quite far away special->momx = 0; diff --git a/src/p_mobj.c b/src/p_mobj.c index 3eebff507..ccb810bf9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9387,7 +9387,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) { S_StartSound(mobj->tracer, sfx_s3k77); mobj->tracer->flags &= ~MF_NOGRAVITY; - mobj->tracer->player->gotbubbletrapped = false; + mobj->tracer->player->carry = CR_NONE; P_KillMobj(mobj, mobj->tracer, mobj->tracer, DMG_NORMAL); break; } -- GitLab From 4e4a3d3ba6663e8f92c86b0c7741cee70d724946 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 02:21:28 -0300 Subject: [PATCH 4/9] move missplaced code from DropDashWait to HandleDropDash --- src/k_respawn.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/k_respawn.c b/src/k_respawn.c index 748b9aaae..127dc7a3c 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -724,14 +724,7 @@ static void K_DropDashWait(player_t *player) player->respawn.timer--; if (player->pflags & PF_FAULT) - return; - - // if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag - if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY)) - { - player->mo->flags &= ~MF_NOGRAVITY; - player->carry = CR_NONE; - } + return; if (leveltime % 8 == 0) { @@ -878,6 +871,12 @@ static void K_HandleDropDash(player_t *player) { player->mo->colorized = false; } + // if player got trapped inside a bubble but lost its bubble object in a unintended way, remove no gravity flag + if (((P_MobjWasRemoved(player->mo->tracer) || player->mo->tracer == NULL || (!P_MobjWasRemoved(player->mo->tracer) && player->mo->tracer && player->mo->tracer->type != MT_BUBBLESHIELDTRAP)) && player->carry == CR_TRAPBUBBLE) && (player->mo->flags & MF_NOGRAVITY)) + { + player->mo->flags &= ~MF_NOGRAVITY; + player->carry = CR_NONE; + } } else { -- GitLab From b668678278c172af1da447d4b49cbd40f2016db9 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 02:24:07 -0300 Subject: [PATCH 5/9] add missing CR_ flags in deh_tables.c --- src/deh_tables.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index 1b7a8fcb7..58deb6cb8 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4670,7 +4670,9 @@ struct int_const_s const INT_CONST[] = { // Carrying {"CR_NONE",CR_NONE}, + {"CR_SLIDING",CR_SLIDING}, {"CR_ZOOMTUBE",CR_ZOOMTUBE}, + {"CR_DASHRING",CR_DASHRING}, {"CR_TRAPBUBBLE",CR_TRAPBUBBLE}, // Character flags (skinflags_t) -- GitLab From 05923e935d259a37a210d47c6495aafd13cbffc2 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 02:27:05 -0300 Subject: [PATCH 6/9] check tracer and player carry flag on trapbubble thinker --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index ccb810bf9..4fe37026e 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9339,7 +9339,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (leveltime % 180 == 0) S_StartSound(mobj, sfx_s3kbfl); - if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->player) + if (mobj->tracer && !P_MobjWasRemoved(mobj->tracer) && mobj->tracer->tracer == mobj && mobj->tracer->player && mobj->tracer->player->carry == CR_TRAPBUBBLE) { player_t *player = mobj->tracer->player; fixed_t destx, desty, curfz, destfz; -- GitLab From 25712a0cf3f75efea0bc755cd86336c3d0104590 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 02:31:01 -0300 Subject: [PATCH 7/9] make game keep CR_TRAPBUBBLE flag on player respawn/reset --- src/p_inter.c | 3 ++- src/p_user.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 1c696327a..2bad99e5d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2626,7 +2626,8 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, K_DropEmeraldsFromPlayer(player, player->emeralds); //K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true); - player->carry = CR_NONE; + if (player->carry != CR_TRAPBUBBLE) + player->carry = CR_NONE; K_KartResetPlayerColor(player); diff --git a/src/p_user.c b/src/p_user.c index ecff343ee..0ba95a032 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -418,7 +418,8 @@ void P_ResetPlayer(player_t *player) { //player->pflags &= ~(PF_); - player->carry = CR_NONE; + if (player->carry != CR_TRAPBUBBLE) + player->carry = CR_NONE; player->onconveyor = 0; //player->drift = player->driftcharge = 0; -- GitLab From da0d266a60415951ac28de0ae900882374046441 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 15:30:43 -0300 Subject: [PATCH 8/9] let player->carry be reseted on player true death --- src/p_inter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 2bad99e5d..1e22373be 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2626,8 +2626,8 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, K_DropEmeraldsFromPlayer(player, player->emeralds); //K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true); - if (player->carry != CR_TRAPBUBBLE) - player->carry = CR_NONE; + //if (player->carry != CR_TRAPBUBBLE) + player->carry = CR_NONE; K_KartResetPlayerColor(player); -- GitLab From 3ac03eb572dc46338fa59057fd4090a512261f78 Mon Sep 17 00:00:00 2001 From: Lighto97 <lighto97@outlook.com> Date: Wed, 12 Mar 2025 15:31:36 -0300 Subject: [PATCH 9/9] remove code i comented to test it out, oops --- src/p_inter.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 1e22373be..1c696327a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2626,7 +2626,6 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, K_DropEmeraldsFromPlayer(player, player->emeralds); //K_SetHitLagForObjects(player->mo, inflictor, source, MAXHITLAGTICS, true); - //if (player->carry != CR_TRAPBUBBLE) player->carry = CR_NONE; K_KartResetPlayerColor(player); -- GitLab