diff --git a/src/k_kart.c b/src/k_kart.c index e5eb6346d..3342b809b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -542,16 +542,21 @@ UINT8 K_GetKartColorByName(const char *name) //} -UINT8 K_GetClosestPlayersColor(mobj_t *mobj) +player_t *K_GetItemBoxPlayer(mobj_t *mobj) { fixed_t closest = INT32_MAX; - UINT8 color = SKINCOLOR_NONE; + player_t *player = NULL; UINT8 i; for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo) - && !players[i].spectator && !players[i].exiting) + if (!(playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo) && !players[i].spectator)) + { + continue; + } + + // Always use normal item box rules -- could pass in "2" for fakes but they blend in better like this + if (P_CanPickupItem(&players[i], 1)) { fixed_t dist = P_AproxDistance(P_AproxDistance( players[i].mo->x - mobj->x, @@ -566,13 +571,13 @@ UINT8 K_GetClosestPlayersColor(mobj_t *mobj) if (dist < closest) { - color = players[i].skincolor; + player = &players[i]; closest = dist; } } } - return color; + return player; } //{ SRB2kart Net Variables @@ -5220,9 +5225,8 @@ static void K_MoveHeldObjects(player_t *player) if (cur->type == MT_EGGMANITEM_SHIELD) { - // K_GetClosestPlayersColor will practically always get our player anyway - // so we might as well save the effort - cur->color = player->skincolor; + // Decided that this should use their "canon" color. + cur->color = SKINCOLOR_BLACK; } cur->flags &= ~MF_NOCLIPTHING; diff --git a/src/k_kart.h b/src/k_kart.h index 14cb242bf..8dc5604b8 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -18,7 +18,7 @@ extern const UINT8 KartColor_Opposite[MAXSKINCOLORS*2]; void K_RainbowColormap(UINT8 *dest_colormap, UINT8 skincolor); void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color); UINT8 K_GetKartColorByName(const char *name); -UINT8 K_GetClosestPlayersColor(mobj_t *mobj); +player_t *K_GetItemBoxPlayer(mobj_t *mobj); void K_RegisterKartStuff(void); diff --git a/src/p_mobj.c b/src/p_mobj.c index 4f5b0b1aa..2a12dcc7a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8109,11 +8109,12 @@ void P_MobjThinker(mobj_t *mobj) } case MT_EGGMANITEM: { - UINT8 color = K_GetClosestPlayersColor(mobj); + player_t *player = K_GetItemBoxPlayer(mobj); + UINT8 color = SKINCOLOR_BLACK; - if (color == SKINCOLOR_NONE) + if (player != NULL) { - color = SKINCOLOR_BLACK; + color = player->skincolor; } mobj->color = color; @@ -8872,8 +8873,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_comebacktimer] > 0) { - if (state < mobj->info->spawnstate || state > mobj->info->spawnstate+19) - P_SetMobjState(mobj, mobj->info->spawnstate); + if (state < S_PLAYERBOMB1 || state > S_PLAYERBOMB20) + P_SetMobjState(mobj, S_PLAYERBOMB1); if (mobj->target->player->kartstuff[k_comebacktimer] < TICRATE && (leveltime & 1)) mobj->flags2 &= ~MF2_DONTDRAW; else @@ -8882,14 +8883,14 @@ void P_MobjThinker(mobj_t *mobj) else { if (!mobj->target->player->kartstuff[k_comebackmode] - && (state < mobj->info->spawnstate || state > mobj->info->spawnstate+19)) - P_SetMobjState(mobj, mobj->info->spawnstate); + && (state < S_PLAYERBOMB1 || state > S_PLAYERBOMB20)) + P_SetMobjState(mobj, S_PLAYERBOMB1); else if (mobj->target->player->kartstuff[k_comebackmode] == 1 - && state != mobj->info->seestate) - P_SetMobjState(mobj, mobj->info->seestate); + && (state < S_PLAYERITEM1 || state > S_PLAYERITEM12)) + P_SetMobjState(mobj, S_PLAYERITEM1); else if (mobj->target->player->kartstuff[k_comebackmode] == 2 - && state != mobj->info->painstate) - P_SetMobjState(mobj, mobj->info->painstate); + && (state < S_PLAYERFAKE1 || state > S_PLAYERFAKE12)) + P_SetMobjState(mobj, S_PLAYERFAKE1); if (mobj->target->player->powers[pw_flashing] && (leveltime & 1)) mobj->flags2 |= MF2_DONTDRAW; @@ -9969,11 +9970,12 @@ void P_MobjThinker(mobj_t *mobj) } else { - UINT8 color = K_GetClosestPlayersColor(mobj); + player_t *player = K_GetItemBoxPlayer(mobj); + UINT8 color = SKINCOLOR_BLACK; - if (color == SKINCOLOR_NONE) + if (player != NULL) { - color = SKINCOLOR_BLACK; + color = player->skincolor; } mobj->color = color;