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;
	}
}