ui/DebugPanel.razor

A Razor UI panel for an in-game debug panel. It renders many buttons that call Manager and Player methods to toggle debug settings, spawn enemies/items/effects, and perform actions like kill/chain/level up for the local player.

NetworkingFile Access
@namespace Sandbox
@using Sandbox;
@using Sandbox.UI;
@using System;
@using Sandbox.Diagnostics;
@inherits Panel
@attribute [StyleSheet("DebugPanel.razor.scss")]

<root onmouseout=@(() => Manager.Instance.MouseDebugText = "")>
	@* <div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => Manager.Instance.ToggleOrthoCamera()) onmousedown=@(() => Manager.Instance.MouseDebugText = "toggle ortho camera")>@($"{(Manager.Instance.IsOrthoCamera ? "📸" : "🎥")}")</button>
	</div> *@

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ToggleSpawnEnemies()) onmousedown=@(() => Manager.Instance.MouseDebugText = "toggle random spawns")>@($"{(Manager.Instance.DontSpawnRandomEnemies ? "🚫" : "✅")}")</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ToggleGodMode()) onmousedown=@(() => Manager.Instance.MouseDebugText = "toggle god mode")>@($"{(Manager.Instance.GodMode ? "😇" : "😐")}")</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => AlmostKillPlayer()) onmousedown=@(() => Manager.Instance.MouseDebugText = "near death")>😵</button>
		<button style="background-color: transparent;" onclick=@(() => KillPlayer()) onmousedown=@(() => Manager.Instance.MouseDebugText = "suicide")>😵</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ToggleLaunchEnemies()) onmousedown=@(() => Manager.Instance.MouseDebugText = "toggle launch enemies")>@($"{(Manager.Instance.LaunchEnemies ? "🆙" : "🟦")}")</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => TogglePlayerMaxDmg()) onmousedown=@(() => Manager.Instance.MouseDebugText = "toggle player dmg")>@($"{(Manager.Instance.PlayerMaxDmg ? "😈" : "🟣")}")</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => LevelUp()) onmousedown=@(() => Manager.Instance.MouseDebugText = "lvl up")>⬆️</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ToggleBulletBounce()) onmousedown=@(() => Manager.Instance.MouseDebugText = "bullet bounce")>@($"{(Manager.Instance.DebugBulletBounce ? "🏀" : "⚪")}")</button>
		<button style="background-color: transparent;" onclick=@(() => ToggleBulletPierce()) onmousedown=@(() => Manager.Instance.MouseDebugText = "bullet pierce")>@($"{(Manager.Instance.DebugBulletPierce ? "💉" : "⚪")}")</button>
		<button style="background-color: transparent;" onclick=@(() => ToggleBulletSplash()) onmousedown=@(() => Manager.Instance.MouseDebugText = "bullet splash")>@($"{(Manager.Instance.DebugBulletSplash ? "💦" : "⚪")}")</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ResetDebug()) onmousedown=@(() => Manager.Instance.MouseDebugText = "reset debug options")>🔄</button>
	</div>

	<div class="debug_row">
		<button style="background-color: transparent;" onclick=@(() => ToggleShowAllPerks()) onmousedown=@(() => Manager.Instance.MouseDebugText = "show all perks")>🔢</button>
	</div>

	<div class="debug_row">
		<button style="background-color: green;" onclick=@(() => SpawnEnemy("zombie")) onmousedown=@(() => Manager.Instance.MouseDebugText = "zombie")>🧟</button>
		<button style="background-color: green;" onclick=@(() => SpawnEnemy("zombie_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "zombie elite")>🧟🏿‍♂️</button>
	</div>

	<div class="debug_row">
		<button style="background-color: red;" onclick=@(() => SpawnEnemy("exploder")) onmousedown=@(() => Manager.Instance.MouseDebugText = "exploder")>🤰</button>
		<button style="background-color: red;" onclick=@(() => SpawnEnemy("exploder_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "exploder elite")>🤰🏿</button>
		<button style="background-color: red;" onclick=@(() => SpawnEnemy("exploder_mini")) onmousedown=@(() => Manager.Instance.MouseDebugText = "exploder mini")>👶</button>
	</div>

	<div class="debug_row">
		<button style="background-color: darkblue;" onclick=@(() => SpawnEnemy("spitter")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter")>🐡</button>
		<button style="background-color: blue;" onclick=@(() => SpawnEnemy("spitter_fire")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_fire")>🔥</button>
		<button style="background-color: blue;" onclick=@(() => SpawnEnemy("spitter_freeze")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_freeze")>❄️</button>
		<button style="background-color: blue;" onclick=@(() => SpawnEnemy("spitter_poison")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_poison")>☣️</button>
		<button style="background-color: blue;" onclick=@(() => SpawnEnemy("spitter_acid")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_acid")>🌊</button>
		<button style="background-color: blue;" onclick=@(() => SpawnEnemy("spitter_curse")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_curse")>💀</button>
	</div>

	<div class="debug_row">
		<button style="background-color: darkmagenta;" onclick=@(() => SpawnEnemy("spitter_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter elite")>🐳</button>
		<button style="background-color: blueviolet;" onclick=@(() => SpawnEnemy("spitter_elite_fire")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_elite_fire")>🔥</button>
		<button style="background-color: blueviolet;" onclick=@(() => SpawnEnemy("spitter_elite_freeze")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_elite_freeze")>❄️</button>
		<button style="background-color: blueviolet;" onclick=@(() => SpawnEnemy("spitter_elite_poison")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_elite_poison")>☣️</button>
		<button style="background-color: blueviolet;" onclick=@(() => SpawnEnemy("spitter_elite_acid")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_elite_acid")>🌊</button>
		<button style="background-color: blueviolet;" onclick=@(() => SpawnEnemy("spitter_elite_curse")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spitter_elite_curse")>💀</button>
	</div>

	<div class="debug_row">
		<button style="background-color: purple;" onclick=@(() => SpawnEnemy("spiker")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spiker")>🌂</button>
		<button style="background-color: purple;" onclick=@(() => SpawnEnemy("spiker_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "spiker elite")>🍆</button>
	</div>

	<div class="debug_row">
		<button style="background-color: orange;" onclick=@(() => SpawnEnemy("charger")) onmousedown=@(() => Manager.Instance.MouseDebugText = "charger")>🐑</button>
		<button style="background-color: orange;" onclick=@(() => SpawnEnemy("charger_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "charger elite")>🦌</button>
	</div>

	<div class="debug_row">
		<button style="background-color: black;" onclick=@(() => SpawnEnemy("runner")) onmousedown=@(() => Manager.Instance.MouseDebugText = "runner")>🐺</button>
		<button style="background-color: black;" onclick=@(() => SpawnEnemy("runner_elite")) onmousedown=@(() => Manager.Instance.MouseDebugText = "runner elite")>🦇</button>
	</div>

	<div class="debug_row">
		<button style="background-color: grey;" onclick=@(() => SpawnEnemy("barrel")) onmousedown=@(() => Manager.Instance.MouseDebugText = "barrel")>🥫</button>
		<button style="background-color: grey;" onclick=@(() => SpawnEnemy("barrel_exploding")) onmousedown=@(() => Manager.Instance.MouseDebugText = "barrel exploding")>🛢️</button>
		<button style="background-color: grey;" onclick=@(() => SpawnEnemy("chest")) onmousedown=@(() => Manager.Instance.MouseDebugText = "chest")>📦</button>
		<button style="background-color: grey;" onclick=@(() => SpawnEnemy("chest_evil")) onmousedown=@(() => Manager.Instance.MouseDebugText = "chest evil")>🧰</button>
	</div>

	<div class="debug_row">
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_spitter")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss spitter")>🐟</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_sniper")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss sniper")>🐫</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_troll")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss troll")>🧝🏼</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_runner")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss runner")>🧛</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_charger")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss charger")>🐂</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_charger_2")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss charger 2")>🐘</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_slammer")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss slammer")>🥁</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_shielder")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss shielder")>🐢</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_spiker")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss spiker")>🗡️</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_spiker_2")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss spiker 2")>🥕</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_exploder")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss exploder")>💥</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_zapper")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss zapper")>🌩️</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_zapper_2")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss zapper 2")>⚡</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_zoner")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss zoner")>🔵</button>
		<button style="background-color: darkslategrey;" onclick=@(() => SpawnEnemy("miniboss_absorber")) onmousedown=@(() => Manager.Instance.MouseDebugText = "miniboss absorber")>🧽</button>
		@* <button style="background-color: darkslategrey;" onclick=@(() => SpawnSnaker()) onmousedown=@(() => Manager.Instance.MouseDebugText = "snaker")>🐍</button> *@
		<button style="background-color: darkgrey;" onclick=@(() => Manager.Instance.SpawnBoss()) onmousedown=@(() => Manager.Instance.MouseDebugText = "boss")>👑</button>
		<button style="background-color: darkgrey;" onclick=@(() => KillBoss()) onmousedown=@(() => Manager.Instance.MouseDebugText = "kill boss")>☠︎︎</button>
		<button style="background-color: darkgrey;" onclick=@(() => SpawnSword()) onmousedown=@(() => Manager.Instance.MouseDebugText = "sword")>⚔️</button>
		<button style="background-color: darkgrey;" onclick=@(() => SpawnEnemy("boss_invincible_generator")) onmousedown=@(() => Manager.Instance.MouseDebugText = "boss invincible generator")>💎</button>
	</div>

	<div class="debug_row">
		<button style="background-color: darkgreen;" onclick=@(() => SpawnCoin()) onmousedown=@(() => Manager.Instance.MouseDebugText = "coin")>💰</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("health_pack")) onmousedown=@(() => Manager.Instance.MouseDebugText = "healthpack")>➕</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("magnet")) onmousedown=@(() => Manager.Instance.MouseDebugText = "magnet")>🧲</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("revive_soul")) onmousedown=@(() => Manager.Instance.MouseDebugText = "revive soul")>✝️</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("bomb")) onmousedown=@(() => Manager.Instance.MouseDebugText = "bomb")>💣</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("reroll_item")) onmousedown=@(() => Manager.Instance.MouseDebugText = "reroll")>🎲</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("banish_item")) onmousedown=@(() => Manager.Instance.MouseDebugText = "banish")>✂️</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("armor_item")) onmousedown=@(() => Manager.Instance.MouseDebugText = "armor")>🛡️</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnItem("reload_item")) onmousedown=@(() => Manager.Instance.MouseDebugText = "reload pickup")>🔫</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnPerk()) onmousedown=@(() => Manager.Instance.MouseDebugText = "random perk")>🧩</button>
		<button style="background-color: darkgreen;" onclick=@(() => FpsPerk()) onmousedown=@(() => Manager.Instance.MouseDebugText = "3rd person perk")>👁️</button>
		<button style="background-color: darkgreen;" onclick=@(() => PerspectivePerk()) onmousedown=@(() => Manager.Instance.MouseDebugText = "perspective perk")>👀</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnEnemy("mushroom")) onmousedown=@(() => Manager.Instance.MouseDebugText = "mushroom")>🍄</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnEnemy("tree")) onmousedown=@(() => Manager.Instance.MouseDebugText = "tree")>🌲</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnAcidPuddle()) onmousedown=@(() => Manager.Instance.MouseDebugText = "acid puddle")>🌊</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnFireGround()) onmousedown=@(() => Manager.Instance.MouseDebugText = "ground fire")>🔥</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnLandmine()) onmousedown=@(() => Manager.Instance.MouseDebugText = "landmine")>⚠️</button>
		<button style="background-color: darkgreen;" onclick=@(() => SpawnLavaBlob()) onmousedown=@(() => Manager.Instance.MouseDebugText = "lava")>🟠</button>
	</div>

	<div class="debug_row">
		<button style="background-color: darkslategrey;" onclick=@(() => ChainPlayer()) onmousedown=@(() => Manager.Instance.MouseDebugText = "chain")>⛓️</button>
		<button style="background-color: transparent;" onclick=@(() => PlayerShield()) onmousedown=@(() => Manager.Instance.MouseDebugText = "player shield")>🟡</button>
		<button style="background-color: transparent;" onclick=@(() => FireParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "fire particles")>🔥</button>
		<button style="background-color: transparent;" onclick=@(() => FreezeParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "freeze particles")>❄️</button>
		<button style="background-color: transparent;" onclick=@(() => PoisonParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "poison particles")>☣️</button>
		<button style="background-color: transparent;" onclick=@(() => FearParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "fear particles")>😱</button>
		<button style="background-color: transparent;" onclick=@(() => StunParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "stun particles")>💫</button>
		<button style="background-color: transparent;" onclick=@(() => ShockParticles()) onmousedown=@(() => Manager.Instance.MouseDebugText = "shock particles")>⚡</button>
	</div>

</root>

@code {
	public string TooltipText { get; set; }

	protected override int BuildHash()
	{
		return System.HashCode.Combine(
			Manager.Instance.DontSpawnRandomEnemies,
			Manager.Instance.GodMode
		);
	}

	void ToggleSpawnEnemies()
	{
		Manager.Instance.DontSpawnRandomEnemies = !Manager.Instance.DontSpawnRandomEnemies;
		GameSettingsSystem.Save();
	}

	void ToggleGodMode()
	{
		Manager.Instance.GodMode = !Manager.Instance.GodMode;
		GameSettingsSystem.Save();
	}

	void ToggleLaunchEnemies()
	{
		Manager.Instance.LaunchEnemies = !Manager.Instance.LaunchEnemies;
		GameSettingsSystem.Save();
	}

	void TogglePlayerMaxDmg()
	{
		Manager.Instance.PlayerMaxDmg = !Manager.Instance.PlayerMaxDmg;
		GameSettingsSystem.Save();
	}

	void LevelUp()
	{
		Manager.Instance.LocalPlayer?.LevelUpDebug();
	}

	void ToggleBulletBounce()
	{
		Manager.Instance.DebugBulletBounce = !Manager.Instance.DebugBulletBounce;
		GameSettingsSystem.Save();
	}

	void ToggleBulletPierce()
	{
		Manager.Instance.DebugBulletPierce = !Manager.Instance.DebugBulletPierce;
		GameSettingsSystem.Save();
	}

	void ToggleBulletSplash()
	{
		Manager.Instance.DebugBulletSplash = !Manager.Instance.DebugBulletSplash;
		GameSettingsSystem.Save();
	}

	void ResetDebug()
	{
		Manager.Instance.PlayerMaxDmg = false;
		Manager.Instance.DebugBulletBounce = false;
		Manager.Instance.DebugBulletPierce = false;
		Manager.Instance.DebugBulletSplash = false;
		Manager.Instance.DontSpawnRandomEnemies = false;
		Manager.Instance.GodMode = false;
		Manager.Instance.LaunchEnemies = false;
		GameSettingsSystem.Save();
	}

	void ToggleShowAllPerks()
	{
		Manager.Instance.ShowAllPerks = !Manager.Instance.ShowAllPerks;
	}

	void SpawnEnemy(string name, float rotAngle = 0f)
	{
		Manager.Instance.SpawnEnemy(name, Manager.Instance.LocalPlayer.Position2D + Utils.GetRandomVector() * 60f, spawnInstantly: false, rotAngle);
	}

	void SpawnSword()
	{
		var player = Manager.Instance.LocalPlayer;
		var pos = player.Position2D + player.Velocity * Game.Random.Float(0f, 3f) + Utils.GetRandomVector() * Game.Random.Float(30f, 120f);

		Manager.Instance.SpawnEnemy("sword", pos, spawnInstantly: false, rotAngle: 0f);
	}

	void SpawnCoin()
	{
		var dir = Utils.GetRandomVector();
		Manager.Instance.SpawnCoinRpc( Manager.Instance.LocalPlayer.Position2D + dir * 50f, Game.Random.Int( 1, 3 ), dir );
	}

	void SpawnItem(string name)
	{
		Manager.Instance.LocalPlayer.GiveItemRpc(name, Utils.GetRandomVector());
	}

	void SpawnPerk()
	{
		Manager.Instance.LocalPlayer.GiveRandomPerkItemWithMessage( sourcePerkType: null, Rarity.None );
	}

	void FpsPerk()
	{
		var dir = Utils.GetRandomVector();
		Manager.Instance.SpawnPerkItemRpc( PerkManager.TypeToIdentity( TypeLibrary.GetType( typeof( PerkFpsMode ) ) ), Manager.Instance.LocalPlayer.Position2D + dir * 50f, dir );
	}

	void PerspectivePerk()
	{
		var dir = Utils.GetRandomVector();
		Manager.Instance.SpawnPerkItemRpc(PerkManager.TypeToIdentity(TypeLibrary.GetType(typeof(PerkPerspective))), Manager.Instance.LocalPlayer.Position2D + dir * 50f, dir);
	}

	void SpawnAcidPuddle()
	{
		var dir = Utils.GetRandomVector();
		Manager.Instance.SpawnAcidPuddleRpc( Manager.Instance.LocalPlayer.Position2D + dir * 100f, lifetime: Game.Random.Float( 24f, 30f ), damage: 5f, scale: Game.Random.Float( 0.5f, 1.8f ), new Color( 0.5f, 0.3f, 0.6f ), new Color( 0.5f, 0.5f, 0.7f ), playerSource: null, enemySource: null, enemyType: EnemyType.None );
	}

	void SpawnFireGround()
	{
		var dir = Utils.GetRandomVector();
		Manager.Instance.SpawnFireGroundRpc( Manager.Instance.LocalPlayer.Position2D + dir * 100f, player: null, enemySource: null, enemyType: EnemyType.None, damage: 2f, lifetime: 8f, spreadChance: 50f, canStack: false, scale: 1f, colorA: Color.Red, colorB: Color.Yellow );
	}

	void SpawnLavaBlob()
	{
		if(Manager.Instance.GetLavaBlobEndPos(Manager.Instance.LocalPlayer.Position2D, out Vector2 endPos))
			Manager.Instance.SpawnLavaBlob(Manager.Instance.LocalPlayer.Position2D, endPos, puddleRadius: Game.Random.Float(170f, 250f), enemySource: null, enemyType: EnemyType.None );
	}

	void SpawnLandmine()
	{
		var player = Manager.Instance.LocalPlayer;
		var dir = Utils.GetRandomVector();
		var pos = player.Position2D + dir * Game.Random.Float(50f, 100f);
		var damage = 10f;

		var landmineGo = GameObject.Clone("prefabs/landmine.prefab", new CloneConfig { StartEnabled = true, Transform = new Transform(new Vector3(pos.x, pos.y, 0f)) });
		var landmine = landmineGo.Components.Get<Landmine>(true);

		landmine.Damage = damage;
		landmine.Shooter = player;

		landmineGo.NetworkSpawn(player.Network.Owner);
	}

	void SpawnSnaker()
	{
		var dir = Utils.GetRandomVector();
		var pos = Manager.Instance.LocalPlayer.Position2D + dir * 50f;
		Manager.Instance.SpawnSnaker( pos, numSegments: 12 );
	}

	void KillBoss()
	{
		if(!Game.IsEditor)
			return;

		var boss = Manager.Instance.Boss;
		if( !boss.IsValid() ) 
			return;

		Manager.Instance.DontSubmitScore = true;
		// Manager.Instance.DontFinishGameOnBossKill = true;

		var localPlayer = Manager.Instance.LocalPlayer;

		var dir = localPlayer.IsValid()
			? (boss.Position2D - localPlayer.Position2D).Normal
			: Utils.GetRandomVector();

		var hitPos = boss.Position2D - dir * boss.Radius;

		Manager.Instance.Boss?.DamageRpc(Manager.Instance.Boss.Health - 0f, localPlayer, DamageType.Bullet, hitPos, dir);
	}

	void ChainPlayer()
	{
		var player = Manager.Instance.LocalPlayer;
		if(!player.IsValid())
			return;

		var enemy = Manager.Instance.GetClosestEnemy(player.Position2D);

		if(!enemy.IsValid())
			return;

		player.Chain(anchorUnit: enemy, chainPos: enemy.Position2D, chainLength: 150f, lifetime: 10f);
	}

	void KillPlayer()
	{
		var player = Manager.Instance.LocalPlayer;
		var dir = Utils.GetRandomVector();
		var force = 1f;
		var upwardAmount = 1f;// Game.Random.Float(0f, 1f);
		player?.Damage(999f, DamageType.Self, player.Position2D, dir, upwardAmount, force, ragdollForce: 1f, enemySource: null, enemyType: EnemyType.None);
	}

	void AlmostKillPlayer()
	{
		var player = Manager.Instance.LocalPlayer;
		player?.Damage(player.Health - 1f, DamageType.Self, player.Position2D, Vector2.Zero, 0f, 0f, ragdollForce: 1f, enemySource: null, enemyType: EnemyType.None);
	}

	void PlayerShield()
	{
		var player = Manager.Instance.LocalPlayer;
		player.GainShield();

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.GainShield();
	}

	void FireParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		player.Ignite(null, null, EnemyType.None, 1f, 30f, 0.1f, false);

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.Ignite(null, null, EnemyType.None, 1f, 30f, 0.1f, false);
	}

	void FreezeParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		player.Freeze(null, null, 0.5f, 30f, true);

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.Freeze(null, null, 0.5f, 30f, true);
	}

	void PoisonParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		player.Poison(null, null, EnemyType.None, 1, 0f, 0.2f, 1f, false);

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.Poison(null, null, EnemyType.None, 1, 0f, 0.2f, 1f, false);
	}

	void FearParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1200f, onlyCountsAsKill: false);
		closestEnemy?.Fear(null, null, 30f);
	}

	void StunParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		player.Stun(null, null, 1f);

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.Stun(null, null, 1f);
	}

	void ShockParticles()
	{
		var player = Manager.Instance.LocalPlayer;
		player.Shock(null, null, 2f, 0, 5);

		var closestEnemy = Manager.Instance.GetClosestEnemy(player.Position2D, 1000f, onlyCountsAsKill: false);
		closestEnemy?.Shock(null, null, 2f, 0, 5);
	}
}