AdminHelper
A tool to assist in event admining. Highlights players who are ramboing, highlights CTF flags, greys out players standing still, finds players by class or regiment, marks melee kills in the kill log, and adds an admin battle map.
| Date uploaded | 2 days ago |
| Version | 1.2.0 |
| Download link | Ryanlt-AdminHelper-1.2.0.zip |
| Downloads | 10 |
| Dependency string | Ryanlt-AdminHelper-1.2.0 |
This mod requires the following mods to function
HoldfastModding-BepInExPack_Holdfast
BepInEx pack for Holdfast: Nations At War. Preconfigured and ready to use.
Preferred version: 5.4.2305Ryanlt-RyLib
Shared UI library for Holdfast client mods. Lets several mods add P menu tabs, a shared Mods tab, a battle map, player and kill log actions, key hints and world or minimap markers without colliding.
Preferred version: 1.0.0README
AdminHelper
AdminHelper is a BepInEx mod for Holdfast: Nations At War. It scores every player on their distance from their own side and marks players who stay out of formation (rambos). It also adds admin tools to the P menu.
Anything that shows another player requires an rc login on the server. See Admin only.
Install
Mod manager
Install AdminHelper with r2modman or Thunderstore Mod Manager and start the game from the manager. BepInEx and RyLib are installed with it.
Manual
- Install BepInExPack_Holdfast into the game folder and start the game once.
- Download
AdminHelper.dllfrom the latest release andRyLib.dllfrom the RyLib release. - Copy them to:
Steam\steamapps\common\Holdfast Nations At War\BepInEx\plugins\AdminHelper\AdminHelper.dll
Steam\steamapps\common\Holdfast Nations At War\BepInEx\plugins\RyLib\RyLib.dll
Checking the install
BepInEx\LogOutput.log contains these lines when both mods load:
[Info : BepInEx] Loading [RyLib 1.0.0]
[Info : BepInEx] Loading [AdminHelper 1.2.0]
If they are missing, see Troubleshooting.
Rambo overlay
- Log in to the server console with
rc login <password>. - Open the P menu and click Rambo UI under the players list, or press F6.
Rambo UI cycles through three modes:
| Mode | The overlay shows |
|---|---|
| Always On | While playing, spectating and in free roam. |
| Freeflight | In free roam only. |
| Off | Never. Scoring continues in the background. |
F6 turns the overlay off, and pressing it again restores the previous mode. The mode is saved between launches.
ToggleKey changes the key.
A player is marked once their ISO passes RingThreshold. The mark is a glow visible through walls and terrain,
a ring at their feet, and a label with their name, state and scores. The mark is removed when their ISO drops
below the threshold.
States
| State | Condition |
|---|---|
| ISOLATED | ISO is above RingThreshold. |
| RAMBO | ISO has stayed above RamboThreshold for RamboHoldSeconds. The label shows the time in seconds. |
| FIGHT | The player joined a melee before being flagged. See Melee grace. |
| AFK | The player has not moved for AfkSeconds. See AFK players. |
Colours
| Colour | Condition |
|---|---|
| Green to yellow | ISO rising from RingThreshold to 100, with a DGR of 0. |
| Orange to red | DGR rising from 1 to 100. |
| Blue | FIGHT. |
| Grey | AFK. |
Spectating marked players
With an rc login, ] spectates the next marked player and [ the previous one. The order is RAMBO, then
ISOLATED and FIGHT sorted by DGR, then AFK. While Rambo UI is not Off, the key bar in free roam and in spectator
mode shows a Spectate Rambos entry for these keys. SpectateNextKey and SpectatePrevKey change them.
P menu settings
The P menu has AdminHelper's settings under Mods > AdminHelper, in the sections Rambo Detection, Flags, Players Tab, Kill Log and Map. They change the same values as the config file.
Player search
The search box in the P menu players tab accepts classes, factions, sides and regiment tags as well as names and
IDs. It works without an rc login.
| Search by | Examples |
|---|---|
| Class name or its start | rifleman, rifle, surgeon, sapper, grenadier |
| Shorthand | line, officer, sgt, medic, flag, drummer, gunner |
| Class group | cavalry (hussars and dragoons), skirmishers (riflemen and light infantry), rank & file (line infantry), infantry, artillery, support, naval, sailor, officers |
| Faction | british, french, prussian, russian, italian, austrian, allied, central, spanish, privateer, american, and country names such as france and britain |
| Side | attackers or att, defenders or def |
Terms combine. french cav lists French hussars and dragoons, and defenders surgeon lists the defending
side's surgeons. Plurals work for all terms.
Regiment tags and player names are compared with punctuation removed and accents replaced by plain letters.
[45e] matches 45e and 45, and 7.Fuß matches 7fus.
Text that is not a class, faction or side searches names and tags as in the base game.
ClassFilterEnabled, FactionSearchEnabled and RegimentSearchEnabled turn each part off.
Regiment teleport
An expanded player row in the P menu has two extra admin buttons.
| Button | Action |
|---|---|
| Reg TP | Teleports the player to the member of their regiment with the same class who is closest to the centre of that group. If no one in the regiment has that class, the player goes to the closest friendly player. |
| Rez + Reg TP | Revives a dead player, waits for them to spawn, then does the same teleport. The teleport is cancelled if they are not alive within four seconds. |
Both buttons use the game's revive request and rc teleport. RowActionsEnabled removes them.
Kill log
Melee mark
Crossed swords between the names mean the victim was in a melee with an enemy player when they died. A line under the kill log title explains the icon. A kill at range shows the distance and then the swords.
A player enters a melee when they hit an enemy with a melee attack, have their attack blocked by an enemy, or
block an enemy's attack. Hits and blocks between teammates do not count. Every player within MeleeChainMetres
of someone in the melee is also in it, on either side. The melee ends when nobody in it has hit or blocked for
MeleeWindowSeconds.
Only kills that happen while you are in the round can be marked.
Name colours
While Rambo UI is not Off, the killer's and victim's names use the colour of their rambo mark at the time of the kill.
Actions
Clicking a row opens actions for the killer and the victim: Spectate, Go To, Bring, Slay, Revive, Heal, Slap, Kick, Reg TP and Rez + Reg TP. Slay, Slap and Kick need a second click within four seconds.
Teamkills
The square toggle next to the search box shows teamkills only and changes the title to TEAM KILL LOG. Typing
tk in the search box does the same. Suicides do not count as teamkills.
Map
The Map tab is on by default. Map tab under Mods > AdminHelper > Map, or MapEnabled, turns it off.
The tab shows an overhead image of the current map, with each player drawn as their class icon in their faction's colour.
- The legend under the map lists the classes each faction can spawn and how many of each are on the field.
- The search box filters the icons by name, class or faction.
- The mouse wheel zooms and dragging pans. Battle Area frames the spawns and Whole Map shows the full map.
- Icons - and Icons + change the icon size.
- Clicking a player selects them. The panel has Spectate, Go To, Bring, Teleport To, Slay, Reg TP and Rez + Reg TP. Slay needs a second click.
- Teleport To moves the selected player and Teleport Me moves you. Both wait for a click on the map and teleport to that spot. Right click cancels.
- While the rambo overlay is showing, marked players have an outline in their mark colour.
- With
FlagHighlightEnabledon, flags are drawn on the map.
Flags
All flag settings are off by default.
| Setting | Effect |
|---|---|
FlagHighlightEnabled |
Tracks flags. While the overlay is showing, each flag glows in its faction's colour. Flags are also drawn on the Map tab. Requires an rc login. |
ShowFlagLabels |
Labels each glowing flag with its faction or its carrier's name. |
FlagMinimapMarkers |
Shows flags on the minimap by the game's reveal rules. Your side's flags are blue. Enemy flags are red and only show while their faction is revealed. |
FlagMinimapAlways |
Shows every flag on the minimap to admins, whatever the reveal rules. Requires an rc login. |
ShowFlagLabels and FlagMinimapMarkers need FlagHighlightEnabled. FlagMinimapAlways needs
FlagMinimapMarkers.
A carried flag follows its carrier, and a dropped flag is marked where it lies. Tracking covers every flag carryable in the game, including the custom bearing flag, whichever mod or map places it.
AFK players
A player who has moved less than AfkMoveMetres in AfkSeconds is marked AFK in grey. Moving further clears
the mark. AfkMarkEnabled turns it off.
Melee grace
When a player who is not flagged joins a melee, they cannot be flagged until MeleeWindowSeconds after the melee
ends, plus RamboHoldSeconds. Their label reads FIGHT during this time. Their dwell time keeps counting, and if
they are still isolated when the grace ends they are flagged straight away. A player who is already flagged when
the melee starts gets no grace. MeleeGrace turns it off.
Scores
| Score | Meaning |
|---|---|
| ISO | Isolation. Distance from the player's own side, built up over time. |
| DGR | Danger. The part of ISO that counts as a threat, based on nearby enemies. |
Both run from 0 to 100, and DGR is never higher than ISO. A player alone with no enemies nearby has a high ISO and a DGR of 0. A player at 60 ISO with three enemies close by has a DGR near 60.
Scoring
Scores update TickHz times a second from four inputs.
| Input | Effect |
|---|---|
| Distance | Distance from the midpoint of the player's two nearest living teammates. It starts counting at ClusterNearMetres and reaches the maximum at ClusterFarMetres. |
| Time | The score rises while the player stays out, at a rate set by RiseSeconds, and falls RecoverMultiplier times faster once they rejoin. |
| Enemies | The nearest enemy's distance and the number of enemies inside EnemyRadius turn ISO into DGR. With no enemies in range DGR is 0. EnemyCrowd enemies at contact give full DGR, and one enemy at contact gives half. |
| Formation | A player in formation has FormationSuppression of the raw score removed. A player counts as in formation inside an officer's or sergeant's placed line, on a line fitted through nearby teammates, or in a tight cluster such as a square. |
Cavalry is only scored with ScoreCavalry on. Artillery is never scored. ExemptClasses excludes other classes.
Admin only
Other players are shown only after the server accepts your rc login. Setting RequireAdminLogin to false
removes this check for testing with bots on your own server. With it off, every player is shown to anyone
running the mod.
Settings
The config file is BepInEx\config\com.ryannlt.adminhelper.cfg, created on first launch. Changes to the file
apply within a second without a restart.
ConfigurationManager can edit the settings in game.
It needs HideManagerGameObject = true under [Chainloader] in BepInEx\config\BepInEx.cfg.
| Setting | Default | Effect |
|---|---|---|
Enabled |
true |
Turns the whole mod on or off, scoring included. |
TickHz |
5 |
Scoring updates per second. |
RequireAdminLogin |
true |
Only show other players after an rc login. |
ClusterNearMetres |
10 |
Distance from the two nearest teammates where isolation starts. |
ClusterFarMetres |
30 |
Distance where isolation reaches the maximum. |
RiseSeconds |
6 |
Time constant for the score rising. |
RecoverMultiplier |
3 |
How much faster the score falls than it rises. |
EnemyRadius |
30 |
Distance within which enemies count towards danger. |
EnemyCrowd |
3 |
Number of enemies at contact that gives full danger. |
FormationSuppression |
0.9 |
Fraction of the raw score removed in formation. |
LineRadius |
10 |
Radius searched for formation mates. |
LineMinMates |
2 |
Mates needed before a line is fitted. |
LineMaxMates |
6 |
Most mates used for the line fit. |
LineResidual |
2 |
Distance either side of the fitted line still counted as on it, in metres. |
ClusterMinMates |
3 |
Mates within ClusterFormationRadius that count as a tight cluster. |
ClusterFormationRadius |
8 |
Radius for the tight cluster check. |
RingThreshold |
40 |
ISO at which a player is marked. |
RamboThreshold |
75 |
ISO at which the dwell timer starts. |
RamboHoldSeconds |
5 |
Seconds above RamboThreshold before a player is flagged RAMBO. |
ScoreCavalry |
false |
Score cavalry. |
ExemptClasses |
empty | Comma separated class names that are never flagged, for example Surgeon,Sapper. |
MeleeGrace |
true |
Turns on melee grace. |
FlagHighlightEnabled |
false |
Tracks flags in the world and on the Map tab. |
FlagMinimapMarkers |
false |
Shows flags on the minimap. |
ShowFlagLabels |
false |
Labels each flag with its faction or carrier. |
FlagMinimapAlways |
false |
Shows every flag on the minimap to admins. |
AfkMarkEnabled |
true |
Marks players who have stopped moving. |
AfkSeconds |
90 |
Seconds without moving before a player is AFK. |
AfkMoveMetres |
0.75 |
Distance a player has to move to reset the AFK timer. |
RamboUi |
Off |
When the overlay shows: On, FreeflightOnly or Off. |
ToggleKey |
F6 |
Key that turns the overlay off and back on. Any KeyCode name. |
ShowRings |
true |
Ring under each marked player. |
ShowLabels |
true |
Label above each marked player. |
ShowGlow |
true |
Glow on marked players and flags, visible through walls. |
MaxLabels |
12 |
Most labels shown at once, worst first. |
SpectateNextKey |
RightBracket |
Spectates the next marked player. |
SpectatePrevKey |
LeftBracket |
Spectates the previous marked player. |
ClassFilterEnabled |
true |
Class search in the players tab. |
RegimentSearchEnabled |
true |
Regiment tag search in the players tab. |
FactionSearchEnabled |
true |
Faction and side search in the players tab. |
RowActionsEnabled |
true |
Reg TP and Rez + Reg TP buttons on player rows. |
MeleeMarkerEnabled |
true |
Crossed swords on melee kills in the kill log. |
TeamkillFilterEnabled |
true |
Teamkill toggle and tk search in the kill log. |
MeleeChainMetres |
10 |
Distance from a melee within which a player counts as in it. |
MeleeWindowSeconds |
10 |
Seconds without a hit or block before a melee ends. |
MapEnabled |
true |
Shows the Map tab in the P menu. |
Glow style and map icon size are set in RyLib's config,
com.ryannlt.rylib.cfg.
Tuning
Each marked player's label shows their ISO and DGR. Compare these with the table below to adjust the thresholds.
With the default settings, ISO settles at these values:
| Distance from the two nearest teammates | ISO |
|---|---|
| Under 10 m | 0 |
| 15 m | 25 |
| 18 m | 40, the player is marked |
| 20 m | 50 |
| 25 m | 75, the dwell timer starts |
| 30 m or more | 100 |
A player is marked at about 18 m. A RAMBO flag needs more than 25 m held for about 8 seconds, plus
RamboHoldSeconds.
| Problem | Change |
|---|---|
| Too many false positives | Raise ClusterFarMetres or RiseSeconds. |
| Rambos are not flagged | Lower ClusterFarMetres. For rambos at around 18 m, try 22. |
| Flagging is too slow | Lower RiseSeconds or RamboHoldSeconds. |
Dwell time falls at RecoverMultiplier times the rate it builds, and a short return to formation does not reset
it.
Troubleshooting
| Problem | Fix |
|---|---|
| No log file, or nothing in the log | BepInEx is not running. Check that winhttp.dll and the BepInEx folder are next to Holdfast NaW.exe. With a mod manager, start the game from the manager. |
| AdminHelper does not load and the log mentions RyLib | Install or update RyLib. |
| The mod loads but nothing is drawn | Run rc login <password>. Check Enabled, and that Rambo UI is not Off. |
Nothing is drawn and the log has no scene loaded line |
Open an issue with BepInEx\LogOutput.log attached. |
| The map shows a grid instead of an image | Open an issue with BepInEx\LogOutput.log attached. |
| The game crashes at launch | Remove the mod and check the game starts. Then open an issue with BepInEx\LogOutput.log attached. |
Building
Requirements:
- The game.
- BepInEx and RyLib installed in an r2modman profile.
- A .NET SDK, for the compiler.
powershell -ExecutionPolicy Bypass -File .\build.ps1
build.ps1 compiles every .cs file in the repo and copies AdminHelper.dll to
BepInEx\plugins\AdminHelper\ in the r2modman profile. Restart the game to load it.
| Option | Effect |
|---|---|
-NoDeploy |
Build without copying. Use this while the game is running. |
-ProfileName <name> |
Use a profile other than Dev. |
AdminHelper compiles against the RyLib in the profile. When changing both, build and deploy RyLib first.
package.ps1 builds the mod and writes a Thunderstore zip to Package\.
Both scripts expect the game in C:\Program Files (x86)\Steam\steamapps\common\Holdfast Nations At War. For
another location, change $GameDir at the top of the script.
The .csproj is for IDE support. build.ps1 calls csc directly.
Source layout
| Folder | Contents |
|---|---|
Core |
Plugin entry point, driver, settings, logging, overlay hotkey and rambo spectating. |
Game |
Game reads: player snapshots, faction and round lookups, text matching. |
Tracking |
Isolation, formation, melee, AFK and flag tracking. |
Overlay |
World marks, minimap flags and the map layer, drawn through RyLib. |
PMenu |
Mods tab settings, player search, kill log and row actions. |
Releases
There is no CI build. Building needs Assembly-CSharp.dll from a game install, which is not in this repo.
Releases are built locally.
Compatibility
Built against Holdfast on Unity 2022.3.62f2 with BepInEx 5.4.23.5 (Mono). A game update that renames or restructures the client player managers stops the mod from working. Please open an issue if that happens.
Licence
MIT.
CHANGELOG
Changelog
1.2.0
Now built on RyLib, a shared UI library, so AdminHelper and other mods can
add to the P menu without breaking each other. Mod managers install it automatically; by hand, it goes in
BepInEx\plugins\RyLib\.
The overlay is drawn in the world, not on a HUD. Watched players glow through walls and terrain, with a ring
at their feet and a label that sits under the P menu rather than over it. The corner list and your own score
readout are gone, and with them ShowCornerList, ShowOwnScore and StartHudVisible. New ShowGlow.
Rambo UI modes. A Rambo UI button under the players list steps between Always On, Freeflight (only in free
roam) and Off, like the game's Admin Raygun, and the mode is remembered between launches. F6 still hides and
restores it. New RamboUi.
Colours say how bad it is. Isolation alone runs green to yellow; any danger turns the mark orange, deepening to red. FIGHT stays blue and AFK grey.
Spectate rambos with [ and ]. Steps through watched players worst first, and the game's own key bar shows
a Spectate Rambos entry in free roam and while spectating. New SpectatePrevKey and SpectateNextKey.
All settings in the P menu, under a shared Mods tab: Mods > AdminHelper, grouped into Rambo Detection, Flags, Players Tab, Kill Log and Map.
Kill log. A melee kill is marked with crossed swords, explained by a line under the heading; the old
IN MELEE / NO MELEE text is gone. While Rambo UI is on, names are coloured by their rambo mark at the moment
of the kill. Clicking a row opens actions for the killer and the victim.
Reg TP prefers the same class. It sends a player to the middle of their regiment's players of the same class, and to the closest friendly player when there are none.
Flags glow in their faction's colour instead of a ring and beam, and follow the game's minimap reveal rules,
with FlagMinimapAlways letting admins see all of them. New ShowFlagLabels. Every flag setting is now off by
default, including FlagMinimapMarkers.
A battle map. A Map tab with an overhead picture of the battle, every player drawn by class in
their faction's colour, a class legend, search, zoom, rambo outlines and flags, and admin actions that only fire
after a button is pressed. Turn it off with MapEnabled or Mods > AdminHelper > Map.
1.1.2
The player search reads factions and sides. french, allied, austrian and the country names behind them
all filter the players tab, and attackers or defenders resolve to whichever faction is attacking or defending
this round. They combine with a class, so french cav is French hussars and dragoons and def surgeon is the
defending side's surgeons, and plurals are understood throughout. Class groups grew too: skirmishers,
rank & file, infantry, support and horse. Anything the mod cannot read is handed straight back to the
stock name and tag search, so nothing that worked before stopped working. New FactionSearchEnabled.
Two new buttons on a player's admin row. Reg TP teleports that player to their own regiment - to the mate
standing nearest the middle of the group, so they land in the line rather than on a straggler - and
Rez + Reg TP revives a dead player first, waits for them to come back, then sends them. Both go through the
game's own admin plumbing, and both live in the admin block, so they only exist once you are logged in. New
RowActionsEnabled.
Source files are now grouped into Core, Game, Tracking, Overlay and PMenu folders. No behaviour
change, but build.ps1 now recurses.
1.1.1
Three additions for CTF events.
Flags are highlighted. With the overlay up, every flag in the round gets a cyan ring and a beam, either at
the carrier's feet or where the flag is lying, a label saying who has it, and a line at the top of the corner
list with the distance. On the minimap the carrier's own pointer is tinted rather than doubled up, and a flag on
the ground gets a marker of its own, named by its faction. Every flag carryable the game has counts, so this is
not tied to one CTF mod. It ships off, since it only matters on a flag game mode - turn on
FlagHighlightEnabled under the new [CTF] section.
Players standing still are greyed out. Anyone who has not moved for AfkSeconds is drawn grey with an AFK
tag, so a parked player is not read as someone worth flying to. They keep their ring and their place in the list.
New [AFK] settings.
Melee grace. A player who enters a melee without already being flagged is not flagged while it lasts, plus
the usual window afterwards, and the label reads FIGHT. The last one or two left alive in a fight their mates
started no longer read as rambos, while a player who runs in alone still flags. Their dwell keeps building
underneath, so nothing is lost if they really are out on their own. Turn it off with MeleeGrace.
1.1.0
Two additions, both inside the game's own P menu rather than a separate window.
Find players by class or regiment. The players tab search box now also matches class names and shorthands,
so rifleman, rifle, line, sgt and cavalry all narrow the list, with the count above it. Regiment tags
are matched with punctuation and accents stripped from both sides, so [45e] is found by 45e or 45, and
7.Fuß by 7fus. Searching by name or ID is unchanged.
Kill log. Every kill is marked with whether the victim was in a melee when they died, so a teamkill in a
scrum can be told apart from a clean one. A player counts as being in a melee once they hit, block, or are
blocked by the other side, and that spreads to everyone standing within MeleeChainMetres of them. A blank mark
means the mod was not tracking and does not know, which is never to be read as a clean kill. A square toggle
beside the heading switches the log to teamkills only, and typing tk in its search box does the same.
New settings live under [PMenu] and [KillLog].
1.0.1
Fixed the BepInEx dependency. 1.0.0 depended on BepInEx-BepInExPack, which is not published in the Holdfast
community, so mod managers could not resolve it and installed no loader. Now depends on
HoldfastModding-BepInExPack_Holdfast. No code changes.
1.0.0
First release. Built for BepInEx 5.