Port various RR related spectating fixes

This commit is contained in:
NepDisk 2026-03-29 06:02:30 -04:00
parent e802edb628
commit 8273c91adf
8 changed files with 73 additions and 75 deletions

View file

@ -3886,6 +3886,8 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
node = READUINT8(*p);
newplayernum = READUINT8(*p);
CONS_Debug(DBG_NETPLAY, "addplayer: %d %d\n", node, newplayernum);
if (newplayernum+1 > doomcom->numslots)
doomcom->numslots = (INT16)(newplayernum+1);
@ -3898,13 +3900,13 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
console = READUINT8(*p);
splitscreenplayer = READUINT8(*p);
G_AddPlayer(newplayernum, console);
for (i = 0; i < MAXAVAILABILITY; i++)
{
newplayer->availabilities[i] = READUINT8(*p);
}
G_AddPlayer(newplayernum, console);
// the server is creating my player
if (node == mynode)
{
@ -3936,6 +3938,13 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
players[newplayernum].splitscreenindex = splitscreenplayer;
players[newplayernum].bot = false;
// Previously called at the top of this function, commented as
// "caused desyncs in this spot :(". But we can't do this in
// G_PlayerReborn, since that only runs for level contexts and
// allows people to party-crash the vote screen even when
// maxplayers is too low for them. Let's try it here...?
G_SpectatePlayerOnJoin(newplayernum);
if (netgame)
{
char joinmsg[256];

View file

@ -1956,7 +1956,7 @@ UINT8 CanChangeSkin(INT32 playernum)
return true;
// Not in game, so you can change
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN)
if (players[playernum].spectator || players[playernum].playerstate == PST_DEAD || players[playernum].playerstate == PST_REBORN || players[playernum].exiting)
return true;
return false;

View file

@ -3053,6 +3053,8 @@ static inline void G_PlayerFinishLevel(INT32 player)
legitimateexit = false;
}
p->spectatorreentry = 0; // Clean up any pending re-entry forbiddings
}
void G_HandleRestatMessage(restatmessage_t *rm)
@ -3199,6 +3201,15 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
tic_t laptime[LAP__MAX];
// This needs to be first, to permit it to wipe extra information
jointime = players[player].jointime;
if (jointime <= 1)
{
// Now called in Got_AddPlayer. In case of weirdness, break glass.
// G_SpectatePlayerOnJoin(player);
betweenmaps = true;
}
score = players[player].score;
lives = players[player].lives;
ctfteam = players[player].ctfteam;
@ -3247,7 +3258,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
pflags = (players[player].pflags & (PF_WANTSTOJOIN|PF_KICKSTARTACCEL|PF_SHRINKME|PF_SHRINKACTIVE|PF_FLIPCAM));
// SRB2kart
if (betweenmaps || leveltime <= starttime || spectator == true || players[player].jointime == 0)
if (betweenmaps || leveltime <= starttime || spectator == true)
{
itemroulette = 0;
previtemroulette = 0;
@ -4029,6 +4040,38 @@ void G_AddPlayer(INT32 playernum, INT32 console)
demo_extradata[playernum] |= DXD_ADDPLAYER; // Set everything
}
void G_SpectatePlayerOnJoin(INT32 playernum)
{
// This is only ever called shortly after the above.
// That calls CL_ClearPlayer, so spectator is false by default
if (!netgame && !G_GametypeHasTeams() && !G_GametypeHasSpectators())
return;
// These are handled automatically elsewhere
if (demo.playback || players[playernum].bot)
return;
UINT8 i;
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i])
continue;
// Spectators are of no consequence
if (players[i].spectator)
continue;
// Prevent splitscreen hosters/joiners from only adding 1 player at a time in empty servers (this will also catch yourself)
if (!players[i].jointime)
continue;
// A ha! An established player! It's time to spectate
players[playernum].spectator = true;
break;
}
}
void G_BeginLevelExit(void)
{
if (g_exit.hasfinished)

View file

@ -268,6 +268,7 @@ void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean res
#define G_AdjustView(v,o,oa) G_AdjustViewEx(v,o,oa, true)
void G_AddPlayer(INT32 playernum, INT32 console);
void G_SpectatePlayerOnJoin(INT32 playernum);
void G_SetExitGameFlag(void);
void G_ClearExitGameFlag(void);

View file

@ -19,6 +19,7 @@
#include "k_bot.h"
#include "k_kart.h"
#include "m_random.h"
#include "p_local.h"
#include "r_things.h"
#include "lua_hook.h"
#include "k_battle.h"
@ -343,10 +344,15 @@ void K_UpdateGrandPrixBots(void)
{
continue;
}
players[i].spectator = K_BotDefaultSpectator();
}
if (grandprixinfo.wonround == false)
{
return;
}
// Find the rival.
for (i = 0; i < MAXGPPLAYERS; i++)
{

View file

@ -56,6 +56,8 @@
#include "k_items.h"
#include "k_waypoint.h"
#include "k_grandprix.h"
#include "g_party.h"
#include "k_director.h"
// BlanKart
#include "blan/b_soc.h"
@ -12381,64 +12383,19 @@ void P_RespawnSpecials(void)
//
void P_SpawnPlayer(INT32 playernum)
{
UINT8 i, pcount = 0; // MAXPLAYERS if exiting
UINT8 i;
player_t *p = &players[playernum];
mobj_t *mobj;
boolean justjoined = (p->jointime <= 1);
if (p->playerstate == PST_REBORN)
G_PlayerReborn(playernum, false);
G_PlayerReborn(playernum, justjoined);
for (i = 0; i < MAXPLAYERS; i++)
{
if (i == playernum)
continue;
if (!playeringame[i] || players[i].spectator)
continue;
if (players[i].exiting)
{
pcount = MAXPLAYERS;
break;
}
if (players[i].jointime <= 1) // Prevent splitscreen hosters/joiners from only adding 1 player at a time in empty servers
continue;
pcount++;
}
// spawn as spectator determination
if (multiplayer && demo.playback)
{
; // Don't mess with spectator values since the demo setup handles them already.
}
else if (p->bot)
{
if (K_BotDefaultSpectator())
{
// Bots should avoid
p->spectator = true;
p->pflags &= ~PF_WANTSTOJOIN;
}
else if (p->spectator)
{
// No point in a spectating bot!
p->spectator = false;
p->pflags |= PF_WANTSTOJOIN;
}
}
else if (netgame && p->jointime <= 1 && pcount)
{
p->spectator = true;
#if 0
if (pcount == 1 || leveltime < starttime)
p->pflags |= PF_WANTSTOJOIN;
p->jointime = 2;
#endif
p->spectatorreentry = 0; //(cv_spectatorreentry.value * TICRATE);
}
else if (multiplayer && !netgame)
if (G_GametypeHasTeams())
{
// If you're in a team game and you don't have a team assigned yet...
if (G_GametypeHasTeams() && p->ctfteam == 0)
if (!p->spectator && p->ctfteam == 0)
{
changeteam_union NetPacket;
UINT16 usvalue;
@ -12460,20 +12417,6 @@ void P_SpawnPlayer(INT32 playernum)
usvalue = SHORT(NetPacket.value.l|NetPacket.value.b);
SendNetXCmd(XD_TEAMCHANGE, &usvalue, sizeof(usvalue));
}
else // Otherwise, never spectator.
{
p->spectator = false;
}
}
if (G_GametypeHasTeams())
{
// Fix stupid non spectator spectators.
if (!p->spectator && !p->ctfteam)
{
p->spectator = true;
p->spectatorreentry = 0; //(cv_spectatorreentry.value * TICRATE);
}
// Fix team colors.
// This code isn't being done right somewhere else. Oh well.

View file

@ -9253,7 +9253,7 @@ void P_PostLoadLevel(void)
K_InitGrandPrixBots();
grandprixinfo.initalize = false;
}
else// if (grandprixinfo.wonround == true)
else
{
K_UpdateGrandPrixBots();
grandprixinfo.wonround = false;

View file

@ -2695,10 +2695,6 @@ static void P_DeathThink(player_t *player)
playerGone = true;
}
}
else if (player->bot && K_BotDefaultSpectator())
{
playerGone = true;
}
if (playerGone == false)
{