diff --git a/src/game/g_player.pas b/src/game/g_player.pas
index 0cde3c089c1dfe4d0a5d9098721c4e4717d07e4e..2f089d711a6bd6265a1a6284c36c4f12b04c7ce1 100644 (file)
--- a/src/game/g_player.pas
+++ b/src/game/g_player.pas
FReady: Boolean;
FDummy: Boolean;
FFireTime: Integer;
FReady: Boolean;
FDummy: Boolean;
FFireTime: Integer;
+ FSpawnInvul: Integer;
FHandicap: Integer;
FWaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request
FHandicap: Integer;
FWaitForFirstSpawn: Boolean; // set to `true` in server, used to spawn a player on first full state request
FMegaRulez[MR_SUIT] := 0;
FMegaRulez[MR_INVUL] := 0;
FMegaRulez[MR_INVIS] := 0;
FMegaRulez[MR_SUIT] := 0;
FMegaRulez[MR_INVUL] := 0;
FMegaRulez[MR_INVIS] := 0;
+ FSpawnInvul := 0;
FBerserk := 0;
end;
FBerserk := 0;
end;
end;
end;
end;
end;
- if (FMegaRulez[MR_INVUL] > gTime) and (gPlayerDrawn <> Self) then
+ if (FMegaRulez[MR_INVUL] > gTime) and ((gPlayerDrawn <> Self) or (FSpawnInvul >= gTime)) then
if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then
begin
e_GetTextureSize(ID, @w, @h);
if g_Texture_Get('TEXTURE_PLAYER_INVULPENTA', ID) then
begin
e_GetTextureSize(ID, @w, @h);
dr: Boolean;
begin
// Ïðè âçÿòèè íåóÿçâèìîñòè ðèñóåòñÿ èíâåðñèîííûé áåëûé ôîí
dr: Boolean;
begin
// Ïðè âçÿòèè íåóÿçâèìîñòè ðèñóåòñÿ èíâåðñèîííûé áåëûé ôîí
- if FMegaRulez[MR_INVUL] >= gTime then
+ if (FMegaRulez[MR_INVUL] >= gTime) and (FSpawnInvul < gTime) then
begin
if (FMegaRulez[MR_INVUL]-gTime) <= 2100 then
dr := not Odd((FMegaRulez[MR_INVUL]-gTime) div 300)
begin
if (FMegaRulez[MR_INVUL]-gTime) <= 2100 then
dr := not Odd((FMegaRulez[MR_INVUL]-gTime) div 300)
PushItem(ITEM_JETPACK);
// Âûáðîñ êëþ÷åé:
PushItem(ITEM_JETPACK);
// Âûáðîñ êëþ÷åé:
- if not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) then
+ if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) or
+ (not LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS)) then
begin
if R_KEY_RED in FRulez then
PushItem(ITEM_KEY_RED);
begin
if R_KEY_RED in FRulez then
PushItem(ITEM_KEY_RED);
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
+ FSpawnInvul := 0;
Result := True;
remove := True;
if gFlash = 2 then Inc(FPickup, 5);
Result := True;
remove := True;
if gFlash = 2 then Inc(FPickup, 5);
FMonsterKills := 0;
FDeath := 0;
FSecrets := 0;
FMonsterKills := 0;
FDeath := 0;
FSecrets := 0;
+ FSpawnInvul := 0;
FReady := False;
if FNoRespawn then
begin
FReady := False;
if FNoRespawn then
begin
FShellTimer := -1;
FPain := 0;
FLastHit := 0;
FShellTimer := -1;
FPain := 0;
FLastHit := 0;
+ FSpawnInvul := 0;
if not g_Game_IsServer then
Exit;
if not g_Game_IsServer then
Exit;
FMaxAmmo[A_CELLS] := AmmoLimits[0, A_CELLS];
FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
FMaxAmmo[A_CELLS] := AmmoLimits[0, A_CELLS];
FMaxAmmo[A_FUEL] := AmmoLimits[0, A_FUEL];
- if gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF] then
+ if (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF]) and
+ LongBool(gGameSettings.Options and GAME_OPTION_DMKEYS) then
FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
else
FRulez := [];
FRulez := [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]
else
FRulez := [];
for a := Low(FMegaRulez) to High(FMegaRulez) do
FMegaRulez[a] := 0;
for a := Low(FMegaRulez) to High(FMegaRulez) do
FMegaRulez[a] := 0;
+// Respawn invulnerability
+ if (gGameSettings.GameType <> GT_SINGLE) and (gGameSettings.SpawnInvul > 0) then
+ begin
+ FMegaRulez[MR_INVUL] := gTime + gGameSettings.SpawnInvul * 1000;
+ FSpawnInvul := FMegaRulez[MR_INVUL];
+ end;
+
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
FDamageBuffer := 0;
FJetpack := False;
FCanJetpack := False;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
if FMegaRulez[MR_INVUL] < gTime+PLAYER_INVUL_TIME then
begin
FMegaRulez[MR_INVUL] := gTime+PLAYER_INVUL_TIME;
+ FSpawnInvul := 0;
end;
ITEM_INVIS:
end;
ITEM_INVIS: