startedInFreePlay

This commit is contained in:
Sally Coolatta 2022-03-29 15:42:31 -04:00
parent 71d49bcc3b
commit fce57a1027
8 changed files with 109 additions and 27 deletions

View file

@ -2972,6 +2972,23 @@ void CL_RemovePlayer(INT32 playernum, INT32 reason)
K_CheckBumpers();
else if (G_RaceGametype())
P_CheckRacers();
// Reset startedInFreePlay
{
INT32 i;
for (i = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && !players[i].spectator)
break;
}
if (i == MAXPLAYERS)
{
// Server was emptied, consider it FREE PLAY.
startedInFreePlay = true;
}
}
}
void CL_Reset(void)
@ -3412,6 +3429,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
HU_AddChatText(va("\x82*%s left the game", player_names[pnum]), false);
kickreason = KR_LEAVE;
break;
case KICK_MSG_GRIEF:
HU_AddChatText(va("\x82*%s has been kicked (Automatic grief detection)", player_names[pnum]), false);
kickreason = KR_KICK;
break;
case KICK_MSG_BANNED:
HU_AddChatText(va("\x82*%s has been banned (Don't come back)", player_names[pnum]), false);
kickreason = KR_BAN;

View file

@ -521,17 +521,18 @@ extern consvar_t cv_playbackspeed;
#define KICK_MSG_TIMEOUT 4
#define KICK_MSG_BANNED 5
#define KICK_MSG_PING_HIGH 6
#define KICK_MSG_CUSTOM_KICK 7
#define KICK_MSG_CUSTOM_BAN 8
#define KICK_MSG_GRIEF 7
#define KICK_MSG_CUSTOM_KICK 8
#define KICK_MSG_CUSTOM_BAN 9
typedef enum
{
KR_KICK = 1, //Kicked by server
KR_PINGLIMIT = 2, //Broke Ping Limit
KR_SYNCH = 3, //Synch Failure
KR_TIMEOUT = 4, //Connection Timeout
KR_BAN = 5, //Banned by server
KR_LEAVE = 6, //Quit the game
KR_KICK = 1, //Kicked by server
KR_PINGLIMIT, //Broke Ping Limit
KR_SYNCH, //Synch Failure
KR_TIMEOUT, //Connection Timeout
KR_BAN, //Banned by server
KR_LEAVE, //Quit the game
} kickreason_t;

View file

@ -275,6 +275,7 @@ tic_t mapreset; // Map reset delay when enough players have joined an empty game
UINT8 nospectategrief; // How many players need to be in-game to eliminate last; for preventing spectate griefing
boolean thwompsactive; // Thwomps activate on lap 2
SINT8 spbplace; // SPB exists, give the person behind better items
boolean startedInFreePlay; // Map was started in free play
// Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players)
boolean legitimateexit; // Did this client actually finish the match?
@ -2482,7 +2483,9 @@ void G_Ticker(boolean run)
if (G_GametypeHasSpectators()
&& (gamestate == GS_LEVEL || gamestate == GS_INTERMISSION || gamestate == GS_VOTING // definitely good
|| gamestate == GS_WAITINGPLAYERS)) // definitely a problem if we don't do it at all in this gamestate, but might need more protection?
{
K_CheckSpectateStatus();
}
if (pausedelay)
pausedelay--;

View file

@ -6316,6 +6316,10 @@ void K_CheckSpectateStatus(void)
if (numingame < 2 || leveltime < starttime || mapreset)
continue;
// DON'T allow if the match is 20 seconds in
if (leveltime > (starttime + 20*TICRATE))
return;
// DON'T allow if the race is on the second lap
if (G_RaceGametype() && players[i].laps)
return;
@ -6331,15 +6335,11 @@ void K_CheckSpectateStatus(void)
respawnlist[numjoiners++] = i;
}
// 1.4: prevent last lap jerkitude
if (gamestate == GS_LEVEL)
// The map started as a legitimate race, but there's still the one player.
// Don't allow new joiners, as they're probably a ragespeccer.
if (G_RaceGametype() && startedInFreePlay == false && numingame == 1)
{
if (!numingame) // but allow empty netgames to recover
nospectategrief = 0;
else if (!nospectategrief && (leveltime > (starttime + 20*TICRATE)))
nospectategrief = numingame;
if (nospectategrief > 1)
return;
return;
}
// literally zero point in going any further if nobody is joining
@ -6391,13 +6391,40 @@ void K_CheckSpectateStatus(void)
}
// Reset the match if you're in an empty server
if (!mapreset && gamestate == GS_LEVEL && leveltime >= starttime && (previngame < 2 && numingame >= 2))
if (!mapreset && gamestate == GS_LEVEL && (previngame < 2 && numingame >= 2))
{
S_ChangeMusicInternal("chalng", false); // COME ON
mapreset = 3*TICRATE; // Even though only the server uses this for game logic, set for everyone for HUD
}
}
void K_UpdateSpectateGrief(void)
{
UINT8 numingame = 0;
if (nospectategrief)
{
return;
}
if (leveltime <= (starttime + 20*TICRATE))
{
return;
}
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i] || players[i].spectator)
{
continue;
}
numingame++;
}
nospectategrief = numingame;
}
//}
//{ SRB2kart HUD Code

View file

@ -3278,6 +3278,7 @@ static void P_NetArchiveMisc(void)
WRITEUINT8(save_p, nospectategrief);
WRITEUINT8(save_p, thwompsactive);
WRITESINT8(save_p, spbplace);
WRITEUINT8(save_p, startedInFreePlay);
// Is it paused?
if (paused)
@ -3387,6 +3388,7 @@ static inline boolean P_NetUnArchiveMisc(void)
nospectategrief = READUINT8(save_p);
thwompsactive = (boolean)READUINT8(save_p);
spbplace = READSINT8(save_p);
startedInFreePlay = READUINT8(save_p);
// Is it paused?
if (READUINT8(save_p) == 0x2f)

View file

@ -3229,6 +3229,37 @@ boolean P_SetupLevel(boolean skipprecip)
G_RecordDemo(buf);
}
wantedcalcdelay = wantedfrequency*2;
indirectitemcooldown = 0;
hyubgone = 0;
mapreset = 0;
nospectategrief = 0;
thwompsactive = false;
spbplace = -1;
startedInFreePlay = false;
{
UINT8 nump = 0;
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i] || players[i].spectator)
{
continue;
}
nump++;
if (nump == 2)
{
break;
}
}
if (nump <= 1)
{
startedInFreePlay = true;
}
}
// ===========
// landing point for netgames.
netgameskip:
@ -3301,14 +3332,6 @@ boolean P_SetupLevel(boolean skipprecip)
CV_SetValue(&cv_analog, false);
}*/
wantedcalcdelay = wantedfrequency*2;
indirectitemcooldown = 0;
hyubgone = 0;
mapreset = 0;
nospectategrief = 0;
thwompsactive = false;
spbplace = -1;
// clear special respawning que
iquehead = iquetail = 0;

View file

@ -735,6 +735,11 @@ void P_Ticker(boolean run)
if (hyubgone > 0)
hyubgone--;
if (G_RaceGametype())
{
K_UpdateSpectateGrief();
}
if (G_BattleGametype())
{
if (wantedcalcdelay && --wantedcalcdelay <= 0)

View file

@ -8504,7 +8504,7 @@ void P_PlayerThink(player_t *player)
}
}
if (netgame && cv_antigrief.value != 0)
if (netgame && cv_antigrief.value != 0 && G_RaceGametype())
{
if (!player->spectator && !player->exiting && !(player->pflags & PF_TIMEOVER))
{
@ -8530,7 +8530,7 @@ void P_PlayerThink(player_t *player)
XBOXSTATIC UINT8 buf[2];
buf[0] = n;
buf[1] = KICK_MSG_CON_FAIL;
buf[1] = KICK_MSG_GRIEF;
SendNetXCmd(XD_KICK, &buf, 2);
}
else