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 also gives each player one preference of their own: growing the chat to fit a burst of messages.
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.
Chat bursts
The base game’s chat shows the last few lines and no more, so a command that answers in several lines at once — a status report, a briefing — scrolls most of its answer out of sight before anybody can read it.
ATG UI grows the chat to fit a burst: messages that each arrive within two seconds of the one before. The chat grows to the largest burst it has seen, up to twelve lines, and shrinks back to its usual size once it fades. A conversation with gaps between the messages never grows it.
Each player chooses this for themselves, and it is on by default. With ATG Core loaded it appears as Expand chat for message bursts, under Interface on the ATG tab of the game’s settings menu. Without Core there is no tab, and every player gets the default. Switched off, the chat behaves exactly as the base game’s does.
Nothing about this reaches the server. It is a client preference and a server owner has no setting for it.
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.
Cards other mods ask for
Any mod loaded after this one can show a card by key. Write a card under that key and the mod shows it; leave the key out and the mod decides what to do instead.
The card always shows the body you wrote. A mod that knows something you could not have written in advance fills it in through a placeholder — a name between percent signs that you put wherever you want the value. Each mod’s page lists the placeholders it fills. One that nothing fills is left as written, so a misspelling shows on the card. A mod may also add a short note beneath your text.
Only the key and those values cross the wire, so a card can be a page of rules without any of it being sent per player.
A mod that shows a card can also take it down again. It closes only the card it asked for: if another card has replaced it on the player’s screen, that one is left alone. This is how a card with no dismiss button comes down once the reason for it has gone.
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
}
],
"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.