In this page I explain how I wired Crosschat Ascended into Ark:SA Permissions and how you can configure chat formatting, tags, tribe logs, online lists and blacklist behaviour.
Most of this lives inside the Premium section of the plugin config, so you need the premium plugin active for it to apply.
Before you touch the formatting options, make sure:
The Ark:SA Permissions plugin is installed on all servers.
Permissions is configured to use MySQL/MariaDB, for example:
{
"UseMysql": true,
"MysqlHost": "127.0.0.1",
"MysqlUser": "arkuser",
"MysqlPass": "yourStrongPassword",
"MysqlDB": "arkdb",
"MysqlPort": 3306,
"ClusterSyncTime": 60
}
The permissions DB schema (usually a table like players) exists and is accessible.
Your groups (Admin, VIP, Muted, etc.) are set up there.
Crosschat never creates those permission groups; it only reads them and applies formatting or logic based on them.
The PermissionsFormatting block lets me override how chat lines look based on the player’s highest-priority group.
Example, based on the reference config:
"Premium": {
"PermissionsFormatting": {
"Default": {
"ChatFormat": "{map}: {tags} {sender} {tribe}: {message}",
"Priority": 0,
"Icon": "",
"FormattingParts": {
"map": "[{name}]",
"tags": "{name}",
"sender": "<RichColor Color=\"1, 0.9, 0, 1\">{name}</>",
"tribe": "<RichColor Color=\"1, 0.9, 0, 1\">[{name}]</>",
"message": "{message}"
}
},
"Admin": {
"ChatFormat": "{map}: {tags} {sender} {tribe}: {message}",
"Priority": 9999,
"Icon": "",
"FormattingParts": {
"map": "[{name}]",
"tags": "{name}",
"sender": "<RichColor Color=\"1, 0.9, 0, 1\">{name}</>",
"tribe": "<RichColor Color=\"1, 0.9, 0, 1\">[{name}]</>",
"message": "<RichColor Color=\"1, 0, 0, 1\">{message}</>"
}
}
},
...
}
Key ideas:
"Default", "Admin", "Moderator", etc.) corresponds to a permission group name in Ark:SA Permissions.Priority determines which formatting wins when a player has multiple groups – higher wins.ChatFormat is the overall template for the chat line.FormattingParts maps each placeholder (map, tags, sender, tribe, message) to another template, where {name} is replaced with the specific value.So if an Admin says “Hi” in chat, the flow is:
Priority defined (for example Admin with 9999).map → "[TheIsland]" (or whatever you defined).sender → colored player name.tribe → colored tribe name in brackets.message → red text because they’re Admin.ChatFormat → final string sent to all servers.Default entry with Priority: 0 and sane formatting; this is the fallback.Icon if you plan to use icons, or leave it as an empty string if not.MapIcons, and you see crashes around formatting, make sure your Default group and map icons are configured correctly (no fake placeholder like "..." without an actual image).ChatTags let me define badges like [Admin], [VIP], etc. that are injected into chat based on permission groups.
From the reference config:
"ChatTags": {
"StackChatTags": true,
"Admin": {
"Priority": 9999,
"Icon": "",
"Text": "<RichColor Color=\"1, 0, 0, 1\">[{icon}Admin]</>",
"CanBeDisabled": true
}
}
Fields:
StackChatTags – if true, players can show multiple tags at once; otherwise only the highest priority tag is shown.Admin, VIP, …):
Priority – which tag wins when stacking is disabled.Icon – optional icon path that will be injected as {icon} into the Text template.Text – how the tag is displayed in chat.CanBeDisabled – if true, players can toggle the tag off with /disabletag.Commands from the Commands block:
/enabletag <tag> – enable a tag (if they have permission group for it)./disabletag <tag> – disable a tag.Messages for feedback live in the Messages block:
"Messages": {
"TagEnabled": "Tag enabled successfully",
"TagDisabled": "Tag disabled successfully",
"NoPermissionTag": "You don't have permission to enable that tag",
"EnableTagSyntax": "Syntax: /enabletag <tag>",
"DisableTagSyntax": "Syntax: /disabletag <tag>",
"TagDisabledAlready": "That tag is already disabled",
"TagNotFound": "That tag doesn't exist",
"CannotDisableTag": "You cannot disable this tag",
"TagAlreadyEnabled": "That tag is already enabled",
...
}
Admin, Mod, VIP).Priority so important ones appear first.Tribelogs lets tribes stream in-game tribe logs to their own Discord channels using webhooks.
"Tribelogs": {
"Enabled": true,
"OnlyTribeOwnerCanSetWebhook": true,
"OnlyTribeAdminsCanSetWebhook": false,
"AdminWebhook": "",
"Permission": "CCA.Tribelog",
"Format": "{map}: {log}"
}
Behaviour:
When enabled, players with the appropriate permission (see Permission) can run:
/tribelog <webhook-url>
Depending on the booleans:
Future tribe log events are then sent to the specified Discord webhook using Format as the template.
Messages are again in Messages:
"Messages": {
"SetTribeLogSyntax": "Syntax: /tribelog <webhook>",
"TribeLogSet": "Tribe log webhook set successfully",
"OnlyTribeOwnerCanSetWebhook": "Only the tribe owner can set the webhook",
"OnlyTribeAdminsCanSetWebhook": "Only tribe admins can set the webhook",
"NoPermissionTribeLog": "You don't have permission to set the tribe log webhook",
"InvalidWebhook": "Invalid webhook",
...
}
Tips:
AdminWebhook to receive all tribe logs centrally for moderation."JoinLeaveWebhook": "",
"JoinFormat": "{map}: Player logged in. PlatformName: {platformname}. IngameName: {ign}. EOS: {eosid}. TribeId: {tribeid}. TribeName: {tribename}. DiscordName: {discordName}",
"LeaveFormat": "{map}: Player logged off. PlatformName: {platformname}. IngameName: {ign}. EOS: {eosid}. TribeId: {tribeid}. TribeName: {tribename}. DiscordName: {discordName}",
JoinLeaveWebhook – if non-empty, I send join and leave events to that webhook.JoinFormat / LeaveFormat – templates with placeholders:
{map}, {platformname}, {ign}, {eosid}, {tribeid}, {tribename}, {discordName}.If a specific field isn’t available (for example player not linked to Discord), a sensible fallback or empty string is used.
"OnlinePlayerListNormal": "{name}{tribeName}. Discord: {discordName}. {map}({playtime})",
"OnlinePlayerListAdmin": "{name}{tribeName}({eos})(PlayerId: {playerId}). TribeId: {tribeId}. Discord: {discordName}({discordId}). {map}({playtime})",
"OnlinePlayerListDisplayScale": 1.0,
"OnlinePlayerListPlayersPerPage": 10,
"OnlinePlayerListColor": [ 0, 255, 0 ],
"OnlinePlayerListBackgroundColor": [ 0, 0, 0 ],
"OnlinePlayerListBackgroundOpacity": 1
/online – shows the player list.OnlinePlayerListNormal template.OnlinePlayerListAdmin, which includes IDs.OnlinePlayerListDisplayScale.OnlinePlayerListPlayersPerPage.The pagination message can be customized in Messages.OnlinePlayerListPagination.
Premium adds /pm, /r, /ignore and /unignore with customizable texts.
"PrivateMessaging": {
"PmFormatReceiver": "{map}: <RichColor Color=\"0, 0.843, 1, 1\">[{sender} -> You]</>: <RichColor Color=\"0.878, 0.878, 0.878, 1\">{message}</>",
"PmFormatSender": "{map}: <RichColor Color=\"0, 0.843, 1, 1\">[You -> {receiver}]</>: <RichColor Color=\"0.878, 0.878, 0.878, 1\">{message}</>",
"PmIcon": ""
},
Commands from Commands:
/pm '<player>' <message> – send a PM./r <message> – reply to the last person who PM’d you.Messages:
"Messages": {
"PmSyntax": "Syntax: /pm '<player>' <message>",
"ReplySyntax": "Syntax: /r <message>",
"NoReplyAvailable": "No player to reply to",
"CannotPmSelf": "You cannot pm yourself",
"PlayerNotOnline": "Player is not online",
...
}
Commands:
/ignore '<player>' – ignore a player’s chat./unignore '<player>' – stop ignoring.Messages:
"Messages": {
"IgnoreSyntax": "Syntax: /ignore '<player>'",
"UnignoreSyntax": "Syntax: /unignore '<player>'",
"PlayerIgnored": "Player ignored successfully",
"PlayerUnignored": "Player unignored successfully",
"CannotIgnoreSelf": "You cannot ignore yourself",
"PlayerNotIgnored": "Player is not ignored"
}
The list of permission groups that can never be ignored (and are also immune to blacklist auto-mutes) is in:
"NeverIgnoredPermissionGroups": "Admins,Moderators"
You can change this to match your staff groups.
The WordBlacklist section lets me automatically mute players that say certain words.
Example structure (values truncated, you should customize these):
"WordBlacklist": {
"BlockedWords": [
"badword1",
"badword2",
"<PLACEHOLDER: more regexes or literal words>"
],
"AutoMuteMinutes": 5,
"MuteLogWebhook": "https://discord.com/api/webhooks/xxxx"
}
BlockedWords – list of regex patterns or literal strings.AutoMuteMinutes – how many minutes to mute a player if they trip a rule (0 to disable auto-mute).MuteLogWebhook – Discord webhook where I send logs about auto-mutes.Muted players are typically placed into the MutedPermissionGroup:
"MutedPermissionGroup": "Muted"
Make sure this group exists in your Permissions database.
Players in NeverIgnoredPermissionGroups will not be muted by these rules.
To further customize the look of chat, you can use:
"MapIcons": {
"TheIsland_WP": "<PLACEHOLDER: icon resource>"
},
"MapColors": {
"TheIsland_WP": [ 0, 125, 125 ]
},
"Platforms": {
"Steam": "Steam",
"Xbox": "Xbox",
"Playstation": "PS"
},
Notes:
"..." as a value – either put a real path or remove the entry.{platform} or {platformname} are displayed.Crashes related to default rank / icons
If you have MapIcons configured but your Default permissions formatting or tags expect an icon that doesn’t exist, you can hit crashes in older builds.
Fix:
Dirty placeholders
Don’t leave "..." as a value in production config unless the code explicitly expects it. Most of the time, an empty string "" or removing the field is safer.
Unsynced group names
If you change group names in Ark:SA Permissions, update them in:
PermissionsFormattingChatTagsMutedPermissionGroupNeverIgnoredPermissionGroupsRoleSyncMappings in the bot config.Regex blacklist too aggressive
Some regexes can be extremely broad; test them carefully or start with literal keywords before moving to complex patterns.
Once you’re comfortable with this page, you’ll have almost full control over how chat looks and behaves for every group on your server.
Last updated: 2025-11-25T13:50:13