diff --git a/src/d_player.h b/src/d_player.h index 96e990f79..a360f41b7 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -439,6 +439,11 @@ typedef struct { boolean flip; } sonicloopvars_t; +// player_t struct for power-ups +struct powerupvars_t { + mobj_t *flickyController; +}; + // player_t struct for all alternative viewpoint variables struct altview_t { @@ -756,6 +761,7 @@ struct player_t mobj_t *sliptideZipIndicator; mobj_t *whip; mobj_t *hand; + mobj_t *flickyAttacker; UINT8 instaShieldCooldown; UINT8 guardCooldown; @@ -777,6 +783,7 @@ struct player_t sonicloopvars_t loop; roundconditions_t roundconditions; + powerupvars_t powerup; }; // WARNING FOR ANYONE ABOUT TO ADD SOMETHING TO THE PLAYER STRUCT, G_PlayerReborn WANTS YOU TO SUFFER diff --git a/src/k_kart.c b/src/k_kart.c index 1a6ba0d06..64f54942e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8287,6 +8287,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->hand && P_MobjWasRemoved(player->hand)) P_SetTarget(&player->hand, NULL); + if (player->flickyAttacker && P_MobjWasRemoved(player->flickyAttacker)) + P_SetTarget(&player->flickyAttacker, NULL); + + if (player->powerup.flickyController && P_MobjWasRemoved(player->powerup.flickyController)) + P_SetTarget(&player->powerup.flickyController, NULL); + if (player->spectator == false) { K_KartEbrakeVisuals(player); diff --git a/src/p_saveg.c b/src/p_saveg.c index f80ffff7b..16efa2798 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -79,6 +79,8 @@ typedef enum RINGSHOOTER = 0x0100, WHIP = 0x0200, HAND = 0x0400, + FLICKYATTACKER = 0x0800, + FLICKYCONTROLLER = 0x1000, } player_saveflags; static inline void P_ArchivePlayer(savebuffer_t *save) @@ -319,6 +321,12 @@ static void P_NetArchivePlayers(savebuffer_t *save) if (players[i].ringShooter) flags |= RINGSHOOTER; + if (players[i].flickyAttacker) + flags |= FLICKYATTACKER; + + if (players[i].powerup.flickyController) + flags |= FLICKYCONTROLLER; + WRITEUINT16(save->p, flags); if (flags & SKYBOXVIEW) @@ -351,6 +359,12 @@ static void P_NetArchivePlayers(savebuffer_t *save) if (flags & RINGSHOOTER) WRITEUINT32(save->p, players[i].ringShooter->mobjnum); + if (flags & FLICKYATTACKER) + WRITEUINT32(save->p, players[i].flickyAttacker->mobjnum); + + if (flags & FLICKYCONTROLLER) + WRITEUINT32(save->p, players[i].powerup.flickyController->mobjnum); + WRITEUINT32(save->p, (UINT32)players[i].followitem); WRITEUINT32(save->p, players[i].charflags); @@ -754,6 +768,12 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) if (flags & RINGSHOOTER) players[i].ringShooter = (mobj_t *)(size_t)READUINT32(save->p); + if (flags & FLICKYATTACKER) + players[i].flickyAttacker = (mobj_t *)(size_t)READUINT32(save->p); + + if (flags & FLICKYCONTROLLER) + players[i].powerup.flickyController = (mobj_t *)(size_t)READUINT32(save->p); + players[i].followitem = (mobjtype_t)READUINT32(save->p); //SetPlayerSkinByNum(i, players[i].skin); @@ -5258,6 +5278,20 @@ static void P_RelinkPointers(void) if (!P_SetTarget(&players[i].ringShooter, P_FindNewPosition(temp))) CONS_Debug(DBG_GAMELOGIC, "ringShooter not found on player %d\n", i); } + if (players[i].flickyAttacker) + { + temp = (UINT32)(size_t)players[i].flickyAttacker; + players[i].flickyAttacker = NULL; + if (!P_SetTarget(&players[i].flickyAttacker, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "flickyAttacker not found on player %d\n", i); + } + if (players[i].powerup.flickyController) + { + temp = (UINT32)(size_t)players[i].powerup.flickyController; + players[i].powerup.flickyController = NULL; + if (!P_SetTarget(&players[i].powerup.flickyController, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "powerup.flickyController not found on player %d\n", i); + } } } diff --git a/src/typedef.h b/src/typedef.h index 275a30da4..013bf7f18 100644 --- a/src/typedef.h +++ b/src/typedef.h @@ -47,6 +47,7 @@ TYPEDEF (botvars_t); TYPEDEF (roundconditions_t); TYPEDEF (skybox_t); TYPEDEF (itemroulette_t); +TYPEDEF (powerupvars_t); TYPEDEF (altview_t); TYPEDEF (player_t);