diff --git a/src/d_player.h b/src/d_player.h index 64547b348..ca4e4f38e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -727,6 +727,8 @@ struct player_t UINT8 justDI; // Turn-lockout timer to briefly prevent unintended turning after DI, resets when actionable or no input boolean flipDI; // Bananas flip the DI direction. Was a bug, but it made bananas much more interesting. + boolean cangrabitems; + SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn fixed_t driftcharge; // Charge your drift so you can release a burst of speed UINT16 driftboost; // (0 to 125 baseline) - Boost you get from drifting diff --git a/src/g_game.c b/src/g_game.c index 392d6f72b..e0bc76b25 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2241,6 +2241,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) UINT8 botdiffincrease; boolean botrival; + boolean cangrabitems; + SINT8 xtralife; uint8_t public_key[PUBKEYLENGTH]; @@ -2342,6 +2344,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) bot = players[player].bot; botdifficulty = players[player].botvars.difficulty; + cangrabitems = players[player].cangrabitems; + botdiffincrease = players[player].botvars.diffincrease; botrival = players[player].botvars.rival; @@ -2567,6 +2571,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->charflags = charflags; p->lastfakeskin = lastfakeskin; + p->cangrabitems = cangrabitems; + memcpy(players[player].availabilities, availabilities, sizeof(availabilities)); p->followitem = followitem; diff --git a/src/k_kart.c b/src/k_kart.c index 5173fa3eb..48e20206b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4235,6 +4235,7 @@ void K_CheckpointCrossAward(player_t *player) return; player->exp += K_GetExpAdjustment(player); + player->cangrabitems = true; K_AwardPlayerRings(player, (player->bot ? 20 : 10), true); } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 62eca4611..0da01f714 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -264,6 +264,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->justDI); else if (fastcmp(field,"flipdi")) lua_pushboolean(L, plr->flipDI); + else if (fastcmp(field,"cangrabitems")) + lua_pushboolean(L, plr->cangrabitems); else if (fastcmp(field,"analoginput")) lua_pushboolean(L, plr->analoginput); else if (fastcmp(field,"transfer")) @@ -876,6 +878,8 @@ static int player_set(lua_State *L) plr->justDI = luaL_checkinteger(L, 3); else if (fastcmp(field,"flipdi")) plr->flipDI = luaL_checkboolean(L, 3); + else if (fastcmp(field,"cangrabitems")) + plr->cangrabitems = luaL_checkboolean(L, 3); else if (fastcmp(field,"incontrol")) plr->incontrol = luaL_checkinteger(L, 3); else if (fastcmp(field,"progressivethrust")) diff --git a/src/objects/random-item.c b/src/objects/random-item.c index 0e0a2a788..fa5419084 100644 --- a/src/objects/random-item.c +++ b/src/objects/random-item.c @@ -112,6 +112,15 @@ void Obj_RandomItemVisuals(mobj_t *mobj) ItemBoxScaling(mobj); item_vfxtimer(mobj)++; + for (UINT8 i = 0; i <= r_splitscreen; i++) + { + UINT32 flag = K_GetPlayerDontDrawFlag(&players[displayplayers[i]]); + if (!players[displayplayers[i]].cangrabitems) + mobj->renderflags |= flag; + else + mobj->renderflags &= ~(flag); + } + if (mobj->type != MT_RANDOMITEM) return; diff --git a/src/p_inter.c b/src/p_inter.c index b3d178254..76997b541 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -128,6 +128,9 @@ boolean P_CanPickupItem(player_t *player, UINT8 weapon) if (weapon != 2 && player->instaWhipCharge) return false; + if (weapon == 1 && !player->cangrabitems) + return false; + if (weapon) { // Item slot already taken up diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 9f11fbb70..4abeb51fb 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -459,6 +459,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].justDI); WRITEUINT8(save->p, players[i].flipDI); + WRITEUINT8(save->p, players[i].cangrabitems); + WRITESINT8(save->p, players[i].drift); WRITEFIXED(save->p, players[i].driftcharge); WRITEUINT16(save->p, players[i].driftboost); @@ -1097,6 +1099,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].justDI = READUINT8(save->p); players[i].flipDI = (boolean)READUINT8(save->p); + players[i].cangrabitems = (boolean)READUINT8(save->p); + players[i].drift = READSINT8(save->p); players[i].driftcharge = READFIXED(save->p); players[i].driftboost = READUINT16(save->p);