UI/LobbyMenu.razor
@using System;
@using Sandbox;
@using Sandbox.UI;
@using Sandbox.Network;
@using System.Runtime.CompilerServices
@inherits PanelComponent
@namespace Sandbox
<root>
<div class="header">
<div class="title">#lobby.title</div>
<div class="subtitle">
<div class="mode">
<label>#lobby.mode</label>
<label>#mode.twoplayers</label>
</div>
<div class="mode">@NetworkManager.Instance.GameMode</div>
</div>
</div>
<div class="body">
<div class="playerlist">
@foreach (var player in Connection.All)
{
<div class="player">
<div class="left">
@if (player.IsHost)
{
<div class="prefix">[Host]</div>
}
@if (Networking.IsHost && !player.IsHost)
{
<div class="prefix" onclick="@(() => player.Kick("You were kicked by the host"))">❌</div>
}
<div class="name">@player.DisplayName</div>
</div>
<div class="right">
<div class="ping">
<img src="@pingIcon" style="width: 35px; margin: 0px 5px;" alt="Ping" />@player.Latency
</div>
</div>
</div>
}
@if (Connection.All.Count < 2)
{
<div class="invite">#lobby.invitefriend</div>
}
</div>
<div class="settings">
<div class="option">
<label class="option_name">#lobby.settings.privacy</label>
<div class="adjuster">
<label class="option_adjust" onclick='@(() => SetLobbyPrivacy("left"))'><</label>
<label class="option_value">@LobbyPrivacy</label>
<label class="option_adjust" onclick='@(() => SetLobbyPrivacy("right"))'>></label>
</div>
</div>
@* <div class="option">
<label class="option_name">Max Players:</label>
<div class="adjuster">
<label class="option_adjust" onclick="@(() => ChangeValue("decrement", MaxPlayers, 1, 1))"><</label>
<label class="option_value">@MaxPlayers</label>
<label class="option_adjust" onclick="@(() => ChangeValue("increment", MaxPlayers, 1, 1))">></label>
</div>
</div> *@
<div class="option">
<label class="option_name">#lobby.settings.rounds</label>
<div class="adjuster">
<label class="option_adjust" onclick="@(() => { var rounds = MaxRounds; ChangeValue("decrement", ref rounds, 1, 10); MaxRounds = rounds; })">-10</label>
<label class="option_adjust" onclick="@(() => { var rounds = MaxRounds; ChangeValue("decrement", ref rounds, 1, 1); MaxRounds = rounds; })">-1</label>
<label class="option_value">@MaxRounds</label>
<label class="option_adjust" onclick="@(() => { var rounds = MaxRounds; ChangeValue("increment", ref rounds, 1, 1); MaxRounds = rounds; })">+1</label>
<label class="option_adjust" onclick="@(() => { var rounds = MaxRounds; ChangeValue("increment", ref rounds, 1, 10); MaxRounds = rounds; })">+10</label>
</div>
</div>
<div class="option">
<label class="option_name">#lobby.settings.ballspeed</label>
<div class="adjuster">
<label class="option_adjust" onclick="@(() => { var speed = Speed; ChangeValue("decrement", ref speed, 100, 100); Speed = speed; })">-100</label>
<label class="option_adjust" onclick="@(() => { var speed = Speed; ChangeValue("decrement", ref speed, 100, 10); Speed = speed; })">-10</label>
<label class="option_value">@Speed</label>
<label class="option_adjust" onclick="@(() => { var speed = Speed; ChangeValue("increment", ref speed, 100, 10); Speed = speed; })">+10</label>
<label class="option_adjust" onclick="@(() => { var speed = Speed; ChangeValue("increment", ref speed, 100, 100); Speed = speed; })">+100</label>
</div>
</div>
@* <div class="option">
<label class="option_name">Paddle Size:</label>
<div class="adjuster">
<label class="option_adjust"><</label>
<label class="option_value"></label>
<label class="option_adjust">></label>
</div>
</div> *@
<div class="option">
<label class="option_name">#lobby.settings.ballacceleration</label>
<div class="adjuster">
<label class="option_adjust" onclick=@( () => ChangeAcceleration() )><</label>
@if (GameSettings.Acceleration)
{
<label class="option_value">#lobby.settings.ballacceleration.true</label>
}
else
{
<label class="option_value">#lobby.settings.ballacceleration.false</label>
}
<label class="option_adjust" onclick=@( () => ChangeAcceleration() )>></label>
</div>
</div>
@if (Networking.IsHost)
{
<div class="button reset" onclick="@(() => OnReset())">#lobby.settings.reset</div>
}
else
{
<div class="button disabled">#lobby.settings.nothost</div>
}
</div>
</div>
<div class="footer">
<div class="left">
@if (Networking.IsHost)
{
<div class="button play" onclick="@(() => OnPlay())">#menu.play</div>
}
else
{
<div class="button disabled">#lobby.waitingforhost</div>
}
<div class="button color" onclick="@(() => TogglePalette())" style="color: @GameSettings.Color;">#lobby.changecolor</div>
</div>
<div class="button exit" onclick="@(() => OnLeaveLobby())">#lobby.leave</div>
</div>
<div class="panel_background @(paletteVisible ? "" : "hidden")">
<div class="palette">
<div class="colors">
<div class="color blue" onclick="@(() => PickColor("blue"))"></div>
<div class="color green" onclick="@(() => PickColor("green"))"></div>
<div class="color darkcyan" onclick="@(() => PickColor("darkcyan"))"></div>
<div class="color red" onclick="@(() => PickColor("red"))"></div>
<div class="color purple" onclick="@(() => PickColor("purple"))"></div>
<div class="color saddlebrown" onclick="@(() => PickColor("saddlebrown"))"></div>
<div class="color gray" onclick="@(() => PickColor("gray"))"></div>
<div class="color lightblue" onclick="@(() => PickColor("lightblue"))"></div>
<div class="color lightgreen" onclick="@(() => PickColor("lightgreen"))"></div>
<div class="color cyan" onclick="@(() => PickColor("cyan"))"></div>
<div class="color lightcoral" onclick="@(() => PickColor("lightcoral"))"></div>
<div class="color violet" onclick="@(() => PickColor("violet"))"></div>
<div class="color yellow" onclick="@(() => PickColor("yellow"))"></div>
<div class="color white" onclick="@(() => PickColor("white"))"></div>
</div>
<div class="button back" onclick="@(() => TogglePalette())">#menu.back</div>
</div>
</div>
</root>
@code
{
@* [Sync] public int MaxPlayers { get; set; } *@
[Sync] public LobbyPrivacy LobbyPrivacy { get; set; } = LobbyPrivacy.Public;
[Sync] public int MaxRounds { get; set; }
[Sync] public int Speed { get; set; }
[Sync] public bool Acceleration { get; set; }
bool paletteVisible = false;
[Property, ImageAssetPath] string pingIcon {get; set;}
public LobbyMenu()
{
@* MaxPlayers = GameSettings.MaxPlayers; *@
MaxRounds = GameSettings.MaxRounds;
Speed = GameSettings.Speed;
Acceleration = GameSettings.Acceleration;
}
@* void SetToTeam(Connection player)
{
if (!Networking.IsHost) return;
NetworkManager.player.Team = "Player";
} *@
void SetLobbyPrivacy(string direction)
{
if (LobbyPrivacy == LobbyPrivacy.Public)
{
if (direction == "left")
{
LobbyPrivacy = LobbyPrivacy.Private;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
else if (direction == "right")
{
LobbyPrivacy = LobbyPrivacy.FriendsOnly;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
}
else if (LobbyPrivacy == LobbyPrivacy.Private)
{
if (direction == "left")
{
LobbyPrivacy = LobbyPrivacy.FriendsOnly;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
else if (direction == "right")
{
LobbyPrivacy = LobbyPrivacy.Public;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
}
else if (LobbyPrivacy == LobbyPrivacy.FriendsOnly)
{
if (direction == "left")
{
LobbyPrivacy = LobbyPrivacy.Public;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
else if (direction == "right")
{
LobbyPrivacy = LobbyPrivacy.Private;
GameSettings.LobbyPrivacy = LobbyPrivacy;
}
}
}
void ChangeValue(string operation, ref int value, int min, int step)
{
if (!Networking.IsHost) return;
if (operation == "increment")
{
value = Math.Max(min, value + step);
}
else if (operation == "decrement")
{
value = Math.Max(min, value - step);
}
}
void ChangeAcceleration()
{
if (Acceleration)
{
Acceleration = false;
}
else
{
Acceleration = true;
}
}
void TogglePalette()
{
if (paletteVisible)
paletteVisible = false;
else
paletteVisible = true;
}
void PickColor(string color)
{
GameSettings.Color = color;
paletteVisible = false;
Log.Info(GameSettings.Color);
}
void OnReset()
{
if (!Networking.IsHost) return;
@* MaxPlayers = 4; *@
LobbyPrivacy = LobbyPrivacy.Public;
MaxRounds = 20;
Speed = 400;
Acceleration = true;
}
void OnPlay()
{
@* GameSettings.MaxPlayers = MaxPlayers; *@
@* GameSettings.MaxRounds = MaxRounds;
GameSettings.Speed = Speed;
GameSettings.Acceleration = Acceleration; *@
SceneLoadOptions load = new SceneLoadOptions();
load.SetScene("scenes/game.scene");
Game.ChangeScene(load);
}
void OnLeaveLobby()
{
Networking.Disconnect();
Scene.LoadFromFile("scenes/MainMenu.scene");
}
protected override void OnUpdate()
{
GameSettings.LobbyPrivacy = LobbyPrivacy;
GameSettings.MaxRounds = MaxRounds;
GameSettings.Speed = Speed;
GameSettings.Acceleration = Acceleration;
}
/// <summary>
/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
/// </summary>
protected override int BuildHash() => System.HashCode.Combine(
@* MaxPlayers, *@
LobbyPrivacy,
NetworkManager.Instance.GameMode,
MaxRounds,
Speed,
Acceleration,
Connection.All.Count
);
}