UI/PauseMenu.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
<root class="pause-root @(IsOpen ? "open" : "closed")">
@if (
IsOpen &&
RoundManager is not null &&
RoundManager.Mode != SessionMode.Menu
)
{
<div class="pause-screen">
<div class="pause-screen-overlay"></div>
<div class="pause-panel">
<div class="pause-panel-chrome"></div>
@if ( _page == PausePage.Main )
{
<div class="pause-eyebrow">
@(RoundManager.Mode == SessionMode.Sandbox ? "SANDBOX" : "ONLINE 1V1")
</div>
<div class="pause-title">
@(RoundManager.Mode == SessionMode.Sandbox ? "TEST MENU" : "PAUSED")
</div>
@if ( RoundManager.Mode == SessionMode.Match )
{
<div class="pause-note">
The online match continues while this menu is open.
</div>
}
else
{
<div class="pause-summary">
<div>A: @RoundManager.GetSandboxWeaponName( 0 )</div>
<div>B: @RoundManager.GetSandboxWeaponName( 1 )</div>
</div>
}
<div class="pause-actions">
<div class="pause-button primary" onclick=@Resume>
<div class="pause-button-title">RESUME</div>
</div>
<div class="pause-button" onclick=@OpenSettings>
<div class="pause-button-title">SETTINGS</div>
<div class="pause-button-copy">Sensitivity, FOV and movement preferences</div>
</div>
@if (
RoundManager.Mode ==
SessionMode.Sandbox &&
Networking.IsHost
)
{
<div class="pause-button" onclick=@ResetSandboxPlayers>
<div class="pause-button-title">RESET PLAYERS</div>
<div class="pause-button-copy">Re-apply current arena and loadouts</div>
</div>
@if ( RoundManager.SandboxBotEnabled )
{
<div class="pause-button" onclick=@ResetSandboxBot>
<div class="pause-button-title">RESET BOT</div>
<div class="pause-button-copy">Respawn and re-equip only the sandbox bot</div>
</div>
}
<div class="pause-button" onclick=@OpenSandboxSetup>
<div class="pause-button-title">SANDBOX SETUP</div>
<div class="pause-button-copy">Change weapons or arena without disconnecting</div>
</div>
}
<div class="pause-button danger" onclick=@LeaveSession>
<div class="pause-button-title">
@(RoundManager.Mode == SessionMode.Sandbox ? "RETURN TO MAIN MENU" : "LEAVE MATCH")
</div>
</div>
</div>
}
else
{
<div class="pause-eyebrow">OPTIONS</div>
<div class="pause-title">SETTINGS</div>
<SettingsPanel />
<div class="pause-settings-back" onclick=@BackFromSettings>
BACK
</div>
}
</div>
</div>
}
</root>
@code
{
public static PauseMenu Current { get; private set; }
public static bool IsAnyPauseOpen =>
Current?.
IsOpen ??
false;
[Property]
public RoundManager RoundManager { get; set; }
[Property, Group( "UI Foundation" ), Title( "Theme" )]
public OMRUITheme Theme { get; set; }
[Property, Group( "UI Foundation" ), Title( "Menu Layout" )]
public OMRMainMenuLayout MenuLayout { get; set; }
private OMRUITheme ActiveTheme =>
Theme ?? OMRUIResources.DefaultTheme;
private OMRMainMenuLayout ActiveMenuLayout =>
MenuLayout ?? OMRUIResources.DefaultMenuLayout;
private GameFlowManager FlowManager =>
RoundManager?.
GameObject?.
Components
.Get<GameFlowManager>();
private enum PausePage
{
Main,
Settings
}
public bool IsOpen { get; private set; }
private PausePage _page =
PausePage.Main;
private SessionMode _lastMode =
SessionMode.Menu;
protected override void OnEnabled()
{
base.OnEnabled();
Current =
this;
}
protected override void OnDisabled()
{
if ( Current == this )
{
Current =
null;
}
base.OnDisabled();
}
protected override void OnStart()
{
base.OnStart();
RoundManager ??=
Components.Get<RoundManager>();
if ( RoundManager is not null )
{
_lastMode =
RoundManager.Mode;
}
}
protected override void OnUpdate()
{
base.OnUpdate();
RoundManager ??=
Components.Get<RoundManager>();
if ( IsOpen )
{
OMRUIRuntimeStyle.ApplyPause(
Panel,
ActiveTheme,
ActiveMenuLayout
);
}
if ( RoundManager is null )
return;
if (
RoundManager.Mode !=
_lastMode
)
{
if (
RoundManager.Mode ==
SessionMode.Menu
)
{
CloseWithoutControlRestore();
}
_lastMode =
RoundManager.Mode;
}
if (
RoundManager.Mode !=
SessionMode.Menu &&
Input.EscapePressed
)
{
if (
IsOpen &&
_page ==
PausePage.Settings
)
{
_page =
PausePage.Main;
return;
}
SetOpen(
!IsOpen
);
}
if ( !IsOpen )
return;
Mouse.Visibility =
MouseVisibility.Visible;
Input.EnableVirtualCursor =
true;
}
private void SetOpen(
bool open
)
{
if (
RoundManager is null ||
RoundManager.Mode ==
SessionMode.Menu
)
return;
if (
IsOpen ==
open
)
return;
IsOpen =
open;
_page =
PausePage.Main;
RoundManager.RequestPauseState(
open
);
}
private void CloseWithoutControlRestore()
{
IsOpen =
false;
_page =
PausePage.Main;
}
private void Resume()
{
SetOpen(
false
);
}
private void OpenSettings()
{
_page =
PausePage.Settings;
}
private void BackFromSettings()
{
_page =
PausePage.Main;
}
private void ResetSandboxPlayers()
{
if (
RoundManager is null ||
RoundManager.Mode !=
SessionMode.Sandbox ||
!Networking.IsHost
)
return;
RoundManager.ResetSandboxPlayersNow();
SetOpen(
false
);
}
private void ResetSandboxBot()
{
if (
RoundManager is null ||
RoundManager.Mode !=
SessionMode.Sandbox ||
!Networking.IsHost
)
return;
RoundManager.ResetSandboxBotNow();
SetOpen(
false
);
}
private void OpenSandboxSetup()
{
if (
RoundManager is null ||
RoundManager.Mode !=
SessionMode.Sandbox ||
!Networking.IsHost
)
return;
CloseWithoutControlRestore();
if (
MainMenuHost.Current is not null
)
{
MainMenuHost.Current
.ReturnToSandboxSetup();
return;
}
FlowManager?.
ReturnToSandboxSetup();
}
private void LeaveSession()
{
if ( RoundManager is null )
return;
CloseWithoutControlRestore();
if (
MainMenuHost.Current is not null
)
{
MainMenuHost.Current
.ReturnToMainMenu();
return;
}
FlowManager?.
ReturnToMainMenu();
}
protected override int BuildHash()
{
HashCode hash =
new();
hash.Add(
IsOpen
);
hash.Add(
_page
);
hash.Add(
RoundManager?.
Mode
);
hash.Add( ActiveTheme?.ContentHash() ?? 0 );
hash.Add( ActiveMenuLayout?.ContentHash() ?? 0 );
if (
RoundManager is not null &&
RoundManager.Mode ==
SessionMode.Sandbox
)
{
hash.Add(
RoundManager.SandboxWeaponAIndex
);
hash.Add(
RoundManager.SandboxWeaponBIndex
);
}
return hash.ToHashCode();
}
}