Oni's suggestions

- Only look for players who can pick up the item. Serves as a subtle tell for other players holding onto items, and lets you see the canon color more often
- Held eggman item uses black instead of player color
- Fix karma items not animating
This commit is contained in:
Sally Cochenour 2020-03-30 07:43:22 -04:00
parent 266ad99374
commit 69a67376b3
3 changed files with 30 additions and 24 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;