{"TotalCount":51,"Files":[{"Ident":"cherkbyte.one_more_push","Path":"BotAI.cs","FileName":"BotAI.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\nusing System.Linq;\r\n\r\npublic sealed class BotAI : Component\r\n{\r\n    [Property] public float Speed { get; set; } = 220f;\r\n    [Property] public float AttackRange { get; set; } = 220f;\r\n\r\n    private CharacterController _cc;\r\n    private PushAbility _push;\r\n    private ManeuverAbility _maneuver;\r\n    private TimeUntil _nextDecision;\r\n    private Vector3 _moveDir;\r\n\r\n    protected override void OnAwake()\r\n    {\r\n        _cc = Components.Get\u003CCharacterController\u003E();\r\n        _push = Components.Get\u003CPushAbility\u003E();\r\n        _maneuver = Components.Get\u003CManeuverAbility\u003E();\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        if ( IsProxy ) return;\r\n\r\n        var target = FindTarget();\r\n\r\n        if ( target.IsValid() )\r\n        {\r\n            _moveDir = (target.WorldPosition - WorldPosition).WithZ( 0 ).Normal;\r\n\r\n            if ( _cc.IsValid() )\r\n            {\r\n                _cc.Velocity = _moveDir * Speed;\r\n                WorldRotation = Rotation.LookAt( _moveDir );\r\n            }\r\n\r\n            float dist = Vector3.DistanceBetween( WorldPosition, target.WorldPosition );\r\n            if ( dist \u003C= AttackRange \u0026\u0026 _push.IsValid() \u0026\u0026 _push.IsReady )\r\n            {\r\n                _push.TryExecuteBotPush();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if ( _nextDecision )\r\n            {\r\n                _nextDecision = Game.Random.Float( 2f, 4f );\r\n                float angle = Game.Random.Float( 0f, MathF.PI * 2f );\r\n                _moveDir = new Vector3( MathF.Cos( angle ), MathF.Sin( angle ), 0f );\r\n            }\r\n\r\n            if ( _cc.IsValid() )\r\n            {\r\n                _cc.Velocity = _moveDir * (Speed * 0.6f);\r\n            }\r\n        }\r\n\r\n        if ( _cc.IsValid() \u0026\u0026 !_cc.IsOnGround \u0026\u0026 _maneuver.IsValid() \u0026\u0026 _maneuver.IsDashReady )\r\n        {\r\n            _maneuver.TryExecuteBotDash( -_cc.Velocity.Normal );\r\n        }\r\n    }\r\n\r\n    private GameObject FindTarget()\r\n    {\r\n        return Scene.GetAllComponents\u003CCharacterController\u003E()\r\n            .Where( c =\u003E c.GameObject != GameObject \u0026\u0026 c.GameObject.IsValid() )\r\n            .OrderBy( c =\u003E Vector3.DistanceBetween( WorldPosition, c.WorldPosition ) )\r\n            .FirstOrDefault()?.GameObject;\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"BouncyShield.cs","FileName":"BouncyShield.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class BouncyShield : Component, Component.ITriggerListener\r\n{\r\n\t[Property] public float BounceForce { get; set; } = 1500f;\r\n\t[Property] public SoundEvent BounceSound { get; set; }\r\n\r\n\tpublic void OnTriggerEnter( Collider other )\r\n\t{\r\n\t\tvar rootObj = other.GameObject.Root;\r\n\t\tvar pushDir = (rootObj.WorldPosition - WorldPosition).Normal;\r\n\t\tpushDir.z = 0.3f;\r\n\r\n\t\tbool bounced = false;\r\n\r\n\t\tvar cc = rootObj.Components.Get\u003CCharacterController\u003E();\r\n\t\tif ( cc.IsValid() )\r\n\t\t{\r\n\t\t\tcc.Velocity = pushDir * BounceForce;\r\n\t\t\tbounced = true;\r\n\t\t}\r\n\r\n\t\tvar rb = rootObj.Components.Get\u003CRigidbody\u003E();\r\n\t\tif ( rb.IsValid() )\r\n\t\t{\r\n\t\t\trb.Velocity = pushDir * BounceForce;\r\n\t\t\tbounced = true;\r\n\t\t}\r\n\r\n\t\tif ( bounced )\r\n\t\t{\r\n\t\t\tif ( BounceSound != null )\r\n\t\t\t{\r\n\t\t\t\tSound.Play( BounceSound, WorldPosition );\r\n\t\t\t}\r\n\t\t\tCameraJuice.Instance?.Shake( 12f );\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"EmoteWheel.cs","FileName":"EmoteWheel.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class EmoteWheel : Component\r\n{\r\n\t[Property] public string CurrentEmote { get; private set; } = \u0022\u0022;\r\n\t[Property] public float EmoteDuration { get; set; } = 2.5f;\r\n\r\n\tprivate TimeSince _emoteTimer;\r\n\r\n\tpublic void PlayEmote( string emoteIcon )\r\n\t{\r\n\t\tCurrentEmote = emoteIcon;\r\n\t\t_emoteTimer = 0;\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif ( !string.IsNullOrEmpty( CurrentEmote ) \u0026\u0026 _emoteTimer \u003E EmoteDuration )\r\n\t\t{\r\n\t\t\tCurrentEmote = \u0022\u0022;\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"PlayerHealth.cs","FileName":"PlayerHealth.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\nusing System.Linq;\r\n\r\npublic sealed class PlayerHealth : Component\r\n{\r\n\t[Property] public float MaxHealth { get; set; } = 100f;\r\n\t[Property] public float CurrentHealth { get; private set; } = 100f;\r\n\r\n\tpublic bool IsDead =\u003E CurrentHealth \u003C= 0f;\r\n\tpublic float RespawnTimer { get; private set; } = 0f;\r\n\tpublic float RespawnDuration { get; set; } = 3f;\r\n\r\n\tprivate Vector3 _lastDamageDirection = Vector3.Zero;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tCurrentHealth = MaxHealth;\r\n\t}\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif ( IsDead )\r\n\t\t{\r\n\t\t\tRespawnTimer -= Time.Delta;\r\n\t\t\tif ( RespawnTimer \u003C= 0f )\r\n\t\t\t{\r\n\t\t\t\tRespawn();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void TakeDamage( float damage )\r\n\t{\r\n\t\tTakeDamage( damage, Vector3.Zero );\r\n\t}\r\n\r\n\tpublic void TakeDamage( float damage, Vector3 direction )\r\n\t{\r\n\t\tif ( IsDead ) return;\r\n\r\n\t\t_lastDamageDirection = direction;\r\n\t\tCurrentHealth = MathX.Clamp( CurrentHealth - damage, 0f, MaxHealth );\r\n\r\n\t\tif ( CurrentHealth \u003C= 0f )\r\n\t\t{\r\n\t\t\tDie();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void Heal( float amount )\r\n\t{\r\n\t\tif ( IsDead ) return;\r\n\t\tCurrentHealth = MathX.Clamp( CurrentHealth \u002B amount, 0f, MaxHealth );\r\n\t}\r\n\r\n\tprivate void Die()\r\n\t{\r\n\t\tRespawnTimer = RespawnDuration;\r\n\r\n\t\tif ( ScoreManager.Instance != null )\r\n\t\t{\r\n\t\t\tScoreManager.Instance.AddDeath();\r\n\t\t}\r\n\r\n\t\tvar ragdoll = Components.Get\u003CPlayerRagdoll\u003E();\r\n\t\tif ( ragdoll.IsValid() )\r\n\t\t{\r\n\t\t\tragdoll.SpawnRagdoll( _lastDamageDirection * 2500f );\r\n\t\t}\r\n\r\n\t\tvar skm = Components.Get\u003CSkinnedModelRenderer\u003E();\r\n\t\tif ( skm.IsValid() ) skm.Enabled = false;\r\n\r\n\t\tvar mr = Components.Get\u003CModelRenderer\u003E();\r\n\t\tif ( mr.IsValid() ) mr.Enabled = false;\r\n\r\n\t\tvar cc = Components.Get\u003CCharacterController\u003E();\r\n\t\tif ( cc.IsValid() ) cc.Enabled = false;\r\n\r\n\t\tvar rb = Components.Get\u003CRigidbody\u003E();\r\n\t\tif ( rb.IsValid() ) rb.Enabled = false;\r\n\r\n\t\tCameraJuice.Instance?.Shake( 30f, 6f );\r\n\r\n\t\tLog.Info( \u0022[PlayerHealth] \u0418\u0433\u0440\u043E\u043A \u043F\u043E\u0433\u0438\u0431!\u0022 );\r\n\t}\r\n\r\n\tpublic void Respawn()\r\n\t{\r\n\t\tCurrentHealth = MaxHealth;\r\n\r\n\t\tvar skm = Components.Get\u003CSkinnedModelRenderer\u003E();\r\n\t\tif ( skm.IsValid() ) skm.Enabled = true;\r\n\r\n\t\tvar mr = Components.Get\u003CModelRenderer\u003E();\r\n\t\tif ( mr.IsValid() ) mr.Enabled = true;\r\n\r\n\t\tvar cc = Components.Get\u003CCharacterController\u003E();\r\n\t\tif ( cc.IsValid() ) cc.Enabled = true;\r\n\r\n\t\tvar rb = Components.Get\u003CRigidbody\u003E();\r\n\t\tif ( rb.IsValid() ) rb.Enabled = true;\r\n\r\n\t\tvar spawnPoint = Scene.GetAllComponents\u003CSpawnPoint\u003E().FirstOrDefault();\r\n\t\tif ( spawnPoint.IsValid() )\r\n\t\t{\r\n\t\t\tTransform.World = spawnPoint.Transform.World;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tTransform.LocalPosition = Vector3.Up * 50f;\r\n\t\t}\r\n\r\n\t\tLog.Info( \u0022[PlayerHealth] \u0418\u0433\u0440\u043E\u043A \u0432\u043E\u0437\u0440\u043E\u0434\u0438\u043B\u0441\u044F!\u0022 );\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"PushHud.razor","FileName":"PushHud.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"@using Sandbox;\r\n@using Sandbox.UI;\r\n@using Sandbox.Services;\r\n@using System;\r\n@using System.Linq;\r\n@using System.Collections.Generic;\r\n@using System.Threading.Tasks;\r\n@inherits PanelComponent\r\n@attribute [StyleSheet( \u0022PushHud.scss\u0022 )]\r\n\r\n\u003Croot class=\u0022hud-root\u0022\u003E\r\n\r\n    \u003Cdiv class=\u0022top-header-container\u0022\u003E\r\n        \u003Cdiv class=\u0022score-box\u0022\u003E\r\n            \u003Cdiv class=\u0022score-card time\u0022\u003E\r\n                \u003Clabel class=\u0022score-title\u0022\u003E@L( \u0022\u0412\u0440\u0435\u043C\u044F\u0022, \u0022Time\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022score-value\u0022\u003E@GetFormattedTime()\u003C/label\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022score-card\u0022\u003E\r\n                \u003Clabel class=\u0022score-title\u0022\u003E@L( \u0022\u0421\u0431\u0438\u0442\u043E\u0022, \u0022Score\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022score-value\u0022\u003E@GetScore()\u003C/label\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022score-card death\u0022\u003E\r\n                \u003Clabel class=\u0022score-title\u0022\u003E@L( \u0022\u0421\u043C\u0435\u0440\u0442\u0438\u0022, \u0022Deaths\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022score-value\u0022\u003E@GetDeaths()\u003C/label\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022score-card highlight\u0022\u003E\r\n                \u003Clabel class=\u0022score-title\u0022\u003E@L( \u0022\u0420\u0435\u043A\u043E\u0440\u0434\u0022, \u0022Best\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022score-value\u0022\u003E@GetHighScore()\u003C/label\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022round-badge\u0022\u003E\r\n            @L( \u0022\u0420\u0410\u0423\u041D\u0414\u0022, \u0022ROUND\u0022 ) @(RoundManager.Instance?.CurrentRound ?? 1)\r\n        \u003C/div\u003E\r\n\r\n        @if ( MapEventManager.Instance != null \u0026\u0026 MapEventManager.Instance.CurrentEvent != WeatherType.None )\r\n        {\r\n            \u003Cdiv class=\u0022weather-banner @GetWeatherClass( MapEventManager.Instance.CurrentEvent )\u0022\u003E\r\n                \u003Clabel class=\u0022weather-icon\u0022\u003E@GetWeatherIcon( MapEventManager.Instance.CurrentEvent )\u003C/label\u003E\r\n                \u003Cdiv class=\u0022weather-info\u0022\u003E\r\n                    \u003Clabel class=\u0022weather-title\u0022\u003E@GetWeatherTitle( MapEventManager.Instance.CurrentEvent )\u003C/label\u003E\r\n                    \u003Clabel class=\u0022weather-sub\u0022\u003E@L( \u0022\u0410\u041A\u0422\u0418\u0412\u041D\u0410\u042F \u0410\u041D\u041E\u041C\u0410\u041B\u0418\u042F\u0022, \u0022ACTIVE ANOMALY\u0022 )\u003C/label\u003E\r\n                \u003C/div\u003E\r\n                \u003Cdiv class=\u0022weather-timer-badge\u0022\u003E\r\n                    \u003Clabel class=\u0022timer-text\u0022\u003E@($\u0022{MapEventManager.Instance.TimeRemaining:F1}s\u0022)\u003C/label\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        }\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022scoreboard-box\u0022\u003E\r\n        \u003Cdiv class=\u0022scoreboard-header\u0022\u003E\r\n            \u003Clabel class=\u0022header-title\u0022\u003E@L( \u0022\u0418\u0413\u0420\u041E\u041A\u0418\u0022, \u0022PLAYERS\u0022 )\u003C/label\u003E\r\n        \u003C/div\u003E\r\n        \u003Cdiv class=\u0022player-list\u0022\u003E\r\n            @foreach ( var p in GetPlayerList() )\r\n            {\r\n                \u003Cdiv class=\u0022player-row @(p.IsLocal ? \u0022local\u0022 : \u0022\u0022)\u0022\u003E\r\n                    \u003Clabel class=\u0022player-name\u0022\u003E@p.Name\u003C/label\u003E\r\n                    \u003Clabel class=\u0022player-score\u0022\u003E@p.Score\u003C/label\u003E\r\n                \u003C/div\u003E\r\n            }\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022killfeed-container\u0022\u003E\r\n        @if ( Killfeed.Instance != null )\r\n        {\r\n            @foreach ( var entry in Killfeed.Instance.Entries )\r\n            {\r\n                \u003Cdiv class=\u0022kill-entry\u0022\u003E\r\n                    \u003Clabel class=\u0022killer\u0022\u003E@entry.KillerName\u003C/label\u003E\r\n                    \u003Clabel class=\u0022icon\u0022\u003E\uD83D\uDCA5 [@entry.Method]\u003C/label\u003E\r\n                    \u003Clabel class=\u0022victim\u0022\u003E@entry.VictimName\u003C/label\u003E\r\n                \u003C/div\u003E\r\n            }\r\n        }\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022hotbar-container\u0022\u003E\r\n        @if ( ShopManager.Instance != null )\r\n        {\r\n            @foreach ( var item in ShopManager.Instance.Items )\r\n            {\r\n                bool isSelected = item == ShopManager.Instance.SelectedItem;\r\n                \r\n                \u003Cdiv class=\u0022slot-wrapper\u0022\u003E\r\n                    \u003Cdiv class=\u0022hotbar-slot @(isSelected ? \u0022selected\u0022 : \u0022\u0022) @(!item.IsUnlocked ? \u0022locked\u0022 : \u0022\u0022)\u0022 \r\n                         onclick=\u0022@(() =\u003E ShopManager.Instance.TryBuyOrSelect(item))\u0022\u003E\r\n                        \r\n                        \u003Clabel class=\u0022slot-name\u0022\u003E@item.GetName( CurrentLanguage )\u003C/label\u003E\r\n                        \r\n                        @if ( !item.IsUnlocked )\r\n                        {\r\n                            \u003Clabel class=\u0022slot-cost\u0022\u003E\uD83D\uDCB0 @item.Cost\u003C/label\u003E\r\n                        }\r\n                    \u003C/div\u003E\r\n                    \u003Cdiv class=\u0022key-badge @(isSelected ? \u0022selected\u0022 : \u0022\u0022)\u0022\u003E@item.Key\u003C/div\u003E\r\n                \u003C/div\u003E\r\n            }\r\n        }\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022top-left-box\u0022\u003E\r\n        \u003Cdiv class=\u0022chat-box @(IsChatOpen ? \u0022open\u0022 : \u0022\u0022)\u0022\u003E\r\n            \u003Cdiv class=\u0022chat-messages\u0022\u003E\r\n                @foreach ( var msg in CanvasMessages )\r\n                {\r\n                    \u003Cdiv class=\u0022chat-row\u0022\u003E\r\n                        \u003Clabel class=\u0022chat-author\u0022\u003E@msg.Author:\u003C/label\u003E\r\n                        \u003Clabel class=\u0022chat-text\u0022\u003E@msg.Text\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n                }\r\n            \u003C/div\u003E\r\n\r\n            @if ( IsChatOpen )\r\n            {\r\n                \u003Cdiv class=\u0022chat-input-row\u0022\u003E\r\n                    \u003Ctextentry @ref=\u0022ChatInput\u0022 onsubmit=\u0022@SendChatMessage\u0022 placeholder=\u0022@L( \u0022\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435...\u0022, \u0022Type a message...\u0022 )\u0022\u003E\u003C/textentry\u003E\r\n                \u003C/div\u003E\r\n            }\r\n            else\r\n            {\r\n                \u003Cdiv class=\u0022hints-row\u0022\u003E\r\n                    \u003Clabel class=\u0022chat-hint\u0022 onclick=\u0022@OpenChat\u0022\u003E@L( \u0022\u041D\u0430\u0436\u043C\u0438\u0442\u0435 [Enter] \u0434\u043B\u044F \u0447\u0430\u0442\u0430\u0022, \u0022Press [Enter] to chat\u0022 )\u003C/label\u003E\r\n                    \u003Clabel class=\u0022chat-hint prop-hint\u0022 onclick=\u0022@ToggleWorkshopMenu\u0022\u003E@L( \u0022[E] \u0421\u043F\u0430\u0432\u043D-\u043C\u0435\u043D\u044E | [R] \u041C\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430\u044F\u0022, \u0022[E] Spawnmenu | [R] Workshop\u0022 )\u003C/label\u003E\r\n                \u003C/div\u003E\r\n            }\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022player-status-panel\u0022\u003E\r\n        \u003Cdiv class=\u0022status-box health-box\u0022\u003E\r\n            \u003Cdiv class=\u0022status-header\u0022\u003E\r\n                \u003Clabel class=\u0022status-title\u0022\u003E\u2764\uFE0F @L( \u0022\u0417\u0414\u041E\u0420\u041E\u0412\u042C\u0415\u0022, \u0022HEALTH\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022status-val\u0022\u003E@($\u0022{GetHealth():F0}\u0022) / @($\u0022{GetMaxHealth():F0}\u0022)\u003C/label\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022bar-background\u0022\u003E\r\n                \u003Cdiv class=\u0022bar-fill health\u0022 style=\u0022width: @($\u0022{GetHealthPercent():F1}%\u0022);\u0022\u003E\u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022status-box cooldown-box\u0022\u003E\r\n            \u003Cdiv class=\u0022status-header\u0022\u003E\r\n                \u003Clabel class=\u0022status-title\u0022\u003E\u26A1 @L( \u0022\u041F\u0415\u0420\u0415\u0417\u0410\u0420\u042F\u0414\u041A\u0410\u0022, \u0022COOLDOWN\u0022 )\u003C/label\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022bar-background\u0022\u003E\r\n                \u003Cdiv class=\u0022bar-fill\u0022 style=\u0022width: @($\u0022{GetPercent():F1}%\u0022);\u0022\u003E\u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\r\n    @if ( PushAbility != null \u0026\u0026 PushAbility.IsCharging )\r\n    {\r\n        \u003Cdiv class=\u0022charge-box\u0022\u003E\r\n            \u003Clabel class=\u0022charge-title\u0022\u003E@L( \u0022\u0417\u0410\u0420\u042F\u0414\u0022, \u0022CHARGE\u0022 )\u003C/label\u003E\r\n            \u003Cdiv class=\u0022bar-background\u0022\u003E\r\n                \u003Cdiv class=\u0022bar-fill charge\u0022 style=\u0022width: @($\u0022{PushAbility.ChargeProgress * 100f:F1}%\u0022);\u0022\u003E\u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( LocalHealth != null \u0026\u0026 LocalHealth.IsDead )\r\n    {\r\n        \u003Cdiv class=\u0022respawn-overlay\u0022\u003E\r\n            \u003Cdiv class=\u0022respawn-card\u0022\u003E\r\n                \u003Clabel class=\u0022death-title\u0022\u003E\uD83D\uDC80 @L( \u0022\u0412\u042B \u041F\u041E\u0413\u0418\u0411\u041B\u0418!\u0022, \u0022YOU DIED!\u0022 )\u003C/label\u003E\r\n                \u003Clabel class=\u0022respawn-subtitle\u0022\u003E\r\n                    @L( \u0022\u0412\u043E\u0437\u0440\u043E\u0436\u0434\u0435\u043D\u0438\u0435 \u0447\u0435\u0440\u0435\u0437:\u0022, \u0022Respawning in:\u0022 )\r\n                \u003C/label\u003E\r\n                \u003Clabel class=\u0022respawn-timer\u0022\u003E@($\u0022{Math.Max( 0, LocalHealth.RespawnTimer ):F1}s\u0022)\u003C/label\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( !IsMenuOpen \u0026\u0026 !IsSettingsOpen \u0026\u0026 !IsWorkshopMenuOpen \u0026\u0026 !IsQSpawnMenuOpen )\r\n    {\r\n        \u003Cbutton class=\u0022side-settings-btn\u0022 onclick=\u0022@OpenMenu\u0022\u003E\r\n            \u003Clabel class=\u0022key-hint\u0022\u003E[ESC]\u003C/label\u003E\r\n            \u003Clabel class=\u0022icon\u0022\u003E\u2699\u003C/label\u003E\r\n        \u003C/button\u003E\r\n    }\r\n\r\n    @if ( IsQSpawnMenuOpen )\r\n    {\r\n        \u003Cdiv class=\u0022spawnmenu-overlay\u0022 onclick=\u0022@CloseQSpawnMenu\u0022\u003E\r\n            \u003Cdiv class=\u0022spawnmenu-window\u0022 onclick=\u0022@((e) =\u003E e.StopPropagation())\u0022\u003E\r\n                \r\n                \u003Cdiv class=\u0022spawnmenu-topbar\u0022\u003E\r\n                    \u003Cdiv class=\u0022brand-badge\u0022\u003E\r\n                        \u003Clabel class=\u0022brand-text\u0022\u003EONE MORE PUSH\u003C/label\u003E\r\n                        \u003Clabel class=\u0022sub-text\u0022\u003ESPAWN MENU\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022topbar-nav\u0022\u003E\r\n                        \u003Cbutton class=\u0022topbar-tab active\u0022\u003E\uD83D\uDCE6 @L( \u0022\u041F\u0420\u041E\u041F\u0421\u042B \u0418 \u0410\u0420\u0415\u041D\u0410\u0022, \u0022PROPS \u0026 ARENA\u0022 )\u003C/button\u003E\r\n                        \u003Cbutton class=\u0022topbar-tab\u0022 onclick=\u0022@ToggleWorkshopMenu\u0022\u003E\u26A1 @L( \u0022\u041C\u0410\u0421\u0422\u0415\u0420\u0421\u041A\u0410\u042F [R]\u0022, \u0022WORKSHOP [R]\u0022 )\u003C/button\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022topbar-credits\u0022\u003E\r\n                        \u003Clabel class=\u0022credits-label\u0022\u003E@L( \u0022\u0411\u0410\u041B\u0410\u041D\u0421:\u0022, \u0022BALANCE:\u0022 )\u003C/label\u003E\r\n                        \u003Clabel class=\u0022credits-val\u0022\u003E\uD83D\uDCB0 @GetCredits()\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022spawnmenu-body\u0022\u003E\r\n                    \u003Cdiv class=\u0022spawnmenu-sidebar\u0022\u003E\r\n                        \u003Clabel class=\u0022sidebar-title\u0022\u003E@L( \u0022\u041A\u0410\u0422\u0415\u0413\u041E\u0420\u0418\u0418\u0022, \u0022CATEGORIES\u0022 )\u003C/label\u003E\r\n                        \u003Cdiv class=\u0022sidebar-item active\u0022\u003E\uD83D\uDCA5 @L( \u0022\u0418\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u0022, \u0022Interactive\u0022 )\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022sidebar-item\u0022\u003E\uD83D\uDEE2\uFE0F @L( \u0022\u041E\u043F\u0430\u0441\u043D\u044B\u0435 \u0437\u043E\u043D\u044B\u0022, \u0022Hazard Zones\u0022 )\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022sidebar-item\u0022\u003E\u2693 @L( \u0022\u0422\u044F\u0436\u0435\u043B\u044B\u0435 \u043E\u0431\u044A\u0435\u043A\u0442\u044B\u0022, \u0022Heavy Objects\u0022 )\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022sidebar-item\u0022\u003E\uD83C\uDF00 @L( \u0022\u041B\u043E\u0432\u0443\u0448\u043A\u0438 \u0026 \u0411\u0430\u0442\u0443\u0442\u044B\u0022, \u0022Traps \u0026 Springs\u0022 )\u003C/div\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022spawnmenu-content\u0022\u003E\r\n                        \u003Cdiv class=\u0022content-header\u0022\u003E\r\n                            \u003Clabel class=\u0022section-title\u0022\u003E@L( \u0022\u0421\u041F\u0410\u0412\u041D \u041E\u0411\u042A\u0415\u041A\u0422\u041E\u0412\u0022, \u0022SPAWN OBJECTS\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022section-desc\u0022\u003E@L( \u0022\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043F\u0440\u0435\u0434\u043C\u0435\u0442 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043D\u0430 \u043A\u0430\u0440\u0442\u0435\u0022, \u0022Select an item to spawn on the map\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cdiv class=\u0022gmod-prop-grid\u0022\u003E\r\n                            \u003Cdiv class=\u0022gmod-prop-card\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(0))\u0022\u003E\r\n                                \u003Cdiv class=\u0022card-glow\u0022\u003E\u003C/div\u003E\r\n                                \u003Cdiv class=\u0022prop-icon\u0022\u003E\uD83D\uDCA5\u003C/div\u003E\r\n                                \u003Clabel class=\u0022prop-label\u0022\u003E@L( \u0022\u0412\u0437\u0440\u044B\u0432\u043D\u0430\u044F \u0411\u043E\u0447\u043A\u0430\u0022, \u0022Explosive Barrel\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022prop-price\u0022\u003E\uD83D\uDCB0 15\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n\r\n                            \u003Cdiv class=\u0022gmod-prop-card\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(1))\u0022\u003E\r\n                                \u003Cdiv class=\u0022card-glow\u0022\u003E\u003C/div\u003E\r\n                                \u003Cdiv class=\u0022prop-icon\u0022\u003E\uD83D\uDEE2\uFE0F\u003C/div\u003E\r\n                                \u003Clabel class=\u0022prop-label\u0022\u003E@L( \u0022\u0417\u043E\u043D\u0430 \u0421\u043C\u043E\u043B\u044B\u0022, \u0022Tar Zone\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022prop-price\u0022\u003E\uD83D\uDCB0 20\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n\r\n                            \u003Cdiv class=\u0022gmod-prop-card\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(2))\u0022\u003E\r\n                                \u003Cdiv class=\u0022card-glow\u0022\u003E\u003C/div\u003E\r\n                                \u003Cdiv class=\u0022prop-icon\u0022\u003E\u2693\u003C/div\u003E\r\n                                \u003Clabel class=\u0022prop-label\u0022\u003E@L( \u0022\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044F\u0022, \u0022Anvil\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022prop-price\u0022\u003E\uD83D\uDCB0 25\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n\r\n                            \u003Cdiv class=\u0022gmod-prop-card\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(3))\u0022\u003E\r\n                                \u003Cdiv class=\u0022card-glow\u0022\u003E\u003C/div\u003E\r\n                                \u003Cdiv class=\u0022prop-icon\u0022\u003E\uD83C\uDF00\u003C/div\u003E\r\n                                \u003Clabel class=\u0022prop-label\u0022\u003E@L( \u0022\u041F\u0440\u0443\u0436\u0438\u043D\u043D\u044B\u0439 \u0411\u0430\u0442\u0443\u0442\u0022, \u0022Spring Pad\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022prop-price\u0022\u003E\uD83D\uDCB0 20\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022spawnmenu-tools\u0022\u003E\r\n                        \u003Clabel class=\u0022tools-title\u0022\u003E@L( \u0022\u0418\u041D\u0421\u0422\u0420\u0423\u041C\u0415\u041D\u0422\u042B\u0022, \u0022TOOLS\u0022 )\u003C/label\u003E\r\n                        \r\n                        \u003Cdiv class=\u0022tool-group\u0022\u003E\r\n                            \u003Clabel class=\u0022group-title\u0022\u003E@L( \u0022\u0412\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u0022, \u0022Interaction\u0022 )\u003C/label\u003E\r\n                            \u003Cdiv class=\u0022tool-item active\u0022\u003E\uD83D\uDC49 @L( \u0022\u0421\u043F\u0430\u0432\u043D-\u043C\u0435\u043D\u044E [E]\u0022, \u0022Spawn Menu [E]\u0022 )\u003C/div\u003E\r\n                            \u003Cdiv class=\u0022tool-item\u0022\u003E\uD83D\uDE80 @L( \u0022\u0421\u0438\u043B\u043E\u0432\u0430\u044F \u0432\u043E\u043B\u043D\u0430\u0022, \u0022Force Wave\u0022 )\u003C/div\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cdiv class=\u0022tool-group\u0022\u003E\r\n                            \u003Clabel class=\u0022group-title\u0022\u003E@L( \u0022\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435\u0022, \u0022Controls\u0022 )\u003C/label\u003E\r\n                            \u003Cdiv class=\u0022tool-hint\u0022\u003E@L( \u0022\u041E\u0442\u043F\u0443\u0441\u0442\u0438\u0442\u0435 [E] \u0434\u043B\u044F \u0437\u0430\u043A\u0440\u044B\u0442\u0438\u044F \u043C\u0435\u043D\u044E\u0022, \u0022Release [E] to close menu\u0022 )\u003C/div\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( IsWorkshopMenuOpen )\r\n    {\r\n        \u003Cdiv class=\u0022menu-overlay\u0022 onclick=\u0022@CloseWorkshopMenu\u0022\u003E\r\n            \u003Cdiv class=\u0022prop-menu-card\u0022 onclick=\u0022@((e) =\u003E e.StopPropagation())\u0022\u003E\r\n                \r\n                \u003Cdiv class=\u0022workshop-header\u0022\u003E\r\n                    \u003Clabel class=\u0022menu-title\u0022\u003E@L( \u0022\u041C\u0410\u0421\u0422\u0415\u0420\u0421\u041A\u0410\u042F \u0410\u0420\u0415\u041D\u042B\u0022, \u0022ARENA WORKSHOP\u0022 )\u003C/label\u003E\r\n                    \u003Cdiv class=\u0022credits-badge\u0022\u003E\uD83D\uDCB0 @GetCredits()\u003C/div\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022tab-selector\u0022\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(ActiveTab == \u0022PROPS\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectTab(\u0022PROPS\u0022))\u0022\u003E\r\n                        \uD83D\uDCE6 @L( \u0022\u041F\u0420\u041E\u041F\u0421\u042B\u0022, \u0022PROPS\u0022 )\r\n                    \u003C/button\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(ActiveTab == \u0022UPGRADES\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectTab(\u0022UPGRADES\u0022))\u0022\u003E\r\n                        \u26A1 @L( \u0022\u041F\u0420\u041E\u041A\u0410\u0427\u041A\u0410\u0022, \u0022UPGRADES\u0022 )\r\n                    \u003C/button\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(ActiveTab == \u0022WEAPONS\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectTab(\u0022WEAPONS\u0022))\u0022\u003E\r\n                        \uD83D\uDD2B @L( \u0022\u041E\u0420\u0423\u0416\u0418\u0415\u0022, \u0022WEAPONS\u0022 )\r\n                    \u003C/button\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(ActiveTab == \u0022PRESTIGE\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectTab(\u0022PRESTIGE\u0022))\u0022\u003E\r\n                        \uD83D\uDC51 @L( \u0022\u041F\u0420\u0415\u0421\u0422\u0418\u0416\u0022, \u0022PRESTIGE\u0022 )\r\n                    \u003C/button\u003E\r\n                \u003C/div\u003E\r\n\r\n                @if ( ActiveTab == \u0022PROPS\u0022 )\r\n                {\r\n                    \u003Cdiv class=\u0022prop-grid\u0022\u003E\r\n                        \u003Cdiv class=\u0022prop-item\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(0))\u0022\u003E\r\n                            \u003Clabel class=\u0022prop-name\u0022\u003E\uD83D\uDCA5 @L( \u0022\u0411\u043E\u0447\u043A\u0430\u0022, \u0022Barrel\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prop-cost\u0022\u003E\uD83D\uDCB0 15\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cdiv class=\u0022prop-item\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(1))\u0022\u003E\r\n                            \u003Clabel class=\u0022prop-name\u0022\u003E\uD83D\uDEE2\uFE0F @L( \u0022\u0421\u043C\u043E\u043B\u0430\u0022, \u0022Tar Zone\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prop-cost\u0022\u003E\uD83D\uDCB0 20\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cdiv class=\u0022prop-item\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(2))\u0022\u003E\r\n                            \u003Clabel class=\u0022prop-name\u0022\u003E\u2693 @L( \u0022\u041D\u0430\u043A\u043E\u0432\u0430\u043B\u044C\u043D\u044F\u0022, \u0022Anvil\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prop-cost\u0022\u003E\uD83D\uDCB0 25\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cdiv class=\u0022prop-item\u0022 onclick=\u0022@(() =\u003E SelectAndSpawnProp(3))\u0022\u003E\r\n                            \u003Clabel class=\u0022prop-name\u0022\u003E\uD83C\uDF00 @L( \u0022\u0411\u0430\u0442\u0443\u0442\u0022, \u0022Spring\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prop-cost\u0022\u003E\uD83D\uDCB0 20\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                }\r\n\r\n                @if ( ActiveTab == \u0022UPGRADES\u0022 )\r\n                {\r\n                    \u003Cdiv class=\u0022upgrades-list\u0022\u003E\r\n                        \u003Cdiv class=\u0022upgrade-row\u0022\u003E\r\n                            \u003Cdiv class=\u0022info\u0022\u003E\r\n                                \u003Clabel class=\u0022name\u0022\u003E\uD83D\uDCAA @L( \u0022\u0421\u0418\u041B\u0410 \u0423\u0414\u0410\u0420\u0410\u0022, \u0022PUSH FORCE\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022level\u0022\u003ELVL @GetForceLevel()\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n                            \u003Cbutton class=\u0022buy-btn\u0022 onclick=\u0022@TryUpgradeForce\u0022\u003E\r\n                                \u003Clabel class=\u0022btn-text\u0022\u003E@L( \u0022\u041A\u0423\u041F\u0418\u0422\u042C\u0022, \u0022BUY\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022btn-cost\u0022\u003E@GetForceCost() \uD83D\uDCB0\u003C/label\u003E\r\n                            \u003C/button\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cdiv class=\u0022upgrade-row\u0022\u003E\r\n                            \u003Cdiv class=\u0022info\u0022\u003E\r\n                                \u003Clabel class=\u0022name\u0022\u003E\uD83C\uDFCB\uFE0F @L( \u0022\u041C\u0410\u0421\u0421\u0410 \u0418\u0413\u0420\u041E\u041A\u0410\u0022, \u0022PLAYER MASS\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022level\u0022\u003ELVL @GetMassLevel()\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n                            \u003Cbutton class=\u0022buy-btn\u0022 onclick=\u0022@TryUpgradeMass\u0022\u003E\r\n                                \u003Clabel class=\u0022btn-text\u0022\u003E@L( \u0022\u041A\u0423\u041F\u0418\u0422\u042C\u0022, \u0022BUY\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022btn-cost\u0022\u003E@GetMassCost() \uD83D\uDCB0\u003C/label\u003E\r\n                            \u003C/button\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cdiv class=\u0022upgrade-row\u0022\u003E\r\n                            \u003Cdiv class=\u0022info\u0022\u003E\r\n                                \u003Clabel class=\u0022name\u0022\u003E\u26A1 @L( \u0022\u042D\u041D\u0415\u0420\u0413\u0418\u042F \u0418 \u0420\u042B\u0412\u041E\u041A\u0022, \u0022ENERGY RECOVERY\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022level\u0022\u003ELVL @GetEnergyLevel()\u003C/label\u003E\r\n                            \u003C/div\u003E\r\n                            \u003Cbutton class=\u0022buy-btn\u0022 onclick=\u0022@TryUpgradeEnergy\u0022\u003E\r\n                                \u003Clabel class=\u0022btn-text\u0022\u003E@L( \u0022\u041A\u0423\u041F\u0418\u0422\u042C\u0022, \u0022BUY\u0022 )\u003C/label\u003E\r\n                                \u003Clabel class=\u0022btn-cost\u0022\u003E@GetEnergyCost() \uD83D\uDCB0\u003C/label\u003E\r\n                            \u003C/button\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                }\r\n\r\n                @if ( ActiveTab == \u0022WEAPONS\u0022 )\r\n                {\r\n                    \u003Cdiv class=\u0022upgrades-list\u0022\u003E\r\n                        @if ( WeaponManager.Instance != null )\r\n                        {\r\n                            @foreach ( var w in WeaponManager.Instance.Weapons )\r\n                            {\r\n                                bool isEquipped = WeaponManager.Instance.CurrentWeapon == w;\r\n\r\n                                \u003Cdiv class=\u0022upgrade-row\u0022\u003E\r\n                                    \u003Cdiv class=\u0022info\u0022\u003E\r\n                                        \u003Clabel class=\u0022name\u0022\u003E@(CurrentLanguage == \u0022RU\u0022 ? w.NameRu : w.NameEn)\u003C/label\u003E\r\n                                        \u003Clabel class=\u0022level\u0022\u003E\r\n                                            @(isEquipped ? L( \u0022\u042D\u041A\u0418\u041F\u0418\u0420\u041E\u0412\u0410\u041D\u041E\u0022, \u0022EQUIPPED\u0022 ) : (w.IsUnlocked ? L( \u0022\u041A\u0423\u041F\u041B\u0415\u041D\u041E\u0022, \u0022UNLOCKED\u0022 ) : L( \u0022\u0417\u0410\u041A\u0420\u042B\u0422\u041E\u0022, \u0022LOCKED\u0022 )))\r\n                                        \u003C/label\u003E\r\n                                    \u003C/div\u003E\r\n\r\n                                    @if ( isEquipped )\r\n                                    {\r\n                                        \u003Cbutton class=\u0022buy-btn equipped\u0022\u003E\r\n                                            \u003Clabel class=\u0022btn-text\u0022\u003E\u2714 @L( \u0022\u0410\u041A\u0422\u0418\u0412\u041D\u041E\u0022, \u0022ACTIVE\u0022 )\u003C/label\u003E\r\n                                        \u003C/button\u003E\r\n                                    }\r\n                                    else if ( w.IsUnlocked )\r\n                                    {\r\n                                        \u003Cbutton class=\u0022buy-btn equip\u0022 onclick=\u0022@(() =\u003E WeaponManager.Instance.TryBuyOrEquip(w))\u0022\u003E\r\n                                            \u003Clabel class=\u0022btn-text\u0022\u003E\u26A1 @L( \u0022\u0412\u0417\u042F\u0422\u042C\u0022, \u0022EQUIP\u0022 )\u003C/label\u003E\r\n                                        \u003C/button\u003E\r\n                                    }\r\n                                    else\r\n                                    {\r\n                                        \u003Cbutton class=\u0022buy-btn\u0022 onclick=\u0022@(() =\u003E WeaponManager.Instance.TryBuyOrEquip(w))\u0022\u003E\r\n                                            \u003Clabel class=\u0022btn-text\u0022\u003E@L( \u0022\u041A\u0423\u041F\u0418\u0422\u042C\u0022, \u0022BUY\u0022 )\u003C/label\u003E\r\n                                            \u003Clabel class=\u0022btn-cost\u0022\u003E@w.Cost \uD83D\uDCB0\u003C/label\u003E\r\n                                        \u003C/button\u003E\r\n                                    }\r\n                                \u003C/div\u003E\r\n                            }\r\n                        }\r\n                    \u003C/div\u003E\r\n                }\r\n\r\n                @if ( ActiveTab == \u0022PRESTIGE\u0022 )\r\n                {\r\n                    \u003Cdiv class=\u0022prestige-card-container\u0022\u003E\r\n                        \u003Cdiv class=\u0022prestige-info-box\u0022\u003E\r\n                            \u003Clabel class=\u0022prestige-lvl\u0022\u003E\uD83D\uDC51 @L( \u0022\u0423\u0420\u041E\u0412\u0415\u041D\u042C \u041F\u0420\u0415\u0421\u0422\u0418\u0416\u0410:\u0022, \u0022PRESTIGE LEVEL:\u0022 ) @GetPrestigeLevel()\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prestige-bonus\u0022\u003E\u2728 @L( \u0022\u0411\u041E\u041D\u0423\u0421 \u041A \u041A\u0420\u0415\u0414\u0418\u0422\u0410\u041C:\u0022, \u0022CREDIT BONUS:\u0022 ) \u002B@(GetPrestigeLevel() * 50)%\u003C/label\u003E\r\n                            \u003Clabel class=\u0022prestige-tokens\u0022\u003E\uD83D\uDD2E @L( \u0022\u041E\u0427\u041A\u0418 \u041F\u0420\u0415\u0421\u0422\u0418\u0416\u0410:\u0022, \u0022PRESTIGE TOKENS:\u0022 ) @GetPrestigeTokens()\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cdiv class=\u0022prestige-desc\u0022\u003E\r\n                            \u003Clabel class=\u0022desc-text\u0022\u003E\r\n                                @L( \u0022\u0421\u0431\u0440\u043E\u0441\u044C\u0442\u0435 \u0443\u0440\u043E\u0432\u043D\u0438 \u0421\u0438\u043B\u044B, \u041C\u0430\u0441\u0441\u044B \u0438 \u042D\u043D\u0435\u0440\u0433\u0438\u0438, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u041E\u0447\u043A\u043E \u041F\u0440\u0435\u0441\u0442\u0438\u0436\u0430 \u0438 \u043F\u043E\u0441\u0442\u043E\u044F\u043D\u043D\u044B\u0439 \u0431\u043E\u043D\u0443\u0441 \u002B50% \u043A \u0437\u0430\u0440\u0430\u0431\u043E\u0442\u043A\u0443!\u0022, \r\n                                   \u0022Reset Force, Mass, and Energy levels to get a Prestige Token and a permanent \u002B50% credit bonus!\u0022 )\r\n                            \u003C/label\u003E\r\n                            \u003Clabel class=\u0022req-text\u0022\u003E\r\n                                @L( \u0022\u0422\u0420\u0415\u0411\u041E\u0412\u0410\u041D\u0418\u0415: \u0421\u0443\u043C\u043C\u0430 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u043F\u0440\u043E\u043A\u0430\u0447\u043A\u0438 15\u002B\u0022, \u0022REQUIREMENT: Total Upgrade Levels 15\u002B\u0022 )\r\n                            \u003C/label\u003E\r\n                        \u003C/div\u003E\r\n\r\n                        \u003Cbutton class=\u0022prestige-btn @(CanPrestige() ? \u0022ready\u0022 : \u0022disabled\u0022)\u0022 onclick=\u0022@TryPrestige\u0022\u003E\r\n                            \u003Clabel class=\u0022btn-text\u0022\u003E@L( \u0022\u0421\u0411\u0420\u041E\u0421\u0418\u0422\u042C \u0418 \u041F\u041E\u041B\u0423\u0427\u0418\u0422\u042C \u041F\u0420\u0415\u0421\u0422\u0418\u0416\u0022, \u0022PRESTIGE RESET\u0022 )\u003C/label\u003E\r\n                        \u003C/button\u003E\r\n                    \u003C/div\u003E\r\n                }\r\n\r\n                \u003Cbutton class=\u0022menu-btn\u0022 onclick=\u0022@CloseWorkshopMenu\u0022\u003E@L( \u0022\u0417\u0410\u041A\u0420\u042B\u0422\u042C [R]\u0022, \u0022CLOSE [R]\u0022 )\u003C/button\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( IsMenuOpen )\r\n    {\r\n        \u003Cdiv class=\u0022main-menu-screen\u0022\u003E\r\n            \u003Cdiv class=\u0022main-menu-sidebar\u0022\u003E\r\n                \u003Cdiv class=\u0022brand-section\u0022\u003E\r\n                    \u003Cdiv class=\u0022logo-glow\u0022\u003E\u003C/div\u003E\r\n                    \u003Clabel class=\u0022brand-title\u0022\u003EONE MORE PUSH\u003C/label\u003E\r\n                    \u003Clabel class=\u0022brand-subtitle\u0022\u003EPHYSICS ARENA BRAWLER\u003C/label\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022nav-buttons-group\u0022\u003E\r\n                    \u003Cbutton class=\u0022epic-btn play\u0022 onclick=\u0022@StartGame\u0022\u003E\r\n                        \u003Cdiv class=\u0022btn-glow\u0022\u003E\u003C/div\u003E\r\n                        \u003Clabel class=\u0022btn-icon\u0022\u003E\u25B6\u003C/label\u003E\r\n                        \u003Cdiv class=\u0022btn-content\u0022\u003E\r\n                            \u003Clabel class=\u0022btn-title\u0022\u003E@L( \u0022\u0412 \u0411\u041E\u0419\u0022, \u0022PLAY NOW\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022btn-sub\u0022\u003E@L( \u0022\u0412\u044B\u0439\u0442\u0438 \u043D\u0430 \u0430\u0440\u0435\u043D\u0443\u0022, \u0022Enter the Arena\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/button\u003E\r\n\r\n                    \u003Cbutton class=\u0022epic-btn\u0022 onclick=\u0022@OpenSettings\u0022\u003E\r\n                        \u003Clabel class=\u0022btn-icon\u0022\u003E\u2699\u003C/label\u003E\r\n                        \u003Cdiv class=\u0022btn-content\u0022\u003E\r\n                            \u003Clabel class=\u0022btn-title\u0022\u003E@L( \u0022\u041D\u0410\u0421\u0422\u0420\u041E\u0419\u041A\u0418\u0022, \u0022SETTINGS\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022btn-sub\u0022\u003E@L( \u0022\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0438 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435\u0022, \u0022Game options\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/button\u003E\r\n\r\n                    \u003Cbutton class=\u0022epic-btn quit\u0022 onclick=\u0022@QuitGame\u0022\u003E\r\n                        \u003Clabel class=\u0022btn-icon\u0022\u003E\u2716\u003C/label\u003E\r\n                        \u003Cdiv class=\u0022btn-content\u0022\u003E\r\n                            \u003Clabel class=\u0022btn-title\u0022\u003E@L( \u0022\u0412 \u041C\u0415\u041D\u042E\u0022, \u0022MAIN MENU\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022btn-sub\u0022\u003E@L( \u0022\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u0432 \u0433\u043B\u0430\u0432\u043D\u043E\u0435 \u043C\u0435\u043D\u044E\u0022, \u0022Return to Main Menu\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/button\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022player-profile-card\u0022\u003E\r\n                    \u003Cdiv class=\u0022profile-icon\u0022\u003E\uD83C\uDFAE\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022profile-info\u0022\u003E\r\n                        \u003Clabel class=\u0022profile-name\u0022\u003E@(Connection.Local?.DisplayName ?? L( \u0022\u0411\u043E\u0435\u0446\u0022, \u0022Fighter\u0022 ))\u003C/label\u003E\r\n                        \u003Clabel class=\u0022profile-stats\u0022\u003E\uD83D\uDCB0 @GetCredits() | \uD83C\uDFC6 @GetHighScore()\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n\r\n            \u003Cdiv class=\u0022main-menu-leaderboard-panel\u0022\u003E\r\n                \u003Cdiv class=\u0022lb-header\u0022\u003E\r\n                    \u003Clabel class=\u0022lb-title\u0022\u003E\uD83C\uDFC6 @L( \u0022\u0422\u0410\u0411\u041B\u0418\u0426\u0410 \u041B\u0418\u0414\u0415\u0420\u041E\u0412\u0022, \u0022GLOBAL LEADERBOARD\u0022 )\u003C/label\u003E\r\n                    \u003Cbutton class=\u0022lb-refresh-btn\u0022 onclick=\u0022@RefreshLeaderboard\u0022\u003E\uD83D\uDD04\u003C/button\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022lb-tabs\u0022\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(CurrentLbStat == \u0022pushes_count\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectLbStat(\u0022pushes_count\u0022))\u0022\u003E\r\n                        \uD83D\uDE80 @L( \u0022\u0422\u041E\u041B\u0427\u041A\u0418\u0022, \u0022PUSHES\u0022 )\r\n                    \u003C/button\u003E\r\n                    \u003Cbutton class=\u0022tab-btn @(CurrentLbStat == \u0022rounds_won\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectLbStat(\u0022rounds_won\u0022))\u0022\u003E\r\n                        \uD83D\uDC51 @L( \u0022\u041F\u041E\u0411\u0415\u0414\u042B\u0022, \u0022WINS\u0022 )\r\n                    \u003C/button\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022lb-body\u0022\u003E\r\n                    @if ( IsLbLoading )\r\n                    {\r\n                        \u003Cdiv class=\u0022lb-status\u0022\u003E@L( \u0022\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430...\u0022, \u0022LOADING...\u0022 )\u003C/div\u003E\r\n                    }\r\n                    else if ( LbEntries == null || LbEntries.Count == 0 )\r\n                    {\r\n                        \u003Cdiv class=\u0022lb-status\u0022\u003E@L( \u0022\u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445\u0022, \u0022NO RECORD FOUND\u0022 )\u003C/div\u003E\r\n                    }\r\n                    else\r\n                    {\r\n                        \u003Cdiv class=\u0022lb-table\u0022\u003E\r\n                            \u003Cdiv class=\u0022lb-table-header\u0022\u003E\r\n                                \u003Cspan class=\u0022col-rank\u0022\u003E#\u003C/span\u003E\r\n                                \u003Cspan class=\u0022col-player\u0022\u003E@L( \u0022\u0418\u0413\u0420\u041E\u041A\u0022, \u0022PLAYER\u0022 )\u003C/span\u003E\r\n                                \u003Cspan class=\u0022col-score\u0022\u003E@L( \u0022\u0421\u0427\u0415\u0422\u0022, \u0022SCORE\u0022 )\u003C/span\u003E\r\n                            \u003C/div\u003E\r\n                            \u003Cdiv class=\u0022lb-table-rows\u0022\u003E\r\n                                @foreach ( var entry in LbEntries )\r\n                                {\r\n                                    \u003Cdiv class=\u0022lb-row @(entry.SteamId == (Connection.Local?.SteamId ?? 0) ? \u0022is-me\u0022 : \u0022\u0022)\u0022\u003E\r\n                                        \u003Cspan class=\u0022col-rank\u0022\u003E@GetRankBadge( entry.Rank )\u003C/span\u003E\r\n                                        \u003Cspan class=\u0022col-player\u0022\u003E@entry.DisplayName\u003C/span\u003E\r\n                                        \u003Cspan class=\u0022col-score\u0022\u003E@entry.Value.ToString(\u0022N0\u0022)\u003C/span\u003E\r\n                                    \u003C/div\u003E\r\n                                }\r\n                            \u003C/div\u003E\r\n                        \u003C/div\u003E\r\n                    }\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n\r\n            \u003Cdiv class=\u0022main-menu-footer-badge\u0022\u003E\r\n                \u003Clabel class=\u0022footer-ver\u0022\u003Ev1.0.0 RELEASE\u003C/label\u003E\r\n                \u003Clabel class=\u0022footer-engine\u0022\u003EPOWERED BY SOURCE 2 \u0026 s\u0026box\u003C/label\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( IsSettingsOpen )\r\n    {\r\n        \u003Cdiv class=\u0022main-menu-screen\u0022\u003E\r\n            \u003Cdiv class=\u0022main-menu-sidebar settings-wide\u0022\u003E\r\n                \u003Cdiv class=\u0022brand-section\u0022\u003E\r\n                    \u003Clabel class=\u0022brand-title\u0022\u003E@L( \u0022\u041D\u0410\u0421\u0422\u0420\u041E\u0419\u041A\u0418\u0022, \u0022SETTINGS\u0022 )\u003C/label\u003E\r\n                    \u003Clabel class=\u0022brand-subtitle\u0022\u003ECONFIGURATION PANEL\u003C/label\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022settings-list-container\u0022\u003E\r\n                    \u003Cdiv class=\u0022setting-row-card\u0022\u003E\r\n                        \u003Cdiv class=\u0022setting-info\u0022\u003E\r\n                            \u003Clabel class=\u0022title\u0022\u003E\uD83C\uDF10 @L( \u0022\u042F\u0437\u044B\u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0022, \u0022Language\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022desc\u0022\u003E@L( \u0022\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u044F\u0437\u044B\u043A \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u0022, \u0022Select UI Language\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cdiv class=\u0022lang-selector\u0022\u003E\r\n                            \u003Cbutton class=\u0022lang-btn @(CurrentLanguage == \u0022EN\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SetLanguage(\u0022EN\u0022))\u0022\u003EEN\u003C/button\u003E\r\n                            \u003Cbutton class=\u0022lang-btn @(CurrentLanguage == \u0022RU\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SetLanguage(\u0022RU\u0022))\u0022\u003ERU\u003C/button\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022setting-row-card\u0022\u003E\r\n                        \u003Cdiv class=\u0022setting-info\u0022\u003E\r\n                            \u003Clabel class=\u0022title\u0022\u003E\uD83E\uDD16 @L( \u0022\u0421\u043F\u0430\u0432\u043D \u0411\u043E\u0442\u043E\u0432\u0022, \u0022Bot Spawner\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022desc\u0022\u003E@L( \u0022\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0442\u044C \u0431\u043E\u0442\u043E\u0432 \u043D\u0430 \u043A\u0430\u0440\u0442\u0443\u0022, \u0022Spawn AI bots in game\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cbutton class=\u0022lang-btn @(BotSpawner.EnableBots ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@ToggleBots\u0022\u003E\r\n                            @(BotSpawner.EnableBots ? L( \u0022\u0412\u041A\u041B\u0022, \u0022ON\u0022 ) : L( \u0022\u0412\u042B\u041A\u041B\u0022, \u0022OFF\u0022 ))\r\n                        \u003C/button\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022setting-row-card\u0022\u003E\r\n                        \u003Cdiv class=\u0022setting-info\u0022\u003E\r\n                            \u003Clabel class=\u0022title\u0022\u003E\uD83C\uDFB5 @L( \u0022\u0424\u043E\u043D\u043E\u0432\u0430\u044F \u041C\u0443\u0437\u044B\u043A\u0430\u0022, \u0022Music\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022desc\u0022\u003E@L( \u0022\u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0441\u0430\u0443\u043D\u0434\u0442\u0440\u0435\u043A\u0022, \u0022Toggle battle music\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Cbutton class=\u0022lang-btn @(EnableMusic ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@ToggleMusic\u0022\u003E\r\n                            @(EnableMusic ? L( \u0022\u0412\u041A\u041B\u0022, \u0022ON\u0022 ) : L( \u0022\u0412\u042B\u041A\u041B\u0022, \u0022OFF\u0022 ))\r\n                        \u003C/button\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022setting-row-card\u0022\u003E\r\n                        \u003Cdiv class=\u0022setting-info\u0022\u003E\r\n                            \u003Clabel class=\u0022title\u0022\u003E\uD83C\uDFAF @L( \u0022\u0427\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u0022, \u0022Sensitivity\u0022 )\u003C/label\u003E\r\n                            \u003Clabel class=\u0022desc\u0022\u003E@L( \u0022\u0421\u043A\u043E\u0440\u043E\u0441\u0442\u044C \u043F\u043E\u0432\u043E\u0440\u043E\u0442\u0430 \u043A\u0430\u043C\u0435\u0440\u044B\u0022, \u0022Mouse sensitivity factor\u0022 )\u003C/label\u003E\r\n                        \u003C/div\u003E\r\n                        \u003Clabel class=\u0022sens-badge\u0022\u003E1.0\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cbutton class=\u0022epic-btn back\u0022 onclick=\u0022@CloseSettings\u0022\u003E\r\n                    \u003Clabel class=\u0022btn-icon\u0022\u003E\u2B05\u003C/label\u003E\r\n                    \u003Cdiv class=\u0022btn-content\u0022\u003E\r\n                        \u003Clabel class=\u0022btn-title\u0022\u003E@L( \u0022\u041D\u0410\u0417\u0410\u0414\u0022, \u0022BACK\u0022 )\u003C/label\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/button\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n\u003C/root\u003E\r\n\r\n@code {\r\n    public class EntryItem\r\n    {\r\n        public int Rank { get; set; }\r\n        public string DisplayName { get; set; }\r\n        public double Value { get; set; }\r\n        public ulong SteamId { get; set; }\r\n    }\r\n\r\n    [Property] public PushAbility PushAbility { get; set; }\r\n    public PlayerHealth LocalHealth { get; private set; }\r\n\r\n    public bool IsMenuOpen { get; set; } = true;\r\n    public bool IsSettingsOpen { get; set; } = false;\r\n    public bool IsWorkshopMenuOpen { get; set; } = false;\r\n    public bool IsQSpawnMenuOpen { get; set; } = false;\r\n\r\n    public string ActiveTab { get; set; } = \u0022PROPS\u0022;\r\n    public static string CurrentLanguage { get; set; } = \u0022EN\u0022;\r\n\r\n    public bool IsLbLoading { get; set; } = true;\r\n    public string CurrentLbStat { get; set; } = \u0022pushes_count\u0022;\r\n    public List\u003CEntryItem\u003E LbEntries { get; set; } = new();\r\n\r\n    public struct ChatMessage\r\n    {\r\n        public string Author { get; set; }\r\n        public string Text { get; set; }\r\n    }\r\n\r\n    public List\u003CChatMessage\u003E CanvasMessages { get; set; } = new();\r\n    public bool IsChatOpen { get; set; } = false;\r\n    private TextEntry ChatInput { get; set; }\r\n\r\n    public struct PlayerInfo\r\n    {\r\n        public string Name { get; set; }\r\n        public int Score { get; set; }\r\n        public bool IsLocal { get; set; }\r\n    }\r\n\r\n    private string L( string ru, string en ) =\u003E CurrentLanguage == \u0022RU\u0022 ? ru : en;\r\n    private bool IsReady =\u003E PushAbility?.IsReady ?? false;\r\n\r\n    private MetaProgression GetMeta() =\u003E Scene.GetAllComponents\u003CMetaProgression\u003E().FirstOrDefault();\r\n    private int GetCredits() =\u003E GetMeta()?.Credits ?? 0;\r\n    private int GetForceLevel() =\u003E GetMeta()?.ForceLevel ?? 0;\r\n    private int GetMassLevel() =\u003E GetMeta()?.MassLevel ?? 0;\r\n    private int GetEnergyLevel() =\u003E GetMeta()?.EnergyLevel ?? 0;\r\n\r\n    private int GetPrestigeLevel() =\u003E GetMeta()?.PrestigeLevel ?? 0;\r\n    private int GetPrestigeTokens() =\u003E GetMeta()?.PrestigeTokens ?? 0;\r\n    private bool CanPrestige() =\u003E GetMeta()?.CanPrestige() ?? false;\r\n    private void TryPrestige() =\u003E GetMeta()?.TryPrestige();\r\n\r\n    private int GetForceCost() =\u003E GetMeta()?.GetUpgradeCost(GetForceLevel()) ?? 0;\r\n    private int GetMassCost() =\u003E GetMeta()?.GetUpgradeCost(GetMassLevel()) ?? 0;\r\n    private int GetEnergyCost() =\u003E GetMeta()?.GetUpgradeCost(GetEnergyLevel()) ?? 0;\r\n\r\n    private void TryUpgradeForce() =\u003E GetMeta()?.TryUpgradeForce();\r\n    private void TryUpgradeMass() =\u003E GetMeta()?.TryUpgradeMass();\r\n    private void TryUpgradeEnergy() =\u003E GetMeta()?.TryUpgradeEnergy();\r\n\r\n    private float GetHealth() =\u003E LocalHealth?.CurrentHealth ?? 100f;\r\n    private float GetMaxHealth() =\u003E LocalHealth?.MaxHealth ?? 100f;\r\n    private float GetHealthPercent() =\u003E MathX.Clamp( (GetHealth() / GetMaxHealth()) * 100f, 0f, 100f );\r\n\r\n    private void SelectTab( string tab )\r\n    {\r\n        ActiveTab = tab;\r\n        StateHasChanged();\r\n    }\r\n\r\n    protected override void OnEnabled()\r\n    {\r\n        base.OnEnabled();\r\n        AddMessage( L( \u0022\u0421\u0438\u0441\u0442\u0435\u043C\u0430\u0022, \u0022System\u0022 ), L( \u0022\u0427\u0430\u0442 \u0433\u043E\u0442\u043E\u0432. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 Enter \u0434\u043B\u044F \u0432\u0432\u043E\u0434\u0430.\u0022, \u0022Chat ready. Press Enter to type.\u0022 ) );\r\n        ApplyMouseState();\r\n        _ = RefreshLeaderboard();\r\n    }\r\n\r\n    private async Task SelectLbStat( string statIdent )\r\n    {\r\n        if ( CurrentLbStat == statIdent ) return;\r\n        CurrentLbStat = statIdent;\r\n        await RefreshLeaderboard();\r\n    }\r\n\r\n    private async Task RefreshLeaderboard()\r\n    {\r\n        IsLbLoading = true;\r\n        StateHasChanged();\r\n\r\n        try\r\n        {\r\n            var board = Sandbox.Services.Leaderboards.GetFromStat( \u0022seilordstudio.one_more_push\u0022, CurrentLbStat );\r\n            board.SetAggregationSum();\r\n            board.MaxEntries = 10;\r\n            await board.Refresh();\r\n\r\n            if ( board.Entries != null )\r\n            {\r\n                LbEntries = board.Entries.Select( x =\u003E new EntryItem\r\n                {\r\n                    Rank = Convert.ToInt32( x.Rank ),\r\n                    DisplayName = x.DisplayName ?? \u0022Player\u0022,\r\n                    Value = Convert.ToDouble( x.Value ),\r\n                    SteamId = Convert.ToUInt64( x.SteamId )\r\n                } ).ToList();\r\n            }\r\n            else\r\n            {\r\n                LbEntries = new();\r\n            }\r\n        }\r\n        catch ( System.Exception ex )\r\n        {\r\n            Log.Warning( $\u0022Leaderboard fetch error: {ex.Message}\u0022 );\r\n        }\r\n\r\n        IsLbLoading = false;\r\n        StateHasChanged();\r\n    }\r\n\r\n    private string GetRankBadge( int rank )\r\n    {\r\n        return rank switch\r\n        {\r\n            1 =\u003E \u0022\uD83E\uDD47 1\u0022,\r\n            2 =\u003E \u0022\uD83E\uDD48 2\u0022,\r\n            3 =\u003E \u0022\uD83E\uDD49 3\u0022,\r\n            _ =\u003E rank.ToString()\r\n        };\r\n    }\r\n\r\n    private bool IsEPressed()\r\n    {\r\n        return Input.Down( \u0022use\u0022 ) || Input.Down( \u0022e\u0022 ) || Input.Down( \u0022E\u0022 );\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        base.OnUpdate();\r\n\r\n        if ( PushAbility == null )\r\n        {\r\n            PushAbility = Scene.GetAllComponents\u003CPushAbility\u003E().FirstOrDefault( x =\u003E !x.IsProxy );\r\n        }\r\n\r\n        if ( LocalHealth == null )\r\n        {\r\n            LocalHealth = Scene.GetAllComponents\u003CPlayerHealth\u003E().FirstOrDefault( x =\u003E !x.IsProxy );\r\n        }\r\n\r\n        bool eDown = IsEPressed();\r\n        if ( eDown )\r\n        {\r\n            if ( !IsQSpawnMenuOpen \u0026\u0026 !IsChatOpen \u0026\u0026 !IsSettingsOpen \u0026\u0026 !IsMenuOpen )\r\n            {\r\n                IsWorkshopMenuOpen = false;\r\n                IsQSpawnMenuOpen = true;\r\n                ApplyMouseState();\r\n                StateHasChanged();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if ( IsQSpawnMenuOpen )\r\n            {\r\n                CloseQSpawnMenu();\r\n            }\r\n        }\r\n\r\n        if ( Input.EscapePressed || Input.Pressed( \u0022menu\u0022 ) )\r\n        {\r\n            Input.EscapePressed = false;\r\n            ToggleMenu();\r\n        }\r\n\r\n        if ( Input.Pressed( \u0022reload\u0022 ) || Input.Pressed( \u0022r\u0022 ) || Input.Pressed( \u0022R\u0022 ) )\r\n        {\r\n            if ( !IsMenuOpen \u0026\u0026 !IsSettingsOpen \u0026\u0026 !IsChatOpen \u0026\u0026 !IsQSpawnMenuOpen )\r\n            {\r\n                ToggleWorkshopMenu();\r\n            }\r\n        }\r\n\r\n        if ( Input.Pressed( \u0022chat\u0022 ) || Input.Pressed( \u0022enter\u0022 ) )\r\n        {\r\n            if ( !IsMenuOpen \u0026\u0026 !IsSettingsOpen \u0026\u0026 !IsWorkshopMenuOpen \u0026\u0026 !IsQSpawnMenuOpen )\r\n            {\r\n                if ( !IsChatOpen ) OpenChat();\r\n            }\r\n        }\r\n\r\n        ApplyMouseState();\r\n    }\r\n\r\n    private void SetLanguage( string lang )\r\n    {\r\n        CurrentLanguage = lang;\r\n        StateHasChanged();\r\n    }\r\n\r\n    private void ApplyMouseState()\r\n    {\r\n        bool needsMouse = IsMenuOpen || IsSettingsOpen || IsChatOpen || IsWorkshopMenuOpen || IsQSpawnMenuOpen;\r\n        Mouse.Visibility = needsMouse ? MouseVisibility.Visible : MouseVisibility.Hidden;\r\n\r\n        if ( !needsMouse \u0026\u0026 Panel != null )\r\n        {\r\n            Panel.Focus();\r\n        }\r\n    }\r\n\r\n    private void ToggleWorkshopMenu()\r\n    {\r\n        IsWorkshopMenuOpen = !IsWorkshopMenuOpen;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n        StateHasChanged();\r\n    }\r\n\r\n    private void CloseWorkshopMenu()\r\n    {\r\n        IsWorkshopMenuOpen = false;\r\n        ApplyMouseState();\r\n        StateHasChanged();\r\n    }\r\n\r\n    private void CloseQSpawnMenu()\r\n    {\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n        StateHasChanged();\r\n    }\r\n\r\n    private void SelectAndSpawnProp( int index )\r\n    {\r\n        if ( PropSpawner.Instance != null )\r\n        {\r\n            PropSpawner.Instance.SpawnByIndex( index );\r\n        }\r\n        if ( IsWorkshopMenuOpen ) CloseWorkshopMenu();\r\n    }\r\n\r\n    private void ToggleMenu()\r\n    {\r\n        if ( IsSettingsOpen ) CloseSettings();\r\n        else if ( IsWorkshopMenuOpen ) CloseWorkshopMenu();\r\n        else if ( IsQSpawnMenuOpen ) CloseQSpawnMenu();\r\n        else if ( IsMenuOpen ) StartGame();\r\n        else OpenMenu();\r\n    }\r\n\r\n    private void StartGame()\r\n    {\r\n        IsMenuOpen = false;\r\n        IsSettingsOpen = false;\r\n        IsWorkshopMenuOpen = false;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n    }\r\n\r\n    private void OpenMenu()\r\n    {\r\n        IsMenuOpen = true;\r\n        IsSettingsOpen = false;\r\n        IsWorkshopMenuOpen = false;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n        _ = RefreshLeaderboard();\r\n    }\r\n\r\n    private void OpenSettings()\r\n    {\r\n        IsMenuOpen = false;\r\n        IsSettingsOpen = true;\r\n        IsWorkshopMenuOpen = false;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n    }\r\n\r\n    private void CloseSettings()\r\n    {\r\n        IsSettingsOpen = false;\r\n        IsMenuOpen = true;\r\n        IsWorkshopMenuOpen = false;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n    }\r\n\r\n    private void QuitGame()\r\n    {\r\n        Game.ActiveScene.LoadFromFile( \u0022scenes/mainmenu.scene\u0022 );\r\n    }\r\n\r\n    private int GetScore() =\u003E ScoreManager.Instance?.Score ?? 0;\r\n\r\n    private string GetFormattedTime()\r\n    {\r\n        var shrinker = Scene.GetAllComponents\u003CArenaShrinker\u003E().FirstOrDefault();\r\n        if ( !shrinker.IsValid() ) return \u002202:00\u0022;\r\n\r\n        int minutes = (int)Math.Max( 0, shrinker.TimeRemaining ) / 60;\r\n        int seconds = (int)Math.Max( 0, shrinker.TimeRemaining ) % 60;\r\n        return $\u0022{minutes:00}:{seconds:00}\u0022;\r\n    }\r\n\r\n    private float GetPercent()\r\n    {\r\n        if ( PushAbility == null ) return 0f;\r\n        return MathX.Clamp( PushAbility.CooldownProgress * 100f, 0f, 100f );\r\n    }\r\n\r\n    private void ToggleBots()\r\n    {\r\n        BotSpawner.EnableBots = !BotSpawner.EnableBots;\r\n        StateHasChanged();\r\n    }\r\n\r\n    private int GetHighScore() =\u003E SaveManager.Current?.HighScore ?? 0;\r\n\r\n    private void OpenChat()\r\n    {\r\n        IsChatOpen = true;\r\n        IsWorkshopMenuOpen = false;\r\n        IsQSpawnMenuOpen = false;\r\n        ApplyMouseState();\r\n        StateHasChanged();\r\n        ChatInput?.Focus();\r\n    }\r\n\r\n    private void SendChatMessage()\r\n    {\r\n        if ( ChatInput == null || string.IsNullOrWhiteSpace( ChatInput.Text ) )\r\n        {\r\n            IsChatOpen = false;\r\n            ApplyMouseState();\r\n            return;\r\n        }\r\n\r\n        string name = Connection.Local?.DisplayName ?? L( \u0022\u0412\u044B\u0022, \u0022You\u0022 );\r\n        AddMessage( name, ChatInput.Text );\r\n\r\n        ChatInput.Text = \u0022\u0022;\r\n        IsChatOpen = false;\r\n        ApplyMouseState();\r\n    }\r\n\r\n    public void AddMessage( string author, string text )\r\n    {\r\n        CanvasMessages.Add( new ChatMessage { Author = author, Text = text } );\r\n        if ( CanvasMessages.Count \u003E 6 )\r\n        {\r\n            CanvasMessages.RemoveAt( 0 );\r\n        }\r\n        StateHasChanged();\r\n    }\r\n\r\n    private IEnumerable\u003CPlayerInfo\u003E GetPlayerList()\r\n    {\r\n        if ( Connection.All != null \u0026\u0026 Connection.All.Any() )\r\n        {\r\n            foreach ( var conn in Connection.All )\r\n            {\r\n                bool isLocal = conn == Connection.Local;\r\n                int score = isLocal ? GetScore() : 0;\r\n\r\n                yield return new PlayerInfo\r\n                {\r\n                    Name = string.IsNullOrEmpty( conn.DisplayName ) ? \u0022Player\u0022 : conn.DisplayName,\r\n                    Score = score,\r\n                    IsLocal = isLocal\r\n                };\r\n            }\r\n        }\r\n        else\r\n        {\r\n            yield return new PlayerInfo\r\n            {\r\n                Name = L( \u0022\u0412\u044B\u0022, \u0022You\u0022 ),\r\n                Score = GetScore(),\r\n                IsLocal = true\r\n            };\r\n        }\r\n    }\r\n\r\n    private string GetWeatherTitle( WeatherType type ) =\u003E type switch\r\n    {\r\n        WeatherType.LowGravity =\u003E L( \u0022\u041D\u0415\u0412\u0415\u0421\u041E\u041C\u041E\u0421\u0422\u042C\u0022, \u0022LOW GRAVITY\u0022 ),\r\n        WeatherType.SlipperyIce =\u003E L( \u0022\u0413\u041E\u041B\u041E\u041B\u0401\u0414\u0022, \u0022SLIPPERY ICE\u0022 ),\r\n        WeatherType.StrongWind =\u003E L( \u0022\u0428\u0422\u041E\u0420\u041C\u041E\u0412\u041E\u0419 \u0412\u0415\u0422\u0415\u0420\u0022, \u0022STRONG WIND\u0022 ),\r\n        _ =\u003E \u0022\u0022\r\n    };\r\n\r\n    private string GetWeatherIcon( WeatherType type ) =\u003E type switch\r\n    {\r\n        WeatherType.LowGravity =\u003E \u0022\uD83D\uDE80\u0022,\r\n        WeatherType.SlipperyIce =\u003E \u0022\u2744\uFE0F\u0022,\r\n        WeatherType.StrongWind =\u003E \u0022\uD83C\uDF2A\uFE0F\u0022,\r\n        _ =\u003E \u0022\u26A0\uFE0F\u0022\r\n    };\r\n\r\n    private string GetWeatherClass( WeatherType type ) =\u003E type switch\r\n    {\r\n        WeatherType.LowGravity =\u003E \u0022gravity\u0022,\r\n        WeatherType.SlipperyIce =\u003E \u0022ice\u0022,\r\n        WeatherType.StrongWind =\u003E \u0022wind\u0022,\r\n        _ =\u003E \u0022\u0022\r\n    };\r\n\r\n    private int GetDeaths() =\u003E ScoreManager.Instance?.Deaths ?? 0;\r\n    public static bool EnableMusic { get; set; } = true;\r\n\r\n    private void ToggleMusic()\r\n    {\r\n        EnableMusic = !EnableMusic;\r\n        MusicManager.Instance?.ToggleMusic( EnableMusic );\r\n        StateHasChanged();\r\n    }\r\n\r\n    protected override int BuildHash()\r\n    {\r\n        var hash = new HashCode();\r\n        hash.Add( GetPercent() );\r\n        hash.Add( GetHealthPercent() );\r\n        hash.Add( LocalHealth?.IsDead );\r\n        hash.Add( (int)(LocalHealth?.RespawnTimer * 10f ?? 0) );\r\n        hash.Add( IsReady );\r\n        hash.Add( MapEventManager.Instance?.CurrentEvent );\r\n        hash.Add( (int)(MapEventManager.Instance?.TimeRemaining * 10f ?? 0) );\r\n        hash.Add( EnableMusic );\r\n        hash.Add( PushAbility?.ChargeProgress );\r\n        hash.Add( PushAbility?.IsCharging );\r\n        hash.Add( GetScore() );\r\n        hash.Add( GetDeaths() ); \r\n        hash.Add( GetFormattedTime() );\r\n        hash.Add( RoundManager.Instance?.CurrentRound );\r\n        hash.Add( IsMenuOpen );\r\n        hash.Add( IsWorkshopMenuOpen );\r\n        hash.Add( IsQSpawnMenuOpen );\r\n        hash.Add( ActiveTab );\r\n        hash.Add( GetCredits() );\r\n        hash.Add( GetForceLevel() );\r\n        hash.Add( GetMassLevel() );\r\n        hash.Add( GetEnergyLevel() );\r\n        hash.Add( GetPrestigeLevel() );\r\n        hash.Add( GetPrestigeTokens() );\r\n        hash.Add( CanPrestige() );\r\n        hash.Add( WeaponManager.Instance?.CurrentWeapon?.Id );\r\n        hash.Add( ShopManager.Instance?.SelectedItem?.Id );\r\n        hash.Add( IsSettingsOpen );\r\n        hash.Add( CurrentLanguage );\r\n        hash.Add( IsChatOpen );\r\n        hash.Add( CanvasMessages.Count );\r\n        hash.Add( Connection.All?.Count() ?? 0 );\r\n        hash.Add( Killfeed.Instance?.Entries.Count );\r\n        hash.Add( CurrentLbStat );\r\n        hash.Add( IsLbLoading );\r\n        hash.Add( LbEntries.Count );\r\n        return hash.ToHashCode();\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\nglobal using Microsoft.AspNetCore.Components;\r\nglobal using Microsoft.AspNetCore.Components.Rendering;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022One More Push\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022one_more_push\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022cherkbyte\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022cherkbyte.one_more_push\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002229\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v9.0\u0022, FrameworkDisplayName = \u0022.NET 9.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00222026-10-06T04:15:32.2273688Z\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.110.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.110.0\u0022)]"},{"Ident":"cherkbyte.one_more_push","Path":"ArenaRoundManeger1.cs","FileName":"ArenaRoundManeger1.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System.Linq;\r\n\r\npublic enum ArenaRoundState\r\n{\r\n    WaitingForPlayers,\r\n    Countdown,\r\n    InGame,\r\n    RoundEnd\r\n}\r\n\r\npublic sealed class ArenaRoundManager : Component\r\n{\r\n    [Property] public float CountdownDuration { get; set; } = 5.0f;\r\n    [Property] public float RoundDuration { get; set; } = 60.0f;\r\n    [Property] public float EndPauseDuration { get; set; } = 4.0f;\r\n\r\n    public ArenaRoundState CurrentState { get; private set; } = ArenaRoundState.WaitingForPlayers;\r\n    public TimeUntil StateTimer { get; private set; }\r\n\r\n    protected override void OnStart()\r\n    {\r\n        SetState( ArenaRoundState.WaitingForPlayers );\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        switch ( CurrentState )\r\n        {\r\n            case ArenaRoundState.WaitingForPlayers:\r\n                if ( Connection.All.Count \u003E= 1 )\r\n                {\r\n                    SetState( ArenaRoundState.Countdown );\r\n                }\r\n                break;\r\n\r\n            case ArenaRoundState.Countdown:\r\n                if ( StateTimer )\r\n                {\r\n                    SetState( ArenaRoundState.InGame );\r\n                }\r\n                break;\r\n\r\n            case ArenaRoundState.InGame:\r\n                if ( StateTimer )\r\n                {\r\n                    SetState( ArenaRoundState.RoundEnd );\r\n                }\r\n                break;\r\n\r\n            case ArenaRoundState.RoundEnd:\r\n                if ( StateTimer )\r\n                {\r\n                    SetState( ArenaRoundState.WaitingForPlayers );\r\n                }\r\n                break;\r\n        }\r\n    }\r\n\r\n    private void SetState( ArenaRoundState newState )\r\n    {\r\n        CurrentState = newState;\r\n\r\n        switch ( newState )\r\n        {\r\n            case ArenaRoundState.WaitingForPlayers:\r\n                Log.Info( \u0022[ArenaRoundManager] \u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u0438\u0433\u0440\u043E\u043A\u043E\u0432...\u0022 );\r\n                break;\r\n\r\n            case ArenaRoundState.Countdown:\r\n                StateTimer = CountdownDuration;\r\n                Log.Info( $\u0022[ArenaRoundManager] \u041E\u0442\u0441\u0447\u0451\u0442! \u0414\u043E \u0441\u0442\u0430\u0440\u0442\u0430: {CountdownDuration} \u0441\u0435\u043A.\u0022 );\r\n                break;\r\n\r\n            case ArenaRoundState.InGame:\r\n                StateTimer = RoundDuration;\r\n                Log.Info( \u0022[ArenaRoundManager] \u0420\u0410\u0423\u041D\u0414 \u041D\u0410\u0427\u0410\u041B\u0421\u042F!\u0022 );\r\n                break;\r\n\r\n            case ArenaRoundState.RoundEnd:\r\n                StateTimer = EndPauseDuration;\r\n                Log.Info( \u0022[ArenaRoundManager] \u0420\u0430\u0443\u043D\u0434 \u043E\u043A\u043E\u043D\u0447\u0435\u043D!\u0022 );\r\n                break;\r\n        }\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"ExplosiveBarrel.cs","FileName":"ExplosiveBarrel.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\nusing System.Linq;\r\n\r\npublic sealed class ExplosiveBarrel : Component, Component.ICollisionListener\r\n{\r\n    [Property] public float ExplosionRadius { get; set; } = 450f;\r\n    [Property] public float ExplosionForce { get; set; } = 65000f;\r\n    [Property] public float ImpactThreshold { get; set; } = 250f;\r\n    [Property] public GameObject ExplosionParticle { get; set; }\r\n    [Property] public SoundEvent ExplosionSound { get; set; }\r\n\r\n    private bool _hasExploded = false;\r\n\r\n    public void Explode()\r\n    {\r\n        if ( _hasExploded || !GameObject.IsValid() ) return;\r\n        _hasExploded = true;\r\n\r\n        if ( ExplosionParticle.IsValid() )\r\n        {\r\n            ExplosionParticle.Clone( WorldPosition );\r\n        }\r\n\r\n        if ( ExplosionSound != null )\r\n        {\r\n            Sound.Play( ExplosionSound, WorldPosition );\r\n        }\r\n\r\n        var hits = Scene.Trace.Sphere( ExplosionRadius, WorldPosition, WorldPosition \u002B Vector3.Up * 2f )\r\n            .IgnoreGameObject( GameObject )\r\n            .RunAll();\r\n\r\n        foreach ( var hit in hits )\r\n        {\r\n            if ( !hit.GameObject.IsValid() ) continue;\r\n\r\n            var targetObj = hit.GameObject.Root;\r\n\r\n            var shield = targetObj.Components.Get\u003CShieldAbility\u003E( true );\r\n            if ( shield.IsValid() \u0026\u0026 shield.IsShieldActive ) continue;\r\n\r\n            var chainBarrel = targetObj.Components.Get\u003CExplosiveBarrel\u003E();\r\n            if ( chainBarrel.IsValid() \u0026\u0026 chainBarrel != this )\r\n            {\r\n                chainBarrel.Explode();\r\n                continue;\r\n            }\r\n\r\n            var rb = targetObj.Components.Get\u003CRigidbody\u003E();\r\n            if ( rb.IsValid() )\r\n            {\r\n                var dir = (hit.GameObject.WorldPosition - WorldPosition).Normal;\r\n                dir.z = MathF.Max( dir.z, 0.4f );\r\n                rb.ApplyImpulse( dir * ExplosionForce );\r\n            }\r\n        }\r\n\r\n        Log.Info( $\u0022[ExplosiveBarrel] Booom! Barrel exploded at {WorldPosition}\u0022 );\r\n        GameObject.Destroy();\r\n    }\r\n\r\n    public void OnCollisionStart( Collision collision )\r\n    {\r\n        if ( collision.Contact.Speed.Length \u003E ImpactThreshold )\r\n        {\r\n            Explode();\r\n        }\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"HeavyAnvil.cs","FileName":"HeavyAnvil.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class HeavyAnvil : Component, Component.ICollisionListener\r\n{\r\n    [Property] public float PushResistanceMultiplier { get; set; } = 0.25f;\r\n    [Property] public float CrushSpeedThreshold { get; set; } = 300f;\r\n    [Property] public float CrushImpactForce { get; set; } = 75000f;\r\n    [Property] public SoundEvent ImpactSound { get; set; }\r\n\r\n    public void OnCollisionStart( Collision collision )\r\n    {\r\n        if ( collision.Contact.Speed.Length \u003C CrushSpeedThreshold ) return;\r\n\r\n        var targetObj = collision.Other.GameObject?.Root;\r\n        if ( !targetObj.IsValid() || targetObj == GameObject.Root ) return;\r\n\r\n        if ( ImpactSound != null )\r\n        {\r\n            Sound.Play( ImpactSound, WorldPosition );\r\n        }\r\n\r\n        var cc = targetObj.Components.Get\u003CCharacterController\u003E();\r\n        if ( cc.IsValid() )\r\n        {\r\n            var dir = (targetObj.WorldPosition - WorldPosition).Normal;\r\n            dir.z = 0.5f;\r\n            cc.Velocity \u002B= dir * 900f;\r\n        }\r\n\r\n        var rb = targetObj.Components.Get\u003CRigidbody\u003E();\r\n        if ( rb.IsValid() )\r\n        {\r\n            var dir = (targetObj.WorldPosition - WorldPosition).Normal;\r\n            dir.z = 0.5f;\r\n            rb.ApplyImpulse( dir * CrushImpactForce );\r\n        }\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"Killfeed.cs","FileName":"Killfeed.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System.Collections.Generic;\r\n\r\npublic sealed class Killfeed : Component\r\n{\r\n\tpublic static Killfeed Instance { get; private set; }\r\n\r\n\tpublic struct KillEntry\r\n\t{\r\n\t\tpublic string KillerName { get; set; }\r\n\t\tpublic string VictimName { get; set; }\r\n\t\tpublic string Method { get; set; }\r\n\t\tpublic float Time { get; set; }\r\n\t}\r\n\r\n\tpublic List\u003CKillEntry\u003E Entries { get; private set; } = new();\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tInstance = this;\r\n\t}\r\n\r\n\tpublic void AddEntry( string killer, string victim, string method = \u0022Push\u0022 )\r\n\t{\r\n\t\tEntries.Add( new KillEntry\r\n\t\t{\r\n\t\t\tKillerName = killer,\r\n\t\t\tVictimName = victim,\r\n\t\t\tMethod = method,\r\n\t\t\tTime = RealTime.Now\r\n\t\t} );\r\n\r\n\t\tif ( Entries.Count \u003E 5 )\r\n\t\t{\r\n\t\t\tEntries.RemoveAt( 0 );\r\n\t\t}\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"ObjectGrabber.cs","FileName":"ObjectGrabber.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic sealed class ObjectGrabber : Component\r\n{\r\n\t[Property] public float MaxReachDistance { get; set; } = 300f;\r\n\t[Property] public float HoldDistance { get; set; } = 150f;\r\n\t[Property] public float ThrowForce { get; set; } = 1200f;\r\n\r\n\tprivate GameObject _heldObject;\r\n\tprivate Rigidbody _heldRigidbody;\r\n\r\n\tprotected override void OnUpdate()\r\n\t{\r\n\t\tif ( IsProxy ) return;\r\n\r\n\t\tif ( Input.Pressed( \u0022use\u0022 ) || Input.Pressed( \u0022e\u0022 ) )\r\n\t\t{\r\n\t\t\tif ( _heldObject.IsValid() )\r\n\t\t\t{\r\n\t\t\t\tDropObject();\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tTryGrabObject();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( Input.Pressed( \u0022attack1\u0022 ) \u0026\u0026 _heldObject.IsValid() )\r\n\t\t{\r\n\t\t\tThrowObject();\r\n\t\t}\r\n\r\n\t\tif ( _heldObject.IsValid() )\r\n\t\t{\r\n\t\t\tUpdateHeldObjectPosition();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void TryGrabObject()\r\n\t{\r\n\t\tvar cam = Components.Get\u003CCameraComponent\u003E() ?? Scene.GetAllComponents\u003CCameraComponent\u003E().FirstOrDefault();\r\n\t\tif ( !cam.IsValid() ) return;\r\n\r\n\t\tvar ray = cam.Transform.World.Forward;\r\n\t\tvar start = cam.WorldPosition;\r\n\t\tvar end = start \u002B ray * MaxReachDistance;\r\n\r\n\t\tvar tr = Scene.Trace.Ray( start, end )\r\n\t\t\t.IgnoreGameObject( GameObject )\r\n\t\t\t.Run();\r\n\r\n\t\tif ( tr.Hit \u0026\u0026 tr.GameObject.IsValid() )\r\n\t\t{\r\n\t\t\tvar rootObj = tr.GameObject.Root;\r\n\t\t\tvar rb = rootObj.Components.Get\u003CRigidbody\u003E() ?? tr.GameObject.Components.Get\u003CRigidbody\u003E();\r\n\r\n\t\t\tif ( rb.IsValid() \u0026\u0026 !rootObj.Tags.Has( \u0022player\u0022 ) )\r\n\t\t\t{\r\n\t\t\t\t_heldObject = rootObj;\r\n\t\t\t\t_heldRigidbody = rb;\r\n\t\t\t\t_heldRigidbody.MotionEnabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void UpdateHeldObjectPosition()\r\n\t{\r\n\t\tvar cam = Components.Get\u003CCameraComponent\u003E() ?? Scene.GetAllComponents\u003CCameraComponent\u003E().FirstOrDefault();\r\n\t\tif ( !cam.IsValid() ) return;\r\n\r\n\t\tvar targetPos = cam.WorldPosition \u002B cam.Transform.World.Forward * HoldDistance;\r\n\t\tvar dir = targetPos - _heldObject.WorldPosition;\r\n\r\n\t\tif ( _heldRigidbody.IsValid() )\r\n\t\t{\r\n\t\t\t_heldRigidbody.Velocity = dir * 10f;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\t_heldObject.WorldPosition = Vector3.Lerp( _heldObject.WorldPosition, targetPos, Time.Delta * 15f );\r\n\t\t}\r\n\t}\r\n\r\n\tprivate void DropObject()\r\n\t{\r\n\t\t_heldObject = null;\r\n\t\t_heldRigidbody = null;\r\n\t}\r\n\r\n\tprivate void ThrowObject()\r\n\t{\r\n\t\tif ( !_heldObject.IsValid() ) return;\r\n\r\n\t\tvar cam = Components.Get\u003CCameraComponent\u003E() ?? Scene.GetAllComponents\u003CCameraComponent\u003E().FirstOrDefault();\r\n\t\tvar throwDir = cam.IsValid() ? cam.Transform.World.Forward : Transform.World.Forward;\r\n\r\n\t\tif ( _heldRigidbody.IsValid() )\r\n\t\t{\r\n\t\t\t_heldRigidbody.Velocity = throwDir * ThrowForce;\r\n\t\t}\r\n\r\n\t\tCameraJuice.Instance?.Shake( 8f );\r\n\r\n\t\t_heldObject = null;\r\n\t\t_heldRigidbody = null;\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"Assembly.cs","FileName":"Assembly.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"global using Sandbox;\r\nglobal using System.Collections.Generic;\r\nglobal using System.Linq;\r\n"},{"Ident":"cherkbyte.one_more_push","Path":"MapEventManager.cs","FileName":"MapEventManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\nusing System.Linq;\r\n\r\npublic enum WeatherType\r\n{\r\n    None,\r\n    LowGravity,\r\n    SlipperyIce,\r\n    StrongWind\r\n}\r\n\r\npublic sealed class MapEventManager : Component\r\n{\r\n    public static MapEventManager Instance { get; private set; }\r\n\r\n    [Property] public float EventDuration { get; set; } = 12f;\r\n    [Property] public float EventInterval { get; set; } = 25f;\r\n    [Property] public float LowGravityForce { get; set; } = 450f;\r\n    [Property] public float WindForce { get; set; } = 400f;\r\n\r\n    public WeatherType CurrentEvent { get; private set; } = WeatherType.None;\r\n    public Vector3 CurrentWindDirection { get; private set; } = Vector3.Right;\r\n    public float TimeRemaining { get; private set; }\r\n\r\n    private TimeUntil _nextEventTime;\r\n    private TimeUntil _eventEndTime;\r\n\r\n    protected override void OnAwake()\r\n    {\r\n        Instance = this;\r\n        _nextEventTime = EventInterval;\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        if ( IsProxy ) return;\r\n\r\n        if ( CurrentEvent == WeatherType.None \u0026\u0026 _nextEventTime )\r\n        {\r\n            StartRandomEvent();\r\n        }\r\n        else if ( CurrentEvent != WeatherType.None )\r\n        {\r\n            TimeRemaining = _eventEndTime;\r\n            if ( _eventEndTime )\r\n            {\r\n                EndEvent();\r\n            }\r\n        }\r\n    }\r\n\r\n    protected override void OnFixedUpdate()\r\n    {\r\n        if ( CurrentEvent == WeatherType.None ) return;\r\n\r\n        var players = Scene.GetAllComponents\u003CCharacterController\u003E();\r\n        var rigidbodies = Scene.GetAllComponents\u003CRigidbody\u003E();\r\n\r\n        if ( CurrentEvent == WeatherType.LowGravity )\r\n        {\r\n            foreach ( var cc in players )\r\n            {\r\n                if ( cc.IsValid() )\r\n                {\r\n                    cc.Velocity \u002B= Vector3.Up * LowGravityForce * Time.Delta;\r\n                }\r\n            }\r\n            foreach ( var rb in rigidbodies )\r\n            {\r\n                if ( rb.IsValid() \u0026\u0026 !rb.IsProxy )\r\n                {\r\n                    rb.ApplyImpulse( Vector3.Up * (rb.PhysicsBody.Mass * LowGravityForce * Time.Delta) );\r\n                }\r\n            }\r\n        }\r\n        else if ( CurrentEvent == WeatherType.StrongWind )\r\n        {\r\n            foreach ( var cc in players )\r\n            {\r\n                if ( cc.IsValid() )\r\n                {\r\n                    cc.Velocity \u002B= CurrentWindDirection * WindForce * Time.Delta;\r\n                }\r\n            }\r\n            foreach ( var rb in rigidbodies )\r\n            {\r\n                if ( rb.IsValid() \u0026\u0026 !rb.IsProxy )\r\n                {\r\n                    rb.ApplyImpulse( CurrentWindDirection * WindForce * 15f * Time.Delta );\r\n                }\r\n            }\r\n        }\r\n        else if ( CurrentEvent == WeatherType.SlipperyIce )\r\n        {\r\n            foreach ( var cc in players )\r\n            {\r\n                if ( cc.IsValid() \u0026\u0026 cc.IsOnGround )\r\n                {\r\n                    var vel = cc.Velocity;\r\n                    vel.x *= 1.015f;\r\n                    vel.y *= 1.015f;\r\n                    cc.Velocity = vel;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private void StartRandomEvent()\r\n    {\r\n        var values = Enum.GetValues( typeof( WeatherType ) ).Cast\u003CWeatherType\u003E().Where( w =\u003E w != WeatherType.None ).ToArray();\r\n        CurrentEvent = values[Random.Shared.Next( values.Length )];\r\n        _eventEndTime = EventDuration;\r\n\r\n        if ( CurrentEvent == WeatherType.StrongWind )\r\n        {\r\n            float angle = Random.Shared.NextSingle() * MathF.PI * 2f;\r\n            CurrentWindDirection = new Vector3( MathF.Cos( angle ), MathF.Sin( angle ), 0f ).Normal;\r\n        }\r\n\r\n        Log.Info( $\u0022[MapEventManager] \u0417\u0430\u043F\u0443\u0449\u0435\u043D \u043F\u043E\u0433\u043E\u0434\u043D\u044B\u0439 \u0438\u0432\u0435\u043D\u0442: {CurrentEvent}\u0022 );\r\n    }\r\n\r\n    private void EndEvent()\r\n    {\r\n        Log.Info( $\u0022[MapEventManager] \u0417\u0430\u0432\u0435\u0440\u0448\u0451\u043D \u0438\u0432\u0435\u043D\u0442: {CurrentEvent}\u0022 );\r\n        CurrentEvent = WeatherType.None;\r\n        _nextEventTime = EventInterval;\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"PlayerAbilities.cs","FileName":"PlayerAbilities.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\n\r\npublic sealed class PlayerAbilities : Component\r\n{\r\n    [Property] public GameObject HeavyObjectPrefab { get; set; }\r\n\r\n    [Property] public float DropCooldown { get; set; } = 8f;\r\n    [Property] public float ShieldCooldown { get; set; } = 6f;\r\n    [Property] public float ShieldDuration { get; set; } = 2f;\r\n\r\n    public bool IsShieldActive { get; private set; } = false;\r\n\r\n    private TimeSince _timeSinceDrop = 100f;\r\n    private TimeSince _timeSinceShield = 100f;\r\n    private TimeSince _shieldActiveTimer = 0f;\r\n\r\n    private Rigidbody _rb;\r\n    private float _originalMass = 0f;\r\n\r\n    protected override void OnStart()\r\n    {\r\n        _rb = Components.Get\u003CRigidbody\u003E();\r\n        if ( _rb.IsValid() )\r\n        {\r\n            _originalMass = _rb.MassOverride;\r\n        }\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        if ( IsProxy ) return;\r\n\r\n        if ( IsShieldActive \u0026\u0026 _shieldActiveTimer \u003E ShieldDuration )\r\n        {\r\n            DeactivateShield();\r\n        }\r\n\r\n        if ( Input.Pressed( \u0022attack2\u0022 ) || Input.Pressed( \u0022use\u0022 ) )\r\n        {\r\n            TryDropObject();\r\n        }\r\n\r\n        if ( Input.Pressed( \u0022run\u0022 ) )\r\n        {\r\n            TryActivateShield();\r\n        }\r\n    }\r\n\r\n    private void TryDropObject()\r\n    {\r\n        if ( _timeSinceDrop \u003C DropCooldown )\r\n        {\r\n            Log.Info( $\u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] \u0421\u0431\u0440\u043E\u0441 \u043D\u0430 \u043F\u0435\u0440\u0435\u0437\u0430\u0440\u044F\u0434\u043A\u0435! \u041E\u0441\u0442\u0430\u043B\u043E\u0441\u044C: {DropCooldown - _timeSinceDrop:F1} \u0441\u0435\u043A.\u0022 );\r\n            return;\r\n        }\r\n\r\n        var headPos = WorldPosition \u002B Vector3.Up * 50f;\r\n        var forwardPos = headPos \u002B WorldTransform.Forward * 600f;\r\n\r\n        var tr = Scene.Trace.Ray( headPos, forwardPos )\r\n                            .IgnoreGameObjectHierarchy( GameObject )\r\n                            .Run();\r\n\r\n        if ( tr.Hit \u0026\u0026 tr.GameObject.IsValid() )\r\n        {\r\n            var targetPos = tr.GameObject.WorldPosition;\r\n            var spawnPos = targetPos \u002B Vector3.Up * 180f;\r\n\r\n            if ( HeavyObjectPrefab.IsValid() )\r\n            {\r\n                var obj = HeavyObjectPrefab.Clone( spawnPos );\r\n                if ( obj.IsValid() \u0026\u0026 Network.Active )\r\n                {\r\n                    obj.NetworkSpawn();\r\n                }\r\n\r\n                _timeSinceDrop = 0;\r\n                Log.Info( \u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] \u0422\u044F\u0436\u0435\u043B\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442 \u0441\u0431\u0440\u043E\u0448\u0435\u043D \u043F\u0440\u044F\u043C\u043E \u043D\u0430 \u0432\u0440\u0430\u0433\u0430!\u0022 );\r\n            }\r\n            else\r\n            {\r\n                Log.Warning( \u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] HeavyObjectPrefab \u043D\u0435 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D \u0432 \u0418\u043D\u0441\u043F\u0435\u043A\u0442\u043E\u0440\u0435!\u0022 );\r\n            }\r\n        }\r\n        else\r\n        {\r\n            Log.Info( \u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] \u041D\u0438\u043A\u043E\u0433\u043E \u043D\u0435 \u043D\u0430\u0448\u043B\u0438 \u043F\u0435\u0440\u0435\u0434 \u0441\u043E\u0431\u043E\u0439 \u0434\u043B\u044F \u0430\u0442\u0430\u043A\u0438!\u0022 );\r\n        }\r\n    }\r\n\r\n    private void TryActivateShield()\r\n    {\r\n        if ( _timeSinceShield \u003C ShieldCooldown || IsShieldActive ) return;\r\n\r\n        IsShieldActive = true;\r\n        _shieldActiveTimer = 0;\r\n        _timeSinceShield = 0;\r\n\r\n        if ( _rb.IsValid() )\r\n        {\r\n            _originalMass = _rb.MassOverride;\r\n            _rb.MassOverride = 1000f; \r\n        }\r\n\r\n        Log.Info( \u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] \u0429\u0418\u0422 \u0410\u041A\u0422\u0418\u0412\u0418\u0420\u041E\u0412\u0410\u041D!\u0022 );\r\n    }\r\n\r\n    private void DeactivateShield()\r\n    {\r\n        IsShieldActive = false;\r\n\r\n        if ( _rb.IsValid() )\r\n        {\r\n            _rb.MassOverride = _originalMass; \r\n        }\r\n\r\n        Log.Info( \u0022[\u0421\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442\u0438] \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0449\u0438\u0442\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u043B\u043E\u0441\u044C.\u0022 );\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"LeaderboardModal.razor","FileName":"LeaderboardModal.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"@using Sandbox;\r\n@using Sandbox.UI;\r\n@using Sandbox.Services;\r\n@using System;\r\n@using System.Threading.Tasks;\r\n@using System.Collections.Generic;\r\n@using System.Linq;\r\n@inherits Panel\r\n\r\n\u003Croot class=\u0022lb-root @(IsOpen ? \u0022open\u0022 : \u0022\u0022)\u0022\u003E\r\n    \u003Cdiv class=\u0022lb-card\u0022\u003E\r\n        \u003Cdiv class=\u0022lb-header\u0022\u003E\r\n            \u003Cdiv class=\u0022lb-title\u0022\u003EGLOBAL LEADERBOARD\u003C/div\u003E\r\n            \u003Cbutton class=\u0022lb-close\u0022 onclick=\u0022@Toggle\u0022\u003E\u2715\u003C/button\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022lb-tabs\u0022\u003E\r\n            \u003Cbutton class=\u0022tab-btn @(CurrentStat == \u0022pushes_count\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectStat(\u0022pushes_count\u0022))\u0022\u003E\r\n                PUSHES\r\n            \u003C/button\u003E\r\n            \u003Cbutton class=\u0022tab-btn @(CurrentStat == \u0022rounds_won\u0022 ? \u0022active\u0022 : \u0022\u0022)\u0022 onclick=\u0022@(() =\u003E SelectStat(\u0022rounds_won\u0022))\u0022\u003E\r\n                WINS\r\n            \u003C/button\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022lb-content\u0022\u003E\r\n            @if (IsLoading)\r\n            {\r\n                \u003Cdiv class=\u0022lb-status\u0022\u003ELOADING DATA...\u003C/div\u003E\r\n            }\r\n            else if (Entries == null || Entries.Count == 0)\r\n            {\r\n                \u003Cdiv class=\u0022lb-status\u0022\u003ENO RECORD FOUND\u003C/div\u003E\r\n            }\r\n            else\r\n            {\r\n                \u003Cdiv class=\u0022lb-table\u0022\u003E\r\n                    \u003Cdiv class=\u0022table-header\u0022\u003E\r\n                        \u003Cspan class=\u0022col-rank\u0022\u003E#\u003C/span\u003E\r\n                        \u003Cspan class=\u0022col-player\u0022\u003EPLAYER\u003C/span\u003E\r\n                        \u003Cspan class=\u0022col-score\u0022\u003ESCORE\u003C/span\u003E\r\n                    \u003C/div\u003E\r\n                    \u003Cdiv class=\u0022table-body\u0022\u003E\r\n                        @foreach (var entry in Entries)\r\n                        {\r\n                            \u003Cdiv class=\u0022table-row @(entry.SteamId == (Connection.Local?.SteamId ?? 0) ? \u0022is-me\u0022 : \u0022\u0022)\u0022\u003E\r\n                                \u003Cspan class=\u0022col-rank\u0022\u003E@GetRankBadge(entry.Rank)\u003C/span\u003E\r\n                                \u003Cspan class=\u0022col-player\u0022\u003E@entry.DisplayName\u003C/span\u003E\r\n                                \u003Cspan class=\u0022col-score\u0022\u003E@entry.Value.ToString(\u0022N0\u0022)\u003C/span\u003E\r\n                            \u003C/div\u003E\r\n                        }\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n            }\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\u003C/root\u003E\r\n\r\n@code {\r\n    public class EntryItem\r\n    {\r\n        public int Rank { get; set; }\r\n        public string DisplayName { get; set; }\r\n        public double Value { get; set; }\r\n        public ulong SteamId { get; set; }\r\n    }\r\n\r\n    public bool IsOpen { get; set; } = false;\r\n    public bool IsLoading { get; set; } = true;\r\n    public string CurrentStat { get; set; } = \u0022pushes_count\u0022;\r\n    public List\u003CEntryItem\u003E Entries { get; set; } = new();\r\n\r\n    protected override void OnAfterTreeRender( bool firstTime )\r\n    {\r\n        base.OnAfterTreeRender( firstTime );\r\n        if ( firstTime )\r\n        {\r\n            _ = RefreshData();\r\n        }\r\n    }\r\n\r\n    public void Toggle()\r\n    {\r\n        IsOpen = !IsOpen;\r\n        if (IsOpen)\r\n        {\r\n            _ = RefreshData();\r\n        }\r\n        StateHasChanged();\r\n    }\r\n\r\n    private async Task SelectStat(string statIdent)\r\n    {\r\n        if (CurrentStat == statIdent) return;\r\n        CurrentStat = statIdent;\r\n        await RefreshData();\r\n    }\r\n\r\n    private async Task RefreshData()\r\n    {\r\n        IsLoading = true;\r\n        StateHasChanged();\r\n\r\n        try\r\n        {\r\n            var board = Leaderboards.GetFromStat(\u0022seilordstudio.one_more_push\u0022, CurrentStat);\r\n            board.SetAggregationSum();\r\n            board.MaxEntries = 20;\r\n            await board.Refresh();\r\n\r\n            if (board.Entries != null)\r\n            {\r\n                Entries = board.Entries.Select(x =\u003E new EntryItem\r\n                {\r\n                    Rank = Convert.ToInt32(x.Rank),\r\n                    DisplayName = x.DisplayName ?? \u0022Player\u0022,\r\n                    Value = Convert.ToDouble(x.Value),\r\n                    SteamId = Convert.ToUInt64(x.SteamId)\r\n                }).ToList();\r\n            }\r\n            else\r\n            {\r\n                Entries = new();\r\n            }\r\n        }\r\n        catch (System.Exception ex)\r\n        {\r\n            Log.Warning($\u0022Leaderboard fetch failed: {ex.Message}\u0022);\r\n        }\r\n\r\n        IsLoading = false;\r\n        StateHasChanged();\r\n    }\r\n\r\n    private string GetRankBadge(int rank)\r\n    {\r\n        return rank switch\r\n        {\r\n            1 =\u003E \u0022\uD83E\uDD47 1\u0022,\r\n            2 =\u003E \u0022\uD83E\uDD48 2\u0022,\r\n            3 =\u003E \u0022\uD83E\uDD49 3\u0022,\r\n            _ =\u003E rank.ToString()\r\n        };\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"RoundManager.cs","FileName":"RoundManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\nusing System.Threading.Tasks;\r\n\r\npublic sealed class RoundManager : Component\r\n{\r\n    public static RoundManager Instance { get; private set; }\r\n\r\n    [Property] public float RoundTime { get; set; } = 120f;\r\n    [Sync] public float TimeLeft { get; set; }\r\n    [Sync] public bool IsInRound { get; set; }\r\n    [Sync] public int CurrentRound { get; set; } = 1;\r\n\r\n    protected override void OnAwake()\r\n    {\r\n        Instance = this;\r\n    }\r\n\r\n    protected override void OnStart()\r\n    {\r\n        StartNewRound();\r\n    }\r\n\r\n    public void StartNewRound()\r\n    {\r\n        TimeLeft = RoundTime;\r\n        IsInRound = true;\r\n\r\n        ResetArena();\r\n        RespawnAllPlayers();\r\n\r\n        var shrinker = Scene.GetAllComponents\u003CArenaShrinker\u003E().FirstOrDefault();\r\n        if ( shrinker.IsValid() )\r\n        {\r\n            shrinker.StartRound();\r\n        }\r\n\r\n        Log.Info( $\u0022[RoundManager] \u0420\u0430\u0443\u043D\u0434 {CurrentRound} \u043D\u0430\u0447\u0430\u0442!\u0022 );\r\n    }\r\n\r\n    public void OnPlayerEliminated( GameObject player )\r\n    {\r\n        if ( !IsInRound ) return;\r\n\r\n        if ( player.IsValid() )\r\n        {\r\n            player.Enabled = false;\r\n        }\r\n\r\n        var activePlayers = Scene.GetAllComponents\u003CPushAbility\u003E()\r\n            .Where( p =\u003E p.GameObject.IsValid() \u0026\u0026 p.GameObject.Enabled );\r\n\r\n        if ( activePlayers.Count() \u003C= 1 )\r\n        {\r\n            _ = EndRound();\r\n        }\r\n    }\r\n\r\n    public async Task EndRound()\r\n    {\r\n        if ( !IsInRound ) return;\r\n\r\n        var winner = Scene.GetAllComponents\u003CPushAbility\u003E()\r\n            .FirstOrDefault( p =\u003E p.GameObject.IsValid() \u0026\u0026 p.GameObject.Enabled );\r\n\r\n        if ( winner.IsValid() \u0026\u0026 !winner.IsProxy )\r\n        {\r\n            GameServices.RecordRoundWin();\r\n        }\r\n\r\n        _ = GameServices.SaveStatsAsync();\r\n\r\n        IsInRound = false;\r\n        CurrentRound\u002B\u002B;\r\n\r\n        Log.Info( $\u0022\u0420\u0430\u0443\u043D\u0434 {CurrentRound - 1} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D! \u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A \u0447\u0435\u0440\u0435\u0437 3 \u0441\u0435\u043A\u0443\u043D\u0434\u044B...\u0022 );\r\n\r\n        await Task.DelaySeconds( 3f );\r\n\r\n        StartNewRound();\r\n    }\r\n\r\n    private void ResetArena()\r\n    {\r\n        var tiles = Scene.GetAllComponents\u003CArenaTile\u003E();\r\n        foreach ( var tile in tiles )\r\n        {\r\n            if ( tile.IsValid() )\r\n            {\r\n                tile.ResetTile();\r\n            }\r\n        }\r\n    }\r\n\r\n    private void RespawnAllPlayers()\r\n    {\r\n        var spawn = Scene.GetAllComponents\u003CSpawnPoint\u003E().FirstOrDefault();\r\n        Vector3 spawnPos = spawn.IsValid() ? spawn.WorldPosition : new Vector3( 0, 0, 250 );\r\n\r\n        var players = Scene.GetAllComponents\u003CPushAbility\u003E();\r\n        foreach ( var player in players )\r\n        {\r\n            if ( !player.IsValid() ) continue;\r\n\r\n            var root = player.GameObject.Root;\r\n            root.Enabled = true;\r\n            root.WorldPosition = spawnPos;\r\n\r\n            var cc = root.Components.Get\u003CCharacterController\u003E( true );\r\n            if ( cc.IsValid() )\r\n            {\r\n                cc.Velocity = Vector3.Zero;\r\n            }\r\n\r\n            var rb = root.Components.Get\u003CRigidbody\u003E( true );\r\n            if ( rb.IsValid() )\r\n            {\r\n                rb.Velocity = Vector3.Zero;\r\n                rb.AngularVelocity = Vector3.Zero;\r\n            }\r\n        }\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"ShopManager.cs","FileName":"ShopManager.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System.Collections.Generic;\r\nusing System.Linq;\r\n\r\npublic class PushItem\r\n{\r\n    public string Id { get; set; }\r\n    public string NameRu { get; set; }\r\n    public string NameEn { get; set; }\r\n    public int Cost { get; set; }\r\n    public float ForceMultiplier { get; set; }\r\n    public string Key { get; set; }\r\n    public bool IsUnlocked { get; set; }\r\n\r\n    public string GetName( string lang ) =\u003E lang == \u0022EN\u0022 ? NameEn : NameRu;\r\n}\r\n\r\npublic class ShopManager : Component\r\n{\r\n    public static ShopManager Instance { get; private set; }\r\n\r\n    public List\u003CPushItem\u003E Items { get; private set; } = new()\r\n    {\r\n        new PushItem { Id = \u0022basic\u0022, NameRu = \u0022\u041E\u0431\u044B\u0447\u043D\u044B\u0439\u0022, NameEn = \u0022Basic\u0022, Cost = 0, ForceMultiplier = 1.0f, Key = \u00221\u0022, IsUnlocked = true },\r\n        new PushItem { Id = \u0022heavy\u0022, NameRu = \u0022\u0422\u044F\u0436\u0435\u043B\u044B\u0439\u0022, NameEn = \u0022Heavy\u0022, Cost = 10, ForceMultiplier = 1.5f, Key = \u00222\u0022, IsUnlocked = false },\r\n        new PushItem { Id = \u0022force\u0022, NameRu = \u0022\u0418\u043C\u043F\u0443\u043B\u044C\u0441\u0022, NameEn = \u0022Impulse\u0022, Cost = 25, ForceMultiplier = 2.2f, Key = \u00223\u0022, IsUnlocked = false },\r\n        new PushItem { Id = \u0022mega\u0022, NameRu = \u0022\u041C\u0435\u0433\u0430-\u0442\u043E\u043B\u0447\u043E\u043A\u0022, NameEn = \u0022Mega Push\u0022, Cost = 50, ForceMultiplier = 3.5f, Key = \u00224\u0022, IsUnlocked = false }\r\n    };\r\n\r\n    public PushItem SelectedItem { get; private set; }\r\n\r\n    protected override void OnStart()\r\n    {\r\n        Instance = this;\r\n        SelectedItem = Items.FirstOrDefault( x =\u003E x.IsUnlocked );\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        if ( Input.Pressed( \u0022slot1\u0022 ) ) SelectByKey( \u00221\u0022 );\r\n        if ( Input.Pressed( \u0022slot2\u0022 ) ) SelectByKey( \u00222\u0022 );\r\n        if ( Input.Pressed( \u0022slot3\u0022 ) ) SelectByKey( \u00223\u0022 );\r\n        if ( Input.Pressed( \u0022slot4\u0022 ) ) SelectByKey( \u00224\u0022 );\r\n    }\r\n\r\n    public void SelectByKey( string key )\r\n    {\r\n        var item = Items.FirstOrDefault( x =\u003E x.Key == key );\r\n        if ( item != null ) TryBuyOrSelect( item );\r\n    }\r\n\r\n    public bool TryBuyOrSelect( PushItem item )\r\n    {\r\n        if ( item.IsUnlocked )\r\n        {\r\n            SelectedItem = item;\r\n            return true;\r\n        }\r\n\r\n        int currentScore = ScoreManager.Instance?.Score ?? 0;\r\n        if ( currentScore \u003E= item.Cost )\r\n        {\r\n            item.IsUnlocked = true;\r\n            SelectedItem = item;\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    public float GetCurrentForceMultiplier()\r\n    {\r\n        return SelectedItem?.ForceMultiplier ?? 1.0f;\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"MainMenu.razor","FileName":"MainMenu.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"@namespace Sandbox\r\n@using Sandbox;\r\n@using Sandbox.UI;\r\n@inherits PanelComponent\r\n\r\n\u003Croot\u003E\r\n    \u003Cdiv class=\u0022background-image\u0022\u003E\u003C/div\u003E\r\n    \u003Cdiv class=\u0022background-overlay\u0022\u003E\u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022header\u0022\u003E\r\n        \u003Cdiv class=\u0022logo\u0022\u003E\r\n            \u003Cspan class=\u0022logo-text\u0022\u003E@GetText(\u0022game_title\u0022)\u003C/span\u003E\r\n        \u003C/div\u003E\r\n        \u003Cdiv class=\u0022header-actions\u0022\u003E\r\n            \u003Cbutton class=\u0022icon-button\u0022 onclick=\u0022@OnSettingsClicked\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                \u003Cspan\u003E\u2699\uFE0F\uFE0F @GetText(\u0022settings_btn\u0022)\u003C/span\u003E\r\n            \u003C/button\u003E\r\n            \u003Cbutton class=\u0022icon-button lang\u0022 onclick=\u0022@OnLangClicked\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                \u003Cspan\u003E\uD83C\uDF10 @GetText(\u0022lang_btn\u0022)\u003C/span\u003E\r\n            \u003C/button\u003E\r\n            \u003Cbutton class=\u0022icon-button exit-btn\u0022 onclick=\u0022@OnQuitClicked\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                \u003Cspan\u003E\uD83D\uDEAA @GetText(\u0022exit_btn\u0022)\u003C/span\u003E\r\n            \u003C/button\u003E\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\r\n    \u003Cdiv class=\u0022main-content\u0022\u003E\r\n        \u003Cdiv class=\u0022modes-section\u0022\u003E\r\n            \u003Cdiv class=\u0022title-group\u0022\u003E\r\n                \u003Cdiv class=\u0022main-title\u0022\u003E@GetText(\u0022title\u0022)\u003C/div\u003E\r\n                \u003Cdiv class=\u0022subtitle\u0022\u003E@GetText(\u0022subtitle\u0022)\u003C/div\u003E\r\n            \u003C/div\u003E\r\n\r\n            \u003Cdiv class=\u0022modes-wrapper\u0022\u003E\r\n                \u003Cdiv class=\u0022mode-card sumo\u0022 onclick=\u0022@(() =\u003E OnModeClicked(GameMode.SumoPush))\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                    \u003Cdiv class=\u0022card-badge sumo-badge\u0022\u003E@GetText(\u0022sumo_tag\u0022)\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022card-icon-wrapper\u0022\u003E\r\n                        \u003Cspan class=\u0022card-icon\u0022\u003E\uD83E\uDD3C\u003C/span\u003E\r\n                    \u003C/div\u003E\r\n                    \u003Cdiv class=\u0022card-content\u0022\u003E\r\n                        \u003Cdiv class=\u0022mode-title\u0022\u003E@GetText(\u0022sumo_title\u0022)\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022mode-desc\u0022\u003E@GetText(\u0022sumo_desc\u0022)\u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022mode-card nextbot disabled\u0022\u003E\r\n                    \u003Cdiv class=\u0022card-badge nextbot-badge disabled-badge\u0022\u003E@GetText(\u0022nextbot_tag\u0022)\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022card-icon-wrapper\u0022\u003E\r\n                        \u003Cspan class=\u0022card-icon\u0022\u003E\uD83C\uDFC3\u003C/span\u003E\r\n                    \u003C/div\u003E\r\n                    \u003Cdiv class=\u0022card-content\u0022\u003E\r\n                        \u003Cdiv class=\u0022mode-title\u0022\u003E@GetText(\u0022nextbot_title\u0022)\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022mode-desc\u0022\u003E@GetText(\u0022nextbot_desc\u0022)\u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n\r\n        \u003Cdiv class=\u0022news-panel\u0022\u003E\r\n            \u003Cdiv class=\u0022news-header\u0022\u003E\r\n                \u003Cspan class=\u0022news-title\u0022\u003E@GetText(\u0022news_title\u0022)\u003C/span\u003E\r\n                \u003Cspan class=\u0022news-badge\u0022\u003E@GetText(\u0022news_tag_new\u0022)\u003C/span\u003E\r\n            \u003C/div\u003E\r\n            \u003Cdiv class=\u0022news-list\u0022\u003E\r\n                \u003Cdiv class=\u0022news-item item-highlight\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                    \u003Cdiv class=\u0022news-item-title\u0022\u003E\uD83D\uDD25 @GetText(\u0022news_item1_title\u0022)\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022news-item-desc\u0022\u003E@GetText(\u0022news_item1_desc\u0022)\u003C/div\u003E\r\n                \u003C/div\u003E\r\n                \u003Cdiv class=\u0022news-item\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                    \u003Cdiv class=\u0022news-item-title\u0022\u003E\u2728 @GetText(\u0022news_item2_title\u0022)\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022news-item-desc\u0022\u003E@GetText(\u0022news_item2_desc\u0022)\u003C/div\u003E\r\n                \u003C/div\u003E\r\n                \u003Cdiv class=\u0022news-item\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\r\n                    \u003Cdiv class=\u0022news-item-title\u0022\u003E\u26A1 @GetText(\u0022news_item3_title\u0022)\u003C/div\u003E\r\n                    \u003Cdiv class=\u0022news-item-desc\u0022\u003E@GetText(\u0022news_item3_desc\u0022)\u003C/div\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    \u003C/div\u003E\r\n\r\n    @if ( IsSettingsOpen )\r\n    {\r\n        \u003Cdiv class=\u0022modal-overlay\u0022\u003E\r\n            \u003Cdiv class=\u0022modal-window\u0022\u003E\r\n                \u003Cdiv class=\u0022modal-header\u0022\u003E\r\n                    \u003Cdiv class=\u0022modal-title\u0022\u003E@GetText(\u0022settings_title\u0022)\u003C/div\u003E\r\n                    \u003Cbutton class=\u0022close-x\u0022 onclick=\u0022@OnCloseSettingsClicked\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E\u2715\u003C/button\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022modal-body\u0022\u003E\r\n                    \u003Cdiv class=\u0022setting-item\u0022\u003E\r\n                        \u003Cdiv class=\u0022setting-label\u0022\u003E@GetText(\u0022volume_label\u0022): @((int)(Volume * 100))%\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022volume-buttons\u0022\u003E\r\n                            \u003Cbutton class=\u0022vol-btn\u0022 onclick=\u0022@(() =\u003E OnVolumeBtnClicked(0.25f))\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E25%\u003C/button\u003E\r\n                            \u003Cbutton class=\u0022vol-btn\u0022 onclick=\u0022@(() =\u003E OnVolumeBtnClicked(0.50f))\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E50%\u003C/button\u003E\r\n                            \u003Cbutton class=\u0022vol-btn\u0022 onclick=\u0022@(() =\u003E OnVolumeBtnClicked(0.75f))\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E75%\u003C/button\u003E\r\n                            \u003Cbutton class=\u0022vol-btn\u0022 onclick=\u0022@(() =\u003E OnVolumeBtnClicked(1.00f))\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E100%\u003C/button\u003E\r\n                        \u003C/div\u003E\r\n                    \u003C/div\u003E\r\n\r\n                    \u003Cdiv class=\u0022controls-section\u0022\u003E\r\n                        \u003Cdiv class=\u0022controls-title\u0022\u003E@GetText(\u0022controls_title\u0022)\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022control-row\u0022\u003E@GetText(\u0022ctrl_move\u0022)\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022control-row\u0022\u003E@GetText(\u0022ctrl_action\u0022)\u003C/div\u003E\r\n                        \u003Cdiv class=\u0022control-row\u0022\u003E@GetText(\u0022ctrl_space\u0022)\u003C/div\u003E\r\n                    \u003C/div\u003E\r\n                \u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022modal-footer\u0022\u003E\r\n                    \u003Cbutton class=\u0022modal-close-btn\u0022 onclick=\u0022@OnCloseSettingsClicked\u0022 onmouseover=\u0022@PlayHoverSound\u0022\u003E@GetText(\u0022close_btn\u0022)\u003C/button\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\r\n    @if ( IsLoading )\r\n    {\r\n        \u003Cdiv class=\u0022loading-overlay\u0022\u003E\r\n            \u003Cdiv class=\u0022loading-box\u0022\u003E\r\n                \u003Cdiv class=\u0022loading-mode-title\u0022\u003E@(TargetMode == GameMode.SumoPush ? GetText(\u0022sumo_title\u0022) : GetText(\u0022nextbot_title\u0022))\u003C/div\u003E\r\n                \u003Cdiv class=\u0022loading-status\u0022\u003E@GetText(\u0022loading_title\u0022)\u003C/div\u003E\r\n                \u003Cdiv class=\u0022loading-sub\u0022\u003E@GetText(\u0022loading_sub\u0022)\u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022progress-bar-bg\u0022\u003E\r\n                    \u003Cdiv class=\u0022progress-bar-fill\u0022 style=\u0022width: @(LoadingProgress)%;\u0022\u003E\u003C/div\u003E\r\n                \u003C/div\u003E\r\n                \u003Cdiv class=\u0022loading-percent\u0022\u003E@((int)LoadingProgress)%\u003C/div\u003E\r\n\r\n                \u003Cdiv class=\u0022tip-box\u0022\u003E\r\n                    \u003Cspan class=\u0022tip-label\u0022\u003E@GetText(\u0022tip_label\u0022)\u003C/span\u003E\r\n                    \u003Cspan class=\u0022tip-text\u0022\u003E@(TargetMode == GameMode.SumoPush ? GetText(\u0022tip_sumo\u0022) : GetText(\u0022tip_nextbot\u0022))\u003C/span\u003E\r\n                \u003C/div\u003E\r\n            \u003C/div\u003E\r\n        \u003C/div\u003E\r\n    }\r\n\u003C/root\u003E\r\n\r\n@code {\r\n    [Property] public SoundEvent HoverSound { get; set; }\r\n    [Property] public SoundEvent ClickSound { get; set; }\r\n\r\n    private bool IsSettingsOpen { get; set; } = false;\r\n    private bool IsLoading { get; set; } = false;\r\n    private GameMode TargetMode { get; set; }\r\n    private float LoadingProgress { get; set; } = 0f;\r\n    private TimeSince TimeSinceLoadingStarted;\r\n    private float Volume { get; set; } = 1.0f;\r\n    private const float TotalLoadingTime = 6.0f;\r\n\r\n    private void PlayHoverSound()\r\n    {\r\n        if ( HoverSound != null )\r\n            Sound.Play( HoverSound );\r\n        else\r\n            Sound.Play( \u0022ui.button.hover\u0022 );\r\n    }\r\n\r\n    private void PlayClickSound()\r\n    {\r\n        if ( ClickSound != null )\r\n            Sound.Play( ClickSound );\r\n        else\r\n            Sound.Play( \u0022ui.button.press\u0022 );\r\n    }\r\n\r\n    protected override void OnUpdate()\r\n    {\r\n        base.OnUpdate();\r\n\r\n        if ( IsLoading )\r\n        {\r\n            float elapsed = TimeSinceLoadingStarted;\r\n            LoadingProgress = MathX.Clamp( (elapsed / TotalLoadingTime) * 100f, 0f, 100f );\r\n\r\n            if ( elapsed \u003E= TotalLoadingTime )\r\n            {\r\n                IsLoading = false;\r\n                if ( ModeController.Instance != null )\r\n                {\r\n                    ModeController.Instance.SelectMode( TargetMode );\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    private void OnModeClicked( GameMode mode )\r\n    {\r\n        PlayClickSound();\r\n        StartLoading( mode );\r\n    }\r\n\r\n    private void OnSettingsClicked()\r\n    {\r\n        PlayClickSound();\r\n        ToggleSettings();\r\n    }\r\n\r\n    private void OnCloseSettingsClicked()\r\n    {\r\n        PlayClickSound();\r\n        ToggleSettings();\r\n    }\r\n\r\n    private void OnLangClicked()\r\n    {\r\n        PlayClickSound();\r\n        OnToggleLanguage();\r\n    }\r\n\r\n    private void OnQuitClicked()\r\n    {\r\n        PlayClickSound();\r\n        Game.Close();\r\n    }\r\n\r\n    private void OnVolumeBtnClicked( float val )\r\n    {\r\n        PlayClickSound();\r\n        SetVolume( val );\r\n    }\r\n\r\n    private void StartLoading( GameMode mode )\r\n    {\r\n        if ( IsLoading ) return;\r\n\r\n        TargetMode = mode;\r\n        IsLoading = true;\r\n        LoadingProgress = 0f;\r\n        TimeSinceLoadingStarted = 0;\r\n    }\r\n\r\n    private void ToggleSettings()\r\n    {\r\n        if ( IsLoading ) return;\r\n        IsSettingsOpen = !IsSettingsOpen;\r\n    }\r\n\r\n    private void SetVolume( float val )\r\n    {\r\n        Volume = val;\r\n        if ( ModeController.Instance != null )\r\n        {\r\n            ModeController.Instance.MasterVolume = val;\r\n        }\r\n    }\r\n\r\n    private void OnToggleLanguage()\r\n    {\r\n        if ( IsLoading ) return;\r\n        if ( ModeController.Instance != null )\r\n        {\r\n            ModeController.Instance.ToggleLanguage();\r\n        }\r\n    }\r\n\r\n    private string GetText( string key )\r\n    {\r\n        return ModeController.Instance?.GetText( key ) ?? key;\r\n    }\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"MetaProgression.cs","FileName":"MetaProgression.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\nusing System;\r\n\r\npublic sealed class MetaProgression : Component\r\n{\r\n\t[Property] public int Credits { get; private set; } = 0;\r\n\r\n\t// \u0423\u0440\u043E\u0432\u043D\u0438 \u043C\u0435\u0442\u0430-\u043F\u0440\u043E\u043A\u0430\u0447\u043A\u0438\r\n\t[Property] public int ForceLevel { get; private set; } = 0;\r\n\t[Property] public int MassLevel { get; private set; } = 0;\r\n\t[Property] public int EnergyLevel { get; private set; } = 0;\r\n\r\n\t// \u041F\u0440\u0435\u0441\u0442\u0438\u0436\r\n\t[Property] public int PrestigeLevel { get; private set; } = 0;\r\n\t[Property] public int PrestigeTokens { get; private set; } = 0;\r\n\r\n\t// \u0422\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043B\u044F \u0441\u0431\u0440\u043E\u0441\u0430 (\u0441\u0443\u043C\u043C\u0430 \u0443\u0440\u043E\u0432\u043D\u0435\u0439 \u043F\u0440\u043E\u043A\u0430\u0447\u043A\u0438)\r\n\tpublic const int REQUIRED_TOTAL_LEVELS_FOR_PRESTIGE = 15;\r\n\r\n\tprivate const string SAVE_FILE = \u0022one_more_push_meta.json\u0022;\r\n\r\n\tprotected override void OnStart()\r\n\t{\r\n\t\tLoadProgress();\r\n\t}\r\n\r\n\tpublic void AddCredits( int amount )\r\n\t{\r\n\t\t// \u041C\u043D\u043E\u0436\u0438\u0442\u0435\u043B\u044C \u043F\u0440\u0435\u0441\u0442\u0438\u0436\u0430 (\u002B50% \u0437\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0440\u0435\u0441\u0442\u0438\u0436\u0430)\r\n\t\tfloat multiplier = 1.0f \u002B (PrestigeLevel * 0.5f);\r\n\t\tCredits \u002B= (int)(amount * multiplier);\r\n\t\tSaveProgress();\r\n\t}\r\n\r\n\tpublic int GetUpgradeCost( int currentLevel )\r\n\t{\r\n\t\treturn (int)(100 * Math.Pow( 1.5, currentLevel ));\r\n\t}\r\n\r\n\tpublic bool TryUpgradeForce()\r\n\t{\r\n\t\tint cost = GetUpgradeCost( ForceLevel );\r\n\t\tif ( Credits \u003E= cost )\r\n\t\t{\r\n\t\t\tCredits -= cost;\r\n\t\t\tForceLevel\u002B\u002B;\r\n\t\t\tSaveProgress();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic bool TryUpgradeMass()\r\n\t{\r\n\t\tint cost = GetUpgradeCost( MassLevel );\r\n\t\tif ( Credits \u003E= cost )\r\n\t\t{\r\n\t\t\tCredits -= cost;\r\n\t\t\tMassLevel\u002B\u002B;\r\n\t\t\tSaveProgress();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic bool TryUpgradeEnergy()\r\n\t{\r\n\t\tint cost = GetUpgradeCost( EnergyLevel );\r\n\t\tif ( Credits \u003E= cost )\r\n\t\t{\r\n\t\t\tCredits -= cost;\r\n\t\t\tEnergyLevel\u002B\u002B;\r\n\t\t\tSaveProgress();\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430: \u0433\u043E\u0442\u043E\u0432 \u043B\u0438 \u0438\u0433\u0440\u043E\u043A \u043A \u043F\u0440\u0435\u0441\u0442\u0438\u0436\u0443\r\n\tpublic bool CanPrestige()\r\n\t{\r\n\t\tint totalLevels = ForceLevel \u002B MassLevel \u002B EnergyLevel;\r\n\t\treturn totalLevels \u003E= REQUIRED_TOTAL_LEVELS_FOR_PRESTIGE;\r\n\t}\r\n\r\n\t// \u0421\u0431\u0440\u043E\u0441 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441\u0430 \u0440\u0430\u0434\u0438 \u041F\u0440\u0435\u0441\u0442\u0438\u0436\u0430\r\n\tpublic bool TryPrestige()\r\n\t{\r\n\t\tif ( !CanPrestige() ) return false;\r\n\r\n\t\t// \u0421\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u043C \u043E\u0431\u044B\u0447\u043D\u044B\u0435 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043A\u0440\u0435\u0434\u0438\u0442\u044B\r\n\t\tForceLevel = 0;\r\n\t\tMassLevel = 0;\r\n\t\tEnergyLevel = 0;\r\n\t\tCredits = 0;\r\n\r\n\t\t// \u041F\u043E\u0432\u044B\u0448\u0430\u0435\u043C \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u043F\u0440\u0435\u0441\u0442\u0438\u0436\u0430 \u0438 \u0432\u044B\u0434\u0430\u0435\u043C \u0442\u043E\u043A\u0435\u043D\u044B\r\n\t\tPrestigeLevel\u002B\u002B;\r\n\t\tPrestigeTokens \u002B= 1;\r\n\r\n\t\tSaveProgress();\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic void SaveProgress()\r\n\t{\r\n\t\tvar data = new ProgressData\r\n\t\t{\r\n\t\t\tCredits = this.Credits,\r\n\t\t\tForceLevel = this.ForceLevel,\r\n\t\t\tMassLevel = this.MassLevel,\r\n\t\t\tEnergyLevel = this.EnergyLevel,\r\n\t\t\tPrestigeLevel = this.PrestigeLevel,\r\n\t\t\tPrestigeTokens = this.PrestigeTokens\r\n\t\t};\r\n\r\n\t\tFileSystem.Data.WriteJson( SAVE_FILE, data );\r\n\t}\r\n\r\n\tpublic void LoadProgress()\r\n\t{\r\n\t\tif ( FileSystem.Data.FileExists( SAVE_FILE ) )\r\n\t\t{\r\n\t\t\tvar data = FileSystem.Data.ReadJson\u003CProgressData\u003E( SAVE_FILE );\r\n\t\t\tif ( data != null )\r\n\t\t\t{\r\n\t\t\t\tCredits = data.Credits;\r\n\t\t\t\tForceLevel = data.ForceLevel;\r\n\t\t\t\tMassLevel = data.MassLevel;\r\n\t\t\t\tEnergyLevel = data.EnergyLevel;\r\n\t\t\t\tPrestigeLevel = data.PrestigeLevel;\r\n\t\t\t\tPrestigeTokens = data.PrestigeTokens;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate class ProgressData\r\n\t{\r\n\t\tpublic int Credits { get; set; }\r\n\t\tpublic int ForceLevel { get; set; }\r\n\t\tpublic int MassLevel { get; set; }\r\n\t\tpublic int EnergyLevel { get; set; }\r\n\t\tpublic int PrestigeLevel { get; set; }\r\n\t\tpublic int PrestigeTokens { get; set; }\r\n\t}\r\n}"},{"Ident":"cherkbyte.one_more_push","Path":"ModeController.cs","FileName":"ModeController.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":410999,"IsPrivate":false,"Code":"using Sandbox;\r\n\r\npublic enum GameMode\r\n{\r\n    SumoPush,\r\n    NextbotRun\r\n}\r\n\r\npublic enum Language\r\n{\r\n    English,\r\n    Russian\r\n}\r\n\r\npublic sealed class ModeController : Component\r\n{\r\n    public static ModeController Instance { get; private set; }\r\n\r\n    [Property] public GameMode SelectedMode { get; set; } = GameMode.SumoPush;\r\n    [Property] public Language CurrentLanguage { get; set; } = Language.Russian;\r\n    [Property] public float MasterVolume { get; set; } = 1.0f;\r\n\r\n    [Property] public SceneFile SumoScene { get; set; }\r\n    [Property] public SceneFile NextbotScene { get; set; }\r\n\r\n    protected override void OnAwake()\r\n    {\r\n        Instance = this;\r\n    }\r\n\r\n    public void SelectMode( GameMode mode )\r\n    {\r\n        SelectedMode = mode;\r\n\r\n        if ( mode == GameMode.SumoPush )\r\n        {\r\n            if ( SumoScene != null )\r\n                Game.ActiveScene.Load( SumoScene );\r\n            else\r\n                Game.ActiveScene.LoadFromFile( \u0022scenes/onemore.scene\u0022 );\r\n        }\r\n        else if ( mode == GameMode.NextbotRun )\r\n        {\r\n            if ( NextbotScene != null )\r\n                Game.ActiveScene.Load( NextbotScene );\r\n            else\r\n                Game.ActiveScene.LoadFromFile( \u0022scenes/onemores2.scene\u0022 );\r\n        }\r\n    }\r\n\r\n    public void ToggleLanguage()\r\n    {\r\n        CurrentLanguage = CurrentLanguage == Language.Russian ? Language.English : Language.Russian;\r\n    }\r\n\r\n    public string GetText( string key )\r\n    {\r\n        bool isRu = CurrentLanguage == Language.Russian;\r\n\r\n        return key switch\r\n        {\r\n            \u0022game_title\u0022 =\u003E \u0022ONE MORE PUSH\u0022,\r\n            \u0022title\u0022 =\u003E isRu ? \u0022\u0412\u042B\u0411\u0415\u0420\u0418\u0422\u0415 \u0420\u0415\u0416\u0418\u041C\u0022 : \u0022SELECT GAME MODE\u0022,\r\n            \u0022subtitle\u0022 =\u003E isRu ? \u0022\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043C \u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0439\u0442\u0435\u0441\u044C \u043D\u0430 \u0430\u0440\u0435\u043D\u0443\u0022 : \u0022Choose your mode and jump into action\u0022,\r\n            \u0022sumo_title\u0022 =\u003E \u0022SUMO PUSH\u0022,\r\n            \u0022sumo_tag\u0022 =\u003E isRu ? \u0022\u041A\u041B\u0410\u0421\u0421\u0418\u041A\u0410\u0022 : \u0022CLASSIC\u0022,\r\n            \u0022sumo_desc\u0022 =\u003E isRu ? \u0022\u0422\u043E\u043B\u043A\u0430\u0439 \u0432\u0440\u0430\u0433\u043E\u0432 \u0438 \u0431\u043E\u0442\u043E\u0432 \u0441 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u043A\u0430 \u043E\u043D\u0430 \u0441\u0443\u0436\u0430\u0435\u0442\u0441\u044F!\u0022 : \u0022Push enemies and bots off the platform before it shrinks!\u0022,\r\n            \u0022nextbot_title\u0022 =\u003E \u0022NEXTBOT RUN\u0022,\r\n            \u0022nextbot_tag\u0022 =\u003E isRu ? \u0022\u0421\u041A\u041E\u0420\u041E\u0022 : \u0022COMING SOON\u0022,\r\n            \u0022nextbot_desc\u0022 =\u003E isRu ? \u0022\u0423\u0431\u0435\u0433\u0430\u0439 \u043E\u0442 \u043D\u0435\u043A\u0441\u0442\u0431\u043E\u0442\u043E\u0432, \u0441\u043F\u0430\u0441\u0430\u0439 \u043D\u043E\u043A\u0430\u0443\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0441\u043E\u044E\u0437\u043D\u0438\u043A\u043E\u0432 \u0438 \u0432\u044B\u0436\u0438\u0432\u0430\u0439!\u0022 : \u0022Run from nextbots, revive fallen teammates, and survive!\u0022,\r\n            \u0022lang_btn\u0022 =\u003E isRu ? \u0022RU\u0022 : \u0022EN\u0022,\r\n            \u0022settings_btn\u0022 =\u003E isRu ? \u0022\u041D\u0410\u0421\u0422\u0420\u041E\u0419\u041A\u0418\u0022 : \u0022SETTINGS\u0022,\r\n            \u0022exit_btn\u0022 =\u003E isRu ? \u0022\u0412\u042B\u0425\u041E\u0414\u0022 : \u0022EXIT\u0022,\r\n            \u0022settings_title\u0022 =\u003E isRu ? \u0022\u041D\u0410\u0421\u0422\u0420\u041E\u0419\u041A\u0418\u0022 : \u0022SETTINGS\u0022,\r\n            \u0022volume_label\u0022 =\u003E isRu ? \u0022\u0413\u0440\u043E\u043C\u043A\u043E\u0441\u0442\u044C \u0437\u0432\u0443\u043A\u0430\u0022 : \u0022Master Volume\u0022,\r\n            \u0022controls_title\u0022 =\u003E isRu ? \u0022\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435\u0022 : \u0022Controls\u0022,\r\n            \u0022ctrl_move\u0022 =\u003E isRu ? \u0022WASD \u2014 \u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435\u0022 : \u0022WASD \u2014 Movement\u0022,\r\n            \u0022ctrl_action\u0022 =\u003E isRu ? \u0022\u041B\u041A\u041C / E \u2014 \u0410\u0442\u0430\u043A\u0430 / \u0421\u043F\u0430\u0441\u0435\u043D\u0438\u0435\u0022 : \u0022LMB / E \u2014 Push / Revive\u0022,\r\n            \u0022ctrl_space\u0022 =\u003E isRu ? \u0022\u041F\u0440\u043E\u0431\u0435\u043B \u2014 \u041F\u0440\u044B\u0436\u043E\u043A\u0022 : \u0022Space \u2014 Jump\u0022,\r\n            \u0022close_btn\u0022 =\u003E isRu ? \u0022\u0417\u0410\u041A\u0420\u042B\u0422\u042C\u0022 : \u0022CLOSE\u0022,\r\n            \u0022news_title\u0022 =\u003E isRu ? \u0022\u041D\u041E\u0412\u041E\u0421\u0422\u0418 \u0418 \u041E\u0411\u041D\u041E\u0412\u041B\u0415\u041D\u0418\u042F\u0022 : \u0022NEWS \u0026 UPDATES\u0022,\r\n            \u0022news_tag_new\u0022 =\u003E isRu ? \u0022\u041F\u0410\u0422\u0427 1.2\u0022 : \u0022PATCH 1.2\u0022,\r\n            \u0022news_item1_title\u0022 =\u003E isRu ? \u0022\u0420\u0435\u0436\u0438\u043C Nextbot Run\u0022 : \u0022Nextbot Run Mode\u0022,\r\n            \u0022news_item1_desc\u0022 =\u003E isRu ? \u0022\u0420\u0435\u0436\u0438\u043C \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u0438 \u0441\u043A\u043E\u0440\u043E \u0431\u0443\u0434\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D!\u0022 : \u0022Mode in development and coming soon!\u0022,\r\n            \u0022news_item2_title\u0022 =\u003E isRu ? \u0022\u041E\u0431\u043D\u043E\u0432\u043B\u0451\u043D\u043D\u044B\u0439 Glass UI\u0022 : \u0022New Glass UI\u0022,\r\n            \u0022news_item2_desc\u0022 =\u003E isRu ? \u0022\u0421\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0437\u0432\u0443\u043A\u0430, \u0432\u044B\u0431\u043E\u0440 \u044F\u0437\u044B\u043A\u0430 \u0438 \u044D\u043A\u0440\u0430\u043D \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438.\u0022 : \u0022Sleek glass UI design, audio settings, multi-language support \u0026 loading screen.\u0022,\r\n            \u0022news_item3_title\u0022 =\u003E isRu ? \u0022\u0411\u0430\u043B\u0430\u043D\u0441 Sumo Push\u0022 : \u0022Sumo Push Balance\u0022,\r\n            \u0022news_item3_desc\u0022 =\u003E isRu ? \u0022\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0430 \u0444\u0438\u0437\u0438\u043A\u0430 \u0442\u043E\u043B\u0447\u043A\u043E\u0432 \u0438 \u0443\u0441\u043A\u043E\u0440\u0435\u043D\u0430 \u0434\u0438\u043D\u0430\u043C\u0438\u043A\u0430 \u0441\u0443\u0436\u0435\u043D\u0438\u044F \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B!\u0022 : \u0022Improved push physics and faster platform shrinking dynamics!\u0022,\r\n            \u0022loading_title\u0022 =\u003E isRu ? \u0022\u0417\u0410\u0413\u0420\u0423\u0417\u041A\u0410 \u0410\u0420\u0415\u041D\u042B...\u0022 : \u0022LOADING ARENA...\u0022,\r\n            \u0022loading_sub\u0022 =\u003E isRu ? \u0022\u041F\u043E\u0434\u0433\u043E\u0442\u043E\u0432\u043A\u0430 \u0433\u0435\u043E\u043C\u0435\u0442\u0440\u0438\u0438 \u0438 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432...\u0022 : \u0022Preparing geometry and spawning objects...\u0022,\r\n            \u0022tip_label\u0022 =\u003E isRu ? \u0022\u0421\u041E\u0412\u0415\u0422:\u0022 : \u0022TIP:\u0022,\r\n            \u0022tip_sumo\u0022 =\u003E isRu ? \u0022\u0421\u043B\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043C\u0438\u0433\u0430\u044E\u0449\u0438\u043C\u0438 \u0431\u043B\u043E\u043A\u0430\u043C\u0438 \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u044B \u2014 \u043E\u043D\u0438 \u0443\u043F\u0430\u0434\u0443\u0442 \u043F\u0435\u0440\u0432\u044B\u043C\u0438!\u0022 : \u0022Watch out for flashing platform blocks \u2014 they fall first!\u0022,\r\n            \u0022tip_nextbot\u0022 =\u003E isRu ? \u0022\u0414\u0435\u0440\u0436\u0430\u0442\u044C\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0441\u043E\u044E\u0437\u043D\u0438\u043A\u0430\u043C\u0438 \u043F\u0440\u043E\u0449\u0435: \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u0431\u044B\u0441\u0442\u0440\u0435\u0435 \u043F\u043E\u0434\u043D\u044F\u0442\u044C \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430!\u0022 : \u0022Stick together with teammates: reviving is much faster when close!\u0022,\r\n            _ =\u003E key\r\n        };\r\n    }\r\n}"}]}