From 73adc74fdf77fba9f9b683fb8484ccc22ab75339 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Mon, 2 Mar 2020 00:16:14 +0300 Subject: [PATCH] more survival bullshit: state recall, MC+NM warmup fix --- src/game/g_game.pas | 8 +++- src/game/g_player.pas | 93 ++++++++++++++++++++++++++--------------- src/game/g_triggers.pas | 21 ++++------ 3 files changed, 76 insertions(+), 46 deletions(-) diff --git a/src/game/g_game.pas b/src/game/g_game.pas index f448602..affc870 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -5218,7 +5218,7 @@ begin else if gPlayers[i].Team = TEAM_BLUE then Inc(nb) end; - if (n < 2) or ((gGameSettings.GameMode = GM_TDM) and ((nr = 0) or (nb = 0))) then + if (n < 1) or ((gGameSettings.GameMode = GM_TDM) and ((nr = 0) or (nb = 0))) then begin // wait a second until the fuckers finally decide to join gLMSRespawn := LMS_RESPAWN_WARMUP; @@ -5515,6 +5515,12 @@ begin if g_Game_IsServer then begin gGameSettings.WarmupTime := gsWarmupTime; + // extend warmup if it's already going + if gLMSRespawn = LMS_RESPAWN_WARMUP then + begin + gLMSRespawnTime := gTime + gsWarmupTime * 1000; + if g_Game_IsNet then MH_SEND_GameEvent(NET_EV_LMS_WARMUP, gLMSRespawnTime - gTime); + end; if g_Game_IsNet then MH_SEND_GameSettings; end; end; diff --git a/src/game/g_player.pas b/src/game/g_player.pas index 30a71f1..fe38642 100644 --- a/src/game/g_player.pas +++ b/src/game/g_player.pas @@ -130,7 +130,7 @@ type MaxAmmo: Array [A_BULLETS..A_HIGH] of Word; Weapon: Array [WP_FIRST..WP_LAST] of Boolean; Rulez: Set of R_ITEM_BACKPACK..R_BERSERK; - WaitRecall: Boolean; + Used: Boolean; end; TKeyState = record @@ -176,7 +176,7 @@ type FFirePainTime: Integer; FFireAttacker: Word; - FSavedState: TPlayerSavedState; + FSavedStateNum: Integer; FModel: TPlayerModel; FPunchAnim: TAnimation; @@ -703,6 +703,7 @@ var CurrentShell: Integer = 0; BotNames: Array of String; BotList: Array of TBotProfile; + SavedStates: Array of TPlayerSavedState; function Lerp(X, Y, Factor: Integer): Integer; @@ -1340,6 +1341,7 @@ begin end; config.Free(); + SetLength(SavedStates, 0); end; procedure g_Player_Free(); @@ -1363,6 +1365,7 @@ begin gPlayer1 := nil; gPlayer2 := nil; + SetLength(SavedStates, 0); end; procedure g_Player_UpdateAll(); @@ -2164,7 +2167,7 @@ begin FClientID := -1; FPing := 0; FLoss := 0; - FSavedState.WaitRecall := False; + FSavedStateNum := -1; FShellTimer := -1; FFireTime := 0; FFirePainTime := 0; @@ -5954,45 +5957,69 @@ end; procedure TPlayer.RememberState(); var i: Integer; -begin - FSavedState.Health := FHealth; - FSavedState.Armor := FArmor; - FSavedState.Air := FAir; - FSavedState.JetFuel := FJetFuel; - FSavedState.CurrWeap := FCurrWeap; - FSavedState.NextWeap := FNextWeap; - FSavedState.NextWeapDelay := FNextWeapDelay; + SavedState: TPlayerSavedState; +begin + SavedState.Health := FHealth; + SavedState.Armor := FArmor; + SavedState.Air := FAir; + SavedState.JetFuel := FJetFuel; + SavedState.CurrWeap := FCurrWeap; + SavedState.NextWeap := FNextWeap; + SavedState.NextWeapDelay := FNextWeapDelay; + for i := Low(FWeapon) to High(FWeapon) do + SavedState.Weapon[i] := FWeapon[i]; + for i := Low(FAmmo) to High(FAmmo) do + SavedState.Ammo[i] := FAmmo[i]; + for i := Low(FMaxAmmo) to High(FMaxAmmo) do + SavedState.MaxAmmo[i] := FMaxAmmo[i]; + SavedState.Rulez := FRulez - [R_KEY_RED, R_KEY_GREEN, R_KEY_BLUE]; + + if FSavedStateNum < 0 then + begin + for i := Low(SavedStates) to High(SavedStates) do + if not SavedStates[i].Used then + begin + FSavedStateNum := i; + break; + end; + if FSavedStateNum < 0 then + begin + SetLength(SavedStates, Length(SavedStates) + 1); + FSavedStateNum := High(SavedStates); + end; + end; - for i := 0 to 3 do - FSavedState.Ammo[i] := FAmmo[i]; - for i := 0 to 3 do - FSavedState.MaxAmmo[i] := FMaxAmmo[i]; - FSavedState.Rulez := FRulez; - FSavedState.WaitRecall := True; + SavedState.Used := True; + SavedStates[i] := SavedState; end; procedure TPlayer.RecallState(); var i: Integer; + SavedState: TPlayerSavedState; begin - if not FSavedState.WaitRecall then Exit; - - FHealth := FSavedState.Health; - FArmor := FSavedState.Armor; - FAir := FSavedState.Air; - FJetFuel := FSavedState.JetFuel; - FCurrWeap := FSavedState.CurrWeap; - FNextWeap := FSavedState.NextWeap; - FNextWeapDelay := FSavedState.NextWeapDelay; - - for i := 0 to 3 do - FAmmo[i] := FSavedState.Ammo[i]; - for i := 0 to 3 do - FMaxAmmo[i] := FSavedState.MaxAmmo[i]; + if(FSavedStateNum < 0) or (FSavedStateNum > High(SavedStates)) then + Exit; - FRulez := FSavedState.Rulez; - FSavedState.WaitRecall := False; + SavedState := SavedStates[FSavedStateNum]; + SavedStates[FSavedStateNum].Used := False; + FSavedStateNum := -1; + + FHealth := SavedState.Health; + FArmor := SavedState.Armor; + FAir := SavedState.Air; + FJetFuel := SavedState.JetFuel; + FCurrWeap := SavedState.CurrWeap; + FNextWeap := SavedState.NextWeap; + FNextWeapDelay := SavedState.NextWeapDelay; + for i := Low(FWeapon) to High(FWeapon) do + FWeapon[i] := SavedState.Weapon[i]; + for i := Low(FAmmo) to High(FAmmo) do + FAmmo[i] := SavedState.Ammo[i]; + for i := Low(FMaxAmmo) to High(FMaxAmmo) do + FMaxAmmo[i] := SavedState.MaxAmmo[i]; + FRulez := SavedState.Rulez; if gGameSettings.GameType = GT_SERVER then MH_SEND_PlayerStats(FUID); diff --git a/src/game/g_triggers.pas b/src/game/g_triggers.pas index 55057b6..779a9a1 100644 --- a/src/game/g_triggers.pas +++ b/src/game/g_triggers.pas @@ -1349,17 +1349,13 @@ begin begin Enabled := False; Result := True; - if gLMSRespawn = LMS_RESPAWN_NONE then + p := g_Player_Get(ActivateUID); + p.GetSecret(); + Inc(gCoopSecretsFound); + if g_Game_IsNet then begin - p := g_Player_Get(ActivateUID); - p.GetSecret(); - Inc(gCoopSecretsFound); - if g_Game_IsNet then - begin - MH_SEND_GameStats(); - if p.FClientID >= 0 then - MH_SEND_GameEvent(NET_EV_SECRET, p.UID, ''); - end; + MH_SEND_GameStats(); + MH_SEND_GameEvent(NET_EV_SECRET, p.UID, ''); end; end; @@ -2599,8 +2595,9 @@ var begin if (tgMonsList = nil) then tgMonsList := TSimpleMonsterList.Create(); - if gTriggers = nil then - Exit; + if gTriggers = nil then Exit; + if gLMSRespawn > LMS_RESPAWN_NONE then Exit; // don't update triggers at all + SetLength(Affected, 0); for a := 0 to High(gTriggers) do -- 2.29.2