What the mod does
ATG UI governs four things a server owner would otherwise have no way to set: how far nametags are drawn, what the killfeed tells players, which notifications appear, and what the server says to a player when they arrive.
It draws almost nothing of its own. Every other surface it touches is one the base game already has — the mod decides what those surfaces are configured to do, and pushes that decision to every client so all of them agree.
The mod declares no dependencies. It works on any world, in any game mode, and a server that loads it and changes nothing gets the values listed below.
Nametag ranges
Three independent distances, all in metres.
| Setting | Default | Meaning |
|---|---|---|
m_iNametagDistanceM | 50 | How far away another player’s name is drawn. |
m_iGroupLineDistanceM | 10 | How far away the group callsign line beneath the name is drawn. |
m_iScopedNametagDistanceM | 50 | How far away nametags are drawn through optics or binoculars. |
m_iNametagDistanceM sets the outer limit of the furthest zone in whatever nametag
configuration your server is running. Nearer zones keep the ranges that configuration
authored, because those decide styling rather than how far anyone can see. Raising it
past what the configuration intended is allowed — the ranges it caches are recalculated
to match. 500 is the engine’s own ceiling for a nametag zone and the setting will not
go above it.
The group line is independent of the name above it and is normally far shorter: it
answers who is beside you, not who is across the valley. Set it to 0 to switch the line
off without touching the nametag configuration.
The scoped distance is kept separate because magnification already changes what a player
can make out. Set it equal to m_iNametagDistanceM if you want no difference between the
two.
These are server settings and are deliberately not offered to players. A player who could set their own nametag distance would set it to the maximum.
Killfeed policy
| Setting | Default | Meaning |
|---|---|---|
m_iKillfeedType | 0 | What the killfeed shows at all. |
m_iKillfeedReceiveType | 40 | Whose deaths a player is shown. |
m_iFriendlyFireKillfeedType | 20 | Whether a friendly kill is shown in full anyway. |
m_iKillfeedType takes 0 for nothing, 10 for the fact that a player died without
ever naming who killed them, and 20 for the full kill including the killer.
m_iKillfeedReceiveType takes 0 for everyone’s deaths, 10 for enemies’ only, 20
for allies’ only, 30 for your own faction’s only, and 40 for your own group’s only.
m_iFriendlyFireKillfeedType takes 0 for no special handling, 10 to show a friendly
kill in full to the killer and the victim, and 20 to show it in full to the whole team.
It overrides the two settings above where they would otherwise hide or anonymise the
kill.
The last two do nothing while m_iKillfeedType is 0.
Two behaviours are the base game’s and are not configurable here: deaths of AI characters never appear in the killfeed for anyone, and a player with the unlimited editor always sees the full killfeed whatever these are set to.
A Game Master can change all three live from the editor attributes. These settings decide what a world starts with, not what it is locked to.
Notifications
| Setting | Default | Meaning |
|---|---|---|
m_bShowPlayerJoinedNotification | false | Tell everyone when a player joins the server. |
Notifications about somebody joining your own squad are separate and unaffected.
Game Master and administrator rights announcements are dropped outright and there is no setting for them. On a server that logs its staff in automatically, those announcements fire on every join and tell players nothing they need. The drop happens where the notification is received, so it holds whichever system granted the rights.
Cards and the message of the day
A card is a full-screen dialog with a heading, a body of text, an optional picture above it, and a button to dismiss it. You write the cards your server has; anything that wants one asks for it by key.
The message of the day is one use of that mechanism. A player is shown it once, after their first spawn, and again whenever the server changes what it is doing.
It does not gate the spawn and nothing is recorded. A player who closes it, or never closes it, plays either way. It is somewhere to put your rules, not a consent form.
| Setting | Default | Meaning |
|---|---|---|
m_bShowMotd | true | Whether the message of the day is shown at all. |
m_sDiscordUrl | empty | The invite a card’s Discord button opens. |
m_aCards | empty | The cards this server can show. |
The mod ships no cards, so nothing appears until you write one. m_bShowMotd is on
by default so that authoring a card is the only step.
Which card is the message of the day
The card whose key matches what the server is currently doing.
With nothing supplying a mode, that key is default — so a server with one message keys
its card default and is finished. ATG Scenario supplies
combat and narrative when it is loaded after this mod, and the message then
follows the mode, changing for everybody the moment the mode does.
A player still on the deploy screen when the mode changes picks the new card up when they spawn, rather than being shown it behind the deploy panel.
Writing a card
| Field | Meaning |
|---|---|
m_sKey | How the card is asked for. The message of the day uses the mode. |
m_sTitle | The heading. Keep it short — the body is where the words go. |
m_sBody | The text. Rich text, so <br/> breaks a line. |
m_sImage | Optional picture above the text, as {GUID}path.edds. |
m_bShowDiscordButton | Whether this card offers Discord — a button, and a QR code. |
m_bDismissible | Whether the player can close it. Off gives it no button. |
A body longer than the card is tall scrolls rather than being cut off.
The picture can be any texture in your mod set, not just one from this mod — take the full resource string from the Workbench picker rather than typing it.
m_bDismissible off is for something a player is meant to read rather than click past.
It governs the card alone: whatever the server does about that player is decided
elsewhere, so a card with no button is not a way to stop anyone doing anything.
The Discord button
Set m_sDiscordUrl to your server’s invite and every card grows a second button,
opposite the one that dismisses it, that opens it in a browser. Leave it empty and no
card shows the button.
m_bShowDiscordButton turns it off for one card that has no business sending anybody to
Discord. It cannot turn the feature on for a server that has set no invite.
Clicking it does not close the card, so a player who goes to Discord comes back to what they were reading.
The QR code
With ATG QR Codes loaded, a card that offers Discord also carries a scannable code beneath its text. The button opens a browser, which is no use to somebody reading the card in game; the code lets them reach the invite with the phone already in their hand.
It is gated on the same two things as the button — the card’s m_bShowDiscordButton, and
an invite in m_sDiscordUrl. There is no separate setting for it.
The message of the day is the one exception. While ATG Link has its
registration gate set to "nag" or "block", the message of the day leaves the code off:
the players reading it are already being sent to Discord to register, and do not need the
same invite twice. With the gate "off", or with ATG Link not loaded, every message of the
day carries the code.
Cards other mods ask for
Any mod loaded after this one can show a card by key.
ATG Link uses three — link-nag, link-gate and
link-unavailable — to put its account-linking messages on screen instead of in chat
alone. Write those keys and it uses them; leave them out and it stays in chat.
Only the key crosses the wire, so a card can be a page of rules without any of it being sent per player.
Logging
| Setting | Default | Meaning |
|---|---|---|
m_iLogVerbosity | -1 | How much this mod writes to the server log. |
-1 follows the level set in ATG Core, so one setting moves every
ATG mod and a single mod can still be turned up while it is being diagnosed. 0 is
warnings and errors only, 1 what it decided, 2 the detail behind those decisions, 3
a line per object. Warnings and errors are never suppressed at any level.
Changing the settings
With ATG Core loaded before this mod, every setting above is
readable from a JSON file in the server’s profile directory, at ATG/atg-ui.json. No
Workbench, no mod of your own, no rebuild.
A bool in this file is written true or false. A 1 is silently ignored and the
setting keeps the value it already had.
{
"m_iNametagDistanceM": 50,
"m_iGroupLineDistanceM": 10,
"m_iScopedNametagDistanceM": 50,
"m_iKillfeedType": 0,
"m_iKillfeedReceiveType": 40,
"m_iFriendlyFireKillfeedType": 20,
"m_bShowPlayerJoinedNotification": false,
"m_bShowMotd": true,
"m_sDiscordUrl": "https://discord.gg/your-invite",
"m_aCards": [
{
"$type": "ATG_UiCard",
"m_sKey": "default",
"m_sTitle": "Welcome",
"m_sBody": "Read the rules before you deploy.<br/><br/>No firing inside the base. Identify before engaging.",
"m_sImage": "",
"m_bShowDiscordButton": true,
"m_bDismissible": true
},
{
"$type": "ATG_UiCard",
"m_sKey": "link-gate",
"m_sTitle": "Account not linked",
"m_sBody": "This server requires a linked account.",
"m_sImage": "",
"m_bShowDiscordButton": true,
"m_bDismissible": false
}
],
"m_iLogVerbosity": -1
}
Copy it and delete the lines you do not want to change — a key you leave out keeps its shipped value.
m_aCards needs care: it is a list, so naming it replaces the whole thing rather than
merging with what is already there. Every entry needs its $type, and for this list it
is always ATG_UiCard. A missing or misspelled one is silent — the entry is dropped and
the card simply never appears.
$profile: resolves to a profile folder inside the directory you pass to
-profile. If you launch with -profile C:\servers\atg, the file belongs at
C:\servers\atg\profile\ATG\atg-ui.json.
Without ATG Core
The mod still works and still uses the values above. To change them you override its
settings file the ordinary Arma way: in Workbench, right-click
Configs/ATG/Ui/InitialSettings.conf in this mod → Override, then edit your copy. That needs the Tools installed and a mod of
your own built, which is the reason the JSON route exists.