status/MysteryBoxStatus.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;
using static Sandbox.VertexLayout;

[Status(1, 0, 0.7f, 0, false )]
public class MysteryBoxStatus : Status
{
	public MysteryBoxStatus()
    {
		Title = "Mystery Box";
		IconPath = "textures/icons/mystery_box.png";
	}

	public override void Init(Player player)
	{
		base.Init(player);
	}

	public override void Refresh()
    {
		Description = GetDescription(Level);

		var pos = Player.Position2D + Utils.GetRandomVector() * Game.Random.Float( 0.4f, 0.8f );
		var BUFFER = 0.3f;
		pos = new Vector2( MathX.Clamp( pos.x, Manager.Instance.BOUNDS_MIN.x + BUFFER, Manager.Instance.BOUNDS_MAX.x - BUFFER ), MathX.Clamp( pos.y, Manager.Instance.BOUNDS_MIN.y + BUFFER, Manager.Instance.BOUNDS_MAX.y - BUFFER ) );
		Crate box = Manager.Instance.SpawnEnemy( TypeLibrary.GetType( typeof( Crate ) ), pos, forceSpawn: true ) as Crate;
		box?.BecomeMysteryBox();
	}
	public override string GetDescription(int newLevel)
	{
		return "Receive a special crate";
	}
	public override string GetUpgradeDescription(int newLevel)
    {
		return "Receive a special crate";
	}
}