diff --git a/.gitignore b/.gitignore
index 590a8dad..1a128a64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,5 @@ bld/
.vscode
/dockerbuild
.idea/*
+
+__pycache__/
diff --git a/AMBuilder b/AMBuilder
index 66d4347d..9ab20344 100644
--- a/AMBuilder
+++ b/AMBuilder
@@ -58,6 +58,8 @@ for sdk_target in MMSPlugin.sdk_targets:
'src/discord.cpp',
'src/map_votes.cpp',
'src/entwatch.cpp',
+ 'src/entwatch_hud.cpp',
+ 'src/entwatch_hud_worldtext.cpp',
'src/user_preferences.cpp',
'src/zombiereborn.cpp',
'src/customio.cpp',
diff --git a/PackageScript b/PackageScript
index b68cbc84..8cb0acc8 100644
--- a/PackageScript
+++ b/PackageScript
@@ -105,6 +105,12 @@ for task in MMSPlugin.binaries:
packages[sdk_name].addBinary(task.debug)
# Add custom stuff here
+ panorama_root = os.path.join(builder.sourcePath, 'assets', 'panorama')
+ for resource in glob.glob(os.path.join(panorama_root, '**', '*_c'), recursive = True):
+ relative_path = os.path.relpath(resource, panorama_root)
+ destination = os.path.join(packages[sdk_name].sdk_name, 'panorama', relative_path)
+ builder.AddFolder(os.path.dirname(destination))
+ builder.AddCopy(resource, destination)
builder.AddFolder(os.path.join(packages[sdk_name].sdk_name, 'addons', MMSPlugin.metadata['name'], 'data'))
configs_folder = builder.AddFolder(os.path.join(packages[sdk_name].sdk_name, 'addons', MMSPlugin.metadata['name'], 'configs'))
zr_folder = builder.AddFolder(os.path.join(packages[sdk_name].sdk_name, 'addons', MMSPlugin.metadata['name'], 'configs', 'zr'))
diff --git a/assets/panorama/layout/custom_game/hud.vxml_c b/assets/panorama/layout/custom_game/hud.vxml_c
new file mode 100644
index 00000000..8200bafe
Binary files /dev/null and b/assets/panorama/layout/custom_game/hud.vxml_c differ
diff --git a/assets/panorama/styles/entwatch/hud.vcss_c b/assets/panorama/styles/entwatch/hud.vcss_c
new file mode 100644
index 00000000..31e8872b
Binary files /dev/null and b/assets/panorama/styles/entwatch/hud.vcss_c differ
diff --git a/assets_source/panorama/README.md b/assets_source/panorama/README.md
new file mode 100644
index 00000000..5ff5e4d6
--- /dev/null
+++ b/assets_source/panorama/README.md
@@ -0,0 +1,45 @@
+`layout/custom_game/hud.xml` and `styles/entwatch/hud.css` are **generated**; do not edit them by hand. Edit the files in `templates/` (`hud.base.css`, `hud.base.xml`, `item.xml`) or the base item geometry in `scripts/generate-panorama.py`, then regenerate. The row count (`MaxRows`), position cap (`EW_PANORAMA_POS_MAX`) and size range (`EW_PANORAMA_SIZE_MIN/MAX`) are read from `src/entwatch_hud.cpp` and `src/entwatch_hud.h`, so changing them there and regenerating keeps the classes in sync.
+
+```
+python scripts/generate-panorama.py # regenerate hud.xml / hud.css
+python scripts/generate-panorama.py --check # fail if they are out of date
+```
+
+With CS2 Workshop Tools installed, regenerate and compile from the repository root (any OS the tools run on; `--cs2-root` can also be given as the `CS2_ROOT` environment variable):
+
+```
+python scripts/compile-panorama.py --cs2-root "F:\steamgames\steamapps\common\Counter-Strike Global Offensive"
+```
+
+The script stages a local `cs2fixes_hud` addon and copies its compiled VXML/CSS into `assets/panorama`. AMBuild packages those resources under `package/cs2/panorama`, alongside the existing sounds and particles. Rebuild CS2Fixes after compiling.
+
+The compiled `assets/panorama/**/*_c` files are checked in, so ordinary and release builds do not need Workshop Tools. After changing anything under `assets_source/panorama`, recompile with the script above and commit the updated resources. `--destination` optionally selects an alternate output directory for the compiler script.
+
+Install the package into `game/csgo`. Clients must also have these resources installed or mounted through an addon; installing a server plugin does not distribute files to clients. The staged local addon is available for Workshop Tools testing.
+
+The item HUD uses one shared `custom_hud_layout` with per-player classes and dialog variables. `src/entwatch.cpp` gathers held items; `src/entwatch_hud.cpp` implements Panorama and renderer selection, while `src/entwatch_hud_worldtext.cpp` preserves the world-text renderer without any Panorama dependency. It shows up to 64 stacked items and an overflow count. Only configured, held items with `ui: true` are shown. No client scripts are required.
+
+`!hudstyle old`, `!hudstyle new`, or `!hudstyle default` select a renderer and persist the player's preference; bare `!hudstyle` toggles. `entwatch_hud_style 0/1` selects the server default for players without an override. `!hud` still cycles visibility and owner names. `!hudpos` and `!hudsize` configure the currently selected renderer. Each renderer keeps its own position and size. `!hudcolor` still customizes world text; Panorama colors live in the CSS.
+
+The green reload icon represents the item's EntWatch ability cooldown. The orange ammo icon represents remaining configured uses or a math-counter value, not the weapon's bullet magazine. Multiple visible handlers are separated with `|`. Items without these handlers show their normal ready state.
+
+`!hudpos [x y|reset]` configures the active style: world-space coordinates for old HUD, whole screen percentages (0-95) for Panorama. Panorama defaults to 2% left / 15% top; keep enough space to the right and below for the item list.
+
+`!hudsize [size|reset]` configures the active style: old HUD font size (20-255, default 60), or Panorama size as a whole percentage (50-200, default 100). Panorama scales the rows, padding, fonts and icons together while keeping its screen anchor. Bare commands report the active style's values. Client console equivalents are `c_hudpos` and `c_hudsize`.
+
+World text retains the existing `entwatch_hudpos_x`, `entwatch_hudpos_y`, and `entwatch_hudfontsize` preference keys. Panorama uses separate `entwatch_panorama_hudpos_x`, `entwatch_panorama_hudpos_y`, and `entwatch_panorama_hudsize` keys. Both sets stay on the player independently of `entwatch_hud_style`. The user-preferences system keeps values in memory per player slot; persistence across reconnects/restarts requires the existing `cs2f_user_prefs_api` REST backend, keyed by SteamID. These commands do not write a local config file.
+
+Panorama item and owner names share one line, with long names ellipsized to preserve the right-aligned status area. Ammo appears before the cooldown; the green reload icon sits at the far right and rotates while cooling down. Size preferences scale the compact row and icon together.
+
+Player-name font size is 16px at 100% HUD size.
+
+If server-side Panorama resources are missing or entity creation fails, the HUD temporarily falls back to world text and retries at most once every 30 seconds. The player's selected renderer is retained. This cannot detect missing client-side resources. Enable `cs2f_entwatch_panorama_debug 1` for creation diagnostics; it is off by default. Normal disconnect/spawn timing does not generate warnings.
+
+Release verification still requires an in-game pass with the packaged resources on server and clients:
+
+- Pick up, transfer, drop and exhaust items; check cooldowns and multiple handlers in both renderers.
+- Switch styles, names-only mode and visibility; change/reset position and size independently for both styles.
+- Reconnect and change map/round, including after disabling EntWatch; check that player slots do not inherit HUD contents.
+- With the preference REST backend configured, reconnect and restart the server and verify both styles' settings. Check malformed numeric preferences and command arguments (`nan`, `inf`, overflow and trailing text).
+- Remove server-side resources in a test installation and verify the warning/fallback/retry behavior; restore resources and confirm recovery.
+- Exercise 64 players/items and overflow, long names, several resolutions and HUD sizes. Confirm readable text and acceptable network traffic.
diff --git a/assets_source/panorama/layout/custom_game/hud.xml b/assets_source/panorama/layout/custom_game/hud.xml
new file mode 100644
index 00000000..1ab12a3d
--- /dev/null
+++ b/assets_source/panorama/layout/custom_game/hud.xml
@@ -0,0 +1,712 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets_source/panorama/styles/entwatch/hud.css b/assets_source/panorama/styles/entwatch/hud.css
new file mode 100644
index 00000000..ea10d723
--- /dev/null
+++ b/assets_source/panorama/styles/entwatch/hud.css
@@ -0,0 +1,1580 @@
+.Root { width: 100%; height: 100%; }
+.EntWatch { horizontal-align: left; margin-left: 2%; margin-top: 15%; flow-children: down; max-height: 720px; overflow: squish scroll; }
+.Hidden { visibility: collapse; }
+.Item { width: 480px; padding: 8px 12px; margin-bottom: 5px; background-color: #121820e8; border-left: 3px solid #94a6bd; flow-children: right; }
+.Heading { width: fill-parent-flow(1); flow-children: right; vertical-align: center; }
+.ItemName { max-width: 50%; white-space: nowrap; text-overflow: ellipsis; vertical-align: center; font-family: Arial; font-size: 18px; font-weight: bold; color: #eef3fa; }
+.Owner { width: fill-parent-flow(1); margin-left: 8px; white-space: nowrap; text-overflow: ellipsis; vertical-align: center; font-family: Arial; font-size: 16px; color: #a6b1c2; }
+.NamesOnly .Owner { visibility: collapse; }
+.NamesOnly .ItemName { max-width: 100%; }
+.Status { flow-children: right; margin-left: 12px; vertical-align: center; }
+.Status Label { vertical-align: center; font-family: Arial; font-size: 16px; }
+.Icon { margin-right: 5px; font-size: 19px; }
+.Cooldown { visibility: collapse; flow-children: right; vertical-align: center; }
+.Cooldown Label { color: #62df87; }
+.Reloading .Cooldown { visibility: visible; }
+.Ammo { visibility: collapse; flow-children: right; margin-right: 12px; vertical-align: center; }
+.Ammo Label { color: #ffbd55; }
+.HasAmmo .Ammo { visibility: visible; }
+.Ready { color: #a6b1c2; }
+.Reloading .Ready, .HasAmmo .Ready { visibility: collapse; }
+.Overflow { font-family: Arial; font-size: 14px; color: #a6b1c2; }
+
+/* Screen-space percentages, selected independently for each player. */
+.EntWatch.PosX0 { margin-left: 0%; }
+.EntWatch.PosY0 { margin-top: 0%; }
+.EntWatch.PosX1 { margin-left: 1%; }
+.EntWatch.PosY1 { margin-top: 1%; }
+.EntWatch.PosX2 { margin-left: 2%; }
+.EntWatch.PosY2 { margin-top: 2%; }
+.EntWatch.PosX3 { margin-left: 3%; }
+.EntWatch.PosY3 { margin-top: 3%; }
+.EntWatch.PosX4 { margin-left: 4%; }
+.EntWatch.PosY4 { margin-top: 4%; }
+.EntWatch.PosX5 { margin-left: 5%; }
+.EntWatch.PosY5 { margin-top: 5%; }
+.EntWatch.PosX6 { margin-left: 6%; }
+.EntWatch.PosY6 { margin-top: 6%; }
+.EntWatch.PosX7 { margin-left: 7%; }
+.EntWatch.PosY7 { margin-top: 7%; }
+.EntWatch.PosX8 { margin-left: 8%; }
+.EntWatch.PosY8 { margin-top: 8%; }
+.EntWatch.PosX9 { margin-left: 9%; }
+.EntWatch.PosY9 { margin-top: 9%; }
+.EntWatch.PosX10 { margin-left: 10%; }
+.EntWatch.PosY10 { margin-top: 10%; }
+.EntWatch.PosX11 { margin-left: 11%; }
+.EntWatch.PosY11 { margin-top: 11%; }
+.EntWatch.PosX12 { margin-left: 12%; }
+.EntWatch.PosY12 { margin-top: 12%; }
+.EntWatch.PosX13 { margin-left: 13%; }
+.EntWatch.PosY13 { margin-top: 13%; }
+.EntWatch.PosX14 { margin-left: 14%; }
+.EntWatch.PosY14 { margin-top: 14%; }
+.EntWatch.PosX15 { margin-left: 15%; }
+.EntWatch.PosY15 { margin-top: 15%; }
+.EntWatch.PosX16 { margin-left: 16%; }
+.EntWatch.PosY16 { margin-top: 16%; }
+.EntWatch.PosX17 { margin-left: 17%; }
+.EntWatch.PosY17 { margin-top: 17%; }
+.EntWatch.PosX18 { margin-left: 18%; }
+.EntWatch.PosY18 { margin-top: 18%; }
+.EntWatch.PosX19 { margin-left: 19%; }
+.EntWatch.PosY19 { margin-top: 19%; }
+.EntWatch.PosX20 { margin-left: 20%; }
+.EntWatch.PosY20 { margin-top: 20%; }
+.EntWatch.PosX21 { margin-left: 21%; }
+.EntWatch.PosY21 { margin-top: 21%; }
+.EntWatch.PosX22 { margin-left: 22%; }
+.EntWatch.PosY22 { margin-top: 22%; }
+.EntWatch.PosX23 { margin-left: 23%; }
+.EntWatch.PosY23 { margin-top: 23%; }
+.EntWatch.PosX24 { margin-left: 24%; }
+.EntWatch.PosY24 { margin-top: 24%; }
+.EntWatch.PosX25 { margin-left: 25%; }
+.EntWatch.PosY25 { margin-top: 25%; }
+.EntWatch.PosX26 { margin-left: 26%; }
+.EntWatch.PosY26 { margin-top: 26%; }
+.EntWatch.PosX27 { margin-left: 27%; }
+.EntWatch.PosY27 { margin-top: 27%; }
+.EntWatch.PosX28 { margin-left: 28%; }
+.EntWatch.PosY28 { margin-top: 28%; }
+.EntWatch.PosX29 { margin-left: 29%; }
+.EntWatch.PosY29 { margin-top: 29%; }
+.EntWatch.PosX30 { margin-left: 30%; }
+.EntWatch.PosY30 { margin-top: 30%; }
+.EntWatch.PosX31 { margin-left: 31%; }
+.EntWatch.PosY31 { margin-top: 31%; }
+.EntWatch.PosX32 { margin-left: 32%; }
+.EntWatch.PosY32 { margin-top: 32%; }
+.EntWatch.PosX33 { margin-left: 33%; }
+.EntWatch.PosY33 { margin-top: 33%; }
+.EntWatch.PosX34 { margin-left: 34%; }
+.EntWatch.PosY34 { margin-top: 34%; }
+.EntWatch.PosX35 { margin-left: 35%; }
+.EntWatch.PosY35 { margin-top: 35%; }
+.EntWatch.PosX36 { margin-left: 36%; }
+.EntWatch.PosY36 { margin-top: 36%; }
+.EntWatch.PosX37 { margin-left: 37%; }
+.EntWatch.PosY37 { margin-top: 37%; }
+.EntWatch.PosX38 { margin-left: 38%; }
+.EntWatch.PosY38 { margin-top: 38%; }
+.EntWatch.PosX39 { margin-left: 39%; }
+.EntWatch.PosY39 { margin-top: 39%; }
+.EntWatch.PosX40 { margin-left: 40%; }
+.EntWatch.PosY40 { margin-top: 40%; }
+.EntWatch.PosX41 { margin-left: 41%; }
+.EntWatch.PosY41 { margin-top: 41%; }
+.EntWatch.PosX42 { margin-left: 42%; }
+.EntWatch.PosY42 { margin-top: 42%; }
+.EntWatch.PosX43 { margin-left: 43%; }
+.EntWatch.PosY43 { margin-top: 43%; }
+.EntWatch.PosX44 { margin-left: 44%; }
+.EntWatch.PosY44 { margin-top: 44%; }
+.EntWatch.PosX45 { margin-left: 45%; }
+.EntWatch.PosY45 { margin-top: 45%; }
+.EntWatch.PosX46 { margin-left: 46%; }
+.EntWatch.PosY46 { margin-top: 46%; }
+.EntWatch.PosX47 { margin-left: 47%; }
+.EntWatch.PosY47 { margin-top: 47%; }
+.EntWatch.PosX48 { margin-left: 48%; }
+.EntWatch.PosY48 { margin-top: 48%; }
+.EntWatch.PosX49 { margin-left: 49%; }
+.EntWatch.PosY49 { margin-top: 49%; }
+.EntWatch.PosX50 { margin-left: 50%; }
+.EntWatch.PosY50 { margin-top: 50%; }
+.EntWatch.PosX51 { margin-left: 51%; }
+.EntWatch.PosY51 { margin-top: 51%; }
+.EntWatch.PosX52 { margin-left: 52%; }
+.EntWatch.PosY52 { margin-top: 52%; }
+.EntWatch.PosX53 { margin-left: 53%; }
+.EntWatch.PosY53 { margin-top: 53%; }
+.EntWatch.PosX54 { margin-left: 54%; }
+.EntWatch.PosY54 { margin-top: 54%; }
+.EntWatch.PosX55 { margin-left: 55%; }
+.EntWatch.PosY55 { margin-top: 55%; }
+.EntWatch.PosX56 { margin-left: 56%; }
+.EntWatch.PosY56 { margin-top: 56%; }
+.EntWatch.PosX57 { margin-left: 57%; }
+.EntWatch.PosY57 { margin-top: 57%; }
+.EntWatch.PosX58 { margin-left: 58%; }
+.EntWatch.PosY58 { margin-top: 58%; }
+.EntWatch.PosX59 { margin-left: 59%; }
+.EntWatch.PosY59 { margin-top: 59%; }
+.EntWatch.PosX60 { margin-left: 60%; }
+.EntWatch.PosY60 { margin-top: 60%; }
+.EntWatch.PosX61 { margin-left: 61%; }
+.EntWatch.PosY61 { margin-top: 61%; }
+.EntWatch.PosX62 { margin-left: 62%; }
+.EntWatch.PosY62 { margin-top: 62%; }
+.EntWatch.PosX63 { margin-left: 63%; }
+.EntWatch.PosY63 { margin-top: 63%; }
+.EntWatch.PosX64 { margin-left: 64%; }
+.EntWatch.PosY64 { margin-top: 64%; }
+.EntWatch.PosX65 { margin-left: 65%; }
+.EntWatch.PosY65 { margin-top: 65%; }
+.EntWatch.PosX66 { margin-left: 66%; }
+.EntWatch.PosY66 { margin-top: 66%; }
+.EntWatch.PosX67 { margin-left: 67%; }
+.EntWatch.PosY67 { margin-top: 67%; }
+.EntWatch.PosX68 { margin-left: 68%; }
+.EntWatch.PosY68 { margin-top: 68%; }
+.EntWatch.PosX69 { margin-left: 69%; }
+.EntWatch.PosY69 { margin-top: 69%; }
+.EntWatch.PosX70 { margin-left: 70%; }
+.EntWatch.PosY70 { margin-top: 70%; }
+.EntWatch.PosX71 { margin-left: 71%; }
+.EntWatch.PosY71 { margin-top: 71%; }
+.EntWatch.PosX72 { margin-left: 72%; }
+.EntWatch.PosY72 { margin-top: 72%; }
+.EntWatch.PosX73 { margin-left: 73%; }
+.EntWatch.PosY73 { margin-top: 73%; }
+.EntWatch.PosX74 { margin-left: 74%; }
+.EntWatch.PosY74 { margin-top: 74%; }
+.EntWatch.PosX75 { margin-left: 75%; }
+.EntWatch.PosY75 { margin-top: 75%; }
+.EntWatch.PosX76 { margin-left: 76%; }
+.EntWatch.PosY76 { margin-top: 76%; }
+.EntWatch.PosX77 { margin-left: 77%; }
+.EntWatch.PosY77 { margin-top: 77%; }
+.EntWatch.PosX78 { margin-left: 78%; }
+.EntWatch.PosY78 { margin-top: 78%; }
+.EntWatch.PosX79 { margin-left: 79%; }
+.EntWatch.PosY79 { margin-top: 79%; }
+.EntWatch.PosX80 { margin-left: 80%; }
+.EntWatch.PosY80 { margin-top: 80%; }
+.EntWatch.PosX81 { margin-left: 81%; }
+.EntWatch.PosY81 { margin-top: 81%; }
+.EntWatch.PosX82 { margin-left: 82%; }
+.EntWatch.PosY82 { margin-top: 82%; }
+.EntWatch.PosX83 { margin-left: 83%; }
+.EntWatch.PosY83 { margin-top: 83%; }
+.EntWatch.PosX84 { margin-left: 84%; }
+.EntWatch.PosY84 { margin-top: 84%; }
+.EntWatch.PosX85 { margin-left: 85%; }
+.EntWatch.PosY85 { margin-top: 85%; }
+.EntWatch.PosX86 { margin-left: 86%; }
+.EntWatch.PosY86 { margin-top: 86%; }
+.EntWatch.PosX87 { margin-left: 87%; }
+.EntWatch.PosY87 { margin-top: 87%; }
+.EntWatch.PosX88 { margin-left: 88%; }
+.EntWatch.PosY88 { margin-top: 88%; }
+.EntWatch.PosX89 { margin-left: 89%; }
+.EntWatch.PosY89 { margin-top: 89%; }
+.EntWatch.PosX90 { margin-left: 90%; }
+.EntWatch.PosY90 { margin-top: 90%; }
+.EntWatch.PosX91 { margin-left: 91%; }
+.EntWatch.PosY91 { margin-top: 91%; }
+.EntWatch.PosX92 { margin-left: 92%; }
+.EntWatch.PosY92 { margin-top: 92%; }
+.EntWatch.PosX93 { margin-left: 93%; }
+.EntWatch.PosY93 { margin-top: 93%; }
+.EntWatch.PosX94 { margin-left: 94%; }
+.EntWatch.PosY94 { margin-top: 94%; }
+.EntWatch.PosX95 { margin-left: 95%; }
+.EntWatch.PosY95 { margin-top: 95%; }
+
+.ReloadIcon { width: 22px; height: 22px; margin-left: 5px; margin-right: 0px; text-align: center; vertical-align: center; }
+.Reloading .ReloadIcon { animation-name: ReloadSpin; animation-duration: 1s; animation-timing-function: linear; animation-iteration-count: infinite; }
+@keyframes 'ReloadSpin' { 0% { transform: rotateZ(0deg); } 100% { transform: rotateZ(360deg); } }
+
+/* Per-player size scales row geometry and typography, preserving screen position. */
+.EntWatch.Size50 .Item { width: 240px; padding: 4px 6px; margin-bottom: 2.5px; border-left-width: 1.5px; }
+.EntWatch.Size50 .ItemName { font-size: 9px; }
+.EntWatch.Size50 .Owner { font-size: 8px; margin-left: 4px; }
+.EntWatch.Size50 .Status { margin-left: 6px; }
+.EntWatch.Size50 .Status Label { font-size: 8px; }
+.EntWatch.Size50 .Status .Icon { font-size: 9.5px; margin-right: 2.5px; }
+.EntWatch.Size50 .Status .ReloadIcon { width: 11px; height: 11px; margin-left: 2.5px; margin-right: 0px; }
+.EntWatch.Size50 .Ammo { margin-right: 6px; }
+.EntWatch.Size50 .Overflow { font-size: 7px; }
+.EntWatch.Size51 .Item { width: 244.8px; padding: 4.08px 6.12px; margin-bottom: 2.55px; border-left-width: 1.53px; }
+.EntWatch.Size51 .ItemName { font-size: 9.18px; }
+.EntWatch.Size51 .Owner { font-size: 8.16px; margin-left: 4.08px; }
+.EntWatch.Size51 .Status { margin-left: 6.12px; }
+.EntWatch.Size51 .Status Label { font-size: 8.16px; }
+.EntWatch.Size51 .Status .Icon { font-size: 9.69px; margin-right: 2.55px; }
+.EntWatch.Size51 .Status .ReloadIcon { width: 11.22px; height: 11.22px; margin-left: 2.55px; margin-right: 0px; }
+.EntWatch.Size51 .Ammo { margin-right: 6.12px; }
+.EntWatch.Size51 .Overflow { font-size: 7.14px; }
+.EntWatch.Size52 .Item { width: 249.6px; padding: 4.16px 6.24px; margin-bottom: 2.6px; border-left-width: 1.56px; }
+.EntWatch.Size52 .ItemName { font-size: 9.36px; }
+.EntWatch.Size52 .Owner { font-size: 8.32px; margin-left: 4.16px; }
+.EntWatch.Size52 .Status { margin-left: 6.24px; }
+.EntWatch.Size52 .Status Label { font-size: 8.32px; }
+.EntWatch.Size52 .Status .Icon { font-size: 9.88px; margin-right: 2.6px; }
+.EntWatch.Size52 .Status .ReloadIcon { width: 11.44px; height: 11.44px; margin-left: 2.6px; margin-right: 0px; }
+.EntWatch.Size52 .Ammo { margin-right: 6.24px; }
+.EntWatch.Size52 .Overflow { font-size: 7.28px; }
+.EntWatch.Size53 .Item { width: 254.4px; padding: 4.24px 6.36px; margin-bottom: 2.65px; border-left-width: 1.59px; }
+.EntWatch.Size53 .ItemName { font-size: 9.54px; }
+.EntWatch.Size53 .Owner { font-size: 8.48px; margin-left: 4.24px; }
+.EntWatch.Size53 .Status { margin-left: 6.36px; }
+.EntWatch.Size53 .Status Label { font-size: 8.48px; }
+.EntWatch.Size53 .Status .Icon { font-size: 10.07px; margin-right: 2.65px; }
+.EntWatch.Size53 .Status .ReloadIcon { width: 11.66px; height: 11.66px; margin-left: 2.65px; margin-right: 0px; }
+.EntWatch.Size53 .Ammo { margin-right: 6.36px; }
+.EntWatch.Size53 .Overflow { font-size: 7.42px; }
+.EntWatch.Size54 .Item { width: 259.2px; padding: 4.32px 6.48px; margin-bottom: 2.7px; border-left-width: 1.62px; }
+.EntWatch.Size54 .ItemName { font-size: 9.72px; }
+.EntWatch.Size54 .Owner { font-size: 8.64px; margin-left: 4.32px; }
+.EntWatch.Size54 .Status { margin-left: 6.48px; }
+.EntWatch.Size54 .Status Label { font-size: 8.64px; }
+.EntWatch.Size54 .Status .Icon { font-size: 10.26px; margin-right: 2.7px; }
+.EntWatch.Size54 .Status .ReloadIcon { width: 11.88px; height: 11.88px; margin-left: 2.7px; margin-right: 0px; }
+.EntWatch.Size54 .Ammo { margin-right: 6.48px; }
+.EntWatch.Size54 .Overflow { font-size: 7.56px; }
+.EntWatch.Size55 .Item { width: 264px; padding: 4.4px 6.6px; margin-bottom: 2.75px; border-left-width: 1.65px; }
+.EntWatch.Size55 .ItemName { font-size: 9.9px; }
+.EntWatch.Size55 .Owner { font-size: 8.8px; margin-left: 4.4px; }
+.EntWatch.Size55 .Status { margin-left: 6.6px; }
+.EntWatch.Size55 .Status Label { font-size: 8.8px; }
+.EntWatch.Size55 .Status .Icon { font-size: 10.45px; margin-right: 2.75px; }
+.EntWatch.Size55 .Status .ReloadIcon { width: 12.1px; height: 12.1px; margin-left: 2.75px; margin-right: 0px; }
+.EntWatch.Size55 .Ammo { margin-right: 6.6px; }
+.EntWatch.Size55 .Overflow { font-size: 7.7px; }
+.EntWatch.Size56 .Item { width: 268.8px; padding: 4.48px 6.72px; margin-bottom: 2.8px; border-left-width: 1.68px; }
+.EntWatch.Size56 .ItemName { font-size: 10.08px; }
+.EntWatch.Size56 .Owner { font-size: 8.96px; margin-left: 4.48px; }
+.EntWatch.Size56 .Status { margin-left: 6.72px; }
+.EntWatch.Size56 .Status Label { font-size: 8.96px; }
+.EntWatch.Size56 .Status .Icon { font-size: 10.64px; margin-right: 2.8px; }
+.EntWatch.Size56 .Status .ReloadIcon { width: 12.32px; height: 12.32px; margin-left: 2.8px; margin-right: 0px; }
+.EntWatch.Size56 .Ammo { margin-right: 6.72px; }
+.EntWatch.Size56 .Overflow { font-size: 7.84px; }
+.EntWatch.Size57 .Item { width: 273.6px; padding: 4.56px 6.84px; margin-bottom: 2.85px; border-left-width: 1.71px; }
+.EntWatch.Size57 .ItemName { font-size: 10.26px; }
+.EntWatch.Size57 .Owner { font-size: 9.12px; margin-left: 4.56px; }
+.EntWatch.Size57 .Status { margin-left: 6.84px; }
+.EntWatch.Size57 .Status Label { font-size: 9.12px; }
+.EntWatch.Size57 .Status .Icon { font-size: 10.83px; margin-right: 2.85px; }
+.EntWatch.Size57 .Status .ReloadIcon { width: 12.54px; height: 12.54px; margin-left: 2.85px; margin-right: 0px; }
+.EntWatch.Size57 .Ammo { margin-right: 6.84px; }
+.EntWatch.Size57 .Overflow { font-size: 7.98px; }
+.EntWatch.Size58 .Item { width: 278.4px; padding: 4.64px 6.96px; margin-bottom: 2.9px; border-left-width: 1.74px; }
+.EntWatch.Size58 .ItemName { font-size: 10.44px; }
+.EntWatch.Size58 .Owner { font-size: 9.28px; margin-left: 4.64px; }
+.EntWatch.Size58 .Status { margin-left: 6.96px; }
+.EntWatch.Size58 .Status Label { font-size: 9.28px; }
+.EntWatch.Size58 .Status .Icon { font-size: 11.02px; margin-right: 2.9px; }
+.EntWatch.Size58 .Status .ReloadIcon { width: 12.76px; height: 12.76px; margin-left: 2.9px; margin-right: 0px; }
+.EntWatch.Size58 .Ammo { margin-right: 6.96px; }
+.EntWatch.Size58 .Overflow { font-size: 8.12px; }
+.EntWatch.Size59 .Item { width: 283.2px; padding: 4.72px 7.08px; margin-bottom: 2.95px; border-left-width: 1.77px; }
+.EntWatch.Size59 .ItemName { font-size: 10.62px; }
+.EntWatch.Size59 .Owner { font-size: 9.44px; margin-left: 4.72px; }
+.EntWatch.Size59 .Status { margin-left: 7.08px; }
+.EntWatch.Size59 .Status Label { font-size: 9.44px; }
+.EntWatch.Size59 .Status .Icon { font-size: 11.21px; margin-right: 2.95px; }
+.EntWatch.Size59 .Status .ReloadIcon { width: 12.98px; height: 12.98px; margin-left: 2.95px; margin-right: 0px; }
+.EntWatch.Size59 .Ammo { margin-right: 7.08px; }
+.EntWatch.Size59 .Overflow { font-size: 8.26px; }
+.EntWatch.Size60 .Item { width: 288px; padding: 4.8px 7.2px; margin-bottom: 3px; border-left-width: 1.8px; }
+.EntWatch.Size60 .ItemName { font-size: 10.8px; }
+.EntWatch.Size60 .Owner { font-size: 9.6px; margin-left: 4.8px; }
+.EntWatch.Size60 .Status { margin-left: 7.2px; }
+.EntWatch.Size60 .Status Label { font-size: 9.6px; }
+.EntWatch.Size60 .Status .Icon { font-size: 11.4px; margin-right: 3px; }
+.EntWatch.Size60 .Status .ReloadIcon { width: 13.2px; height: 13.2px; margin-left: 3px; margin-right: 0px; }
+.EntWatch.Size60 .Ammo { margin-right: 7.2px; }
+.EntWatch.Size60 .Overflow { font-size: 8.4px; }
+.EntWatch.Size61 .Item { width: 292.8px; padding: 4.88px 7.32px; margin-bottom: 3.05px; border-left-width: 1.83px; }
+.EntWatch.Size61 .ItemName { font-size: 10.98px; }
+.EntWatch.Size61 .Owner { font-size: 9.76px; margin-left: 4.88px; }
+.EntWatch.Size61 .Status { margin-left: 7.32px; }
+.EntWatch.Size61 .Status Label { font-size: 9.76px; }
+.EntWatch.Size61 .Status .Icon { font-size: 11.59px; margin-right: 3.05px; }
+.EntWatch.Size61 .Status .ReloadIcon { width: 13.42px; height: 13.42px; margin-left: 3.05px; margin-right: 0px; }
+.EntWatch.Size61 .Ammo { margin-right: 7.32px; }
+.EntWatch.Size61 .Overflow { font-size: 8.54px; }
+.EntWatch.Size62 .Item { width: 297.6px; padding: 4.96px 7.44px; margin-bottom: 3.1px; border-left-width: 1.86px; }
+.EntWatch.Size62 .ItemName { font-size: 11.16px; }
+.EntWatch.Size62 .Owner { font-size: 9.92px; margin-left: 4.96px; }
+.EntWatch.Size62 .Status { margin-left: 7.44px; }
+.EntWatch.Size62 .Status Label { font-size: 9.92px; }
+.EntWatch.Size62 .Status .Icon { font-size: 11.78px; margin-right: 3.1px; }
+.EntWatch.Size62 .Status .ReloadIcon { width: 13.64px; height: 13.64px; margin-left: 3.1px; margin-right: 0px; }
+.EntWatch.Size62 .Ammo { margin-right: 7.44px; }
+.EntWatch.Size62 .Overflow { font-size: 8.68px; }
+.EntWatch.Size63 .Item { width: 302.4px; padding: 5.04px 7.56px; margin-bottom: 3.15px; border-left-width: 1.89px; }
+.EntWatch.Size63 .ItemName { font-size: 11.34px; }
+.EntWatch.Size63 .Owner { font-size: 10.08px; margin-left: 5.04px; }
+.EntWatch.Size63 .Status { margin-left: 7.56px; }
+.EntWatch.Size63 .Status Label { font-size: 10.08px; }
+.EntWatch.Size63 .Status .Icon { font-size: 11.97px; margin-right: 3.15px; }
+.EntWatch.Size63 .Status .ReloadIcon { width: 13.86px; height: 13.86px; margin-left: 3.15px; margin-right: 0px; }
+.EntWatch.Size63 .Ammo { margin-right: 7.56px; }
+.EntWatch.Size63 .Overflow { font-size: 8.82px; }
+.EntWatch.Size64 .Item { width: 307.2px; padding: 5.12px 7.68px; margin-bottom: 3.2px; border-left-width: 1.92px; }
+.EntWatch.Size64 .ItemName { font-size: 11.52px; }
+.EntWatch.Size64 .Owner { font-size: 10.24px; margin-left: 5.12px; }
+.EntWatch.Size64 .Status { margin-left: 7.68px; }
+.EntWatch.Size64 .Status Label { font-size: 10.24px; }
+.EntWatch.Size64 .Status .Icon { font-size: 12.16px; margin-right: 3.2px; }
+.EntWatch.Size64 .Status .ReloadIcon { width: 14.08px; height: 14.08px; margin-left: 3.2px; margin-right: 0px; }
+.EntWatch.Size64 .Ammo { margin-right: 7.68px; }
+.EntWatch.Size64 .Overflow { font-size: 8.96px; }
+.EntWatch.Size65 .Item { width: 312px; padding: 5.2px 7.8px; margin-bottom: 3.25px; border-left-width: 1.95px; }
+.EntWatch.Size65 .ItemName { font-size: 11.7px; }
+.EntWatch.Size65 .Owner { font-size: 10.4px; margin-left: 5.2px; }
+.EntWatch.Size65 .Status { margin-left: 7.8px; }
+.EntWatch.Size65 .Status Label { font-size: 10.4px; }
+.EntWatch.Size65 .Status .Icon { font-size: 12.35px; margin-right: 3.25px; }
+.EntWatch.Size65 .Status .ReloadIcon { width: 14.3px; height: 14.3px; margin-left: 3.25px; margin-right: 0px; }
+.EntWatch.Size65 .Ammo { margin-right: 7.8px; }
+.EntWatch.Size65 .Overflow { font-size: 9.1px; }
+.EntWatch.Size66 .Item { width: 316.8px; padding: 5.28px 7.92px; margin-bottom: 3.3px; border-left-width: 1.98px; }
+.EntWatch.Size66 .ItemName { font-size: 11.88px; }
+.EntWatch.Size66 .Owner { font-size: 10.56px; margin-left: 5.28px; }
+.EntWatch.Size66 .Status { margin-left: 7.92px; }
+.EntWatch.Size66 .Status Label { font-size: 10.56px; }
+.EntWatch.Size66 .Status .Icon { font-size: 12.54px; margin-right: 3.3px; }
+.EntWatch.Size66 .Status .ReloadIcon { width: 14.52px; height: 14.52px; margin-left: 3.3px; margin-right: 0px; }
+.EntWatch.Size66 .Ammo { margin-right: 7.92px; }
+.EntWatch.Size66 .Overflow { font-size: 9.24px; }
+.EntWatch.Size67 .Item { width: 321.6px; padding: 5.36px 8.04px; margin-bottom: 3.35px; border-left-width: 2.01px; }
+.EntWatch.Size67 .ItemName { font-size: 12.06px; }
+.EntWatch.Size67 .Owner { font-size: 10.72px; margin-left: 5.36px; }
+.EntWatch.Size67 .Status { margin-left: 8.04px; }
+.EntWatch.Size67 .Status Label { font-size: 10.72px; }
+.EntWatch.Size67 .Status .Icon { font-size: 12.73px; margin-right: 3.35px; }
+.EntWatch.Size67 .Status .ReloadIcon { width: 14.74px; height: 14.74px; margin-left: 3.35px; margin-right: 0px; }
+.EntWatch.Size67 .Ammo { margin-right: 8.04px; }
+.EntWatch.Size67 .Overflow { font-size: 9.38px; }
+.EntWatch.Size68 .Item { width: 326.4px; padding: 5.44px 8.16px; margin-bottom: 3.4px; border-left-width: 2.04px; }
+.EntWatch.Size68 .ItemName { font-size: 12.24px; }
+.EntWatch.Size68 .Owner { font-size: 10.88px; margin-left: 5.44px; }
+.EntWatch.Size68 .Status { margin-left: 8.16px; }
+.EntWatch.Size68 .Status Label { font-size: 10.88px; }
+.EntWatch.Size68 .Status .Icon { font-size: 12.92px; margin-right: 3.4px; }
+.EntWatch.Size68 .Status .ReloadIcon { width: 14.96px; height: 14.96px; margin-left: 3.4px; margin-right: 0px; }
+.EntWatch.Size68 .Ammo { margin-right: 8.16px; }
+.EntWatch.Size68 .Overflow { font-size: 9.52px; }
+.EntWatch.Size69 .Item { width: 331.2px; padding: 5.52px 8.28px; margin-bottom: 3.45px; border-left-width: 2.07px; }
+.EntWatch.Size69 .ItemName { font-size: 12.42px; }
+.EntWatch.Size69 .Owner { font-size: 11.04px; margin-left: 5.52px; }
+.EntWatch.Size69 .Status { margin-left: 8.28px; }
+.EntWatch.Size69 .Status Label { font-size: 11.04px; }
+.EntWatch.Size69 .Status .Icon { font-size: 13.11px; margin-right: 3.45px; }
+.EntWatch.Size69 .Status .ReloadIcon { width: 15.18px; height: 15.18px; margin-left: 3.45px; margin-right: 0px; }
+.EntWatch.Size69 .Ammo { margin-right: 8.28px; }
+.EntWatch.Size69 .Overflow { font-size: 9.66px; }
+.EntWatch.Size70 .Item { width: 336px; padding: 5.6px 8.4px; margin-bottom: 3.5px; border-left-width: 2.1px; }
+.EntWatch.Size70 .ItemName { font-size: 12.6px; }
+.EntWatch.Size70 .Owner { font-size: 11.2px; margin-left: 5.6px; }
+.EntWatch.Size70 .Status { margin-left: 8.4px; }
+.EntWatch.Size70 .Status Label { font-size: 11.2px; }
+.EntWatch.Size70 .Status .Icon { font-size: 13.3px; margin-right: 3.5px; }
+.EntWatch.Size70 .Status .ReloadIcon { width: 15.4px; height: 15.4px; margin-left: 3.5px; margin-right: 0px; }
+.EntWatch.Size70 .Ammo { margin-right: 8.4px; }
+.EntWatch.Size70 .Overflow { font-size: 9.8px; }
+.EntWatch.Size71 .Item { width: 340.8px; padding: 5.68px 8.52px; margin-bottom: 3.55px; border-left-width: 2.13px; }
+.EntWatch.Size71 .ItemName { font-size: 12.78px; }
+.EntWatch.Size71 .Owner { font-size: 11.36px; margin-left: 5.68px; }
+.EntWatch.Size71 .Status { margin-left: 8.52px; }
+.EntWatch.Size71 .Status Label { font-size: 11.36px; }
+.EntWatch.Size71 .Status .Icon { font-size: 13.49px; margin-right: 3.55px; }
+.EntWatch.Size71 .Status .ReloadIcon { width: 15.62px; height: 15.62px; margin-left: 3.55px; margin-right: 0px; }
+.EntWatch.Size71 .Ammo { margin-right: 8.52px; }
+.EntWatch.Size71 .Overflow { font-size: 9.94px; }
+.EntWatch.Size72 .Item { width: 345.6px; padding: 5.76px 8.64px; margin-bottom: 3.6px; border-left-width: 2.16px; }
+.EntWatch.Size72 .ItemName { font-size: 12.96px; }
+.EntWatch.Size72 .Owner { font-size: 11.52px; margin-left: 5.76px; }
+.EntWatch.Size72 .Status { margin-left: 8.64px; }
+.EntWatch.Size72 .Status Label { font-size: 11.52px; }
+.EntWatch.Size72 .Status .Icon { font-size: 13.68px; margin-right: 3.6px; }
+.EntWatch.Size72 .Status .ReloadIcon { width: 15.84px; height: 15.84px; margin-left: 3.6px; margin-right: 0px; }
+.EntWatch.Size72 .Ammo { margin-right: 8.64px; }
+.EntWatch.Size72 .Overflow { font-size: 10.08px; }
+.EntWatch.Size73 .Item { width: 350.4px; padding: 5.84px 8.76px; margin-bottom: 3.65px; border-left-width: 2.19px; }
+.EntWatch.Size73 .ItemName { font-size: 13.14px; }
+.EntWatch.Size73 .Owner { font-size: 11.68px; margin-left: 5.84px; }
+.EntWatch.Size73 .Status { margin-left: 8.76px; }
+.EntWatch.Size73 .Status Label { font-size: 11.68px; }
+.EntWatch.Size73 .Status .Icon { font-size: 13.87px; margin-right: 3.65px; }
+.EntWatch.Size73 .Status .ReloadIcon { width: 16.06px; height: 16.06px; margin-left: 3.65px; margin-right: 0px; }
+.EntWatch.Size73 .Ammo { margin-right: 8.76px; }
+.EntWatch.Size73 .Overflow { font-size: 10.22px; }
+.EntWatch.Size74 .Item { width: 355.2px; padding: 5.92px 8.88px; margin-bottom: 3.7px; border-left-width: 2.22px; }
+.EntWatch.Size74 .ItemName { font-size: 13.32px; }
+.EntWatch.Size74 .Owner { font-size: 11.84px; margin-left: 5.92px; }
+.EntWatch.Size74 .Status { margin-left: 8.88px; }
+.EntWatch.Size74 .Status Label { font-size: 11.84px; }
+.EntWatch.Size74 .Status .Icon { font-size: 14.06px; margin-right: 3.7px; }
+.EntWatch.Size74 .Status .ReloadIcon { width: 16.28px; height: 16.28px; margin-left: 3.7px; margin-right: 0px; }
+.EntWatch.Size74 .Ammo { margin-right: 8.88px; }
+.EntWatch.Size74 .Overflow { font-size: 10.36px; }
+.EntWatch.Size75 .Item { width: 360px; padding: 6px 9px; margin-bottom: 3.75px; border-left-width: 2.25px; }
+.EntWatch.Size75 .ItemName { font-size: 13.5px; }
+.EntWatch.Size75 .Owner { font-size: 12px; margin-left: 6px; }
+.EntWatch.Size75 .Status { margin-left: 9px; }
+.EntWatch.Size75 .Status Label { font-size: 12px; }
+.EntWatch.Size75 .Status .Icon { font-size: 14.25px; margin-right: 3.75px; }
+.EntWatch.Size75 .Status .ReloadIcon { width: 16.5px; height: 16.5px; margin-left: 3.75px; margin-right: 0px; }
+.EntWatch.Size75 .Ammo { margin-right: 9px; }
+.EntWatch.Size75 .Overflow { font-size: 10.5px; }
+.EntWatch.Size76 .Item { width: 364.8px; padding: 6.08px 9.12px; margin-bottom: 3.8px; border-left-width: 2.28px; }
+.EntWatch.Size76 .ItemName { font-size: 13.68px; }
+.EntWatch.Size76 .Owner { font-size: 12.16px; margin-left: 6.08px; }
+.EntWatch.Size76 .Status { margin-left: 9.12px; }
+.EntWatch.Size76 .Status Label { font-size: 12.16px; }
+.EntWatch.Size76 .Status .Icon { font-size: 14.44px; margin-right: 3.8px; }
+.EntWatch.Size76 .Status .ReloadIcon { width: 16.72px; height: 16.72px; margin-left: 3.8px; margin-right: 0px; }
+.EntWatch.Size76 .Ammo { margin-right: 9.12px; }
+.EntWatch.Size76 .Overflow { font-size: 10.64px; }
+.EntWatch.Size77 .Item { width: 369.6px; padding: 6.16px 9.24px; margin-bottom: 3.85px; border-left-width: 2.31px; }
+.EntWatch.Size77 .ItemName { font-size: 13.86px; }
+.EntWatch.Size77 .Owner { font-size: 12.32px; margin-left: 6.16px; }
+.EntWatch.Size77 .Status { margin-left: 9.24px; }
+.EntWatch.Size77 .Status Label { font-size: 12.32px; }
+.EntWatch.Size77 .Status .Icon { font-size: 14.63px; margin-right: 3.85px; }
+.EntWatch.Size77 .Status .ReloadIcon { width: 16.94px; height: 16.94px; margin-left: 3.85px; margin-right: 0px; }
+.EntWatch.Size77 .Ammo { margin-right: 9.24px; }
+.EntWatch.Size77 .Overflow { font-size: 10.78px; }
+.EntWatch.Size78 .Item { width: 374.4px; padding: 6.24px 9.36px; margin-bottom: 3.9px; border-left-width: 2.34px; }
+.EntWatch.Size78 .ItemName { font-size: 14.04px; }
+.EntWatch.Size78 .Owner { font-size: 12.48px; margin-left: 6.24px; }
+.EntWatch.Size78 .Status { margin-left: 9.36px; }
+.EntWatch.Size78 .Status Label { font-size: 12.48px; }
+.EntWatch.Size78 .Status .Icon { font-size: 14.82px; margin-right: 3.9px; }
+.EntWatch.Size78 .Status .ReloadIcon { width: 17.16px; height: 17.16px; margin-left: 3.9px; margin-right: 0px; }
+.EntWatch.Size78 .Ammo { margin-right: 9.36px; }
+.EntWatch.Size78 .Overflow { font-size: 10.92px; }
+.EntWatch.Size79 .Item { width: 379.2px; padding: 6.32px 9.48px; margin-bottom: 3.95px; border-left-width: 2.37px; }
+.EntWatch.Size79 .ItemName { font-size: 14.22px; }
+.EntWatch.Size79 .Owner { font-size: 12.64px; margin-left: 6.32px; }
+.EntWatch.Size79 .Status { margin-left: 9.48px; }
+.EntWatch.Size79 .Status Label { font-size: 12.64px; }
+.EntWatch.Size79 .Status .Icon { font-size: 15.01px; margin-right: 3.95px; }
+.EntWatch.Size79 .Status .ReloadIcon { width: 17.38px; height: 17.38px; margin-left: 3.95px; margin-right: 0px; }
+.EntWatch.Size79 .Ammo { margin-right: 9.48px; }
+.EntWatch.Size79 .Overflow { font-size: 11.06px; }
+.EntWatch.Size80 .Item { width: 384px; padding: 6.4px 9.6px; margin-bottom: 4px; border-left-width: 2.4px; }
+.EntWatch.Size80 .ItemName { font-size: 14.4px; }
+.EntWatch.Size80 .Owner { font-size: 12.8px; margin-left: 6.4px; }
+.EntWatch.Size80 .Status { margin-left: 9.6px; }
+.EntWatch.Size80 .Status Label { font-size: 12.8px; }
+.EntWatch.Size80 .Status .Icon { font-size: 15.2px; margin-right: 4px; }
+.EntWatch.Size80 .Status .ReloadIcon { width: 17.6px; height: 17.6px; margin-left: 4px; margin-right: 0px; }
+.EntWatch.Size80 .Ammo { margin-right: 9.6px; }
+.EntWatch.Size80 .Overflow { font-size: 11.2px; }
+.EntWatch.Size81 .Item { width: 388.8px; padding: 6.48px 9.72px; margin-bottom: 4.05px; border-left-width: 2.43px; }
+.EntWatch.Size81 .ItemName { font-size: 14.58px; }
+.EntWatch.Size81 .Owner { font-size: 12.96px; margin-left: 6.48px; }
+.EntWatch.Size81 .Status { margin-left: 9.72px; }
+.EntWatch.Size81 .Status Label { font-size: 12.96px; }
+.EntWatch.Size81 .Status .Icon { font-size: 15.39px; margin-right: 4.05px; }
+.EntWatch.Size81 .Status .ReloadIcon { width: 17.82px; height: 17.82px; margin-left: 4.05px; margin-right: 0px; }
+.EntWatch.Size81 .Ammo { margin-right: 9.72px; }
+.EntWatch.Size81 .Overflow { font-size: 11.34px; }
+.EntWatch.Size82 .Item { width: 393.6px; padding: 6.56px 9.84px; margin-bottom: 4.1px; border-left-width: 2.46px; }
+.EntWatch.Size82 .ItemName { font-size: 14.76px; }
+.EntWatch.Size82 .Owner { font-size: 13.12px; margin-left: 6.56px; }
+.EntWatch.Size82 .Status { margin-left: 9.84px; }
+.EntWatch.Size82 .Status Label { font-size: 13.12px; }
+.EntWatch.Size82 .Status .Icon { font-size: 15.58px; margin-right: 4.1px; }
+.EntWatch.Size82 .Status .ReloadIcon { width: 18.04px; height: 18.04px; margin-left: 4.1px; margin-right: 0px; }
+.EntWatch.Size82 .Ammo { margin-right: 9.84px; }
+.EntWatch.Size82 .Overflow { font-size: 11.48px; }
+.EntWatch.Size83 .Item { width: 398.4px; padding: 6.64px 9.96px; margin-bottom: 4.15px; border-left-width: 2.49px; }
+.EntWatch.Size83 .ItemName { font-size: 14.94px; }
+.EntWatch.Size83 .Owner { font-size: 13.28px; margin-left: 6.64px; }
+.EntWatch.Size83 .Status { margin-left: 9.96px; }
+.EntWatch.Size83 .Status Label { font-size: 13.28px; }
+.EntWatch.Size83 .Status .Icon { font-size: 15.77px; margin-right: 4.15px; }
+.EntWatch.Size83 .Status .ReloadIcon { width: 18.26px; height: 18.26px; margin-left: 4.15px; margin-right: 0px; }
+.EntWatch.Size83 .Ammo { margin-right: 9.96px; }
+.EntWatch.Size83 .Overflow { font-size: 11.62px; }
+.EntWatch.Size84 .Item { width: 403.2px; padding: 6.72px 10.08px; margin-bottom: 4.2px; border-left-width: 2.52px; }
+.EntWatch.Size84 .ItemName { font-size: 15.12px; }
+.EntWatch.Size84 .Owner { font-size: 13.44px; margin-left: 6.72px; }
+.EntWatch.Size84 .Status { margin-left: 10.08px; }
+.EntWatch.Size84 .Status Label { font-size: 13.44px; }
+.EntWatch.Size84 .Status .Icon { font-size: 15.96px; margin-right: 4.2px; }
+.EntWatch.Size84 .Status .ReloadIcon { width: 18.48px; height: 18.48px; margin-left: 4.2px; margin-right: 0px; }
+.EntWatch.Size84 .Ammo { margin-right: 10.08px; }
+.EntWatch.Size84 .Overflow { font-size: 11.76px; }
+.EntWatch.Size85 .Item { width: 408px; padding: 6.8px 10.2px; margin-bottom: 4.25px; border-left-width: 2.55px; }
+.EntWatch.Size85 .ItemName { font-size: 15.3px; }
+.EntWatch.Size85 .Owner { font-size: 13.6px; margin-left: 6.8px; }
+.EntWatch.Size85 .Status { margin-left: 10.2px; }
+.EntWatch.Size85 .Status Label { font-size: 13.6px; }
+.EntWatch.Size85 .Status .Icon { font-size: 16.15px; margin-right: 4.25px; }
+.EntWatch.Size85 .Status .ReloadIcon { width: 18.7px; height: 18.7px; margin-left: 4.25px; margin-right: 0px; }
+.EntWatch.Size85 .Ammo { margin-right: 10.2px; }
+.EntWatch.Size85 .Overflow { font-size: 11.9px; }
+.EntWatch.Size86 .Item { width: 412.8px; padding: 6.88px 10.32px; margin-bottom: 4.3px; border-left-width: 2.58px; }
+.EntWatch.Size86 .ItemName { font-size: 15.48px; }
+.EntWatch.Size86 .Owner { font-size: 13.76px; margin-left: 6.88px; }
+.EntWatch.Size86 .Status { margin-left: 10.32px; }
+.EntWatch.Size86 .Status Label { font-size: 13.76px; }
+.EntWatch.Size86 .Status .Icon { font-size: 16.34px; margin-right: 4.3px; }
+.EntWatch.Size86 .Status .ReloadIcon { width: 18.92px; height: 18.92px; margin-left: 4.3px; margin-right: 0px; }
+.EntWatch.Size86 .Ammo { margin-right: 10.32px; }
+.EntWatch.Size86 .Overflow { font-size: 12.04px; }
+.EntWatch.Size87 .Item { width: 417.6px; padding: 6.96px 10.44px; margin-bottom: 4.35px; border-left-width: 2.61px; }
+.EntWatch.Size87 .ItemName { font-size: 15.66px; }
+.EntWatch.Size87 .Owner { font-size: 13.92px; margin-left: 6.96px; }
+.EntWatch.Size87 .Status { margin-left: 10.44px; }
+.EntWatch.Size87 .Status Label { font-size: 13.92px; }
+.EntWatch.Size87 .Status .Icon { font-size: 16.53px; margin-right: 4.35px; }
+.EntWatch.Size87 .Status .ReloadIcon { width: 19.14px; height: 19.14px; margin-left: 4.35px; margin-right: 0px; }
+.EntWatch.Size87 .Ammo { margin-right: 10.44px; }
+.EntWatch.Size87 .Overflow { font-size: 12.18px; }
+.EntWatch.Size88 .Item { width: 422.4px; padding: 7.04px 10.56px; margin-bottom: 4.4px; border-left-width: 2.64px; }
+.EntWatch.Size88 .ItemName { font-size: 15.84px; }
+.EntWatch.Size88 .Owner { font-size: 14.08px; margin-left: 7.04px; }
+.EntWatch.Size88 .Status { margin-left: 10.56px; }
+.EntWatch.Size88 .Status Label { font-size: 14.08px; }
+.EntWatch.Size88 .Status .Icon { font-size: 16.72px; margin-right: 4.4px; }
+.EntWatch.Size88 .Status .ReloadIcon { width: 19.36px; height: 19.36px; margin-left: 4.4px; margin-right: 0px; }
+.EntWatch.Size88 .Ammo { margin-right: 10.56px; }
+.EntWatch.Size88 .Overflow { font-size: 12.32px; }
+.EntWatch.Size89 .Item { width: 427.2px; padding: 7.12px 10.68px; margin-bottom: 4.45px; border-left-width: 2.67px; }
+.EntWatch.Size89 .ItemName { font-size: 16.02px; }
+.EntWatch.Size89 .Owner { font-size: 14.24px; margin-left: 7.12px; }
+.EntWatch.Size89 .Status { margin-left: 10.68px; }
+.EntWatch.Size89 .Status Label { font-size: 14.24px; }
+.EntWatch.Size89 .Status .Icon { font-size: 16.91px; margin-right: 4.45px; }
+.EntWatch.Size89 .Status .ReloadIcon { width: 19.58px; height: 19.58px; margin-left: 4.45px; margin-right: 0px; }
+.EntWatch.Size89 .Ammo { margin-right: 10.68px; }
+.EntWatch.Size89 .Overflow { font-size: 12.46px; }
+.EntWatch.Size90 .Item { width: 432px; padding: 7.2px 10.8px; margin-bottom: 4.5px; border-left-width: 2.7px; }
+.EntWatch.Size90 .ItemName { font-size: 16.2px; }
+.EntWatch.Size90 .Owner { font-size: 14.4px; margin-left: 7.2px; }
+.EntWatch.Size90 .Status { margin-left: 10.8px; }
+.EntWatch.Size90 .Status Label { font-size: 14.4px; }
+.EntWatch.Size90 .Status .Icon { font-size: 17.1px; margin-right: 4.5px; }
+.EntWatch.Size90 .Status .ReloadIcon { width: 19.8px; height: 19.8px; margin-left: 4.5px; margin-right: 0px; }
+.EntWatch.Size90 .Ammo { margin-right: 10.8px; }
+.EntWatch.Size90 .Overflow { font-size: 12.6px; }
+.EntWatch.Size91 .Item { width: 436.8px; padding: 7.28px 10.92px; margin-bottom: 4.55px; border-left-width: 2.73px; }
+.EntWatch.Size91 .ItemName { font-size: 16.38px; }
+.EntWatch.Size91 .Owner { font-size: 14.56px; margin-left: 7.28px; }
+.EntWatch.Size91 .Status { margin-left: 10.92px; }
+.EntWatch.Size91 .Status Label { font-size: 14.56px; }
+.EntWatch.Size91 .Status .Icon { font-size: 17.29px; margin-right: 4.55px; }
+.EntWatch.Size91 .Status .ReloadIcon { width: 20.02px; height: 20.02px; margin-left: 4.55px; margin-right: 0px; }
+.EntWatch.Size91 .Ammo { margin-right: 10.92px; }
+.EntWatch.Size91 .Overflow { font-size: 12.74px; }
+.EntWatch.Size92 .Item { width: 441.6px; padding: 7.36px 11.04px; margin-bottom: 4.6px; border-left-width: 2.76px; }
+.EntWatch.Size92 .ItemName { font-size: 16.56px; }
+.EntWatch.Size92 .Owner { font-size: 14.72px; margin-left: 7.36px; }
+.EntWatch.Size92 .Status { margin-left: 11.04px; }
+.EntWatch.Size92 .Status Label { font-size: 14.72px; }
+.EntWatch.Size92 .Status .Icon { font-size: 17.48px; margin-right: 4.6px; }
+.EntWatch.Size92 .Status .ReloadIcon { width: 20.24px; height: 20.24px; margin-left: 4.6px; margin-right: 0px; }
+.EntWatch.Size92 .Ammo { margin-right: 11.04px; }
+.EntWatch.Size92 .Overflow { font-size: 12.88px; }
+.EntWatch.Size93 .Item { width: 446.4px; padding: 7.44px 11.16px; margin-bottom: 4.65px; border-left-width: 2.79px; }
+.EntWatch.Size93 .ItemName { font-size: 16.74px; }
+.EntWatch.Size93 .Owner { font-size: 14.88px; margin-left: 7.44px; }
+.EntWatch.Size93 .Status { margin-left: 11.16px; }
+.EntWatch.Size93 .Status Label { font-size: 14.88px; }
+.EntWatch.Size93 .Status .Icon { font-size: 17.67px; margin-right: 4.65px; }
+.EntWatch.Size93 .Status .ReloadIcon { width: 20.46px; height: 20.46px; margin-left: 4.65px; margin-right: 0px; }
+.EntWatch.Size93 .Ammo { margin-right: 11.16px; }
+.EntWatch.Size93 .Overflow { font-size: 13.02px; }
+.EntWatch.Size94 .Item { width: 451.2px; padding: 7.52px 11.28px; margin-bottom: 4.7px; border-left-width: 2.82px; }
+.EntWatch.Size94 .ItemName { font-size: 16.92px; }
+.EntWatch.Size94 .Owner { font-size: 15.04px; margin-left: 7.52px; }
+.EntWatch.Size94 .Status { margin-left: 11.28px; }
+.EntWatch.Size94 .Status Label { font-size: 15.04px; }
+.EntWatch.Size94 .Status .Icon { font-size: 17.86px; margin-right: 4.7px; }
+.EntWatch.Size94 .Status .ReloadIcon { width: 20.68px; height: 20.68px; margin-left: 4.7px; margin-right: 0px; }
+.EntWatch.Size94 .Ammo { margin-right: 11.28px; }
+.EntWatch.Size94 .Overflow { font-size: 13.16px; }
+.EntWatch.Size95 .Item { width: 456px; padding: 7.6px 11.4px; margin-bottom: 4.75px; border-left-width: 2.85px; }
+.EntWatch.Size95 .ItemName { font-size: 17.1px; }
+.EntWatch.Size95 .Owner { font-size: 15.2px; margin-left: 7.6px; }
+.EntWatch.Size95 .Status { margin-left: 11.4px; }
+.EntWatch.Size95 .Status Label { font-size: 15.2px; }
+.EntWatch.Size95 .Status .Icon { font-size: 18.05px; margin-right: 4.75px; }
+.EntWatch.Size95 .Status .ReloadIcon { width: 20.9px; height: 20.9px; margin-left: 4.75px; margin-right: 0px; }
+.EntWatch.Size95 .Ammo { margin-right: 11.4px; }
+.EntWatch.Size95 .Overflow { font-size: 13.3px; }
+.EntWatch.Size96 .Item { width: 460.8px; padding: 7.68px 11.52px; margin-bottom: 4.8px; border-left-width: 2.88px; }
+.EntWatch.Size96 .ItemName { font-size: 17.28px; }
+.EntWatch.Size96 .Owner { font-size: 15.36px; margin-left: 7.68px; }
+.EntWatch.Size96 .Status { margin-left: 11.52px; }
+.EntWatch.Size96 .Status Label { font-size: 15.36px; }
+.EntWatch.Size96 .Status .Icon { font-size: 18.24px; margin-right: 4.8px; }
+.EntWatch.Size96 .Status .ReloadIcon { width: 21.12px; height: 21.12px; margin-left: 4.8px; margin-right: 0px; }
+.EntWatch.Size96 .Ammo { margin-right: 11.52px; }
+.EntWatch.Size96 .Overflow { font-size: 13.44px; }
+.EntWatch.Size97 .Item { width: 465.6px; padding: 7.76px 11.64px; margin-bottom: 4.85px; border-left-width: 2.91px; }
+.EntWatch.Size97 .ItemName { font-size: 17.46px; }
+.EntWatch.Size97 .Owner { font-size: 15.52px; margin-left: 7.76px; }
+.EntWatch.Size97 .Status { margin-left: 11.64px; }
+.EntWatch.Size97 .Status Label { font-size: 15.52px; }
+.EntWatch.Size97 .Status .Icon { font-size: 18.43px; margin-right: 4.85px; }
+.EntWatch.Size97 .Status .ReloadIcon { width: 21.34px; height: 21.34px; margin-left: 4.85px; margin-right: 0px; }
+.EntWatch.Size97 .Ammo { margin-right: 11.64px; }
+.EntWatch.Size97 .Overflow { font-size: 13.58px; }
+.EntWatch.Size98 .Item { width: 470.4px; padding: 7.84px 11.76px; margin-bottom: 4.9px; border-left-width: 2.94px; }
+.EntWatch.Size98 .ItemName { font-size: 17.64px; }
+.EntWatch.Size98 .Owner { font-size: 15.68px; margin-left: 7.84px; }
+.EntWatch.Size98 .Status { margin-left: 11.76px; }
+.EntWatch.Size98 .Status Label { font-size: 15.68px; }
+.EntWatch.Size98 .Status .Icon { font-size: 18.62px; margin-right: 4.9px; }
+.EntWatch.Size98 .Status .ReloadIcon { width: 21.56px; height: 21.56px; margin-left: 4.9px; margin-right: 0px; }
+.EntWatch.Size98 .Ammo { margin-right: 11.76px; }
+.EntWatch.Size98 .Overflow { font-size: 13.72px; }
+.EntWatch.Size99 .Item { width: 475.2px; padding: 7.92px 11.88px; margin-bottom: 4.95px; border-left-width: 2.97px; }
+.EntWatch.Size99 .ItemName { font-size: 17.82px; }
+.EntWatch.Size99 .Owner { font-size: 15.84px; margin-left: 7.92px; }
+.EntWatch.Size99 .Status { margin-left: 11.88px; }
+.EntWatch.Size99 .Status Label { font-size: 15.84px; }
+.EntWatch.Size99 .Status .Icon { font-size: 18.81px; margin-right: 4.95px; }
+.EntWatch.Size99 .Status .ReloadIcon { width: 21.78px; height: 21.78px; margin-left: 4.95px; margin-right: 0px; }
+.EntWatch.Size99 .Ammo { margin-right: 11.88px; }
+.EntWatch.Size99 .Overflow { font-size: 13.86px; }
+.EntWatch.Size100 .Item { width: 480px; padding: 8px 12px; margin-bottom: 5px; border-left-width: 3px; }
+.EntWatch.Size100 .ItemName { font-size: 18px; }
+.EntWatch.Size100 .Owner { font-size: 16px; margin-left: 8px; }
+.EntWatch.Size100 .Status { margin-left: 12px; }
+.EntWatch.Size100 .Status Label { font-size: 16px; }
+.EntWatch.Size100 .Status .Icon { font-size: 19px; margin-right: 5px; }
+.EntWatch.Size100 .Status .ReloadIcon { width: 22px; height: 22px; margin-left: 5px; margin-right: 0px; }
+.EntWatch.Size100 .Ammo { margin-right: 12px; }
+.EntWatch.Size100 .Overflow { font-size: 14px; }
+.EntWatch.Size101 .Item { width: 484.8px; padding: 8.08px 12.12px; margin-bottom: 5.05px; border-left-width: 3.03px; }
+.EntWatch.Size101 .ItemName { font-size: 18.18px; }
+.EntWatch.Size101 .Owner { font-size: 16.16px; margin-left: 8.08px; }
+.EntWatch.Size101 .Status { margin-left: 12.12px; }
+.EntWatch.Size101 .Status Label { font-size: 16.16px; }
+.EntWatch.Size101 .Status .Icon { font-size: 19.19px; margin-right: 5.05px; }
+.EntWatch.Size101 .Status .ReloadIcon { width: 22.22px; height: 22.22px; margin-left: 5.05px; margin-right: 0px; }
+.EntWatch.Size101 .Ammo { margin-right: 12.12px; }
+.EntWatch.Size101 .Overflow { font-size: 14.14px; }
+.EntWatch.Size102 .Item { width: 489.6px; padding: 8.16px 12.24px; margin-bottom: 5.1px; border-left-width: 3.06px; }
+.EntWatch.Size102 .ItemName { font-size: 18.36px; }
+.EntWatch.Size102 .Owner { font-size: 16.32px; margin-left: 8.16px; }
+.EntWatch.Size102 .Status { margin-left: 12.24px; }
+.EntWatch.Size102 .Status Label { font-size: 16.32px; }
+.EntWatch.Size102 .Status .Icon { font-size: 19.38px; margin-right: 5.1px; }
+.EntWatch.Size102 .Status .ReloadIcon { width: 22.44px; height: 22.44px; margin-left: 5.1px; margin-right: 0px; }
+.EntWatch.Size102 .Ammo { margin-right: 12.24px; }
+.EntWatch.Size102 .Overflow { font-size: 14.28px; }
+.EntWatch.Size103 .Item { width: 494.4px; padding: 8.24px 12.36px; margin-bottom: 5.15px; border-left-width: 3.09px; }
+.EntWatch.Size103 .ItemName { font-size: 18.54px; }
+.EntWatch.Size103 .Owner { font-size: 16.48px; margin-left: 8.24px; }
+.EntWatch.Size103 .Status { margin-left: 12.36px; }
+.EntWatch.Size103 .Status Label { font-size: 16.48px; }
+.EntWatch.Size103 .Status .Icon { font-size: 19.57px; margin-right: 5.15px; }
+.EntWatch.Size103 .Status .ReloadIcon { width: 22.66px; height: 22.66px; margin-left: 5.15px; margin-right: 0px; }
+.EntWatch.Size103 .Ammo { margin-right: 12.36px; }
+.EntWatch.Size103 .Overflow { font-size: 14.42px; }
+.EntWatch.Size104 .Item { width: 499.2px; padding: 8.32px 12.48px; margin-bottom: 5.2px; border-left-width: 3.12px; }
+.EntWatch.Size104 .ItemName { font-size: 18.72px; }
+.EntWatch.Size104 .Owner { font-size: 16.64px; margin-left: 8.32px; }
+.EntWatch.Size104 .Status { margin-left: 12.48px; }
+.EntWatch.Size104 .Status Label { font-size: 16.64px; }
+.EntWatch.Size104 .Status .Icon { font-size: 19.76px; margin-right: 5.2px; }
+.EntWatch.Size104 .Status .ReloadIcon { width: 22.88px; height: 22.88px; margin-left: 5.2px; margin-right: 0px; }
+.EntWatch.Size104 .Ammo { margin-right: 12.48px; }
+.EntWatch.Size104 .Overflow { font-size: 14.56px; }
+.EntWatch.Size105 .Item { width: 504px; padding: 8.4px 12.6px; margin-bottom: 5.25px; border-left-width: 3.15px; }
+.EntWatch.Size105 .ItemName { font-size: 18.9px; }
+.EntWatch.Size105 .Owner { font-size: 16.8px; margin-left: 8.4px; }
+.EntWatch.Size105 .Status { margin-left: 12.6px; }
+.EntWatch.Size105 .Status Label { font-size: 16.8px; }
+.EntWatch.Size105 .Status .Icon { font-size: 19.95px; margin-right: 5.25px; }
+.EntWatch.Size105 .Status .ReloadIcon { width: 23.1px; height: 23.1px; margin-left: 5.25px; margin-right: 0px; }
+.EntWatch.Size105 .Ammo { margin-right: 12.6px; }
+.EntWatch.Size105 .Overflow { font-size: 14.7px; }
+.EntWatch.Size106 .Item { width: 508.8px; padding: 8.48px 12.72px; margin-bottom: 5.3px; border-left-width: 3.18px; }
+.EntWatch.Size106 .ItemName { font-size: 19.08px; }
+.EntWatch.Size106 .Owner { font-size: 16.96px; margin-left: 8.48px; }
+.EntWatch.Size106 .Status { margin-left: 12.72px; }
+.EntWatch.Size106 .Status Label { font-size: 16.96px; }
+.EntWatch.Size106 .Status .Icon { font-size: 20.14px; margin-right: 5.3px; }
+.EntWatch.Size106 .Status .ReloadIcon { width: 23.32px; height: 23.32px; margin-left: 5.3px; margin-right: 0px; }
+.EntWatch.Size106 .Ammo { margin-right: 12.72px; }
+.EntWatch.Size106 .Overflow { font-size: 14.84px; }
+.EntWatch.Size107 .Item { width: 513.6px; padding: 8.56px 12.84px; margin-bottom: 5.35px; border-left-width: 3.21px; }
+.EntWatch.Size107 .ItemName { font-size: 19.26px; }
+.EntWatch.Size107 .Owner { font-size: 17.12px; margin-left: 8.56px; }
+.EntWatch.Size107 .Status { margin-left: 12.84px; }
+.EntWatch.Size107 .Status Label { font-size: 17.12px; }
+.EntWatch.Size107 .Status .Icon { font-size: 20.33px; margin-right: 5.35px; }
+.EntWatch.Size107 .Status .ReloadIcon { width: 23.54px; height: 23.54px; margin-left: 5.35px; margin-right: 0px; }
+.EntWatch.Size107 .Ammo { margin-right: 12.84px; }
+.EntWatch.Size107 .Overflow { font-size: 14.98px; }
+.EntWatch.Size108 .Item { width: 518.4px; padding: 8.64px 12.96px; margin-bottom: 5.4px; border-left-width: 3.24px; }
+.EntWatch.Size108 .ItemName { font-size: 19.44px; }
+.EntWatch.Size108 .Owner { font-size: 17.28px; margin-left: 8.64px; }
+.EntWatch.Size108 .Status { margin-left: 12.96px; }
+.EntWatch.Size108 .Status Label { font-size: 17.28px; }
+.EntWatch.Size108 .Status .Icon { font-size: 20.52px; margin-right: 5.4px; }
+.EntWatch.Size108 .Status .ReloadIcon { width: 23.76px; height: 23.76px; margin-left: 5.4px; margin-right: 0px; }
+.EntWatch.Size108 .Ammo { margin-right: 12.96px; }
+.EntWatch.Size108 .Overflow { font-size: 15.12px; }
+.EntWatch.Size109 .Item { width: 523.2px; padding: 8.72px 13.08px; margin-bottom: 5.45px; border-left-width: 3.27px; }
+.EntWatch.Size109 .ItemName { font-size: 19.62px; }
+.EntWatch.Size109 .Owner { font-size: 17.44px; margin-left: 8.72px; }
+.EntWatch.Size109 .Status { margin-left: 13.08px; }
+.EntWatch.Size109 .Status Label { font-size: 17.44px; }
+.EntWatch.Size109 .Status .Icon { font-size: 20.71px; margin-right: 5.45px; }
+.EntWatch.Size109 .Status .ReloadIcon { width: 23.98px; height: 23.98px; margin-left: 5.45px; margin-right: 0px; }
+.EntWatch.Size109 .Ammo { margin-right: 13.08px; }
+.EntWatch.Size109 .Overflow { font-size: 15.26px; }
+.EntWatch.Size110 .Item { width: 528px; padding: 8.8px 13.2px; margin-bottom: 5.5px; border-left-width: 3.3px; }
+.EntWatch.Size110 .ItemName { font-size: 19.8px; }
+.EntWatch.Size110 .Owner { font-size: 17.6px; margin-left: 8.8px; }
+.EntWatch.Size110 .Status { margin-left: 13.2px; }
+.EntWatch.Size110 .Status Label { font-size: 17.6px; }
+.EntWatch.Size110 .Status .Icon { font-size: 20.9px; margin-right: 5.5px; }
+.EntWatch.Size110 .Status .ReloadIcon { width: 24.2px; height: 24.2px; margin-left: 5.5px; margin-right: 0px; }
+.EntWatch.Size110 .Ammo { margin-right: 13.2px; }
+.EntWatch.Size110 .Overflow { font-size: 15.4px; }
+.EntWatch.Size111 .Item { width: 532.8px; padding: 8.88px 13.32px; margin-bottom: 5.55px; border-left-width: 3.33px; }
+.EntWatch.Size111 .ItemName { font-size: 19.98px; }
+.EntWatch.Size111 .Owner { font-size: 17.76px; margin-left: 8.88px; }
+.EntWatch.Size111 .Status { margin-left: 13.32px; }
+.EntWatch.Size111 .Status Label { font-size: 17.76px; }
+.EntWatch.Size111 .Status .Icon { font-size: 21.09px; margin-right: 5.55px; }
+.EntWatch.Size111 .Status .ReloadIcon { width: 24.42px; height: 24.42px; margin-left: 5.55px; margin-right: 0px; }
+.EntWatch.Size111 .Ammo { margin-right: 13.32px; }
+.EntWatch.Size111 .Overflow { font-size: 15.54px; }
+.EntWatch.Size112 .Item { width: 537.6px; padding: 8.96px 13.44px; margin-bottom: 5.6px; border-left-width: 3.36px; }
+.EntWatch.Size112 .ItemName { font-size: 20.16px; }
+.EntWatch.Size112 .Owner { font-size: 17.92px; margin-left: 8.96px; }
+.EntWatch.Size112 .Status { margin-left: 13.44px; }
+.EntWatch.Size112 .Status Label { font-size: 17.92px; }
+.EntWatch.Size112 .Status .Icon { font-size: 21.28px; margin-right: 5.6px; }
+.EntWatch.Size112 .Status .ReloadIcon { width: 24.64px; height: 24.64px; margin-left: 5.6px; margin-right: 0px; }
+.EntWatch.Size112 .Ammo { margin-right: 13.44px; }
+.EntWatch.Size112 .Overflow { font-size: 15.68px; }
+.EntWatch.Size113 .Item { width: 542.4px; padding: 9.04px 13.56px; margin-bottom: 5.65px; border-left-width: 3.39px; }
+.EntWatch.Size113 .ItemName { font-size: 20.34px; }
+.EntWatch.Size113 .Owner { font-size: 18.08px; margin-left: 9.04px; }
+.EntWatch.Size113 .Status { margin-left: 13.56px; }
+.EntWatch.Size113 .Status Label { font-size: 18.08px; }
+.EntWatch.Size113 .Status .Icon { font-size: 21.47px; margin-right: 5.65px; }
+.EntWatch.Size113 .Status .ReloadIcon { width: 24.86px; height: 24.86px; margin-left: 5.65px; margin-right: 0px; }
+.EntWatch.Size113 .Ammo { margin-right: 13.56px; }
+.EntWatch.Size113 .Overflow { font-size: 15.82px; }
+.EntWatch.Size114 .Item { width: 547.2px; padding: 9.12px 13.68px; margin-bottom: 5.7px; border-left-width: 3.42px; }
+.EntWatch.Size114 .ItemName { font-size: 20.52px; }
+.EntWatch.Size114 .Owner { font-size: 18.24px; margin-left: 9.12px; }
+.EntWatch.Size114 .Status { margin-left: 13.68px; }
+.EntWatch.Size114 .Status Label { font-size: 18.24px; }
+.EntWatch.Size114 .Status .Icon { font-size: 21.66px; margin-right: 5.7px; }
+.EntWatch.Size114 .Status .ReloadIcon { width: 25.08px; height: 25.08px; margin-left: 5.7px; margin-right: 0px; }
+.EntWatch.Size114 .Ammo { margin-right: 13.68px; }
+.EntWatch.Size114 .Overflow { font-size: 15.96px; }
+.EntWatch.Size115 .Item { width: 552px; padding: 9.2px 13.8px; margin-bottom: 5.75px; border-left-width: 3.45px; }
+.EntWatch.Size115 .ItemName { font-size: 20.7px; }
+.EntWatch.Size115 .Owner { font-size: 18.4px; margin-left: 9.2px; }
+.EntWatch.Size115 .Status { margin-left: 13.8px; }
+.EntWatch.Size115 .Status Label { font-size: 18.4px; }
+.EntWatch.Size115 .Status .Icon { font-size: 21.85px; margin-right: 5.75px; }
+.EntWatch.Size115 .Status .ReloadIcon { width: 25.3px; height: 25.3px; margin-left: 5.75px; margin-right: 0px; }
+.EntWatch.Size115 .Ammo { margin-right: 13.8px; }
+.EntWatch.Size115 .Overflow { font-size: 16.1px; }
+.EntWatch.Size116 .Item { width: 556.8px; padding: 9.28px 13.92px; margin-bottom: 5.8px; border-left-width: 3.48px; }
+.EntWatch.Size116 .ItemName { font-size: 20.88px; }
+.EntWatch.Size116 .Owner { font-size: 18.56px; margin-left: 9.28px; }
+.EntWatch.Size116 .Status { margin-left: 13.92px; }
+.EntWatch.Size116 .Status Label { font-size: 18.56px; }
+.EntWatch.Size116 .Status .Icon { font-size: 22.04px; margin-right: 5.8px; }
+.EntWatch.Size116 .Status .ReloadIcon { width: 25.52px; height: 25.52px; margin-left: 5.8px; margin-right: 0px; }
+.EntWatch.Size116 .Ammo { margin-right: 13.92px; }
+.EntWatch.Size116 .Overflow { font-size: 16.24px; }
+.EntWatch.Size117 .Item { width: 561.6px; padding: 9.36px 14.04px; margin-bottom: 5.85px; border-left-width: 3.51px; }
+.EntWatch.Size117 .ItemName { font-size: 21.06px; }
+.EntWatch.Size117 .Owner { font-size: 18.72px; margin-left: 9.36px; }
+.EntWatch.Size117 .Status { margin-left: 14.04px; }
+.EntWatch.Size117 .Status Label { font-size: 18.72px; }
+.EntWatch.Size117 .Status .Icon { font-size: 22.23px; margin-right: 5.85px; }
+.EntWatch.Size117 .Status .ReloadIcon { width: 25.74px; height: 25.74px; margin-left: 5.85px; margin-right: 0px; }
+.EntWatch.Size117 .Ammo { margin-right: 14.04px; }
+.EntWatch.Size117 .Overflow { font-size: 16.38px; }
+.EntWatch.Size118 .Item { width: 566.4px; padding: 9.44px 14.16px; margin-bottom: 5.9px; border-left-width: 3.54px; }
+.EntWatch.Size118 .ItemName { font-size: 21.24px; }
+.EntWatch.Size118 .Owner { font-size: 18.88px; margin-left: 9.44px; }
+.EntWatch.Size118 .Status { margin-left: 14.16px; }
+.EntWatch.Size118 .Status Label { font-size: 18.88px; }
+.EntWatch.Size118 .Status .Icon { font-size: 22.42px; margin-right: 5.9px; }
+.EntWatch.Size118 .Status .ReloadIcon { width: 25.96px; height: 25.96px; margin-left: 5.9px; margin-right: 0px; }
+.EntWatch.Size118 .Ammo { margin-right: 14.16px; }
+.EntWatch.Size118 .Overflow { font-size: 16.52px; }
+.EntWatch.Size119 .Item { width: 571.2px; padding: 9.52px 14.28px; margin-bottom: 5.95px; border-left-width: 3.57px; }
+.EntWatch.Size119 .ItemName { font-size: 21.42px; }
+.EntWatch.Size119 .Owner { font-size: 19.04px; margin-left: 9.52px; }
+.EntWatch.Size119 .Status { margin-left: 14.28px; }
+.EntWatch.Size119 .Status Label { font-size: 19.04px; }
+.EntWatch.Size119 .Status .Icon { font-size: 22.61px; margin-right: 5.95px; }
+.EntWatch.Size119 .Status .ReloadIcon { width: 26.18px; height: 26.18px; margin-left: 5.95px; margin-right: 0px; }
+.EntWatch.Size119 .Ammo { margin-right: 14.28px; }
+.EntWatch.Size119 .Overflow { font-size: 16.66px; }
+.EntWatch.Size120 .Item { width: 576px; padding: 9.6px 14.4px; margin-bottom: 6px; border-left-width: 3.6px; }
+.EntWatch.Size120 .ItemName { font-size: 21.6px; }
+.EntWatch.Size120 .Owner { font-size: 19.2px; margin-left: 9.6px; }
+.EntWatch.Size120 .Status { margin-left: 14.4px; }
+.EntWatch.Size120 .Status Label { font-size: 19.2px; }
+.EntWatch.Size120 .Status .Icon { font-size: 22.8px; margin-right: 6px; }
+.EntWatch.Size120 .Status .ReloadIcon { width: 26.4px; height: 26.4px; margin-left: 6px; margin-right: 0px; }
+.EntWatch.Size120 .Ammo { margin-right: 14.4px; }
+.EntWatch.Size120 .Overflow { font-size: 16.8px; }
+.EntWatch.Size121 .Item { width: 580.8px; padding: 9.68px 14.52px; margin-bottom: 6.05px; border-left-width: 3.63px; }
+.EntWatch.Size121 .ItemName { font-size: 21.78px; }
+.EntWatch.Size121 .Owner { font-size: 19.36px; margin-left: 9.68px; }
+.EntWatch.Size121 .Status { margin-left: 14.52px; }
+.EntWatch.Size121 .Status Label { font-size: 19.36px; }
+.EntWatch.Size121 .Status .Icon { font-size: 22.99px; margin-right: 6.05px; }
+.EntWatch.Size121 .Status .ReloadIcon { width: 26.62px; height: 26.62px; margin-left: 6.05px; margin-right: 0px; }
+.EntWatch.Size121 .Ammo { margin-right: 14.52px; }
+.EntWatch.Size121 .Overflow { font-size: 16.94px; }
+.EntWatch.Size122 .Item { width: 585.6px; padding: 9.76px 14.64px; margin-bottom: 6.1px; border-left-width: 3.66px; }
+.EntWatch.Size122 .ItemName { font-size: 21.96px; }
+.EntWatch.Size122 .Owner { font-size: 19.52px; margin-left: 9.76px; }
+.EntWatch.Size122 .Status { margin-left: 14.64px; }
+.EntWatch.Size122 .Status Label { font-size: 19.52px; }
+.EntWatch.Size122 .Status .Icon { font-size: 23.18px; margin-right: 6.1px; }
+.EntWatch.Size122 .Status .ReloadIcon { width: 26.84px; height: 26.84px; margin-left: 6.1px; margin-right: 0px; }
+.EntWatch.Size122 .Ammo { margin-right: 14.64px; }
+.EntWatch.Size122 .Overflow { font-size: 17.08px; }
+.EntWatch.Size123 .Item { width: 590.4px; padding: 9.84px 14.76px; margin-bottom: 6.15px; border-left-width: 3.69px; }
+.EntWatch.Size123 .ItemName { font-size: 22.14px; }
+.EntWatch.Size123 .Owner { font-size: 19.68px; margin-left: 9.84px; }
+.EntWatch.Size123 .Status { margin-left: 14.76px; }
+.EntWatch.Size123 .Status Label { font-size: 19.68px; }
+.EntWatch.Size123 .Status .Icon { font-size: 23.37px; margin-right: 6.15px; }
+.EntWatch.Size123 .Status .ReloadIcon { width: 27.06px; height: 27.06px; margin-left: 6.15px; margin-right: 0px; }
+.EntWatch.Size123 .Ammo { margin-right: 14.76px; }
+.EntWatch.Size123 .Overflow { font-size: 17.22px; }
+.EntWatch.Size124 .Item { width: 595.2px; padding: 9.92px 14.88px; margin-bottom: 6.2px; border-left-width: 3.72px; }
+.EntWatch.Size124 .ItemName { font-size: 22.32px; }
+.EntWatch.Size124 .Owner { font-size: 19.84px; margin-left: 9.92px; }
+.EntWatch.Size124 .Status { margin-left: 14.88px; }
+.EntWatch.Size124 .Status Label { font-size: 19.84px; }
+.EntWatch.Size124 .Status .Icon { font-size: 23.56px; margin-right: 6.2px; }
+.EntWatch.Size124 .Status .ReloadIcon { width: 27.28px; height: 27.28px; margin-left: 6.2px; margin-right: 0px; }
+.EntWatch.Size124 .Ammo { margin-right: 14.88px; }
+.EntWatch.Size124 .Overflow { font-size: 17.36px; }
+.EntWatch.Size125 .Item { width: 600px; padding: 10px 15px; margin-bottom: 6.25px; border-left-width: 3.75px; }
+.EntWatch.Size125 .ItemName { font-size: 22.5px; }
+.EntWatch.Size125 .Owner { font-size: 20px; margin-left: 10px; }
+.EntWatch.Size125 .Status { margin-left: 15px; }
+.EntWatch.Size125 .Status Label { font-size: 20px; }
+.EntWatch.Size125 .Status .Icon { font-size: 23.75px; margin-right: 6.25px; }
+.EntWatch.Size125 .Status .ReloadIcon { width: 27.5px; height: 27.5px; margin-left: 6.25px; margin-right: 0px; }
+.EntWatch.Size125 .Ammo { margin-right: 15px; }
+.EntWatch.Size125 .Overflow { font-size: 17.5px; }
+.EntWatch.Size126 .Item { width: 604.8px; padding: 10.08px 15.12px; margin-bottom: 6.3px; border-left-width: 3.78px; }
+.EntWatch.Size126 .ItemName { font-size: 22.68px; }
+.EntWatch.Size126 .Owner { font-size: 20.16px; margin-left: 10.08px; }
+.EntWatch.Size126 .Status { margin-left: 15.12px; }
+.EntWatch.Size126 .Status Label { font-size: 20.16px; }
+.EntWatch.Size126 .Status .Icon { font-size: 23.94px; margin-right: 6.3px; }
+.EntWatch.Size126 .Status .ReloadIcon { width: 27.72px; height: 27.72px; margin-left: 6.3px; margin-right: 0px; }
+.EntWatch.Size126 .Ammo { margin-right: 15.12px; }
+.EntWatch.Size126 .Overflow { font-size: 17.64px; }
+.EntWatch.Size127 .Item { width: 609.6px; padding: 10.16px 15.24px; margin-bottom: 6.35px; border-left-width: 3.81px; }
+.EntWatch.Size127 .ItemName { font-size: 22.86px; }
+.EntWatch.Size127 .Owner { font-size: 20.32px; margin-left: 10.16px; }
+.EntWatch.Size127 .Status { margin-left: 15.24px; }
+.EntWatch.Size127 .Status Label { font-size: 20.32px; }
+.EntWatch.Size127 .Status .Icon { font-size: 24.13px; margin-right: 6.35px; }
+.EntWatch.Size127 .Status .ReloadIcon { width: 27.94px; height: 27.94px; margin-left: 6.35px; margin-right: 0px; }
+.EntWatch.Size127 .Ammo { margin-right: 15.24px; }
+.EntWatch.Size127 .Overflow { font-size: 17.78px; }
+.EntWatch.Size128 .Item { width: 614.4px; padding: 10.24px 15.36px; margin-bottom: 6.4px; border-left-width: 3.84px; }
+.EntWatch.Size128 .ItemName { font-size: 23.04px; }
+.EntWatch.Size128 .Owner { font-size: 20.48px; margin-left: 10.24px; }
+.EntWatch.Size128 .Status { margin-left: 15.36px; }
+.EntWatch.Size128 .Status Label { font-size: 20.48px; }
+.EntWatch.Size128 .Status .Icon { font-size: 24.32px; margin-right: 6.4px; }
+.EntWatch.Size128 .Status .ReloadIcon { width: 28.16px; height: 28.16px; margin-left: 6.4px; margin-right: 0px; }
+.EntWatch.Size128 .Ammo { margin-right: 15.36px; }
+.EntWatch.Size128 .Overflow { font-size: 17.92px; }
+.EntWatch.Size129 .Item { width: 619.2px; padding: 10.32px 15.48px; margin-bottom: 6.45px; border-left-width: 3.87px; }
+.EntWatch.Size129 .ItemName { font-size: 23.22px; }
+.EntWatch.Size129 .Owner { font-size: 20.64px; margin-left: 10.32px; }
+.EntWatch.Size129 .Status { margin-left: 15.48px; }
+.EntWatch.Size129 .Status Label { font-size: 20.64px; }
+.EntWatch.Size129 .Status .Icon { font-size: 24.51px; margin-right: 6.45px; }
+.EntWatch.Size129 .Status .ReloadIcon { width: 28.38px; height: 28.38px; margin-left: 6.45px; margin-right: 0px; }
+.EntWatch.Size129 .Ammo { margin-right: 15.48px; }
+.EntWatch.Size129 .Overflow { font-size: 18.06px; }
+.EntWatch.Size130 .Item { width: 624px; padding: 10.4px 15.6px; margin-bottom: 6.5px; border-left-width: 3.9px; }
+.EntWatch.Size130 .ItemName { font-size: 23.4px; }
+.EntWatch.Size130 .Owner { font-size: 20.8px; margin-left: 10.4px; }
+.EntWatch.Size130 .Status { margin-left: 15.6px; }
+.EntWatch.Size130 .Status Label { font-size: 20.8px; }
+.EntWatch.Size130 .Status .Icon { font-size: 24.7px; margin-right: 6.5px; }
+.EntWatch.Size130 .Status .ReloadIcon { width: 28.6px; height: 28.6px; margin-left: 6.5px; margin-right: 0px; }
+.EntWatch.Size130 .Ammo { margin-right: 15.6px; }
+.EntWatch.Size130 .Overflow { font-size: 18.2px; }
+.EntWatch.Size131 .Item { width: 628.8px; padding: 10.48px 15.72px; margin-bottom: 6.55px; border-left-width: 3.93px; }
+.EntWatch.Size131 .ItemName { font-size: 23.58px; }
+.EntWatch.Size131 .Owner { font-size: 20.96px; margin-left: 10.48px; }
+.EntWatch.Size131 .Status { margin-left: 15.72px; }
+.EntWatch.Size131 .Status Label { font-size: 20.96px; }
+.EntWatch.Size131 .Status .Icon { font-size: 24.89px; margin-right: 6.55px; }
+.EntWatch.Size131 .Status .ReloadIcon { width: 28.82px; height: 28.82px; margin-left: 6.55px; margin-right: 0px; }
+.EntWatch.Size131 .Ammo { margin-right: 15.72px; }
+.EntWatch.Size131 .Overflow { font-size: 18.34px; }
+.EntWatch.Size132 .Item { width: 633.6px; padding: 10.56px 15.84px; margin-bottom: 6.6px; border-left-width: 3.96px; }
+.EntWatch.Size132 .ItemName { font-size: 23.76px; }
+.EntWatch.Size132 .Owner { font-size: 21.12px; margin-left: 10.56px; }
+.EntWatch.Size132 .Status { margin-left: 15.84px; }
+.EntWatch.Size132 .Status Label { font-size: 21.12px; }
+.EntWatch.Size132 .Status .Icon { font-size: 25.08px; margin-right: 6.6px; }
+.EntWatch.Size132 .Status .ReloadIcon { width: 29.04px; height: 29.04px; margin-left: 6.6px; margin-right: 0px; }
+.EntWatch.Size132 .Ammo { margin-right: 15.84px; }
+.EntWatch.Size132 .Overflow { font-size: 18.48px; }
+.EntWatch.Size133 .Item { width: 638.4px; padding: 10.64px 15.96px; margin-bottom: 6.65px; border-left-width: 3.99px; }
+.EntWatch.Size133 .ItemName { font-size: 23.94px; }
+.EntWatch.Size133 .Owner { font-size: 21.28px; margin-left: 10.64px; }
+.EntWatch.Size133 .Status { margin-left: 15.96px; }
+.EntWatch.Size133 .Status Label { font-size: 21.28px; }
+.EntWatch.Size133 .Status .Icon { font-size: 25.27px; margin-right: 6.65px; }
+.EntWatch.Size133 .Status .ReloadIcon { width: 29.26px; height: 29.26px; margin-left: 6.65px; margin-right: 0px; }
+.EntWatch.Size133 .Ammo { margin-right: 15.96px; }
+.EntWatch.Size133 .Overflow { font-size: 18.62px; }
+.EntWatch.Size134 .Item { width: 643.2px; padding: 10.72px 16.08px; margin-bottom: 6.7px; border-left-width: 4.02px; }
+.EntWatch.Size134 .ItemName { font-size: 24.12px; }
+.EntWatch.Size134 .Owner { font-size: 21.44px; margin-left: 10.72px; }
+.EntWatch.Size134 .Status { margin-left: 16.08px; }
+.EntWatch.Size134 .Status Label { font-size: 21.44px; }
+.EntWatch.Size134 .Status .Icon { font-size: 25.46px; margin-right: 6.7px; }
+.EntWatch.Size134 .Status .ReloadIcon { width: 29.48px; height: 29.48px; margin-left: 6.7px; margin-right: 0px; }
+.EntWatch.Size134 .Ammo { margin-right: 16.08px; }
+.EntWatch.Size134 .Overflow { font-size: 18.76px; }
+.EntWatch.Size135 .Item { width: 648px; padding: 10.8px 16.2px; margin-bottom: 6.75px; border-left-width: 4.05px; }
+.EntWatch.Size135 .ItemName { font-size: 24.3px; }
+.EntWatch.Size135 .Owner { font-size: 21.6px; margin-left: 10.8px; }
+.EntWatch.Size135 .Status { margin-left: 16.2px; }
+.EntWatch.Size135 .Status Label { font-size: 21.6px; }
+.EntWatch.Size135 .Status .Icon { font-size: 25.65px; margin-right: 6.75px; }
+.EntWatch.Size135 .Status .ReloadIcon { width: 29.7px; height: 29.7px; margin-left: 6.75px; margin-right: 0px; }
+.EntWatch.Size135 .Ammo { margin-right: 16.2px; }
+.EntWatch.Size135 .Overflow { font-size: 18.9px; }
+.EntWatch.Size136 .Item { width: 652.8px; padding: 10.88px 16.32px; margin-bottom: 6.8px; border-left-width: 4.08px; }
+.EntWatch.Size136 .ItemName { font-size: 24.48px; }
+.EntWatch.Size136 .Owner { font-size: 21.76px; margin-left: 10.88px; }
+.EntWatch.Size136 .Status { margin-left: 16.32px; }
+.EntWatch.Size136 .Status Label { font-size: 21.76px; }
+.EntWatch.Size136 .Status .Icon { font-size: 25.84px; margin-right: 6.8px; }
+.EntWatch.Size136 .Status .ReloadIcon { width: 29.92px; height: 29.92px; margin-left: 6.8px; margin-right: 0px; }
+.EntWatch.Size136 .Ammo { margin-right: 16.32px; }
+.EntWatch.Size136 .Overflow { font-size: 19.04px; }
+.EntWatch.Size137 .Item { width: 657.6px; padding: 10.96px 16.44px; margin-bottom: 6.85px; border-left-width: 4.11px; }
+.EntWatch.Size137 .ItemName { font-size: 24.66px; }
+.EntWatch.Size137 .Owner { font-size: 21.92px; margin-left: 10.96px; }
+.EntWatch.Size137 .Status { margin-left: 16.44px; }
+.EntWatch.Size137 .Status Label { font-size: 21.92px; }
+.EntWatch.Size137 .Status .Icon { font-size: 26.03px; margin-right: 6.85px; }
+.EntWatch.Size137 .Status .ReloadIcon { width: 30.14px; height: 30.14px; margin-left: 6.85px; margin-right: 0px; }
+.EntWatch.Size137 .Ammo { margin-right: 16.44px; }
+.EntWatch.Size137 .Overflow { font-size: 19.18px; }
+.EntWatch.Size138 .Item { width: 662.4px; padding: 11.04px 16.56px; margin-bottom: 6.9px; border-left-width: 4.14px; }
+.EntWatch.Size138 .ItemName { font-size: 24.84px; }
+.EntWatch.Size138 .Owner { font-size: 22.08px; margin-left: 11.04px; }
+.EntWatch.Size138 .Status { margin-left: 16.56px; }
+.EntWatch.Size138 .Status Label { font-size: 22.08px; }
+.EntWatch.Size138 .Status .Icon { font-size: 26.22px; margin-right: 6.9px; }
+.EntWatch.Size138 .Status .ReloadIcon { width: 30.36px; height: 30.36px; margin-left: 6.9px; margin-right: 0px; }
+.EntWatch.Size138 .Ammo { margin-right: 16.56px; }
+.EntWatch.Size138 .Overflow { font-size: 19.32px; }
+.EntWatch.Size139 .Item { width: 667.2px; padding: 11.12px 16.68px; margin-bottom: 6.95px; border-left-width: 4.17px; }
+.EntWatch.Size139 .ItemName { font-size: 25.02px; }
+.EntWatch.Size139 .Owner { font-size: 22.24px; margin-left: 11.12px; }
+.EntWatch.Size139 .Status { margin-left: 16.68px; }
+.EntWatch.Size139 .Status Label { font-size: 22.24px; }
+.EntWatch.Size139 .Status .Icon { font-size: 26.41px; margin-right: 6.95px; }
+.EntWatch.Size139 .Status .ReloadIcon { width: 30.58px; height: 30.58px; margin-left: 6.95px; margin-right: 0px; }
+.EntWatch.Size139 .Ammo { margin-right: 16.68px; }
+.EntWatch.Size139 .Overflow { font-size: 19.46px; }
+.EntWatch.Size140 .Item { width: 672px; padding: 11.2px 16.8px; margin-bottom: 7px; border-left-width: 4.2px; }
+.EntWatch.Size140 .ItemName { font-size: 25.2px; }
+.EntWatch.Size140 .Owner { font-size: 22.4px; margin-left: 11.2px; }
+.EntWatch.Size140 .Status { margin-left: 16.8px; }
+.EntWatch.Size140 .Status Label { font-size: 22.4px; }
+.EntWatch.Size140 .Status .Icon { font-size: 26.6px; margin-right: 7px; }
+.EntWatch.Size140 .Status .ReloadIcon { width: 30.8px; height: 30.8px; margin-left: 7px; margin-right: 0px; }
+.EntWatch.Size140 .Ammo { margin-right: 16.8px; }
+.EntWatch.Size140 .Overflow { font-size: 19.6px; }
+.EntWatch.Size141 .Item { width: 676.8px; padding: 11.28px 16.92px; margin-bottom: 7.05px; border-left-width: 4.23px; }
+.EntWatch.Size141 .ItemName { font-size: 25.38px; }
+.EntWatch.Size141 .Owner { font-size: 22.56px; margin-left: 11.28px; }
+.EntWatch.Size141 .Status { margin-left: 16.92px; }
+.EntWatch.Size141 .Status Label { font-size: 22.56px; }
+.EntWatch.Size141 .Status .Icon { font-size: 26.79px; margin-right: 7.05px; }
+.EntWatch.Size141 .Status .ReloadIcon { width: 31.02px; height: 31.02px; margin-left: 7.05px; margin-right: 0px; }
+.EntWatch.Size141 .Ammo { margin-right: 16.92px; }
+.EntWatch.Size141 .Overflow { font-size: 19.74px; }
+.EntWatch.Size142 .Item { width: 681.6px; padding: 11.36px 17.04px; margin-bottom: 7.1px; border-left-width: 4.26px; }
+.EntWatch.Size142 .ItemName { font-size: 25.56px; }
+.EntWatch.Size142 .Owner { font-size: 22.72px; margin-left: 11.36px; }
+.EntWatch.Size142 .Status { margin-left: 17.04px; }
+.EntWatch.Size142 .Status Label { font-size: 22.72px; }
+.EntWatch.Size142 .Status .Icon { font-size: 26.98px; margin-right: 7.1px; }
+.EntWatch.Size142 .Status .ReloadIcon { width: 31.24px; height: 31.24px; margin-left: 7.1px; margin-right: 0px; }
+.EntWatch.Size142 .Ammo { margin-right: 17.04px; }
+.EntWatch.Size142 .Overflow { font-size: 19.88px; }
+.EntWatch.Size143 .Item { width: 686.4px; padding: 11.44px 17.16px; margin-bottom: 7.15px; border-left-width: 4.29px; }
+.EntWatch.Size143 .ItemName { font-size: 25.74px; }
+.EntWatch.Size143 .Owner { font-size: 22.88px; margin-left: 11.44px; }
+.EntWatch.Size143 .Status { margin-left: 17.16px; }
+.EntWatch.Size143 .Status Label { font-size: 22.88px; }
+.EntWatch.Size143 .Status .Icon { font-size: 27.17px; margin-right: 7.15px; }
+.EntWatch.Size143 .Status .ReloadIcon { width: 31.46px; height: 31.46px; margin-left: 7.15px; margin-right: 0px; }
+.EntWatch.Size143 .Ammo { margin-right: 17.16px; }
+.EntWatch.Size143 .Overflow { font-size: 20.02px; }
+.EntWatch.Size144 .Item { width: 691.2px; padding: 11.52px 17.28px; margin-bottom: 7.2px; border-left-width: 4.32px; }
+.EntWatch.Size144 .ItemName { font-size: 25.92px; }
+.EntWatch.Size144 .Owner { font-size: 23.04px; margin-left: 11.52px; }
+.EntWatch.Size144 .Status { margin-left: 17.28px; }
+.EntWatch.Size144 .Status Label { font-size: 23.04px; }
+.EntWatch.Size144 .Status .Icon { font-size: 27.36px; margin-right: 7.2px; }
+.EntWatch.Size144 .Status .ReloadIcon { width: 31.68px; height: 31.68px; margin-left: 7.2px; margin-right: 0px; }
+.EntWatch.Size144 .Ammo { margin-right: 17.28px; }
+.EntWatch.Size144 .Overflow { font-size: 20.16px; }
+.EntWatch.Size145 .Item { width: 696px; padding: 11.6px 17.4px; margin-bottom: 7.25px; border-left-width: 4.35px; }
+.EntWatch.Size145 .ItemName { font-size: 26.1px; }
+.EntWatch.Size145 .Owner { font-size: 23.2px; margin-left: 11.6px; }
+.EntWatch.Size145 .Status { margin-left: 17.4px; }
+.EntWatch.Size145 .Status Label { font-size: 23.2px; }
+.EntWatch.Size145 .Status .Icon { font-size: 27.55px; margin-right: 7.25px; }
+.EntWatch.Size145 .Status .ReloadIcon { width: 31.9px; height: 31.9px; margin-left: 7.25px; margin-right: 0px; }
+.EntWatch.Size145 .Ammo { margin-right: 17.4px; }
+.EntWatch.Size145 .Overflow { font-size: 20.3px; }
+.EntWatch.Size146 .Item { width: 700.8px; padding: 11.68px 17.52px; margin-bottom: 7.3px; border-left-width: 4.38px; }
+.EntWatch.Size146 .ItemName { font-size: 26.28px; }
+.EntWatch.Size146 .Owner { font-size: 23.36px; margin-left: 11.68px; }
+.EntWatch.Size146 .Status { margin-left: 17.52px; }
+.EntWatch.Size146 .Status Label { font-size: 23.36px; }
+.EntWatch.Size146 .Status .Icon { font-size: 27.74px; margin-right: 7.3px; }
+.EntWatch.Size146 .Status .ReloadIcon { width: 32.12px; height: 32.12px; margin-left: 7.3px; margin-right: 0px; }
+.EntWatch.Size146 .Ammo { margin-right: 17.52px; }
+.EntWatch.Size146 .Overflow { font-size: 20.44px; }
+.EntWatch.Size147 .Item { width: 705.6px; padding: 11.76px 17.64px; margin-bottom: 7.35px; border-left-width: 4.41px; }
+.EntWatch.Size147 .ItemName { font-size: 26.46px; }
+.EntWatch.Size147 .Owner { font-size: 23.52px; margin-left: 11.76px; }
+.EntWatch.Size147 .Status { margin-left: 17.64px; }
+.EntWatch.Size147 .Status Label { font-size: 23.52px; }
+.EntWatch.Size147 .Status .Icon { font-size: 27.93px; margin-right: 7.35px; }
+.EntWatch.Size147 .Status .ReloadIcon { width: 32.34px; height: 32.34px; margin-left: 7.35px; margin-right: 0px; }
+.EntWatch.Size147 .Ammo { margin-right: 17.64px; }
+.EntWatch.Size147 .Overflow { font-size: 20.58px; }
+.EntWatch.Size148 .Item { width: 710.4px; padding: 11.84px 17.76px; margin-bottom: 7.4px; border-left-width: 4.44px; }
+.EntWatch.Size148 .ItemName { font-size: 26.64px; }
+.EntWatch.Size148 .Owner { font-size: 23.68px; margin-left: 11.84px; }
+.EntWatch.Size148 .Status { margin-left: 17.76px; }
+.EntWatch.Size148 .Status Label { font-size: 23.68px; }
+.EntWatch.Size148 .Status .Icon { font-size: 28.12px; margin-right: 7.4px; }
+.EntWatch.Size148 .Status .ReloadIcon { width: 32.56px; height: 32.56px; margin-left: 7.4px; margin-right: 0px; }
+.EntWatch.Size148 .Ammo { margin-right: 17.76px; }
+.EntWatch.Size148 .Overflow { font-size: 20.72px; }
+.EntWatch.Size149 .Item { width: 715.2px; padding: 11.92px 17.88px; margin-bottom: 7.45px; border-left-width: 4.47px; }
+.EntWatch.Size149 .ItemName { font-size: 26.82px; }
+.EntWatch.Size149 .Owner { font-size: 23.84px; margin-left: 11.92px; }
+.EntWatch.Size149 .Status { margin-left: 17.88px; }
+.EntWatch.Size149 .Status Label { font-size: 23.84px; }
+.EntWatch.Size149 .Status .Icon { font-size: 28.31px; margin-right: 7.45px; }
+.EntWatch.Size149 .Status .ReloadIcon { width: 32.78px; height: 32.78px; margin-left: 7.45px; margin-right: 0px; }
+.EntWatch.Size149 .Ammo { margin-right: 17.88px; }
+.EntWatch.Size149 .Overflow { font-size: 20.86px; }
+.EntWatch.Size150 .Item { width: 720px; padding: 12px 18px; margin-bottom: 7.5px; border-left-width: 4.5px; }
+.EntWatch.Size150 .ItemName { font-size: 27px; }
+.EntWatch.Size150 .Owner { font-size: 24px; margin-left: 12px; }
+.EntWatch.Size150 .Status { margin-left: 18px; }
+.EntWatch.Size150 .Status Label { font-size: 24px; }
+.EntWatch.Size150 .Status .Icon { font-size: 28.5px; margin-right: 7.5px; }
+.EntWatch.Size150 .Status .ReloadIcon { width: 33px; height: 33px; margin-left: 7.5px; margin-right: 0px; }
+.EntWatch.Size150 .Ammo { margin-right: 18px; }
+.EntWatch.Size150 .Overflow { font-size: 21px; }
+.EntWatch.Size151 .Item { width: 724.8px; padding: 12.08px 18.12px; margin-bottom: 7.55px; border-left-width: 4.53px; }
+.EntWatch.Size151 .ItemName { font-size: 27.18px; }
+.EntWatch.Size151 .Owner { font-size: 24.16px; margin-left: 12.08px; }
+.EntWatch.Size151 .Status { margin-left: 18.12px; }
+.EntWatch.Size151 .Status Label { font-size: 24.16px; }
+.EntWatch.Size151 .Status .Icon { font-size: 28.69px; margin-right: 7.55px; }
+.EntWatch.Size151 .Status .ReloadIcon { width: 33.22px; height: 33.22px; margin-left: 7.55px; margin-right: 0px; }
+.EntWatch.Size151 .Ammo { margin-right: 18.12px; }
+.EntWatch.Size151 .Overflow { font-size: 21.14px; }
+.EntWatch.Size152 .Item { width: 729.6px; padding: 12.16px 18.24px; margin-bottom: 7.6px; border-left-width: 4.56px; }
+.EntWatch.Size152 .ItemName { font-size: 27.36px; }
+.EntWatch.Size152 .Owner { font-size: 24.32px; margin-left: 12.16px; }
+.EntWatch.Size152 .Status { margin-left: 18.24px; }
+.EntWatch.Size152 .Status Label { font-size: 24.32px; }
+.EntWatch.Size152 .Status .Icon { font-size: 28.88px; margin-right: 7.6px; }
+.EntWatch.Size152 .Status .ReloadIcon { width: 33.44px; height: 33.44px; margin-left: 7.6px; margin-right: 0px; }
+.EntWatch.Size152 .Ammo { margin-right: 18.24px; }
+.EntWatch.Size152 .Overflow { font-size: 21.28px; }
+.EntWatch.Size153 .Item { width: 734.4px; padding: 12.24px 18.36px; margin-bottom: 7.65px; border-left-width: 4.59px; }
+.EntWatch.Size153 .ItemName { font-size: 27.54px; }
+.EntWatch.Size153 .Owner { font-size: 24.48px; margin-left: 12.24px; }
+.EntWatch.Size153 .Status { margin-left: 18.36px; }
+.EntWatch.Size153 .Status Label { font-size: 24.48px; }
+.EntWatch.Size153 .Status .Icon { font-size: 29.07px; margin-right: 7.65px; }
+.EntWatch.Size153 .Status .ReloadIcon { width: 33.66px; height: 33.66px; margin-left: 7.65px; margin-right: 0px; }
+.EntWatch.Size153 .Ammo { margin-right: 18.36px; }
+.EntWatch.Size153 .Overflow { font-size: 21.42px; }
+.EntWatch.Size154 .Item { width: 739.2px; padding: 12.32px 18.48px; margin-bottom: 7.7px; border-left-width: 4.62px; }
+.EntWatch.Size154 .ItemName { font-size: 27.72px; }
+.EntWatch.Size154 .Owner { font-size: 24.64px; margin-left: 12.32px; }
+.EntWatch.Size154 .Status { margin-left: 18.48px; }
+.EntWatch.Size154 .Status Label { font-size: 24.64px; }
+.EntWatch.Size154 .Status .Icon { font-size: 29.26px; margin-right: 7.7px; }
+.EntWatch.Size154 .Status .ReloadIcon { width: 33.88px; height: 33.88px; margin-left: 7.7px; margin-right: 0px; }
+.EntWatch.Size154 .Ammo { margin-right: 18.48px; }
+.EntWatch.Size154 .Overflow { font-size: 21.56px; }
+.EntWatch.Size155 .Item { width: 744px; padding: 12.4px 18.6px; margin-bottom: 7.75px; border-left-width: 4.65px; }
+.EntWatch.Size155 .ItemName { font-size: 27.9px; }
+.EntWatch.Size155 .Owner { font-size: 24.8px; margin-left: 12.4px; }
+.EntWatch.Size155 .Status { margin-left: 18.6px; }
+.EntWatch.Size155 .Status Label { font-size: 24.8px; }
+.EntWatch.Size155 .Status .Icon { font-size: 29.45px; margin-right: 7.75px; }
+.EntWatch.Size155 .Status .ReloadIcon { width: 34.1px; height: 34.1px; margin-left: 7.75px; margin-right: 0px; }
+.EntWatch.Size155 .Ammo { margin-right: 18.6px; }
+.EntWatch.Size155 .Overflow { font-size: 21.7px; }
+.EntWatch.Size156 .Item { width: 748.8px; padding: 12.48px 18.72px; margin-bottom: 7.8px; border-left-width: 4.68px; }
+.EntWatch.Size156 .ItemName { font-size: 28.08px; }
+.EntWatch.Size156 .Owner { font-size: 24.96px; margin-left: 12.48px; }
+.EntWatch.Size156 .Status { margin-left: 18.72px; }
+.EntWatch.Size156 .Status Label { font-size: 24.96px; }
+.EntWatch.Size156 .Status .Icon { font-size: 29.64px; margin-right: 7.8px; }
+.EntWatch.Size156 .Status .ReloadIcon { width: 34.32px; height: 34.32px; margin-left: 7.8px; margin-right: 0px; }
+.EntWatch.Size156 .Ammo { margin-right: 18.72px; }
+.EntWatch.Size156 .Overflow { font-size: 21.84px; }
+.EntWatch.Size157 .Item { width: 753.6px; padding: 12.56px 18.84px; margin-bottom: 7.85px; border-left-width: 4.71px; }
+.EntWatch.Size157 .ItemName { font-size: 28.26px; }
+.EntWatch.Size157 .Owner { font-size: 25.12px; margin-left: 12.56px; }
+.EntWatch.Size157 .Status { margin-left: 18.84px; }
+.EntWatch.Size157 .Status Label { font-size: 25.12px; }
+.EntWatch.Size157 .Status .Icon { font-size: 29.83px; margin-right: 7.85px; }
+.EntWatch.Size157 .Status .ReloadIcon { width: 34.54px; height: 34.54px; margin-left: 7.85px; margin-right: 0px; }
+.EntWatch.Size157 .Ammo { margin-right: 18.84px; }
+.EntWatch.Size157 .Overflow { font-size: 21.98px; }
+.EntWatch.Size158 .Item { width: 758.4px; padding: 12.64px 18.96px; margin-bottom: 7.9px; border-left-width: 4.74px; }
+.EntWatch.Size158 .ItemName { font-size: 28.44px; }
+.EntWatch.Size158 .Owner { font-size: 25.28px; margin-left: 12.64px; }
+.EntWatch.Size158 .Status { margin-left: 18.96px; }
+.EntWatch.Size158 .Status Label { font-size: 25.28px; }
+.EntWatch.Size158 .Status .Icon { font-size: 30.02px; margin-right: 7.9px; }
+.EntWatch.Size158 .Status .ReloadIcon { width: 34.76px; height: 34.76px; margin-left: 7.9px; margin-right: 0px; }
+.EntWatch.Size158 .Ammo { margin-right: 18.96px; }
+.EntWatch.Size158 .Overflow { font-size: 22.12px; }
+.EntWatch.Size159 .Item { width: 763.2px; padding: 12.72px 19.08px; margin-bottom: 7.95px; border-left-width: 4.77px; }
+.EntWatch.Size159 .ItemName { font-size: 28.62px; }
+.EntWatch.Size159 .Owner { font-size: 25.44px; margin-left: 12.72px; }
+.EntWatch.Size159 .Status { margin-left: 19.08px; }
+.EntWatch.Size159 .Status Label { font-size: 25.44px; }
+.EntWatch.Size159 .Status .Icon { font-size: 30.21px; margin-right: 7.95px; }
+.EntWatch.Size159 .Status .ReloadIcon { width: 34.98px; height: 34.98px; margin-left: 7.95px; margin-right: 0px; }
+.EntWatch.Size159 .Ammo { margin-right: 19.08px; }
+.EntWatch.Size159 .Overflow { font-size: 22.26px; }
+.EntWatch.Size160 .Item { width: 768px; padding: 12.8px 19.2px; margin-bottom: 8px; border-left-width: 4.8px; }
+.EntWatch.Size160 .ItemName { font-size: 28.8px; }
+.EntWatch.Size160 .Owner { font-size: 25.6px; margin-left: 12.8px; }
+.EntWatch.Size160 .Status { margin-left: 19.2px; }
+.EntWatch.Size160 .Status Label { font-size: 25.6px; }
+.EntWatch.Size160 .Status .Icon { font-size: 30.4px; margin-right: 8px; }
+.EntWatch.Size160 .Status .ReloadIcon { width: 35.2px; height: 35.2px; margin-left: 8px; margin-right: 0px; }
+.EntWatch.Size160 .Ammo { margin-right: 19.2px; }
+.EntWatch.Size160 .Overflow { font-size: 22.4px; }
+.EntWatch.Size161 .Item { width: 772.8px; padding: 12.88px 19.32px; margin-bottom: 8.05px; border-left-width: 4.83px; }
+.EntWatch.Size161 .ItemName { font-size: 28.98px; }
+.EntWatch.Size161 .Owner { font-size: 25.76px; margin-left: 12.88px; }
+.EntWatch.Size161 .Status { margin-left: 19.32px; }
+.EntWatch.Size161 .Status Label { font-size: 25.76px; }
+.EntWatch.Size161 .Status .Icon { font-size: 30.59px; margin-right: 8.05px; }
+.EntWatch.Size161 .Status .ReloadIcon { width: 35.42px; height: 35.42px; margin-left: 8.05px; margin-right: 0px; }
+.EntWatch.Size161 .Ammo { margin-right: 19.32px; }
+.EntWatch.Size161 .Overflow { font-size: 22.54px; }
+.EntWatch.Size162 .Item { width: 777.6px; padding: 12.96px 19.44px; margin-bottom: 8.1px; border-left-width: 4.86px; }
+.EntWatch.Size162 .ItemName { font-size: 29.16px; }
+.EntWatch.Size162 .Owner { font-size: 25.92px; margin-left: 12.96px; }
+.EntWatch.Size162 .Status { margin-left: 19.44px; }
+.EntWatch.Size162 .Status Label { font-size: 25.92px; }
+.EntWatch.Size162 .Status .Icon { font-size: 30.78px; margin-right: 8.1px; }
+.EntWatch.Size162 .Status .ReloadIcon { width: 35.64px; height: 35.64px; margin-left: 8.1px; margin-right: 0px; }
+.EntWatch.Size162 .Ammo { margin-right: 19.44px; }
+.EntWatch.Size162 .Overflow { font-size: 22.68px; }
+.EntWatch.Size163 .Item { width: 782.4px; padding: 13.04px 19.56px; margin-bottom: 8.15px; border-left-width: 4.89px; }
+.EntWatch.Size163 .ItemName { font-size: 29.34px; }
+.EntWatch.Size163 .Owner { font-size: 26.08px; margin-left: 13.04px; }
+.EntWatch.Size163 .Status { margin-left: 19.56px; }
+.EntWatch.Size163 .Status Label { font-size: 26.08px; }
+.EntWatch.Size163 .Status .Icon { font-size: 30.97px; margin-right: 8.15px; }
+.EntWatch.Size163 .Status .ReloadIcon { width: 35.86px; height: 35.86px; margin-left: 8.15px; margin-right: 0px; }
+.EntWatch.Size163 .Ammo { margin-right: 19.56px; }
+.EntWatch.Size163 .Overflow { font-size: 22.82px; }
+.EntWatch.Size164 .Item { width: 787.2px; padding: 13.12px 19.68px; margin-bottom: 8.2px; border-left-width: 4.92px; }
+.EntWatch.Size164 .ItemName { font-size: 29.52px; }
+.EntWatch.Size164 .Owner { font-size: 26.24px; margin-left: 13.12px; }
+.EntWatch.Size164 .Status { margin-left: 19.68px; }
+.EntWatch.Size164 .Status Label { font-size: 26.24px; }
+.EntWatch.Size164 .Status .Icon { font-size: 31.16px; margin-right: 8.2px; }
+.EntWatch.Size164 .Status .ReloadIcon { width: 36.08px; height: 36.08px; margin-left: 8.2px; margin-right: 0px; }
+.EntWatch.Size164 .Ammo { margin-right: 19.68px; }
+.EntWatch.Size164 .Overflow { font-size: 22.96px; }
+.EntWatch.Size165 .Item { width: 792px; padding: 13.2px 19.8px; margin-bottom: 8.25px; border-left-width: 4.95px; }
+.EntWatch.Size165 .ItemName { font-size: 29.7px; }
+.EntWatch.Size165 .Owner { font-size: 26.4px; margin-left: 13.2px; }
+.EntWatch.Size165 .Status { margin-left: 19.8px; }
+.EntWatch.Size165 .Status Label { font-size: 26.4px; }
+.EntWatch.Size165 .Status .Icon { font-size: 31.35px; margin-right: 8.25px; }
+.EntWatch.Size165 .Status .ReloadIcon { width: 36.3px; height: 36.3px; margin-left: 8.25px; margin-right: 0px; }
+.EntWatch.Size165 .Ammo { margin-right: 19.8px; }
+.EntWatch.Size165 .Overflow { font-size: 23.1px; }
+.EntWatch.Size166 .Item { width: 796.8px; padding: 13.28px 19.92px; margin-bottom: 8.3px; border-left-width: 4.98px; }
+.EntWatch.Size166 .ItemName { font-size: 29.88px; }
+.EntWatch.Size166 .Owner { font-size: 26.56px; margin-left: 13.28px; }
+.EntWatch.Size166 .Status { margin-left: 19.92px; }
+.EntWatch.Size166 .Status Label { font-size: 26.56px; }
+.EntWatch.Size166 .Status .Icon { font-size: 31.54px; margin-right: 8.3px; }
+.EntWatch.Size166 .Status .ReloadIcon { width: 36.52px; height: 36.52px; margin-left: 8.3px; margin-right: 0px; }
+.EntWatch.Size166 .Ammo { margin-right: 19.92px; }
+.EntWatch.Size166 .Overflow { font-size: 23.24px; }
+.EntWatch.Size167 .Item { width: 801.6px; padding: 13.36px 20.04px; margin-bottom: 8.35px; border-left-width: 5.01px; }
+.EntWatch.Size167 .ItemName { font-size: 30.06px; }
+.EntWatch.Size167 .Owner { font-size: 26.72px; margin-left: 13.36px; }
+.EntWatch.Size167 .Status { margin-left: 20.04px; }
+.EntWatch.Size167 .Status Label { font-size: 26.72px; }
+.EntWatch.Size167 .Status .Icon { font-size: 31.73px; margin-right: 8.35px; }
+.EntWatch.Size167 .Status .ReloadIcon { width: 36.74px; height: 36.74px; margin-left: 8.35px; margin-right: 0px; }
+.EntWatch.Size167 .Ammo { margin-right: 20.04px; }
+.EntWatch.Size167 .Overflow { font-size: 23.38px; }
+.EntWatch.Size168 .Item { width: 806.4px; padding: 13.44px 20.16px; margin-bottom: 8.4px; border-left-width: 5.04px; }
+.EntWatch.Size168 .ItemName { font-size: 30.24px; }
+.EntWatch.Size168 .Owner { font-size: 26.88px; margin-left: 13.44px; }
+.EntWatch.Size168 .Status { margin-left: 20.16px; }
+.EntWatch.Size168 .Status Label { font-size: 26.88px; }
+.EntWatch.Size168 .Status .Icon { font-size: 31.92px; margin-right: 8.4px; }
+.EntWatch.Size168 .Status .ReloadIcon { width: 36.96px; height: 36.96px; margin-left: 8.4px; margin-right: 0px; }
+.EntWatch.Size168 .Ammo { margin-right: 20.16px; }
+.EntWatch.Size168 .Overflow { font-size: 23.52px; }
+.EntWatch.Size169 .Item { width: 811.2px; padding: 13.52px 20.28px; margin-bottom: 8.45px; border-left-width: 5.07px; }
+.EntWatch.Size169 .ItemName { font-size: 30.42px; }
+.EntWatch.Size169 .Owner { font-size: 27.04px; margin-left: 13.52px; }
+.EntWatch.Size169 .Status { margin-left: 20.28px; }
+.EntWatch.Size169 .Status Label { font-size: 27.04px; }
+.EntWatch.Size169 .Status .Icon { font-size: 32.11px; margin-right: 8.45px; }
+.EntWatch.Size169 .Status .ReloadIcon { width: 37.18px; height: 37.18px; margin-left: 8.45px; margin-right: 0px; }
+.EntWatch.Size169 .Ammo { margin-right: 20.28px; }
+.EntWatch.Size169 .Overflow { font-size: 23.66px; }
+.EntWatch.Size170 .Item { width: 816px; padding: 13.6px 20.4px; margin-bottom: 8.5px; border-left-width: 5.1px; }
+.EntWatch.Size170 .ItemName { font-size: 30.6px; }
+.EntWatch.Size170 .Owner { font-size: 27.2px; margin-left: 13.6px; }
+.EntWatch.Size170 .Status { margin-left: 20.4px; }
+.EntWatch.Size170 .Status Label { font-size: 27.2px; }
+.EntWatch.Size170 .Status .Icon { font-size: 32.3px; margin-right: 8.5px; }
+.EntWatch.Size170 .Status .ReloadIcon { width: 37.4px; height: 37.4px; margin-left: 8.5px; margin-right: 0px; }
+.EntWatch.Size170 .Ammo { margin-right: 20.4px; }
+.EntWatch.Size170 .Overflow { font-size: 23.8px; }
+.EntWatch.Size171 .Item { width: 820.8px; padding: 13.68px 20.52px; margin-bottom: 8.55px; border-left-width: 5.13px; }
+.EntWatch.Size171 .ItemName { font-size: 30.78px; }
+.EntWatch.Size171 .Owner { font-size: 27.36px; margin-left: 13.68px; }
+.EntWatch.Size171 .Status { margin-left: 20.52px; }
+.EntWatch.Size171 .Status Label { font-size: 27.36px; }
+.EntWatch.Size171 .Status .Icon { font-size: 32.49px; margin-right: 8.55px; }
+.EntWatch.Size171 .Status .ReloadIcon { width: 37.62px; height: 37.62px; margin-left: 8.55px; margin-right: 0px; }
+.EntWatch.Size171 .Ammo { margin-right: 20.52px; }
+.EntWatch.Size171 .Overflow { font-size: 23.94px; }
+.EntWatch.Size172 .Item { width: 825.6px; padding: 13.76px 20.64px; margin-bottom: 8.6px; border-left-width: 5.16px; }
+.EntWatch.Size172 .ItemName { font-size: 30.96px; }
+.EntWatch.Size172 .Owner { font-size: 27.52px; margin-left: 13.76px; }
+.EntWatch.Size172 .Status { margin-left: 20.64px; }
+.EntWatch.Size172 .Status Label { font-size: 27.52px; }
+.EntWatch.Size172 .Status .Icon { font-size: 32.68px; margin-right: 8.6px; }
+.EntWatch.Size172 .Status .ReloadIcon { width: 37.84px; height: 37.84px; margin-left: 8.6px; margin-right: 0px; }
+.EntWatch.Size172 .Ammo { margin-right: 20.64px; }
+.EntWatch.Size172 .Overflow { font-size: 24.08px; }
+.EntWatch.Size173 .Item { width: 830.4px; padding: 13.84px 20.76px; margin-bottom: 8.65px; border-left-width: 5.19px; }
+.EntWatch.Size173 .ItemName { font-size: 31.14px; }
+.EntWatch.Size173 .Owner { font-size: 27.68px; margin-left: 13.84px; }
+.EntWatch.Size173 .Status { margin-left: 20.76px; }
+.EntWatch.Size173 .Status Label { font-size: 27.68px; }
+.EntWatch.Size173 .Status .Icon { font-size: 32.87px; margin-right: 8.65px; }
+.EntWatch.Size173 .Status .ReloadIcon { width: 38.06px; height: 38.06px; margin-left: 8.65px; margin-right: 0px; }
+.EntWatch.Size173 .Ammo { margin-right: 20.76px; }
+.EntWatch.Size173 .Overflow { font-size: 24.22px; }
+.EntWatch.Size174 .Item { width: 835.2px; padding: 13.92px 20.88px; margin-bottom: 8.7px; border-left-width: 5.22px; }
+.EntWatch.Size174 .ItemName { font-size: 31.32px; }
+.EntWatch.Size174 .Owner { font-size: 27.84px; margin-left: 13.92px; }
+.EntWatch.Size174 .Status { margin-left: 20.88px; }
+.EntWatch.Size174 .Status Label { font-size: 27.84px; }
+.EntWatch.Size174 .Status .Icon { font-size: 33.06px; margin-right: 8.7px; }
+.EntWatch.Size174 .Status .ReloadIcon { width: 38.28px; height: 38.28px; margin-left: 8.7px; margin-right: 0px; }
+.EntWatch.Size174 .Ammo { margin-right: 20.88px; }
+.EntWatch.Size174 .Overflow { font-size: 24.36px; }
+.EntWatch.Size175 .Item { width: 840px; padding: 14px 21px; margin-bottom: 8.75px; border-left-width: 5.25px; }
+.EntWatch.Size175 .ItemName { font-size: 31.5px; }
+.EntWatch.Size175 .Owner { font-size: 28px; margin-left: 14px; }
+.EntWatch.Size175 .Status { margin-left: 21px; }
+.EntWatch.Size175 .Status Label { font-size: 28px; }
+.EntWatch.Size175 .Status .Icon { font-size: 33.25px; margin-right: 8.75px; }
+.EntWatch.Size175 .Status .ReloadIcon { width: 38.5px; height: 38.5px; margin-left: 8.75px; margin-right: 0px; }
+.EntWatch.Size175 .Ammo { margin-right: 21px; }
+.EntWatch.Size175 .Overflow { font-size: 24.5px; }
+.EntWatch.Size176 .Item { width: 844.8px; padding: 14.08px 21.12px; margin-bottom: 8.8px; border-left-width: 5.28px; }
+.EntWatch.Size176 .ItemName { font-size: 31.68px; }
+.EntWatch.Size176 .Owner { font-size: 28.16px; margin-left: 14.08px; }
+.EntWatch.Size176 .Status { margin-left: 21.12px; }
+.EntWatch.Size176 .Status Label { font-size: 28.16px; }
+.EntWatch.Size176 .Status .Icon { font-size: 33.44px; margin-right: 8.8px; }
+.EntWatch.Size176 .Status .ReloadIcon { width: 38.72px; height: 38.72px; margin-left: 8.8px; margin-right: 0px; }
+.EntWatch.Size176 .Ammo { margin-right: 21.12px; }
+.EntWatch.Size176 .Overflow { font-size: 24.64px; }
+.EntWatch.Size177 .Item { width: 849.6px; padding: 14.16px 21.24px; margin-bottom: 8.85px; border-left-width: 5.31px; }
+.EntWatch.Size177 .ItemName { font-size: 31.86px; }
+.EntWatch.Size177 .Owner { font-size: 28.32px; margin-left: 14.16px; }
+.EntWatch.Size177 .Status { margin-left: 21.24px; }
+.EntWatch.Size177 .Status Label { font-size: 28.32px; }
+.EntWatch.Size177 .Status .Icon { font-size: 33.63px; margin-right: 8.85px; }
+.EntWatch.Size177 .Status .ReloadIcon { width: 38.94px; height: 38.94px; margin-left: 8.85px; margin-right: 0px; }
+.EntWatch.Size177 .Ammo { margin-right: 21.24px; }
+.EntWatch.Size177 .Overflow { font-size: 24.78px; }
+.EntWatch.Size178 .Item { width: 854.4px; padding: 14.24px 21.36px; margin-bottom: 8.9px; border-left-width: 5.34px; }
+.EntWatch.Size178 .ItemName { font-size: 32.04px; }
+.EntWatch.Size178 .Owner { font-size: 28.48px; margin-left: 14.24px; }
+.EntWatch.Size178 .Status { margin-left: 21.36px; }
+.EntWatch.Size178 .Status Label { font-size: 28.48px; }
+.EntWatch.Size178 .Status .Icon { font-size: 33.82px; margin-right: 8.9px; }
+.EntWatch.Size178 .Status .ReloadIcon { width: 39.16px; height: 39.16px; margin-left: 8.9px; margin-right: 0px; }
+.EntWatch.Size178 .Ammo { margin-right: 21.36px; }
+.EntWatch.Size178 .Overflow { font-size: 24.92px; }
+.EntWatch.Size179 .Item { width: 859.2px; padding: 14.32px 21.48px; margin-bottom: 8.95px; border-left-width: 5.37px; }
+.EntWatch.Size179 .ItemName { font-size: 32.22px; }
+.EntWatch.Size179 .Owner { font-size: 28.64px; margin-left: 14.32px; }
+.EntWatch.Size179 .Status { margin-left: 21.48px; }
+.EntWatch.Size179 .Status Label { font-size: 28.64px; }
+.EntWatch.Size179 .Status .Icon { font-size: 34.01px; margin-right: 8.95px; }
+.EntWatch.Size179 .Status .ReloadIcon { width: 39.38px; height: 39.38px; margin-left: 8.95px; margin-right: 0px; }
+.EntWatch.Size179 .Ammo { margin-right: 21.48px; }
+.EntWatch.Size179 .Overflow { font-size: 25.06px; }
+.EntWatch.Size180 .Item { width: 864px; padding: 14.4px 21.6px; margin-bottom: 9px; border-left-width: 5.4px; }
+.EntWatch.Size180 .ItemName { font-size: 32.4px; }
+.EntWatch.Size180 .Owner { font-size: 28.8px; margin-left: 14.4px; }
+.EntWatch.Size180 .Status { margin-left: 21.6px; }
+.EntWatch.Size180 .Status Label { font-size: 28.8px; }
+.EntWatch.Size180 .Status .Icon { font-size: 34.2px; margin-right: 9px; }
+.EntWatch.Size180 .Status .ReloadIcon { width: 39.6px; height: 39.6px; margin-left: 9px; margin-right: 0px; }
+.EntWatch.Size180 .Ammo { margin-right: 21.6px; }
+.EntWatch.Size180 .Overflow { font-size: 25.2px; }
+.EntWatch.Size181 .Item { width: 868.8px; padding: 14.48px 21.72px; margin-bottom: 9.05px; border-left-width: 5.43px; }
+.EntWatch.Size181 .ItemName { font-size: 32.58px; }
+.EntWatch.Size181 .Owner { font-size: 28.96px; margin-left: 14.48px; }
+.EntWatch.Size181 .Status { margin-left: 21.72px; }
+.EntWatch.Size181 .Status Label { font-size: 28.96px; }
+.EntWatch.Size181 .Status .Icon { font-size: 34.39px; margin-right: 9.05px; }
+.EntWatch.Size181 .Status .ReloadIcon { width: 39.82px; height: 39.82px; margin-left: 9.05px; margin-right: 0px; }
+.EntWatch.Size181 .Ammo { margin-right: 21.72px; }
+.EntWatch.Size181 .Overflow { font-size: 25.34px; }
+.EntWatch.Size182 .Item { width: 873.6px; padding: 14.56px 21.84px; margin-bottom: 9.1px; border-left-width: 5.46px; }
+.EntWatch.Size182 .ItemName { font-size: 32.76px; }
+.EntWatch.Size182 .Owner { font-size: 29.12px; margin-left: 14.56px; }
+.EntWatch.Size182 .Status { margin-left: 21.84px; }
+.EntWatch.Size182 .Status Label { font-size: 29.12px; }
+.EntWatch.Size182 .Status .Icon { font-size: 34.58px; margin-right: 9.1px; }
+.EntWatch.Size182 .Status .ReloadIcon { width: 40.04px; height: 40.04px; margin-left: 9.1px; margin-right: 0px; }
+.EntWatch.Size182 .Ammo { margin-right: 21.84px; }
+.EntWatch.Size182 .Overflow { font-size: 25.48px; }
+.EntWatch.Size183 .Item { width: 878.4px; padding: 14.64px 21.96px; margin-bottom: 9.15px; border-left-width: 5.49px; }
+.EntWatch.Size183 .ItemName { font-size: 32.94px; }
+.EntWatch.Size183 .Owner { font-size: 29.28px; margin-left: 14.64px; }
+.EntWatch.Size183 .Status { margin-left: 21.96px; }
+.EntWatch.Size183 .Status Label { font-size: 29.28px; }
+.EntWatch.Size183 .Status .Icon { font-size: 34.77px; margin-right: 9.15px; }
+.EntWatch.Size183 .Status .ReloadIcon { width: 40.26px; height: 40.26px; margin-left: 9.15px; margin-right: 0px; }
+.EntWatch.Size183 .Ammo { margin-right: 21.96px; }
+.EntWatch.Size183 .Overflow { font-size: 25.62px; }
+.EntWatch.Size184 .Item { width: 883.2px; padding: 14.72px 22.08px; margin-bottom: 9.2px; border-left-width: 5.52px; }
+.EntWatch.Size184 .ItemName { font-size: 33.12px; }
+.EntWatch.Size184 .Owner { font-size: 29.44px; margin-left: 14.72px; }
+.EntWatch.Size184 .Status { margin-left: 22.08px; }
+.EntWatch.Size184 .Status Label { font-size: 29.44px; }
+.EntWatch.Size184 .Status .Icon { font-size: 34.96px; margin-right: 9.2px; }
+.EntWatch.Size184 .Status .ReloadIcon { width: 40.48px; height: 40.48px; margin-left: 9.2px; margin-right: 0px; }
+.EntWatch.Size184 .Ammo { margin-right: 22.08px; }
+.EntWatch.Size184 .Overflow { font-size: 25.76px; }
+.EntWatch.Size185 .Item { width: 888px; padding: 14.8px 22.2px; margin-bottom: 9.25px; border-left-width: 5.55px; }
+.EntWatch.Size185 .ItemName { font-size: 33.3px; }
+.EntWatch.Size185 .Owner { font-size: 29.6px; margin-left: 14.8px; }
+.EntWatch.Size185 .Status { margin-left: 22.2px; }
+.EntWatch.Size185 .Status Label { font-size: 29.6px; }
+.EntWatch.Size185 .Status .Icon { font-size: 35.15px; margin-right: 9.25px; }
+.EntWatch.Size185 .Status .ReloadIcon { width: 40.7px; height: 40.7px; margin-left: 9.25px; margin-right: 0px; }
+.EntWatch.Size185 .Ammo { margin-right: 22.2px; }
+.EntWatch.Size185 .Overflow { font-size: 25.9px; }
+.EntWatch.Size186 .Item { width: 892.8px; padding: 14.88px 22.32px; margin-bottom: 9.3px; border-left-width: 5.58px; }
+.EntWatch.Size186 .ItemName { font-size: 33.48px; }
+.EntWatch.Size186 .Owner { font-size: 29.76px; margin-left: 14.88px; }
+.EntWatch.Size186 .Status { margin-left: 22.32px; }
+.EntWatch.Size186 .Status Label { font-size: 29.76px; }
+.EntWatch.Size186 .Status .Icon { font-size: 35.34px; margin-right: 9.3px; }
+.EntWatch.Size186 .Status .ReloadIcon { width: 40.92px; height: 40.92px; margin-left: 9.3px; margin-right: 0px; }
+.EntWatch.Size186 .Ammo { margin-right: 22.32px; }
+.EntWatch.Size186 .Overflow { font-size: 26.04px; }
+.EntWatch.Size187 .Item { width: 897.6px; padding: 14.96px 22.44px; margin-bottom: 9.35px; border-left-width: 5.61px; }
+.EntWatch.Size187 .ItemName { font-size: 33.66px; }
+.EntWatch.Size187 .Owner { font-size: 29.92px; margin-left: 14.96px; }
+.EntWatch.Size187 .Status { margin-left: 22.44px; }
+.EntWatch.Size187 .Status Label { font-size: 29.92px; }
+.EntWatch.Size187 .Status .Icon { font-size: 35.53px; margin-right: 9.35px; }
+.EntWatch.Size187 .Status .ReloadIcon { width: 41.14px; height: 41.14px; margin-left: 9.35px; margin-right: 0px; }
+.EntWatch.Size187 .Ammo { margin-right: 22.44px; }
+.EntWatch.Size187 .Overflow { font-size: 26.18px; }
+.EntWatch.Size188 .Item { width: 902.4px; padding: 15.04px 22.56px; margin-bottom: 9.4px; border-left-width: 5.64px; }
+.EntWatch.Size188 .ItemName { font-size: 33.84px; }
+.EntWatch.Size188 .Owner { font-size: 30.08px; margin-left: 15.04px; }
+.EntWatch.Size188 .Status { margin-left: 22.56px; }
+.EntWatch.Size188 .Status Label { font-size: 30.08px; }
+.EntWatch.Size188 .Status .Icon { font-size: 35.72px; margin-right: 9.4px; }
+.EntWatch.Size188 .Status .ReloadIcon { width: 41.36px; height: 41.36px; margin-left: 9.4px; margin-right: 0px; }
+.EntWatch.Size188 .Ammo { margin-right: 22.56px; }
+.EntWatch.Size188 .Overflow { font-size: 26.32px; }
+.EntWatch.Size189 .Item { width: 907.2px; padding: 15.12px 22.68px; margin-bottom: 9.45px; border-left-width: 5.67px; }
+.EntWatch.Size189 .ItemName { font-size: 34.02px; }
+.EntWatch.Size189 .Owner { font-size: 30.24px; margin-left: 15.12px; }
+.EntWatch.Size189 .Status { margin-left: 22.68px; }
+.EntWatch.Size189 .Status Label { font-size: 30.24px; }
+.EntWatch.Size189 .Status .Icon { font-size: 35.91px; margin-right: 9.45px; }
+.EntWatch.Size189 .Status .ReloadIcon { width: 41.58px; height: 41.58px; margin-left: 9.45px; margin-right: 0px; }
+.EntWatch.Size189 .Ammo { margin-right: 22.68px; }
+.EntWatch.Size189 .Overflow { font-size: 26.46px; }
+.EntWatch.Size190 .Item { width: 912px; padding: 15.2px 22.8px; margin-bottom: 9.5px; border-left-width: 5.7px; }
+.EntWatch.Size190 .ItemName { font-size: 34.2px; }
+.EntWatch.Size190 .Owner { font-size: 30.4px; margin-left: 15.2px; }
+.EntWatch.Size190 .Status { margin-left: 22.8px; }
+.EntWatch.Size190 .Status Label { font-size: 30.4px; }
+.EntWatch.Size190 .Status .Icon { font-size: 36.1px; margin-right: 9.5px; }
+.EntWatch.Size190 .Status .ReloadIcon { width: 41.8px; height: 41.8px; margin-left: 9.5px; margin-right: 0px; }
+.EntWatch.Size190 .Ammo { margin-right: 22.8px; }
+.EntWatch.Size190 .Overflow { font-size: 26.6px; }
+.EntWatch.Size191 .Item { width: 916.8px; padding: 15.28px 22.92px; margin-bottom: 9.55px; border-left-width: 5.73px; }
+.EntWatch.Size191 .ItemName { font-size: 34.38px; }
+.EntWatch.Size191 .Owner { font-size: 30.56px; margin-left: 15.28px; }
+.EntWatch.Size191 .Status { margin-left: 22.92px; }
+.EntWatch.Size191 .Status Label { font-size: 30.56px; }
+.EntWatch.Size191 .Status .Icon { font-size: 36.29px; margin-right: 9.55px; }
+.EntWatch.Size191 .Status .ReloadIcon { width: 42.02px; height: 42.02px; margin-left: 9.55px; margin-right: 0px; }
+.EntWatch.Size191 .Ammo { margin-right: 22.92px; }
+.EntWatch.Size191 .Overflow { font-size: 26.74px; }
+.EntWatch.Size192 .Item { width: 921.6px; padding: 15.36px 23.04px; margin-bottom: 9.6px; border-left-width: 5.76px; }
+.EntWatch.Size192 .ItemName { font-size: 34.56px; }
+.EntWatch.Size192 .Owner { font-size: 30.72px; margin-left: 15.36px; }
+.EntWatch.Size192 .Status { margin-left: 23.04px; }
+.EntWatch.Size192 .Status Label { font-size: 30.72px; }
+.EntWatch.Size192 .Status .Icon { font-size: 36.48px; margin-right: 9.6px; }
+.EntWatch.Size192 .Status .ReloadIcon { width: 42.24px; height: 42.24px; margin-left: 9.6px; margin-right: 0px; }
+.EntWatch.Size192 .Ammo { margin-right: 23.04px; }
+.EntWatch.Size192 .Overflow { font-size: 26.88px; }
+.EntWatch.Size193 .Item { width: 926.4px; padding: 15.44px 23.16px; margin-bottom: 9.65px; border-left-width: 5.79px; }
+.EntWatch.Size193 .ItemName { font-size: 34.74px; }
+.EntWatch.Size193 .Owner { font-size: 30.88px; margin-left: 15.44px; }
+.EntWatch.Size193 .Status { margin-left: 23.16px; }
+.EntWatch.Size193 .Status Label { font-size: 30.88px; }
+.EntWatch.Size193 .Status .Icon { font-size: 36.67px; margin-right: 9.65px; }
+.EntWatch.Size193 .Status .ReloadIcon { width: 42.46px; height: 42.46px; margin-left: 9.65px; margin-right: 0px; }
+.EntWatch.Size193 .Ammo { margin-right: 23.16px; }
+.EntWatch.Size193 .Overflow { font-size: 27.02px; }
+.EntWatch.Size194 .Item { width: 931.2px; padding: 15.52px 23.28px; margin-bottom: 9.7px; border-left-width: 5.82px; }
+.EntWatch.Size194 .ItemName { font-size: 34.92px; }
+.EntWatch.Size194 .Owner { font-size: 31.04px; margin-left: 15.52px; }
+.EntWatch.Size194 .Status { margin-left: 23.28px; }
+.EntWatch.Size194 .Status Label { font-size: 31.04px; }
+.EntWatch.Size194 .Status .Icon { font-size: 36.86px; margin-right: 9.7px; }
+.EntWatch.Size194 .Status .ReloadIcon { width: 42.68px; height: 42.68px; margin-left: 9.7px; margin-right: 0px; }
+.EntWatch.Size194 .Ammo { margin-right: 23.28px; }
+.EntWatch.Size194 .Overflow { font-size: 27.16px; }
+.EntWatch.Size195 .Item { width: 936px; padding: 15.6px 23.4px; margin-bottom: 9.75px; border-left-width: 5.85px; }
+.EntWatch.Size195 .ItemName { font-size: 35.1px; }
+.EntWatch.Size195 .Owner { font-size: 31.2px; margin-left: 15.6px; }
+.EntWatch.Size195 .Status { margin-left: 23.4px; }
+.EntWatch.Size195 .Status Label { font-size: 31.2px; }
+.EntWatch.Size195 .Status .Icon { font-size: 37.05px; margin-right: 9.75px; }
+.EntWatch.Size195 .Status .ReloadIcon { width: 42.9px; height: 42.9px; margin-left: 9.75px; margin-right: 0px; }
+.EntWatch.Size195 .Ammo { margin-right: 23.4px; }
+.EntWatch.Size195 .Overflow { font-size: 27.3px; }
+.EntWatch.Size196 .Item { width: 940.8px; padding: 15.68px 23.52px; margin-bottom: 9.8px; border-left-width: 5.88px; }
+.EntWatch.Size196 .ItemName { font-size: 35.28px; }
+.EntWatch.Size196 .Owner { font-size: 31.36px; margin-left: 15.68px; }
+.EntWatch.Size196 .Status { margin-left: 23.52px; }
+.EntWatch.Size196 .Status Label { font-size: 31.36px; }
+.EntWatch.Size196 .Status .Icon { font-size: 37.24px; margin-right: 9.8px; }
+.EntWatch.Size196 .Status .ReloadIcon { width: 43.12px; height: 43.12px; margin-left: 9.8px; margin-right: 0px; }
+.EntWatch.Size196 .Ammo { margin-right: 23.52px; }
+.EntWatch.Size196 .Overflow { font-size: 27.44px; }
+.EntWatch.Size197 .Item { width: 945.6px; padding: 15.76px 23.64px; margin-bottom: 9.85px; border-left-width: 5.91px; }
+.EntWatch.Size197 .ItemName { font-size: 35.46px; }
+.EntWatch.Size197 .Owner { font-size: 31.52px; margin-left: 15.76px; }
+.EntWatch.Size197 .Status { margin-left: 23.64px; }
+.EntWatch.Size197 .Status Label { font-size: 31.52px; }
+.EntWatch.Size197 .Status .Icon { font-size: 37.43px; margin-right: 9.85px; }
+.EntWatch.Size197 .Status .ReloadIcon { width: 43.34px; height: 43.34px; margin-left: 9.85px; margin-right: 0px; }
+.EntWatch.Size197 .Ammo { margin-right: 23.64px; }
+.EntWatch.Size197 .Overflow { font-size: 27.58px; }
+.EntWatch.Size198 .Item { width: 950.4px; padding: 15.84px 23.76px; margin-bottom: 9.9px; border-left-width: 5.94px; }
+.EntWatch.Size198 .ItemName { font-size: 35.64px; }
+.EntWatch.Size198 .Owner { font-size: 31.68px; margin-left: 15.84px; }
+.EntWatch.Size198 .Status { margin-left: 23.76px; }
+.EntWatch.Size198 .Status Label { font-size: 31.68px; }
+.EntWatch.Size198 .Status .Icon { font-size: 37.62px; margin-right: 9.9px; }
+.EntWatch.Size198 .Status .ReloadIcon { width: 43.56px; height: 43.56px; margin-left: 9.9px; margin-right: 0px; }
+.EntWatch.Size198 .Ammo { margin-right: 23.76px; }
+.EntWatch.Size198 .Overflow { font-size: 27.72px; }
+.EntWatch.Size199 .Item { width: 955.2px; padding: 15.92px 23.88px; margin-bottom: 9.95px; border-left-width: 5.97px; }
+.EntWatch.Size199 .ItemName { font-size: 35.82px; }
+.EntWatch.Size199 .Owner { font-size: 31.84px; margin-left: 15.92px; }
+.EntWatch.Size199 .Status { margin-left: 23.88px; }
+.EntWatch.Size199 .Status Label { font-size: 31.84px; }
+.EntWatch.Size199 .Status .Icon { font-size: 37.81px; margin-right: 9.95px; }
+.EntWatch.Size199 .Status .ReloadIcon { width: 43.78px; height: 43.78px; margin-left: 9.95px; margin-right: 0px; }
+.EntWatch.Size199 .Ammo { margin-right: 23.88px; }
+.EntWatch.Size199 .Overflow { font-size: 27.86px; }
+.EntWatch.Size200 .Item { width: 960px; padding: 16px 24px; margin-bottom: 10px; border-left-width: 6px; }
+.EntWatch.Size200 .ItemName { font-size: 36px; }
+.EntWatch.Size200 .Owner { font-size: 32px; margin-left: 16px; }
+.EntWatch.Size200 .Status { margin-left: 24px; }
+.EntWatch.Size200 .Status Label { font-size: 32px; }
+.EntWatch.Size200 .Status .Icon { font-size: 38px; margin-right: 10px; }
+.EntWatch.Size200 .Status .ReloadIcon { width: 44px; height: 44px; margin-left: 10px; margin-right: 0px; }
+.EntWatch.Size200 .Ammo { margin-right: 24px; }
+.EntWatch.Size200 .Overflow { font-size: 28px; }
diff --git a/assets_source/panorama/templates/hud.base.css b/assets_source/panorama/templates/hud.base.css
new file mode 100644
index 00000000..15d6164f
--- /dev/null
+++ b/assets_source/panorama/templates/hud.base.css
@@ -0,0 +1,31 @@
+.Root { width: 100%; height: 100%; }
+.EntWatch { horizontal-align: left; margin-left: 2%; margin-top: 15%; flow-children: down; max-height: 720px; overflow: squish scroll; }
+.Hidden { visibility: collapse; }
+.Item { width: 480px; padding: 8px 12px; margin-bottom: 5px; background-color: #121820e8; border-left: 3px solid #94a6bd; flow-children: right; }
+.Heading { width: fill-parent-flow(1); flow-children: right; vertical-align: center; }
+.ItemName { max-width: 50%; white-space: nowrap; text-overflow: ellipsis; vertical-align: center; font-family: Arial; font-size: 18px; font-weight: bold; color: #eef3fa; }
+.Owner { width: fill-parent-flow(1); margin-left: 8px; white-space: nowrap; text-overflow: ellipsis; vertical-align: center; font-family: Arial; font-size: 16px; color: #a6b1c2; }
+.NamesOnly .Owner { visibility: collapse; }
+.NamesOnly .ItemName { max-width: 100%; }
+.Status { flow-children: right; margin-left: 12px; vertical-align: center; }
+.Status Label { vertical-align: center; font-family: Arial; font-size: 16px; }
+.Icon { margin-right: 5px; font-size: 19px; }
+.Cooldown { visibility: collapse; flow-children: right; vertical-align: center; }
+.Cooldown Label { color: #62df87; }
+.Reloading .Cooldown { visibility: visible; }
+.Ammo { visibility: collapse; flow-children: right; margin-right: 12px; vertical-align: center; }
+.Ammo Label { color: #ffbd55; }
+.HasAmmo .Ammo { visibility: visible; }
+.Ready { color: #a6b1c2; }
+.Reloading .Ready, .HasAmmo .Ready { visibility: collapse; }
+.Overflow { font-family: Arial; font-size: 14px; color: #a6b1c2; }
+
+/* Screen-space percentages, selected independently for each player. */
+/* @generate: positions */
+
+.ReloadIcon { width: 22px; height: 22px; margin-left: 5px; margin-right: 0px; text-align: center; vertical-align: center; }
+.Reloading .ReloadIcon { animation-name: ReloadSpin; animation-duration: 1s; animation-timing-function: linear; animation-iteration-count: infinite; }
+@keyframes 'ReloadSpin' { 0% { transform: rotateZ(0deg); } 100% { transform: rotateZ(360deg); } }
+
+/* Per-player size scales row geometry and typography, preserving screen position. */
+/* @generate: sizes */
diff --git a/assets_source/panorama/templates/hud.base.xml b/assets_source/panorama/templates/hud.base.xml
new file mode 100644
index 00000000..bbe47173
--- /dev/null
+++ b/assets_source/panorama/templates/hud.base.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/assets_source/panorama/templates/item.xml b/assets_source/panorama/templates/item.xml
new file mode 100644
index 00000000..a0f7f1aa
--- /dev/null
+++ b/assets_source/panorama/templates/item.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cfg/cs2fixes/cs2fixes.cfg b/cfg/cs2fixes/cs2fixes.cfg
index 2ed7948d..0cd747a8 100644
--- a/cfg/cs2fixes/cs2fixes.cfg
+++ b/cfg/cs2fixes/cs2fixes.cfg
@@ -162,6 +162,7 @@ entwatch_enable 0 // Whether to enable EntWatch features
entwatch_auto_filter 1 // Whether to automatically block non-item holders from triggering uses
entwatch_clantag 1 // Whether to set item holder's clantag and set 9999 score
entwatch_hud 1 // Whether to enable the EntWatch hud and related commands
+entwatch_hud_style 0 // Default renderer: 0 = world text, 1 = Panorama (experimental, needs the packaged panorama files on server and clients, still being tested on more servers/maps); players can use !hudstyle
entwatch_score 9999 // Score to give item holders (0 = dont change score at all) Requires entwatch_clantag 1
entwatch_glow 1000 // Distance that dropped item weapon glow will be visible (0 = glow disabled)
entwatch_glow_team 0 // Whether dropped item glow is only visible to the team the item belongs to (0 = glow to all players)
diff --git a/scripts/compile-panorama.py b/scripts/compile-panorama.py
new file mode 100644
index 00000000..d7575a08
--- /dev/null
+++ b/scripts/compile-panorama.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+"""Compile the EntWatch Panorama HUD with the CS2 Workshop Tools resource compiler.
+
+Regenerates the HUD sources first (see generate-panorama.py), stages them in a
+local addon under the CS2 install, compiles them and copies the results into
+assets/panorama. Commit those compiled files; clients and servers need them.
+
+Usage:
+ python scripts/compile-panorama.py --cs2-root ""
+The root can also come from the CS2_ROOT environment variable.
+"""
+
+import argparse
+import importlib.util
+import os
+import shutil
+import subprocess
+import sys
+from pathlib import Path
+
+HERE = Path(__file__).resolve().parent
+REPO = HERE.parent
+RESOURCES = [Path("panorama/layout/custom_game/hud.vxml_c"), Path("panorama/styles/entwatch/hud.vcss_c")]
+ADDON_INFO = (
+ "\n"
+ "{ IsPlayable = false }\n"
+)
+
+
+def write_text(path, text):
+ path.parent.mkdir(parents=True, exist_ok=True)
+ with open(path, "w", encoding="utf-8", newline="\n") as f:
+ f.write(text)
+
+
+def find_compiler(cs2_root):
+ if sys.platform == "win32":
+ candidates = [cs2_root / "game" / "bin" / "win64" / "resourcecompiler.exe"]
+ else:
+ candidates = [cs2_root / "game" / "bin" / "linuxsteamrt64" / "resourcecompiler"]
+ for candidate in candidates:
+ if candidate.is_file():
+ return candidate
+ sys.exit("resourcecompiler not found (looked for %s). Install the CS2 Workshop Tools." % ", ".join(map(str, candidates)))
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__.split("\n")[0])
+ parser.add_argument("--cs2-root", default=os.environ.get("CS2_ROOT"), help="CS2 install directory (default: $CS2_ROOT)")
+ parser.add_argument("--destination", default=str(REPO / "assets"), help="where to copy compiled resources (default: /assets)")
+ args = parser.parse_args()
+ if not args.cs2_root:
+ parser.error("--cs2-root or CS2_ROOT is required")
+
+ cs2_root = Path(args.cs2_root)
+ destination = Path(args.destination)
+ compiler = find_compiler(cs2_root)
+
+ spec = importlib.util.spec_from_file_location("generate_panorama", HERE / "generate-panorama.py")
+ generator = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(generator)
+ if generator.main([]) != 0:
+ sys.exit("Panorama source generation failed")
+
+ content = cs2_root / "content" / "csgo_addons" / "cs2fixes_hud"
+ output = cs2_root / "game" / "csgo_addons" / "cs2fixes_hud"
+ layout = content / "panorama" / "layout" / "custom_game" / "hud.xml"
+ style = content / "panorama" / "styles" / "entwatch" / "hud.css"
+ for src, dst in ((generator.OUTPUTS["xml"], layout), (generator.OUTPUTS["css"], style)):
+ dst.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copyfile(src, dst)
+ write_text(content / "panorama" / "preprocessor_config.txt", '"PanzipCfg" { "BlockDefs" {} }\n')
+ write_text(content / "addoninfo.txt", ADDON_INFO)
+
+ # Do not accept outputs left over from a previous compilation.
+ for relative in RESOURCES:
+ (output / relative).unlink(missing_ok=True)
+
+ subprocess.run([str(compiler), "-game", str(cs2_root / "game" / "csgo"), "-i", str(style), "-i", str(layout), "-f", "-nop4"], check=True)
+
+ for relative in RESOURCES:
+ compiled = output / relative
+ if not compiled.is_file() or compiled.stat().st_size == 0:
+ sys.exit("Missing or empty compiled resource: %s" % compiled)
+ for relative in RESOURCES:
+ target = destination / relative
+ target.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copyfile(output / relative, target)
+ shutil.copyfile(content / "addoninfo.txt", output / "addoninfo.txt")
+ print("Compiled Panorama resources copied into %s." % destination)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/generate-panorama.py b/scripts/generate-panorama.py
new file mode 100644
index 00000000..6f8b36db
--- /dev/null
+++ b/scripts/generate-panorama.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python3
+"""Generate the EntWatch Panorama HUD layout and stylesheet.
+
+Reads the hand-edited templates in assets_source/panorama/templates and writes
+ assets_source/panorama/layout/custom_game/hud.xml
+ assets_source/panorama/styles/entwatch/hud.css
+
+Limits (row count, position cap, size range) are read from the C++ sources so
+the generated classes always match what the server will actually send.
+
+Usage:
+ python scripts/generate-panorama.py # (re)generate
+ python scripts/generate-panorama.py --check # exit 1 if generated files are stale
+
+After regenerating, recompile with scripts/compile-panorama.py and commit the
+compiled resources in assets/panorama.
+"""
+
+import argparse
+import re
+import sys
+from collections import namedtuple
+from decimal import Decimal
+from pathlib import Path
+
+REPO = Path(__file__).resolve().parent.parent
+PANORAMA = REPO / "assets_source" / "panorama"
+TEMPLATES = PANORAMA / "templates"
+OUTPUTS = {
+ "xml": PANORAMA / "layout" / "custom_game" / "hud.xml",
+ "css": PANORAMA / "styles" / "entwatch" / "hud.css",
+}
+
+Limits = namedtuple("Limits", "pos_max size_min size_max size_default max_rows")
+
+# Geometry at 100% size. Every other size class is these values scaled by N/100.
+# (selector, [(property, (px values...)), ...])
+SIZE_RULES = [
+ (".Item", [("width", (480,)), ("padding", (8, 12)), ("margin-bottom", (5,)), ("border-left-width", (3,))]),
+ (".ItemName", [("font-size", (18,))]),
+ (".Owner", [("font-size", (16,)), ("margin-left", (8,))]),
+ (".Status", [("margin-left", (12,))]),
+ (".Status Label", [("font-size", (16,))]),
+ (".Status .Icon", [("font-size", (19,)), ("margin-right", (5,))]),
+ (".Status .ReloadIcon", [("width", (22,)), ("height", (22,)), ("margin-left", (5,)), ("margin-right", (0,))]),
+ (".Ammo", [("margin-right", (12,))]),
+ (".Overflow", [("font-size", (14,))]),
+]
+
+
+def read_constexpr(path, name):
+ match = re.search(r"constexpr\s+(?:int|size_t)\s+%s\s*=\s*(\d+)\s*;" % re.escape(name), path.read_text(encoding="utf-8"))
+ if not match:
+ sys.exit("Could not find constexpr %s in %s" % (name, path))
+ return int(match.group(1))
+
+
+def read_limits():
+ header = REPO / "src" / "entwatch_hud.h"
+ source = REPO / "src" / "entwatch_hud.cpp"
+ return Limits(
+ pos_max=read_constexpr(header, "EW_PANORAMA_POS_MAX"),
+ size_min=read_constexpr(header, "EW_PANORAMA_SIZE_MIN"),
+ size_max=read_constexpr(header, "EW_PANORAMA_SIZE_MAX"),
+ size_default=read_constexpr(header, "EW_PANORAMA_SIZE_DEFAULT"),
+ max_rows=read_constexpr(source, "MaxRows"),
+ )
+
+
+def scale(value, percent):
+ """value * percent / 100 as a short decimal string (no float rounding noise)."""
+ return format((Decimal(value * percent) / 100).normalize(), "f")
+
+
+def size_section(limits):
+ lines = []
+ for percent in range(limits.size_min, limits.size_max + 1):
+ for selector, props in SIZE_RULES:
+ decls = "; ".join(
+ "%s: %s" % (prop, " ".join(scale(v, percent) + "px" for v in values)) for prop, values in props
+ )
+ lines.append(".EntWatch.Size%d %s { %s; }" % (percent, selector, decls))
+ return "\n".join(lines) + "\n"
+
+
+def position_section(limits):
+ lines = []
+ for n in range(limits.pos_max + 1):
+ lines.append(".EntWatch.PosX%d { margin-left: %d%%; }" % (n, n))
+ lines.append(".EntWatch.PosY%d { margin-top: %d%%; }" % (n, n))
+ return "\n".join(lines) + "\n"
+
+
+def fill(template, marker, content):
+ lines = template.split("\n")
+ hits = [i for i, line in enumerate(lines) if marker in line]
+ if len(hits) != 1:
+ sys.exit("Template must contain exactly one '%s' marker (found %d)" % (marker, len(hits)))
+ lines[hits[0]] = content.rstrip("\n")
+ return "\n".join(lines)
+
+
+def generate(limits):
+ """Return {"xml": text, "css": text}."""
+ if limits.size_default != 100:
+ sys.exit("The base geometry in SIZE_RULES is the 100%% size; EW_PANORAMA_SIZE_DEFAULT is %d." % limits.size_default)
+ read = lambda name: (TEMPLATES / name).read_text(encoding="utf-8")
+
+ item = read("item.xml").rstrip("\n")
+ items = "\n".join(item.replace("@INDEX@", str(i)) for i in range(limits.max_rows))
+ xml = fill(read("hud.base.xml"), "@generate: items", items)
+
+ css = fill(read("hud.base.css"), "@generate: positions", position_section(limits))
+ css = fill(css, "@generate: sizes", size_section(limits))
+ return {"xml": xml, "css": css}
+
+
+def normalized(path):
+ return path.read_bytes().replace(b"\r\n", b"\n").decode("utf-8") if path.exists() else None
+
+
+def main(argv=None):
+ parser = argparse.ArgumentParser(description=__doc__.split("\n")[0])
+ parser.add_argument("--check", action="store_true", help="fail if the generated files on disk are out of date")
+ args = parser.parse_args(argv)
+
+ generated = generate(read_limits())
+ stale = [key for key, text in generated.items() if normalized(OUTPUTS[key]) != text]
+ if args.check:
+ if stale:
+ print("Out of date, run scripts/generate-panorama.py: " + ", ".join(str(OUTPUTS[k].relative_to(REPO)) for k in stale))
+ return 1
+ print("Generated Panorama sources are up to date.")
+ return 0
+ for key, text in generated.items():
+ if key in stale:
+ with open(OUTPUTS[key], "w", encoding="utf-8", newline="\n") as f:
+ f.write(text)
+ print("Wrote " + str(OUTPUTS[key].relative_to(REPO)))
+ if not stale:
+ print("Already up to date.")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/src/cs2_sdk/entity/customhudlayout.cpp b/src/cs2_sdk/entity/customhudlayout.cpp
index 72f25a87..eeb7f224 100644
--- a/src/cs2_sdk/entity/customhudlayout.cpp
+++ b/src/cs2_sdk/entity/customhudlayout.cpp
@@ -49,12 +49,14 @@ void CCSCustomHudLayout::ClearCallbacks()
void CCSCustomHudLayout::OnClick(CCSPlayerController* pController, const std::string& sButtonId)
{
- if (auto it = sm_mapCustomLayoutCallbacks.find(GetHandle().ToInt()); it != sm_mapCustomLayoutCallbacks.end())
+ if (auto it = sm_mapCustomLayoutCallbacks.find(GetHandle().ToInt()); it != sm_mapCustomLayoutCallbacks.end() && it->second.m_OnClick)
it->second.m_OnClick(pController, this, sButtonId);
}
void CCSCustomHudLayout::OnClientDisconnect(int slot)
{
+ if (slot < 0 || slot >= MAXPLAYERS)
+ return;
auto iterator = sm_mapCustomLayoutCallbacks.begin();
while (iterator != sm_mapCustomLayoutCallbacks.end())
@@ -67,7 +69,8 @@ void CCSCustomHudLayout::OnClientDisconnect(int slot)
continue;
}
- iterator->second.m_OnDisconnect(pLayout, slot);
+ if (iterator->second.m_OnDisconnect)
+ iterator->second.m_OnDisconnect(pLayout, slot);
iterator++;
}
}
diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp
index 8e3290d2..9cb3a732 100644
--- a/src/cs2fixes.cpp
+++ b/src/cs2fixes.cpp
@@ -34,6 +34,7 @@
#include "entitylistener.h"
#include "entitysystem.h"
#include "entwatch.h"
+#include "entwatch_hud.h"
#include "eventlistener.h"
#include "gameconfig.h"
#include "gamesystem.h"
@@ -226,6 +227,7 @@ bool CS2Fixes::Unload(char* error, size_t maxlen)
CommandList().clear();
UndoPatches();
RemoveAllTimers();
+ EW_DestroyHud();
UnregisterEventListeners();
if (g_GameConfig)
diff --git a/src/entwatch.cpp b/src/entwatch.cpp
index 3c77ee84..6e61dccb 100644
--- a/src/entwatch.cpp
+++ b/src/entwatch.cpp
@@ -32,6 +32,7 @@
#include "entity/cpointworldtext.h"
#include "entity/cteam.h"
#include "entity/services.h"
+#include "entwatch_hud.h"
#include "eventlistener.h"
#include "gameevents.pb.h"
#include "leader.h"
@@ -926,7 +927,7 @@ std::string EWItemInstance::GetHandlerStateText()
bool first = true;
for (int i = 0; i < (vecHandlers).size(); i++)
{
- if (!vecHandlers[i]->bShowHud || (int)(vecHandlers[i]->mode) >= EWMode_Last)
+ if (!vecHandlers[i] || !vecHandlers[i]->bShowHud || (int)(vecHandlers[i]->mode) >= EWMode_Last)
continue;
vecHandlers[i]->UpdateHudText();
@@ -1063,6 +1064,7 @@ void CEWHandler::UnLoadConfig()
vecHookedTriggers.clear();
m_bConfigLoaded = false;
+ EW_UpdateHud();
}
/*
@@ -1875,102 +1877,58 @@ KHook::Return CEWHandler::Hook_Use(CBaseEntity* pThis, InputData_t* pInput
// Update cd and uses of all held items
float EW_UpdateHud()
{
- if (!GetGlobals())
+ if (!GetGlobals() || !g_pEWHandler || !g_playerManager)
return EW_HUD_TICKRATE;
- std::string sHudText = "";
- std::string sHudTextNoPlayerNames = "";
- static bool bWasEmptyPreviously = false;
-
- bool bFirst = true;
- for (int i = 0; i < (g_pEWHandler->vecItems).size(); i++)
+ std::vector rows;
+ for (const auto& item : g_pEWHandler->vecItems)
{
- std::shared_ptr pItem = g_pEWHandler->vecItems[i];
- if (!pItem)
+ if (!item || item->iOwnerSlot < 0 || item->iOwnerSlot >= MAXPLAYERS || item->iWeaponEnt == -1 || !item->bShowHud)
continue;
-
- if (pItem->iOwnerSlot == -1 || pItem->iWeaponEnt == -1)
- continue;
-
- if (!pItem->bShowHud)
- continue;
-
- CCSPlayerController* pOwner = CCSPlayerController::FromSlot(CPlayerSlot(pItem->iOwnerSlot));
- if (!pOwner)
- continue;
-
- std::string sItemText = pItem->GetHandlerStateText();
-
- if (g_cvarUseEntwatchClantag.Get())
+ auto owner = CCSPlayerController::FromSlot(CPlayerSlot(item->iOwnerSlot));
+ if (!owner || !owner->IsConnected()) continue;
+ EntwatchHudRow row;
+ row.name = item->szShortName;
+ row.owner = owner->GetPlayerName();
+ row.state = item->GetHandlerStateText();
+ for (const auto& handler : item->vecHandlers)
{
- V_snprintf(pItem->sClantag, sizeof(EWItemInstance::sClantag), "%s: %s", sItemText.c_str(), pItem->szShortName.c_str());
- if (pItem->bHasThisClantag)
- pOwner->SetClanTag(pItem->sClantag);
+ if (!handler || !handler->bShowHud || handler->mode < Cooldown || handler->mode >= EWMode_Last)
+ continue;
+ // Use the same countdown rounding as the legacy handler text.
+ const int seconds = handler->flLastUsed == -1.0f ? 0 :
+ static_cast(handler->flCooldown - (GetGlobals()->curtime - (handler->flLastUsed + 1)));
+ if (handler->mode != CounterValue && seconds > 0)
+ {
+ if (!row.cooldown.empty()) row.cooldown += " | ";
+ row.cooldown += std::to_string(seconds) + "s";
+ }
+ std::string ammo;
+ if (handler->mode == MaxUses || handler->mode == CooldownAfterUses)
+ ammo = std::to_string(std::max(0, handler->iMaxUses - handler->iCurrentUses)) + "/" + std::to_string(handler->iMaxUses);
+ else if (handler->mode == CounterValue)
+ ammo = std::to_string(std::max(0, static_cast(std::round(handler->flCounterValue)))) + "/" + std::to_string(static_cast(std::round(handler->flCounterMax)));
+ if (!ammo.empty())
+ {
+ if (!row.ammo.empty()) row.ammo += " | ";
+ row.ammo += ammo;
+ }
}
-
- if (!g_cvarEnableEntwatchHud.Get())
- continue;
-
- // std::format not supported in clang16 by default (steamrt3)
- if (!bFirst)
+ if (g_cvarUseEntwatchClantag.Get())
{
- sHudText.append("\n");
- sHudTextNoPlayerNames.append("\n");
+ V_snprintf(item->sClantag, sizeof(EWItemInstance::sClantag), "%s: %s", row.state.c_str(), item->szShortName.c_str());
+ if (item->bHasThisClantag) owner->SetClanTag(item->sClantag);
}
- else
- bFirst = false;
-
- sHudText.append("[");
- sHudText.append(sItemText);
- sHudText.append("]");
- sHudText.append(pItem->szShortName);
- sHudText.append(": ");
- sHudText.append(pOwner->GetPlayerName());
-
- // sHudTextNoPlayerNames.append(std::format("\n[{}]{}", sItemText, pItem->szShortName));
- sHudTextNoPlayerNames.append("[");
- sHudTextNoPlayerNames.append(sItemText);
- sHudTextNoPlayerNames.append("]");
- sHudTextNoPlayerNames.append(pItem->szShortName);
- }
-
- if (sHudText != "")
- {
- bWasEmptyPreviously = false;
- }
- else
- {
- if (bWasEmptyPreviously)
- return EW_HUD_TICKRATE;
- bWasEmptyPreviously = true;
+ rows.push_back(std::move(row));
}
-
- for (int i = 0; i < GetGlobals()->maxClients; i++)
+ // Always render empty lists too: drops, round resets and disabled HUDs must hide immediately.
+ for (int slot = 0; slot < std::min(GetGlobals()->maxClients, MAXPLAYERS); ++slot)
{
- CCSPlayerController* pController = CCSPlayerController::FromSlot(i);
- if (!pController)
- continue;
- auto pPawn = pController->GetPawn();
- if (!pPawn)
- continue;
- ZEPlayer* zpPlayer = g_playerManager->GetPlayer(CPlayerSlot(i));
- if (!zpPlayer)
- continue;
-
- EWHudMode mode = (EWHudMode)(zpPlayer->GetEntwatchHudMode());
-
- CPointWorldText* pText = zpPlayer->GetEntwatchHud();
- if (!pText)
- continue;
-
- if (mode == EWHudMode::Hud_On)
- pText->AcceptInput("SetMessage", sHudText.c_str());
- else if (mode == EWHudMode::Hud_ItemOnly)
- pText->AcceptInput("SetMessage", sHudTextNoPlayerNames.c_str());
- else
- pText->AcceptInput("SetMessage", "");
+ auto controller = CCSPlayerController::FromSlot(slot);
+ auto player = g_playerManager->GetPlayer(CPlayerSlot(slot));
+ if (controller && controller->IsConnected() && player && !player->IsFakeClient())
+ EW_RenderHud(player, rows);
}
-
return EW_HUD_TICKRATE;
}
@@ -1987,6 +1945,7 @@ void EW_RoundPreStart()
g_pEWHandler->ResetAllClantags();
g_pEWHandler->ClearItems();
+ EW_UpdateHud();
}
void EW_OnEntitySpawned(CEntityInstance* pEntity)
@@ -2599,6 +2558,7 @@ CON_COMMAND_CHAT(hud, "- Toggle EntWatch HUD")
mode = EWHudMode::Hud_None;
zpPlayer->SetEntwatchHudMode((int)mode);
+ EW_UpdateHud();
if (mode == EWHudMode::Hud_None)
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "EntWatch HUD\x07 disabled.");
@@ -2608,7 +2568,7 @@ CON_COMMAND_CHAT(hud, "- Toggle EntWatch HUD")
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "EntWatch HUD\x04 enabled\x10 (Item names only).");
}
-CON_COMMAND_CHAT(hudpos, " - Sets the position of the EntWatch hud.")
+CON_COMMAND_CHAT(hudpos, "[x y|reset] - Position the active EntWatch HUD style")
{
if (!g_cvarEnableEntWatch.Get())
return;
@@ -2632,15 +2592,30 @@ CON_COMMAND_CHAT(hudpos, " - Sets the position of the EntWatch hud.")
return;
}
- if (args.ArgC() < 3)
+ if (zpPlayer->GetEntwatchHudStyle() == 1)
+ {
+ EW_ConfigurePanoramaHudPos(player, args);
+ return;
+ }
+ if (args.ArgC() == 2 && !V_stricmp(args[1], "reset"))
+ {
+ zpPlayer->SetEntwatchHudPos(EW_HUDPOS_X_DEFAULT, EW_HUDPOS_Y_DEFAULT);
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "World-text HUD position reset.");
+ return;
+ }
+ if (args.ArgC() != 3)
{
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudpos ");
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Current hudpos: %.1fx %.1fy", zpPlayer->GetEntwatchHudX(), zpPlayer->GetEntwatchHudY());
return;
}
- float x = std::atof(args[1]);
- float y = std::atof(args[2]);
+ float x, y;
+ if (!EW_ParseHudFloat(args[1], x) || !EW_ParseHudFloat(args[2], y) || std::abs(x) > 1000.0f || std::abs(y) > 1000.0f)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "World-text position must contain two numbers between -1000 and 1000.");
+ return;
+ }
zpPlayer->SetEntwatchHudPos(x, y);
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Set hudpos to: %.1fx %.1fy", x, y);
@@ -2698,7 +2673,7 @@ CON_COMMAND_CHAT(hudcolor, " [a] - Set color (and transparency) of th
zpPlayer->SetEntwatchHudColor(newColor);
}
-CON_COMMAND_CHAT(hudsize, " - Set font size of the EntWatch hud")
+CON_COMMAND_CHAT(hudsize, "[size|reset] - Size the active HUD: world-text font size or Panorama percentage")
{
if (!g_cvarEnableEntWatch.Get())
return;
@@ -2722,7 +2697,18 @@ CON_COMMAND_CHAT(hudsize, " - Set font size of the EntWatch hud")
return;
}
- if (args.ArgC() < 2)
+ if (zpPlayer->GetEntwatchHudStyle() == 1)
+ {
+ EW_ConfigurePanoramaHudSize(player, args);
+ return;
+ }
+ if (args.ArgC() == 2 && !V_stricmp(args[1], "reset"))
+ {
+ zpPlayer->SetEntwatchHudSize(EW_HUDSIZE_DEFAULT);
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "World-text HUD font size reset.");
+ return;
+ }
+ if (args.ArgC() != 2)
{
ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudsize ");
float flSize = zpPlayer->GetEntwatchHudSize();
@@ -2730,7 +2716,12 @@ CON_COMMAND_CHAT(hudsize, " - Set font size of the EntWatch hud")
return;
}
- float size = std::atof(args[1]);
+ float size;
+ if (!EW_ParseHudFloat(args[1], size))
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "HUD size must be a finite number.");
+ return;
+ }
if (size < 20.0f) // size 20 with 0.005 units per pixel is small
size = 20.0f;
else if (size > 255.0f) // game has a max of 255
diff --git a/src/entwatch.h b/src/entwatch.h
index 1526bb2f..cd0bbe9b 100644
--- a/src/entwatch.h
+++ b/src/entwatch.h
@@ -37,6 +37,10 @@ extern CConVar g_cvarEnableEntwatchHud;
#define EW_PREFIX " \4[EntWatch]\1 "
#define EW_PREF_HUD_MODE "entwatch_hud"
+#define EW_PREF_HUD_STYLE "entwatch_hud_style"
+#define EW_PREF_PANORAMA_X "entwatch_panorama_hudpos_x"
+#define EW_PREF_PANORAMA_Y "entwatch_panorama_hudpos_y"
+#define EW_PREF_PANORAMA_SIZE "entwatch_panorama_hudsize"
#define EW_PREF_HUDPOS_X "entwatch_hudpos_x"
#define EW_PREF_HUDPOS_Y "entwatch_hudpos_y"
#define EW_PREF_HUDCOLOR "entwatch_hudcolor"
diff --git a/src/entwatch_hud.cpp b/src/entwatch_hud.cpp
new file mode 100644
index 00000000..56bc7e97
--- /dev/null
+++ b/src/entwatch_hud.cpp
@@ -0,0 +1,346 @@
+/**
+ * =============================================================================
+ * CS2Fixes
+ * Copyright (C) 2023-2026 Source2ZE
+ * =============================================================================
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, version 3.0, as published by the
+ * Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ */
+
+#include "entwatch_hud.h"
+#include "commands.h"
+#include "cs2fixes.h"
+#include "entity/customhudlayout.h"
+#include "entwatch.h"
+#include "filesystem.h"
+#include "playermanager.h"
+#include "user_preferences.h"
+#include "utils/entity.h"
+#include
+#include
+#include
+#include
+#include
+
+CConVar g_cvarEntwatchHudStyle("entwatch_hud_style", FCVAR_NONE, "Default HUD renderer: 0 = world text, 1 = Panorama", 0, true, 0, true, 1);
+CConVar g_cvarEntwatchPanoramaDebug("cs2f_entwatch_panorama_debug", FCVAR_NONE, "Log EntWatch HUD creation and Panorama resource diagnostics", false);
+
+namespace
+{
+ constexpr size_t MaxRows = 64;
+ CHandle s_layout;
+ struct PanoramaState
+ {
+ bool visible = false;
+ int mode = 0;
+ int x = 0;
+ int y = 0;
+ int size = 0;
+ size_t totalRows = 0;
+
+ bool operator==(const PanoramaState&) const = default;
+ };
+
+ std::array s_previous;
+ std::array s_initialized{};
+ std::array s_positionX{};
+ std::array s_positionY{};
+ std::array s_size{};
+ std::array, MAXPLAYERS> s_rows;
+ std::array s_mode{};
+ double s_flNextCreateAttempt = 0.0;
+
+ CCSCustomHudLayout* GetPanoramaHud(bool create)
+ {
+ if (s_layout.Get() || !create)
+ return s_layout.Get();
+ if (g_flUniversalTime < s_flNextCreateAttempt)
+ return nullptr;
+ if (!g_pFullFileSystem || !g_pFullFileSystem->FileExists("panorama/layout/custom_game/hud.vxml_c", "GAME") || !g_pFullFileSystem->FileExists("panorama/styles/entwatch/hud.vcss_c", "GAME"))
+ {
+ Warning("[EntWatch HUD] Missing compiled Panorama resources; using world text. Install the packaged panorama directory on server and clients. Retrying in 30 seconds.\n");
+ s_flNextCreateAttempt = g_flUniversalTime + 30.0;
+ return nullptr;
+ }
+ auto layout = CCSCustomHudLayout::Create("hud", "entwatchHud");
+ if (!layout)
+ {
+ Warning("[EntWatch HUD] Failed to create custom_hud_layout; using world text. Retrying in 30 seconds.\n");
+ s_flNextCreateAttempt = g_flUniversalTime + 30.0;
+ return nullptr;
+ }
+ s_layout = layout->GetHandle();
+ s_initialized.fill(false);
+ for (auto& vecRows : s_rows) vecRows.clear();
+ layout->Activate(true);
+ if (g_cvarEntwatchPanoramaDebug.Get())
+ Message("[EntWatch Panorama] Created shared entity=%d layout=%s server resource=%d\n", layout->entindex(), layout->m_strLayout().String(),
+ g_pFullFileSystem->FileExists("panorama/layout/custom_game/hud.vxml_c", "GAME"));
+ return layout;
+ }
+
+ bool RenderPanorama(ZEPlayer* player, const std::vector& rows, bool visible)
+ {
+ auto layout = GetPanoramaHud(visible);
+ if (!layout)
+ return !visible;
+ const int slot = player->GetPlayerSlot().Get();
+ if (slot < 0 || slot >= MAXPLAYERS) return false;
+ const int x = player->GetEntwatchPanoramaHudX();
+ const int y = player->GetEntwatchPanoramaHudY();
+ const int size = player->GetEntwatchPanoramaHudSize();
+ const PanoramaState state{visible, player->GetEntwatchHudMode(), x, y, size, visible ? rows.size() : 0};
+ const size_t visibleRows = visible ? std::min(rows.size(), MaxRows) : 0;
+ // Compare against the last rendered state directly instead of building a signature string per player per tick.
+ if (s_initialized[slot] && s_previous[slot] == state && s_rows[slot].size() == visibleRows && std::equal(rows.begin(), rows.begin() + visibleRows, s_rows[slot].begin()))
+ return true;
+ // Remove the previous per-player position before applying the new CSS classes.
+ if (s_initialized[slot])
+ {
+ if (s_positionX[slot] != x)
+ layout->SetHasClass("entwatch", "PosX" + std::to_string(s_positionX[slot]), false, slot);
+ if (s_positionY[slot] != y)
+ layout->SetHasClass("entwatch", "PosY" + std::to_string(s_positionY[slot]), false, slot);
+ if (s_size[slot] != size)
+ layout->SetHasClass("entwatch", "Size" + std::to_string(s_size[slot]), false, slot);
+ }
+ if (!s_initialized[slot] || s_positionX[slot] != x)
+ layout->SetHasClass("entwatch", "PosX" + std::to_string(x), true, slot);
+ if (!s_initialized[slot] || s_positionY[slot] != y)
+ layout->SetHasClass("entwatch", "PosY" + std::to_string(y), true, slot);
+ if (!s_initialized[slot] || s_size[slot] != size)
+ layout->SetHasClass("entwatch", "Size" + std::to_string(size), true, slot);
+ s_positionX[slot] = x;
+ s_positionY[slot] = y;
+ s_size[slot] = size;
+ s_initialized[slot] = true;
+ s_previous[slot] = state;
+ layout->SetHasClass("entwatch", "Hidden", !visible, slot);
+ for (size_t i = 0; i < MaxRows; ++i)
+ {
+ const std::string id = "item_" + std::to_string(i);
+ const bool active = visible && i < rows.size();
+ if (!active && i >= s_rows[slot].size()) continue;
+ if (active && i < s_rows[slot].size() && rows[i] == s_rows[slot][i] && s_mode[slot] == player->GetEntwatchHudMode()) continue;
+ layout->SetHasClass(id, "Hidden", !active, slot);
+ if (!active) continue;
+ const auto& row = rows[i];
+ layout->SetDialogVariableString(id, "item", row.name, slot);
+ layout->SetDialogVariableString(id, "owner", row.owner, slot);
+ layout->SetDialogVariableString(id, "state", row.state, slot);
+ layout->SetDialogVariableString(id, "cooldown", row.cooldown, slot);
+ layout->SetDialogVariableString(id, "ammo", row.ammo, slot);
+ layout->SetHasClass(id, "NamesOnly", player->GetEntwatchHudMode() == Hud_ItemOnly, slot);
+ layout->SetHasClass(id, "Reloading", !row.cooldown.empty(), slot);
+ layout->SetHasClass(id, "HasAmmo", !row.ammo.empty(), slot);
+ }
+ layout->SetDialogVariableString("overflow", "count", std::to_string(rows.size() > MaxRows ? rows.size() - MaxRows : 0), slot);
+ layout->SetHasClass("overflow", "Hidden", !visible || rows.size() <= MaxRows, slot);
+ s_rows[slot].assign(rows.begin(), rows.begin() + (visible ? std::min(rows.size(), MaxRows) : 0));
+ s_mode[slot] = player->GetEntwatchHudMode();
+ return true;
+ }
+} // namespace
+
+int EW_DefaultHudStyle()
+{ return g_cvarEntwatchHudStyle.Get(); }
+
+bool EW_ParseHudFloat(const char* pszValue, float& flValue)
+{
+ if (!pszValue || !*pszValue)
+ return false;
+ char* pszEnd;
+ errno = 0;
+ flValue = std::strtof(pszValue, &pszEnd);
+ return pszEnd != pszValue && !*pszEnd && errno != ERANGE && std::isfinite(flValue);
+}
+
+void ZEPlayer::SetEntwatchPanoramaHudPos(int x, int y, bool bSave)
+{
+ m_iEntwatchPanoramaX = x >= 0 && x <= EW_PANORAMA_POS_MAX ? x : EW_PANORAMA_X_DEFAULT;
+ m_iEntwatchPanoramaY = y >= 0 && y <= EW_PANORAMA_POS_MAX ? y : EW_PANORAMA_Y_DEFAULT;
+ if (!bSave)
+ return;
+ g_pUserPreferencesSystem->SetPreferenceInt(m_slot.Get(), EW_PREF_PANORAMA_X, m_iEntwatchPanoramaX);
+ g_pUserPreferencesSystem->SetPreferenceInt(m_slot.Get(), EW_PREF_PANORAMA_Y, m_iEntwatchPanoramaY);
+}
+
+void EW_ConfigurePanoramaHudPos(CCSPlayerController* player, const CCommand& args)
+{
+ if (!player) return;
+ auto zePlayer = player->GetZEPlayer();
+ if (!zePlayer) return;
+ int x = zePlayer->GetEntwatchPanoramaHudX();
+ int y = zePlayer->GetEntwatchPanoramaHudY();
+ if (args.ArgC() == 2 && !V_stricmp(args[1], "reset"))
+ {
+ x = EW_PANORAMA_X_DEFAULT;
+ y = EW_PANORAMA_Y_DEFAULT;
+ }
+ else if (args.ArgC() == 3)
+ {
+ char* endX;
+ char* endY;
+ const long parsedX = std::strtol(args[1], &endX, 10);
+ const long parsedY = std::strtol(args[2], &endY, 10);
+ if (!*args[1] || !*args[2] || *endX || *endY || parsedX < 0 || parsedX > EW_PANORAMA_POS_MAX || parsedY < 0 || parsedY > EW_PANORAMA_POS_MAX)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Use whole screen percentages from 0 to %d: !hudpos ", EW_PANORAMA_POS_MAX);
+ return;
+ }
+ x = static_cast(parsedX);
+ y = static_cast(parsedY);
+ }
+ else if (args.ArgC() != 1)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudpos [x y|reset]");
+ return;
+ }
+ if (args.ArgC() > 1)
+ {
+ zePlayer->SetEntwatchPanoramaHudPos(x, y);
+ EW_UpdateHud();
+ }
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Panorama HUD position: %d%% from left, %d%% from top.", x, y);
+}
+
+void ZEPlayer::SetEntwatchPanoramaHudSize(int size, bool bSave)
+{
+ m_iEntwatchPanoramaSize = size >= EW_PANORAMA_SIZE_MIN && size <= EW_PANORAMA_SIZE_MAX ? size : EW_PANORAMA_SIZE_DEFAULT;
+ if (bSave)
+ g_pUserPreferencesSystem->SetPreferenceInt(m_slot.Get(), EW_PREF_PANORAMA_SIZE, m_iEntwatchPanoramaSize);
+}
+
+void EW_ConfigurePanoramaHudSize(CCSPlayerController* player, const CCommand& args)
+{
+ if (!player) return;
+ auto zePlayer = player->GetZEPlayer();
+ if (!zePlayer) return;
+ int size = zePlayer->GetEntwatchPanoramaHudSize();
+ if (args.ArgC() == 2)
+ {
+ if (!V_stricmp(args[1], "reset"))
+ size = EW_PANORAMA_SIZE_DEFAULT;
+ else
+ {
+ char* end;
+ const long parsed = std::strtol(args[1], &end, 10);
+ if (!*args[1] || *end || parsed < EW_PANORAMA_SIZE_MIN || parsed > EW_PANORAMA_SIZE_MAX)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Panorama size must be a whole percentage from 50 to 200. Default: 100.");
+ return;
+ }
+ size = static_cast(parsed);
+ }
+ zePlayer->SetEntwatchPanoramaHudSize(size);
+ EW_UpdateHud();
+ }
+ else if (args.ArgC() != 1)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudsize [50-200|reset]");
+ return;
+ }
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Panorama HUD size: %d%%.", size);
+}
+
+void EW_DestroyHud()
+{
+ if (auto layout = s_layout.Get()) layout->Remove();
+ s_layout = nullptr;
+ s_flNextCreateAttempt = 0.0;
+ s_initialized.fill(false);
+ for (auto& previous : s_previous)
+ previous = {};
+ s_mode.fill(0);
+ for (auto& vecRows : s_rows) vecRows.clear();
+}
+
+void EW_ForgetHudPlayer(int slot)
+{
+ if (slot >= 0 && slot < MAXPLAYERS)
+ {
+ s_initialized[slot] = false;
+ s_previous[slot] = {};
+ s_mode[slot] = 0;
+ s_rows[slot].clear();
+ auto pPlayer = g_playerManager ? g_playerManager->GetPlayer(CPlayerSlot(slot)) : nullptr;
+ if (pPlayer)
+ {
+ if (auto pText = pPlayer->GetEntwatchHud())
+ pText->Remove();
+ pPlayer->SetEntwatchHud(nullptr);
+ }
+ }
+}
+
+void EW_RenderHud(ZEPlayer* player, const std::vector& rows)
+{
+ if (!player || player->IsFakeClient() || player->GetPlayerSlot().Get() < 0 || player->GetPlayerSlot().Get() >= MAXPLAYERS)
+ return;
+ const bool visible = g_cvarEnableEntWatch.Get() && g_cvarEnableEntwatchHud.Get() && player->GetEntwatchHudMode() != Hud_None && !rows.empty();
+ const bool panorama = player->GetEntwatchHudStyle() == 1;
+ const bool bPanoramaReady = RenderPanorama(player, rows, visible && panorama);
+ if (panorama && bPanoramaReady)
+ {
+ // Remove a world-text entity left over from before this player (or the server default) switched to Panorama.
+ if (auto text = player->GetEntwatchHud())
+ {
+ text->Remove();
+ player->SetEntwatchHud(nullptr);
+ }
+ }
+ EW_RenderWorldText(player, rows, visible && (!panorama || !bPanoramaReady));
+}
+
+CON_COMMAND_CHAT(hudstyle, "[old|new|default] - Switch EntWatch world-text/Panorama renderer")
+{
+ if (!g_cvarEnableEntWatch.Get())
+ return;
+
+ if (!g_cvarEnableEntwatchHud.Get())
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "The EntWatch hud is currently disabled.");
+ return;
+ }
+
+ if (!player)
+ {
+ ClientPrint(player, HUD_PRINTCONSOLE, "Use entwatch_hud_style 0/1 for the server default.");
+ return;
+ }
+ auto zePlayer = player->GetZEPlayer();
+ if (!zePlayer) return;
+ int style = zePlayer->GetEntwatchHudStyle() == 0 ? 1 : 0;
+ if (args.ArgC() > 2)
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudstyle [old|new|default]");
+ return;
+ }
+ if (args.ArgC() > 1)
+ {
+ if (!V_stricmp(args[1], "old"))
+ style = 0;
+ else if (!V_stricmp(args[1], "new"))
+ style = 1;
+ else if (!V_stricmp(args[1], "default"))
+ style = -1;
+ else
+ {
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "Usage: !hudstyle [old|new|default]");
+ return;
+ }
+ }
+ zePlayer->SetEntwatchHudStyle(style);
+ EW_UpdateHud();
+ ClientPrint(player, HUD_PRINTTALK, EW_PREFIX "HUD renderer: %s. Use !hud to toggle visibility.", zePlayer->GetEntwatchHudStyle() ? "Panorama" : "world text");
+}
diff --git a/src/entwatch_hud.h b/src/entwatch_hud.h
new file mode 100644
index 00000000..23e4687f
--- /dev/null
+++ b/src/entwatch_hud.h
@@ -0,0 +1,55 @@
+/**
+ * =============================================================================
+ * CS2Fixes
+ * Copyright (C) 2023-2026 Source2ZE
+ * =============================================================================
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, version 3.0, as published by the
+ * Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ */
+
+#pragma once
+
+#include
+#include
+
+class ZEPlayer;
+class CCSPlayerController;
+class CCommand;
+
+constexpr int EW_PANORAMA_X_DEFAULT = 2;
+constexpr int EW_PANORAMA_Y_DEFAULT = 15;
+constexpr int EW_PANORAMA_POS_MAX = 95;
+constexpr int EW_PANORAMA_SIZE_DEFAULT = 100;
+constexpr int EW_PANORAMA_SIZE_MIN = 50;
+constexpr int EW_PANORAMA_SIZE_MAX = 200;
+
+struct EntwatchHudRow
+{
+ std::string name;
+ std::string owner;
+ std::string state;
+ std::string cooldown;
+ std::string ammo;
+
+ bool operator==(const EntwatchHudRow&) const = default;
+};
+
+// Keep the item model independent of either HUD entity implementation.
+void EW_RenderHud(ZEPlayer* player, const std::vector& rows);
+void EW_RenderWorldText(ZEPlayer* player, const std::vector& rows, bool visible);
+void EW_ForgetHudPlayer(int slot);
+void EW_DestroyHud();
+int EW_DefaultHudStyle();
+bool EW_ParseHudFloat(const char* pszValue, float& flValue);
+void EW_ConfigurePanoramaHudPos(CCSPlayerController* player, const CCommand& args);
+void EW_ConfigurePanoramaHudSize(CCSPlayerController* player, const CCommand& args);
diff --git a/src/entwatch_hud_worldtext.cpp b/src/entwatch_hud_worldtext.cpp
new file mode 100644
index 00000000..7f465a1c
--- /dev/null
+++ b/src/entwatch_hud_worldtext.cpp
@@ -0,0 +1,156 @@
+/**
+ * =============================================================================
+ * CS2Fixes
+ * Copyright (C) 2023-2026 Source2ZE
+ * =============================================================================
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, version 3.0, as published by the
+ * Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ */
+
+#include "commands.h"
+#include "entwatch.h"
+#include "entwatch_hud.h"
+#include "playermanager.h"
+#include "utils/entity.h"
+#include
+
+extern CConVar g_cvarEntwatchPanoramaDebug;
+
+namespace
+{
+ // Last message sent to each player's world-text entity, so unchanged text isn't re-sent every tick.
+ struct WorldTextCache
+ {
+ int handle = -1;
+ std::string message;
+ };
+ std::array s_cache;
+} // namespace
+
+void EW_RenderWorldText(ZEPlayer* player, const std::vector& rows, bool visible)
+{
+ if (!player)
+ return;
+ auto text = player->GetEntwatchHud();
+ if (!text && visible)
+ {
+ player->CreateEntwatchWorldHud();
+ text = player->GetEntwatchHud();
+ }
+ if (!text)
+ return;
+ std::string message;
+ if (visible)
+ for (const auto& row : rows)
+ {
+ if (!message.empty()) message += "\n";
+ message += "[" + row.state + "]" + row.name;
+ if (player->GetEntwatchHudMode() == Hud_On) message += ": " + row.owner;
+ }
+ const int slot = player->GetPlayerSlot().Get();
+ if (slot >= 0 && slot < MAXPLAYERS)
+ {
+ auto& cache = s_cache[slot];
+ const int handle = text->GetHandle().ToInt();
+ if (cache.handle == handle && cache.message == message)
+ return;
+ cache.handle = handle;
+ cache.message = message;
+ }
+ text->AcceptInput("SetMessage", message.c_str());
+}
+
+void ZEPlayer::CreateEntwatchWorldHud()
+{
+ const bool bDebug = g_cvarEntwatchPanoramaDebug.Get();
+ CCSPlayerController* pController = CCSPlayerController::FromSlot(GetPlayerSlot());
+ if (!pController)
+ return;
+
+ CCSPlayerPawn* pPawn = pController->GetPlayerPawn();
+ if (!pPawn)
+ return;
+
+ CPointOrient* pOrient = GetPointOrient();
+ if (!pOrient)
+ return;
+
+ CPointWorldText* pText = GetEntwatchHud();
+ if (pText)
+ {
+ pText->Remove();
+ SetEntwatchHud(nullptr);
+ pText = nullptr;
+ }
+
+ pText = CreateEntityByName("point_worldtext");
+ if (!pText)
+ {
+ static double flNextWarning = 0.0;
+ if (g_flUniversalTime >= flNextWarning)
+ {
+ Warning("[EntWatch HUD] Failed to create point_worldtext for slot %d.\n", GetPlayerSlot().Get());
+ flNextWarning = g_flUniversalTime + 30.0;
+ }
+ return;
+ }
+ pText->m_bEnabled(true);
+ pText->m_bFullbright(true);
+ pText->m_flFontSize(GetEntwatchHudSize());
+
+ Color col;
+ int a = m_colorEntwatchHud.a();
+ if (a == 255) // 254 allows it to be visible through some items
+ col.SetColor(m_colorEntwatchHud.r(), m_colorEntwatchHud.g(), m_colorEntwatchHud.b(), 254);
+ else
+ col.SetColor(m_colorEntwatchHud.r(), m_colorEntwatchHud.g(), m_colorEntwatchHud.b(), a);
+
+ pText->m_Color = col;
+
+ pText->m_flWorldUnitsPerPx(0.005f);
+ pText->m_nJustifyVertical(PointWorldTextJustifyVertical_t::POINT_WORLD_TEXT_JUSTIFY_VERTICAL_TOP);
+
+ V_strncpy(pText->m_FontName, "Verdana Bold", 64);
+
+ pText->SetMessage("");
+
+ pText->DispatchSpawn();
+ SetEntwatchHud(pText);
+ if (bDebug)
+ Message("[EntWatch HUD] Created world-text HUD for slot %d.\n", GetPlayerSlot().Get());
+
+ pText->AcceptInput("SetParent", "!activator", pOrient);
+
+ Vector origin = pOrient->GetAbsOrigin();
+ QAngle vmangles = pOrient->GetAbsRotation();
+
+ Vector forward;
+ Vector right;
+ Vector up;
+ AngleVectors(vmangles, &forward, &right, &up);
+
+ origin += (forward * 7.0f);
+
+ // -x = move left, +x = move right
+ origin += (right * GetEntwatchHudX());
+
+ // -y = move up, +y = move down
+ origin -= (up * GetEntwatchHudY());
+
+ QAngle angles;
+ angles.x = 0.0f;
+ angles.y = AngleNormalize(vmangles.y - 90.0f);
+ angles.z = AngleNormalize(-vmangles.x + 90.0f);
+
+ pText->Teleport(&origin, &angles, nullptr);
+}
diff --git a/src/playermanager.cpp b/src/playermanager.cpp
index 6f932105..3acc16d4 100644
--- a/src/playermanager.cpp
+++ b/src/playermanager.cpp
@@ -25,6 +25,7 @@
#include "engine/igameeventsystem.h"
#include "entity/ccsplayercontroller.h"
#include "entwatch.h"
+#include "entwatch_hud.h"
#include "leader.h"
#include "map_votes.h"
#include "networksystem/inetworkmessages.h"
@@ -38,6 +39,7 @@
#include "votemanager.h"
#include "zombiereborn.h"
#include <../cs2fixes.h>
+#include
#include "tier0/memdbgon.h"
@@ -740,73 +742,29 @@ void ZEPlayer::ToggleThirdPerson(float flDistance, bool bForce)
void ZEPlayer::CreateEntwatchHud()
{
- CCSPlayerController* pController = CCSPlayerController::FromSlot(GetPlayerSlot());
- if (!pController)
- return;
-
- CCSPlayerPawn* pPawn = pController->GetPlayerPawn();
- if (!pPawn)
- return;
-
- CPointOrient* pOrient = GetPointOrient();
- if (!pOrient)
- return;
-
- CPointWorldText* pText = GetEntwatchHud();
- if (pText)
+ if (GetEntwatchHudStyle() == 0)
+ CreateEntwatchWorldHud();
+ else
{
- pText->Remove();
- pText = nullptr;
+ if (auto text = GetEntwatchHud())
+ {
+ text->Remove();
+ SetEntwatchHud(nullptr);
+ }
}
+}
- pText = CreateEntityByName("point_worldtext");
- pText->m_bEnabled(true);
- pText->m_bFullbright(true);
- pText->m_flFontSize(GetEntwatchHudSize());
-
- Color col;
- int a = m_colorEntwatchHud.a();
- if (a == 255) // 254 allows it to be visible through some items
- col.SetColor(m_colorEntwatchHud.r(), m_colorEntwatchHud.g(), m_colorEntwatchHud.b(), 254);
- else
- col.SetColor(m_colorEntwatchHud.r(), m_colorEntwatchHud.g(), m_colorEntwatchHud.b(), a);
-
- pText->m_Color = col;
-
- pText->m_flWorldUnitsPerPx(0.005f);
- pText->m_nJustifyVertical(PointWorldTextJustifyVertical_t::POINT_WORLD_TEXT_JUSTIFY_VERTICAL_TOP);
-
- V_strncpy(pText->m_FontName, "Verdana Bold", 64);
-
- pText->SetMessage("");
-
- pText->DispatchSpawn();
- SetEntwatchHud(pText);
-
- pText->AcceptInput("SetParent", "!activator", pOrient);
-
- Vector origin = pOrient->GetAbsOrigin();
- QAngle vmangles = pOrient->GetAbsRotation();
-
- Vector forward;
- Vector right;
- Vector up;
- AngleVectors(vmangles, &forward, &right, &up);
-
- origin += (forward * 7.0f);
-
- // -x = move left, +x = move right
- origin += (right * GetEntwatchHudX());
-
- // -y = move up, +y = move down
- origin -= (up * GetEntwatchHudY());
-
- QAngle angles;
- angles.x = 0.0f;
- angles.y = AngleNormalize(vmangles.y - 90.0f);
- angles.z = AngleNormalize(-vmangles.x + 90.0f);
+int ZEPlayer::GetEntwatchHudStyle()
+{
+ return m_iEntwatchHudStyle < 0 ? EW_DefaultHudStyle() : m_iEntwatchHudStyle;
+}
- pText->Teleport(&origin, &angles, nullptr);
+void ZEPlayer::SetEntwatchHudStyle(int style, bool bSave)
+{
+ m_iEntwatchHudStyle = style >= -1 && style <= 1 ? style : -1;
+ if (bSave)
+ g_pUserPreferencesSystem->SetPreferenceInt(m_slot.Get(), EW_PREF_HUD_STYLE, m_iEntwatchHudStyle);
+ CreateEntwatchHud();
}
int ZEPlayer::GetEntwatchHudMode()
@@ -818,7 +776,7 @@ int ZEPlayer::GetEntwatchHudMode()
void ZEPlayer::SetEntwatchHudMode(int iMode)
{
- m_iEntwatchHudMode = iMode;
+ m_iEntwatchHudMode = iMode >= Hud_None && iMode <= Hud_ItemOnly ? iMode : Hud_None;
g_pUserPreferencesSystem->SetPreferenceInt(m_slot.Get(), EW_PREF_HUD_MODE, m_iEntwatchHudMode);
}
@@ -842,8 +800,8 @@ void ZEPlayer::SetEntwatchHudColor(Color colorHud)
void ZEPlayer::SetEntwatchHudPos(float x, float y)
{
- m_flEntwatchHudX = x;
- m_flEntwatchHudY = y;
+ m_flEntwatchHudX = std::isfinite(x) && std::abs(x) <= 1000.0f ? x : EW_HUDPOS_X_DEFAULT;
+ m_flEntwatchHudY = std::isfinite(y) && std::abs(y) <= 1000.0f ? y : EW_HUDPOS_Y_DEFAULT;
g_pUserPreferencesSystem->SetPreferenceFloat(m_slot.Get(), EW_PREF_HUDPOS_X, m_flEntwatchHudX);
g_pUserPreferencesSystem->SetPreferenceFloat(m_slot.Get(), EW_PREF_HUDPOS_Y, m_flEntwatchHudY);
@@ -852,7 +810,7 @@ void ZEPlayer::SetEntwatchHudPos(float x, float y)
void ZEPlayer::SetEntwatchHudSize(float flSize)
{
- m_flEntwatchHudSize = flSize;
+ m_flEntwatchHudSize = std::isfinite(flSize) ? std::clamp(flSize, 20.0f, 255.0f) : EW_HUDSIZE_DEFAULT;
g_pUserPreferencesSystem->SetPreferenceFloat(m_slot.Get(), EW_PREF_HUDSIZE, m_flEntwatchHudSize);
CPointWorldText* pText = GetEntwatchHud();
@@ -916,6 +874,7 @@ void CPlayerManager::OnClientDisconnect(CPlayerSlot slot)
g_pUserPreferencesSystem->PushPreferences(slot.Get());
g_pUserPreferencesSystem->ClearPreferences(slot.Get());
+ EW_ForgetHudPlayer(slot.Get());
if (g_cvarEnableEntWatch.Get())
EW_PlayerDisconnect(slot.Get());
diff --git a/src/playermanager.h b/src/playermanager.h
index ee7eac18..f15deedc 100644
--- a/src/playermanager.h
+++ b/src/playermanager.h
@@ -25,6 +25,7 @@
#include "entity/cpointworldtext.h"
#include "entity/customplayercamera.h"
#include "entity/lights.h"
+#include "entwatch_hud.h"
#include "gamesystem.h"
#include "in_buttons.h"
#include "steam/isteamuser.h"
@@ -198,6 +199,10 @@ class ZEPlayer
m_pActiveZRModel = nullptr;
m_iButtonWatchMode = 0;
m_iEntwatchHudMode = 0;
+ m_iEntwatchHudStyle = -1;
+ m_iEntwatchPanoramaX = EW_PANORAMA_X_DEFAULT;
+ m_iEntwatchPanoramaY = EW_PANORAMA_Y_DEFAULT;
+ m_iEntwatchPanoramaSize = EW_PANORAMA_SIZE_DEFAULT;
m_colorEntwatchHud = Color(255, 255, 255, 255);
m_flEntwatchHudX = -7.5f;
m_flEntwatchHudY = -2.0f;
@@ -271,10 +276,18 @@ class ZEPlayer
void SetActiveZRClass(std::shared_ptr pZRModel) { m_pActiveZRClass = pZRModel; }
void SetActiveZRModel(std::shared_ptr pZRClass) { m_pActiveZRModel = pZRClass; }
void SetEntwatchHudMode(int iMode);
+ void SetEntwatchHudStyle(int style, bool bSave = true);
+ int GetEntwatchHudStyle();
+ void CreateEntwatchWorldHud();
void SetPointOrient(CPointOrient* pOrient) { m_hPointOrient.Set(pOrient); }
void SetEntwatchHud(CPointWorldText* pWorldText) { m_hEntwatchHud.Set(pWorldText); }
void SetEntwatchHudColor(Color colorHud);
void SetEntwatchHudPos(float x, float y);
+ void SetEntwatchPanoramaHudPos(int x, int y, bool bSave = true);
+ int GetEntwatchPanoramaHudX() const { return m_iEntwatchPanoramaX; }
+ int GetEntwatchPanoramaHudY() const { return m_iEntwatchPanoramaY; }
+ void SetEntwatchPanoramaHudSize(int size, bool bSave = true);
+ int GetEntwatchPanoramaHudSize() const { return m_iEntwatchPanoramaSize; }
void SetEntwatchHudSize(float flSize);
void SetTopDefenderStatus(bool bStatus) { m_bTopDefender = bStatus; }
void SetLastVoiceTime(float flTime) { m_flLastVoiceTime = flTime; }
@@ -409,6 +422,10 @@ class ZEPlayer
CHandle m_hEntwatchHud;
CHandle m_hCustomCamera;
int m_iEntwatchHudMode;
+ int m_iEntwatchHudStyle;
+ int m_iEntwatchPanoramaX;
+ int m_iEntwatchPanoramaY;
+ int m_iEntwatchPanoramaSize;
Color m_colorEntwatchHud;
float m_flEntwatchHudX;
float m_flEntwatchHudY;
diff --git a/src/user_preferences.cpp b/src/user_preferences.cpp
index 27f41e47..d4121f07 100644
--- a/src/user_preferences.cpp
+++ b/src/user_preferences.cpp
@@ -21,6 +21,7 @@
#include "commands.h"
#include "common.h"
#include "entwatch.h"
+#include "entwatch_hud.h"
#include "httpmanager.h"
#include "playermanager.h"
#include "strtools.h"
@@ -137,9 +138,13 @@ void CUserPreferencesSystem::OnPutPreferences(int iSlot)
// Set EntWatch
player->SetEntwatchHudMode(iEntwatchMode);
+ player->SetEntwatchHudStyle(GetPreferenceInt(iSlot, EW_PREF_HUD_STYLE, -1), false);
player->SetEntwatchHudPos(flEntwatchHudposX, flEntwatchHudposY);
+ player->SetEntwatchPanoramaHudPos(GetPreferenceInt(iSlot, EW_PREF_PANORAMA_X, EW_PANORAMA_X_DEFAULT), GetPreferenceInt(iSlot, EW_PREF_PANORAMA_Y, EW_PANORAMA_Y_DEFAULT), false);
+ player->SetEntwatchPanoramaHudSize(GetPreferenceInt(iSlot, EW_PREF_PANORAMA_SIZE, EW_PANORAMA_SIZE_DEFAULT), false);
player->SetEntwatchHudColor(ewHudColor);
player->SetEntwatchHudSize(flEntwatchHudSize);
+ EW_UpdateHud();
}
void CUserPreferencesSystem::PullPreferences(int iSlot)