ATG UI

Nametags, killfeed, notifications and the message of the day, set once by the server owner.

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.

SettingDefaultMeaning
m_iNametagDistanceM50How far away another player’s name is drawn.
m_iGroupLineDistanceM10How far away the group callsign line beneath the name is drawn.
m_iScopedNametagDistanceM50How 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

SettingDefaultMeaning
m_iKillfeedType0What the killfeed shows at all.
m_iKillfeedReceiveType40Whose deaths a player is shown.
m_iFriendlyFireKillfeedType20Whether 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

SettingDefaultMeaning
m_bShowPlayerJoinedNotificationfalseTell 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.

SettingDefaultMeaning
m_bShowMotdtrueWhether the message of the day is shown at all.
m_sDiscordUrlemptyThe invite a card’s Discord button opens.
m_aCardsemptyThe 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

FieldMeaning
m_sKeyHow the card is asked for. The message of the day uses the mode.
m_sTitleThe heading. Keep it short — the body is where the words go.
m_sBodyThe text. Rich text, so <br/> breaks a line.
m_sImageOptional picture above the text, as {GUID}path.edds.
m_bShowDiscordButtonWhether this card offers Discord — a button, and a QR code.
m_bDismissibleWhether 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

SettingDefaultMeaning
m_iLogVerbosity-1How 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.