mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2024-12-27 04:41:23 +00:00
Merge branch 'public_speclil' into 'public_next'
[1.4 ver.] Da anti-grief stuff See merge request KartKrew/Kart!474
This commit is contained in:
commit
16b0bd736b
19 changed files with 310 additions and 38 deletions
|
@ -644,6 +644,10 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
|||
rsp->onconveyor = LONG(players[i].onconveyor);
|
||||
|
||||
rsp->jointime = (tic_t)LONG(players[i].jointime);
|
||||
rsp->spectatorreentry = (tic_t)LONG(players[i].spectatorreentry);
|
||||
|
||||
rsp->grieftime = (tic_t)LONG(players[i].grieftime);
|
||||
rsp->griefstrikes = players[i].griefstrikes;
|
||||
|
||||
rsp->splitscreenindex = players[i].splitscreenindex;
|
||||
|
||||
|
@ -767,6 +771,10 @@ static void resynch_read_player(resynch_pak *rsp)
|
|||
players[i].onconveyor = LONG(rsp->onconveyor);
|
||||
|
||||
players[i].jointime = (tic_t)LONG(rsp->jointime);
|
||||
players[i].spectatorreentry = (tic_t)LONG(rsp->spectatorreentry);
|
||||
|
||||
players[i].grieftime = (tic_t)LONG(rsp->grieftime);
|
||||
players[i].griefstrikes = rsp->griefstrikes;
|
||||
|
||||
players[i].splitscreenindex = rsp->splitscreenindex;
|
||||
|
||||
|
@ -2964,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)
|
||||
|
@ -3404,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;
|
||||
|
|
|
@ -276,6 +276,10 @@ typedef struct
|
|||
INT32 onconveyor;
|
||||
|
||||
tic_t jointime;
|
||||
tic_t spectatorreentry;
|
||||
|
||||
tic_t grieftime;
|
||||
UINT8 griefstrikes;
|
||||
|
||||
UINT8 splitscreenindex;
|
||||
|
||||
|
@ -517,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;
|
||||
|
||||
|
|
|
@ -247,6 +247,12 @@ consvar_t cv_allowteamchange = {"allowteamchange", "Yes", CV_NETVAR, CV_YesNo, N
|
|||
static CV_PossibleValue_t ingamecap_cons_t[] = {{0, "MIN"}, {MAXPLAYERS-1, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_ingamecap = {"ingamecap", "0", CV_NETVAR, ingamecap_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t spectatorreentry_cons_t[] = {{0, "MIN"}, {10*60, "MAX"}, {0, NULL}};
|
||||
consvar_t cv_spectatorreentry = {"spectatorreentry", "30", CV_NETVAR, spectatorreentry_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t antigrief_cons_t[] = {{20, "MIN"}, {60, "MAX"}, {0, "Off"}, {0, NULL}};
|
||||
consvar_t cv_antigrief = {"antigrief", "30", CV_NETVAR, antigrief_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
consvar_t cv_startinglives = {"startinglives", "3", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, startingliveslimit_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||
|
||||
static CV_PossibleValue_t respawntime_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}};
|
||||
|
@ -679,6 +685,8 @@ void D_RegisterServerCommands(void)
|
|||
CV_RegisterVar(&cv_restrictskinchange);
|
||||
CV_RegisterVar(&cv_allowteamchange);
|
||||
CV_RegisterVar(&cv_ingamecap);
|
||||
CV_RegisterVar(&cv_spectatorreentry);
|
||||
CV_RegisterVar(&cv_antigrief);
|
||||
CV_RegisterVar(&cv_respawntime);
|
||||
CV_RegisterVar(&cv_killingdead);
|
||||
|
||||
|
@ -3449,7 +3457,7 @@ static void Command_ServerTeamChange_f(void)
|
|||
static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
||||
{
|
||||
changeteam_union NetPacket;
|
||||
boolean error = false;
|
||||
boolean error = false, wasspectator = false;
|
||||
NetPacket.value.l = NetPacket.value.b = READINT16(*cp);
|
||||
|
||||
if (!G_GametypeHasTeams() && !G_GametypeHasSpectators()) //Make sure you're in the right gametype.
|
||||
|
@ -3593,6 +3601,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
|||
else
|
||||
players[playernum].playerstate = PST_REBORN;
|
||||
}
|
||||
else
|
||||
wasspectator = true;
|
||||
|
||||
players[playernum].pflags &= ~PF_WANTSTOJOIN;
|
||||
|
||||
|
@ -3677,7 +3687,7 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
|||
else
|
||||
CONS_Printf(M_GetText("%s switched to the %c%s%c.\n"), player_names[playernum], '\x84', M_GetText("Blue Team"), '\x80');
|
||||
}
|
||||
else if (NetPacket.packet.newteam == 0)
|
||||
else if (NetPacket.packet.newteam == 0 && !wasspectator)
|
||||
HU_AddChatText(va("\x82*%s became a spectator.", player_names[playernum]), false); // "entered the game" text was moved to P_SpectatorJoinGame
|
||||
|
||||
//reset view if you are changed, or viewing someone who was changed.
|
||||
|
@ -3707,12 +3717,15 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
|||
// Clear player score and rings if a spectator.
|
||||
if (players[playernum].spectator)
|
||||
{
|
||||
players[playernum].spectatorreentry = (cv_spectatorreentry.value * TICRATE);
|
||||
|
||||
if (G_BattleGametype()) // SRB2kart
|
||||
{
|
||||
players[playernum].marescore = 0;
|
||||
if (K_IsPlayerWanted(&players[playernum]))
|
||||
K_CalculateBattleWanted();
|
||||
}
|
||||
|
||||
players[playernum].health = 1;
|
||||
if (players[playernum].mo)
|
||||
players[playernum].mo->health = 1;
|
||||
|
|
|
@ -94,6 +94,7 @@ extern consvar_t cv_killingdead;
|
|||
extern consvar_t cv_pause;
|
||||
|
||||
extern consvar_t cv_restrictskinchange, cv_allowteamchange, cv_ingamecap, cv_respawntime;
|
||||
extern consvar_t cv_spectatorreentry, cv_antigrief;
|
||||
|
||||
/*extern consvar_t cv_teleporters, cv_superring, cv_supersneakers, cv_invincibility;
|
||||
extern consvar_t cv_jumpshield, cv_watershield, cv_ringshield, cv_forceshield, cv_bombshield;
|
||||
|
|
|
@ -520,6 +520,10 @@ typedef struct player_s
|
|||
UINT8 bot;
|
||||
|
||||
tic_t jointime; // Timer when player joins game to change skin/color
|
||||
tic_t spectatorreentry;
|
||||
|
||||
tic_t grieftime;
|
||||
UINT8 griefstrikes;
|
||||
|
||||
UINT8 splitscreenindex;
|
||||
#ifdef HWRENDER
|
||||
|
|
|
@ -477,6 +477,7 @@ extern tic_t mapreset;
|
|||
extern UINT8 nospectategrief;
|
||||
extern boolean thwompsactive;
|
||||
extern SINT8 spbplace;
|
||||
extern boolean startedInFreePlay;
|
||||
|
||||
extern boolean legitimateexit;
|
||||
extern boolean comebackshowninfo;
|
||||
|
|
25
src/g_game.c
25
src/g_game.c
|
@ -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--;
|
||||
|
@ -2603,6 +2606,9 @@ void G_PlayerReborn(INT32 player)
|
|||
INT32 wanted;
|
||||
INT32 respawnflip;
|
||||
boolean songcredit = false;
|
||||
tic_t spectatorreentry;
|
||||
tic_t grieftime;
|
||||
UINT8 griefstrikes;
|
||||
|
||||
score = players[player].score;
|
||||
marescore = players[player].marescore;
|
||||
|
@ -2644,7 +2650,7 @@ void G_PlayerReborn(INT32 player)
|
|||
pity = players[player].pity;
|
||||
|
||||
// SRB2kart
|
||||
if (leveltime <= starttime)
|
||||
if (leveltime <= starttime || spectator == true)
|
||||
{
|
||||
itemroulette = 0;
|
||||
roulettetype = 0;
|
||||
|
@ -2655,6 +2661,14 @@ void G_PlayerReborn(INT32 player)
|
|||
comebackpoints = 0;
|
||||
wanted = 0;
|
||||
starpostwp = 0;
|
||||
|
||||
starposttime = 0;
|
||||
starpostx = 0;
|
||||
starposty = 0;
|
||||
starpostz = 0;
|
||||
starpostnum = 0;
|
||||
respawnflip = 0;
|
||||
starpostangle = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2685,6 +2699,11 @@ void G_PlayerReborn(INT32 player)
|
|||
wanted = players[player].kartstuff[k_wanted];
|
||||
}
|
||||
|
||||
spectatorreentry = players[player].spectatorreentry;
|
||||
|
||||
grieftime = players[player].grieftime;
|
||||
griefstrikes = players[player].griefstrikes;
|
||||
|
||||
p = &players[player];
|
||||
memset(p, 0, sizeof (*p));
|
||||
|
||||
|
@ -2738,6 +2757,10 @@ void G_PlayerReborn(INT32 player)
|
|||
p->kartstuff[k_eggmanblame] = -1;
|
||||
p->kartstuff[k_starpostflip] = respawnflip;
|
||||
|
||||
p->spectatorreentry = spectatorreentry;
|
||||
p->grieftime = grieftime;
|
||||
p->griefstrikes = griefstrikes;
|
||||
|
||||
// Don't do anything immediately
|
||||
p->pflags |= PF_USEDOWN;
|
||||
p->pflags |= PF_ATTACKDOWN;
|
||||
|
|
|
@ -759,7 +759,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
|||
char *tempchar = NULL;
|
||||
|
||||
// player is a spectator?
|
||||
if (players[playernum].spectator)
|
||||
if (players[playernum].spectator)
|
||||
{
|
||||
cstart = "\x86"; // grey name
|
||||
textcolor = "\x86";
|
||||
|
|
87
src/k_kart.c
87
src/k_kart.c
|
@ -6267,16 +6267,23 @@ void K_CheckSpectateStatus(void)
|
|||
{
|
||||
UINT8 respawnlist[MAXPLAYERS];
|
||||
UINT8 i, j, numingame = 0, numjoiners = 0;
|
||||
UINT8 previngame = 0;
|
||||
|
||||
// Maintain spectate wait timer
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
if (!playeringame[i])
|
||||
continue;
|
||||
|
||||
if (players[i].spectator && (players[i].pflags & PF_WANTSTOJOIN))
|
||||
players[i].kartstuff[k_spectatewait]++;
|
||||
else
|
||||
players[i].kartstuff[k_spectatewait] = 0;
|
||||
|
||||
if (gamestate != GS_LEVEL)
|
||||
players[i].spectatorreentry = 0;
|
||||
else if (players[i].spectatorreentry > 0)
|
||||
players[i].spectatorreentry--;
|
||||
}
|
||||
|
||||
// No one's allowed to join
|
||||
|
@ -6292,32 +6299,57 @@ void K_CheckSpectateStatus(void)
|
|||
if (!players[i].spectator)
|
||||
{
|
||||
numingame++;
|
||||
if (cv_ingamecap.value && numingame >= cv_ingamecap.value) // DON'T allow if you've hit the in-game player cap
|
||||
|
||||
// DON'T allow if you've hit the in-game player cap
|
||||
if (cv_ingamecap.value && numingame >= cv_ingamecap.value)
|
||||
return;
|
||||
if (gamestate != GS_LEVEL) // Allow if you're not in a level
|
||||
|
||||
// Allow if you're not in a level
|
||||
if (gamestate != GS_LEVEL)
|
||||
continue;
|
||||
if (players[i].exiting) // DON'T allow if anyone's exiting
|
||||
|
||||
// DON'T allow if anyone's exiting
|
||||
if (players[i].exiting)
|
||||
return;
|
||||
if (numingame < 2 || leveltime < starttime || mapreset) // Allow if the match hasn't started yet
|
||||
|
||||
// Allow if the match hasn't started yet
|
||||
if (numingame < 2 || leveltime < starttime || mapreset)
|
||||
continue;
|
||||
if (leveltime > (starttime + 20*TICRATE)) // DON'T allow if the match is 20 seconds in
|
||||
|
||||
// DON'T allow if the match is 20 seconds in
|
||||
if (leveltime > (starttime + 20*TICRATE))
|
||||
return;
|
||||
if (G_RaceGametype() && players[i].laps) // DON'T allow if the race is at 2 laps
|
||||
|
||||
// DON'T allow if the race is on the second lap
|
||||
if (G_RaceGametype() && players[i].laps)
|
||||
return;
|
||||
|
||||
continue;
|
||||
}
|
||||
else if (!(players[i].pflags & PF_WANTSTOJOIN))
|
||||
{
|
||||
// This spectator does not want to join.
|
||||
continue;
|
||||
}
|
||||
|
||||
respawnlist[numjoiners++] = i;
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// literally zero point in going any further if nobody is joining
|
||||
if (!numjoiners)
|
||||
return;
|
||||
|
||||
// Organize by spectate wait timer
|
||||
#if 0
|
||||
if (cv_ingamecap.value)
|
||||
#endif
|
||||
{
|
||||
UINT8 oldrespawnlist[MAXPLAYERS];
|
||||
memcpy(oldrespawnlist, respawnlist, numjoiners);
|
||||
|
@ -6341,22 +6373,59 @@ void K_CheckSpectateStatus(void)
|
|||
}
|
||||
}
|
||||
|
||||
// Finally, we can de-spectate everyone!
|
||||
// Finally, we can de-spectate everyone in the list!
|
||||
previngame = numingame;
|
||||
|
||||
for (i = 0; i < numjoiners; i++)
|
||||
{
|
||||
if (cv_ingamecap.value && numingame+i >= cv_ingamecap.value) // Hit the in-game player cap while adding people?
|
||||
// Hit the in-game player cap while adding people? Get out of here
|
||||
if (cv_ingamecap.value > 0 && numingame >= cv_ingamecap.value)
|
||||
break;
|
||||
|
||||
// This person has their reentry cooldown active.
|
||||
if (players[i].spectatorreentry > 0 && numingame > 0)
|
||||
continue;
|
||||
|
||||
P_SpectatorJoinGame(&players[respawnlist[i]]);
|
||||
numingame++;
|
||||
}
|
||||
|
||||
// Reset the match if you're in an empty server
|
||||
if (!mapreset && gamestate == GS_LEVEL && leveltime >= starttime && (numingame < 2 && numingame+i >= 2)) // use previous i value
|
||||
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;
|
||||
INT32 i;
|
||||
|
||||
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
|
||||
|
|
|
@ -68,6 +68,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground);
|
|||
void K_CalculateBattleWanted(void);
|
||||
void K_CheckBumpers(void);
|
||||
void K_CheckSpectateStatus(void);
|
||||
void K_UpdateSpectateGrief(void);
|
||||
|
||||
// sound stuff for lua
|
||||
void K_PlayAttackTaunt(mobj_t *source);
|
||||
|
|
|
@ -383,6 +383,12 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->bot);
|
||||
else if (fastcmp(field,"jointime"))
|
||||
lua_pushinteger(L, plr->jointime);
|
||||
else if (fastcmp(field,"spectatorreentry"))
|
||||
lua_pushinteger(L, plr->spectatorreentry);
|
||||
else if (fastcmp(field,"grieftime"))
|
||||
lua_pushinteger(L, plr->grieftime);
|
||||
else if (fastcmp(field,"griefstrikes"))
|
||||
lua_pushinteger(L, plr->griefstrikes);
|
||||
else if (fastcmp(field,"splitscreenindex"))
|
||||
lua_pushinteger(L, plr->splitscreenindex);
|
||||
#ifdef HWRENDER
|
||||
|
@ -647,6 +653,12 @@ static int player_set(lua_State *L)
|
|||
return NOSET;
|
||||
else if (fastcmp(field,"jointime"))
|
||||
plr->jointime = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"spectatorreentry"))
|
||||
plr->spectatorreentry = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"grieftime"))
|
||||
plr->grieftime = (tic_t)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"griefstrikes"))
|
||||
plr->griefstrikes = (UINT8)luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"splitscreenindex"))
|
||||
return NOSET;
|
||||
#ifdef HWRENDER
|
||||
|
|
|
@ -8392,7 +8392,7 @@ void A_SPBChase(mobj_t *actor)
|
|||
|
||||
if (actor->extravalue1 == 1) // MODE: TARGETING
|
||||
{
|
||||
if (actor->tracer && actor->tracer->health)
|
||||
if (actor->tracer && actor->tracer->health && !(actor->tracer->player && actor->tracer->player->spectator))
|
||||
{
|
||||
|
||||
fixed_t defspeed = wspeed;
|
||||
|
|
|
@ -1471,7 +1471,15 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
// blatant reuse of a variable that's normally unused in circuit
|
||||
if (!player->tossdelay)
|
||||
{
|
||||
S_StartSound(toucher, sfx_s26d);
|
||||
|
||||
if (netgame && cv_antigrief.value)
|
||||
{
|
||||
player->grieftime += TICRATE;
|
||||
}
|
||||
}
|
||||
|
||||
player->tossdelay = 3;
|
||||
return;
|
||||
}
|
||||
|
@ -1495,6 +1503,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
player->starpostangle = special->angle;
|
||||
player->starpostnum = special->health;
|
||||
player->kartstuff[k_starpostflip] = special->spawnpoint->options & MTF_OBJECTFLIP; // store flipping
|
||||
player->grieftime = 0;
|
||||
|
||||
//S_StartSound(toucher, special->info->painsound);
|
||||
return;
|
||||
|
|
12
src/p_mobj.c
12
src/p_mobj.c
|
@ -10663,10 +10663,7 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
else if (netgame && p->jointime <= 1 && pcount)
|
||||
{
|
||||
p->spectator = true;
|
||||
// Oni doesn't want this
|
||||
/*if (pcount == 1 || leveltime < starttime)
|
||||
p->pflags |= PF_WANTSTOJOIN;
|
||||
p->jointime = 2;*/
|
||||
p->spectatorreentry = 0; //(cv_spectatorreentry.value * TICRATE);
|
||||
}
|
||||
else if (multiplayer && !netgame)
|
||||
{
|
||||
|
@ -10680,6 +10677,8 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
// Spawn as a spectator,
|
||||
// yes even in splitscreen mode
|
||||
p->spectator = true;
|
||||
p->spectatorreentry = 0; //(cv_spectatorreentry.value * TICRATE);
|
||||
|
||||
if (playernum&1) p->skincolor = skincolor_redteam;
|
||||
else p->skincolor = skincolor_blueteam;
|
||||
|
||||
|
@ -10699,7 +10698,10 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
{
|
||||
// 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.
|
||||
|
@ -10741,6 +10743,8 @@ void P_SpawnPlayer(INT32 playernum)
|
|||
// Spawn with a pity shield if necessary.
|
||||
//P_DoPityCheck(p);
|
||||
|
||||
p->grieftime = 0;
|
||||
|
||||
if (G_BattleGametype()) // SRB2kart
|
||||
{
|
||||
mobj_t *overheadarrow = P_SpawnMobj(mobj->x, mobj->y, mobj->z + P_GetPlayerHeight(p)+16*FRACUNIT, MT_PLAYERARROW);
|
||||
|
|
|
@ -246,6 +246,10 @@ static void P_NetArchivePlayers(void)
|
|||
WRITEINT32(save_p, players[i].onconveyor);
|
||||
|
||||
WRITEUINT32(save_p, players[i].jointime);
|
||||
WRITEUINT32(save_p, players[i].spectatorreentry);
|
||||
|
||||
WRITEUINT32(save_p, players[i].grieftime);
|
||||
WRITEUINT8(save_p, players[i].griefstrikes);
|
||||
|
||||
WRITEUINT8(save_p, players[i].splitscreenindex);
|
||||
|
||||
|
@ -411,6 +415,10 @@ static void P_NetUnArchivePlayers(void)
|
|||
players[i].onconveyor = READINT32(save_p);
|
||||
|
||||
players[i].jointime = READUINT32(save_p);
|
||||
players[i].spectatorreentry = READUINT32(save_p);
|
||||
|
||||
players[i].grieftime = READUINT32(save_p);
|
||||
players[i].griefstrikes = READUINT8(save_p);
|
||||
|
||||
players[i].splitscreenindex = READUINT8(save_p);
|
||||
|
||||
|
@ -3270,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)
|
||||
|
@ -3379,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)
|
||||
|
|
|
@ -2396,6 +2396,8 @@ static void P_LevelInitStuff(void)
|
|||
players[i].exiting = 0;
|
||||
P_ResetPlayer(&players[i]);
|
||||
|
||||
players[i].spectatorreentry = 0; // SRB2Kart 1.4
|
||||
|
||||
players[i].mo = NULL;
|
||||
|
||||
// we must unset axis details too
|
||||
|
@ -3227,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:
|
||||
|
@ -3299,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;
|
||||
|
||||
|
|
13
src/p_spec.c
13
src/p_spec.c
|
@ -4311,17 +4311,22 @@ DoneSection2:
|
|||
// Play the starpost sound for 'consistency'
|
||||
// S_StartSound(player->mo, sfx_strpst);
|
||||
|
||||
// Figure out how many are playing on the last lap, to prevent spectate griefing
|
||||
if (!nospectategrief && player->laps >= (UINT8)(cv_numlaps.value - 1))
|
||||
nospectategrief = nump;
|
||||
|
||||
thwompsactive = true; // Lap 2 effects
|
||||
player->grieftime = 0;
|
||||
}
|
||||
else if (player->starpostnum)
|
||||
{
|
||||
// blatant reuse of a variable that's normally unused in circuit
|
||||
if (!player->tossdelay)
|
||||
{
|
||||
S_StartSound(player->mo, sfx_s26d);
|
||||
|
||||
if (netgame && cv_antigrief.value)
|
||||
{
|
||||
player->grieftime += TICRATE;
|
||||
}
|
||||
}
|
||||
|
||||
player->tossdelay = 3;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
56
src/p_user.c
56
src/p_user.c
|
@ -1698,6 +1698,9 @@ void P_DoPlayerExit(player_t *player)
|
|||
if (P_IsLocalPlayer(player) && (!player->spectator && !demo.playback))
|
||||
legitimateexit = true;
|
||||
|
||||
if (player->griefstrikes > 0)
|
||||
player->griefstrikes--; // Remove a strike for finishing a race normally
|
||||
|
||||
if (G_RaceGametype()) // If in Race Mode, allow
|
||||
{
|
||||
player->exiting = raceexittime+2;
|
||||
|
@ -8501,6 +8504,59 @@ void P_PlayerThink(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
if (netgame && cv_antigrief.value != 0 && G_RaceGametype())
|
||||
{
|
||||
if (!player->spectator && !player->exiting && !(player->pflags & PF_TIMEOVER))
|
||||
{
|
||||
const tic_t griefval = cv_antigrief.value * TICRATE;
|
||||
const UINT8 n = player - players;
|
||||
|
||||
if (n != serverplayer
|
||||
#ifndef DEVELOP
|
||||
&& !IsPlayerAdmin(n)
|
||||
#endif
|
||||
)
|
||||
{
|
||||
if (player->grieftime > griefval)
|
||||
{
|
||||
player->griefstrikes++;
|
||||
player->grieftime = 0;
|
||||
|
||||
if (server)
|
||||
{
|
||||
if (player->griefstrikes > 2)
|
||||
{
|
||||
// Send kick
|
||||
XBOXSTATIC UINT8 buf[2];
|
||||
|
||||
buf[0] = n;
|
||||
buf[1] = KICK_MSG_GRIEF;
|
||||
SendNetXCmd(XD_KICK, &buf, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Send spectate
|
||||
changeteam_union NetPacket;
|
||||
UINT16 usvalue;
|
||||
|
||||
NetPacket.value.l = NetPacket.value.b = 0;
|
||||
NetPacket.packet.newteam = 0;
|
||||
NetPacket.packet.playernum = n;
|
||||
NetPacket.packet.verification = true;
|
||||
|
||||
usvalue = SHORT(NetPacket.value.l|NetPacket.value.b);
|
||||
SendNetXCmd(XD_TEAMCHANGE, &usvalue, sizeof(usvalue));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (player->powers[pw_flashing] == 0)
|
||||
{
|
||||
player->grieftime++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((netgame || multiplayer) && player->spectator && cmd->buttons & BT_ATTACK && !player->powers[pw_flashing])
|
||||
{
|
||||
player->pflags ^= PF_WANTSTOJOIN;
|
||||
|
|
Loading…
Reference in a new issue