Minimap.cs
using Sandbox;
public sealed class Minimap : Component, IPlayerReplicatorEvents
{
CameraComponent cam;
protected override void OnEnabled()
{
var playerReplicator = Scene.Get<PlayerReplicator>();
cam = GetComponent<CameraComponent>();
var viewport = cam.Viewport;
if (playerReplicator.NumberOfPlayers >= 2 )
{
viewport.y /= 2;
}
if (playerReplicator.NumberOfPlayers >= 4)
{
viewport.x /= 2;
}
cam.Viewport = viewport;
}
protected override void OnUpdate()
{
var hud = cam.Hud;
var rect = cam.ScreenRect;
// Draw borders
var borderSize = 3;
hud.DrawRect( new Rect( rect.Left, rect.Top, rect.Width, borderSize ), Color.Black );
hud.DrawRect( new Rect( rect.Left, rect.Top, borderSize, rect.Height ), Color.Black );
hud.DrawRect( new Rect( rect.Left + rect.Width - borderSize, rect.Top, borderSize, rect.Height ), Color.Black );
hud.DrawRect( new Rect( rect.Left, rect.Top + rect.Height - borderSize, rect.Width, borderSize ), Color.Black );
rect.Width -= borderSize;
rect.Height -= borderSize;
rect.Left += borderSize;
rect.Top += borderSize;
// Draw base health
var baseHealthFraction = HomeBase.Local.CurrentHealth / HomeBase.Local.StartingHealth;
hud.DrawRect( new Rect( rect.Left, rect.Top, rect.Width, 10 ), Color.White );
hud.DrawRect( new Rect( rect.Left, rect.Top, rect.Width * baseHealthFraction, 10 ), Color.Red );
// Draw players
/*
var world0 = rect.Center;
var players = Scene.GetComponentsInChildren<PlayerController>();
foreach (var player in players)
{
// 14.3f is trial and error, not sure what it should be properly
var offset = (Vector2)(player.WorldPosition.RotateAround(Vector3.Zero, Rotation.FromYaw(-90))/14.3f);
offset.x *= -1;
offset += world0;
hud.DrawCircle( offset, 5, Color.Green );
}
*/
}
void IPlayerReplicatorEvents.PlayersReplicated( int newNumberOfPlayers )
{
var viewport = cam.Viewport;
if ( newNumberOfPlayers == 2 )
{
viewport.y /= 2;
}
else if ( newNumberOfPlayers == 4 )
{
viewport.x /= 2;
}
else
{
throw new System.NotImplementedException();
}
cam.Viewport = viewport;
}
}