--- title: 'Action Engine' slug: 'action-engine' category: 'Servers' order: 11 description: 'Build automations that react to events across your server using a visual canvas of events, conditions, and actions.' --- # 1 - Introduction The Action Engine lets you build automations without writing code. You place blocks on a canvas, connect them, and CADLY runs the graph whenever a matching event happens. Every automation answers three questions: **what happened**, **should we act**, and **what do we do**. Those map to the three kinds of block — events, conditions and flow control, and actions. The Action Engine used to be part of ER:LC. It is now bot-wide and has its own **Action Engine** tab in server settings. ER:LC is still the largest source of events, but the engine itself is no longer tied to it. ## 1.1 - Table of Contents | Section | What it covers | | --------------------------------------- | ------------------------------------------- | | [How It Works](#2---how-it-works) | Events, graphs, and execution | | [Variables](#3---variables) | Using data from the event that fired | | [Blocks](#4---blocks) | Every event, action, and flow-control block | | [Safety Limits](#5---safety-limits) | Loop protection, block cap, rate limits | | [Troubleshooting](#6---troubleshooting) | When an automation does not fire | ## 1.2 - Links to Related Documents - [ER:LC Integration](/docs/erlc) - [Logs](/docs/logs) - [Server Settings](/docs/server-settings) # 2 - How It Works An **event** happens. CADLY finds every event block matching it, then walks the connections outward, running each block it reaches. ```cadly-mock type: flow title: Example automation meta: Action Engine status: Active steps: - Event | A player spawns a restricted vehicle. - Condition | Their Discord account is missing the required role. - Action | Send a warning PM in game and post to the staff channel. ``` Blocks run in the order they are connected. Branches run at the same time, so two chains from one block do not wait for each other. ## 2.1 - Execution History Every run is recorded. Open **Execution History** on the Action Engine page to see what fired, what it did, and why anything was skipped. This is the first place to look when an automation does not behave. A skipped block records its reason rather than failing silently — a cooldown that blocked, a value that was empty, a condition that came out false. # 3 - Variables Variables carry data from the event into your blocks. When a player joins, you have that player. When a log is created, you have the log, who filed it, and who it is about. ## 3.1 - Using a Variable Click **Insert variable** in any text field. The picker is grouped by what the event gave you, and every row shows its current value so you can pick by recognising the value rather than decoding a name. ```cadly-mock type: setting title: Variable picker meta: On Player Kill status: Ready items: - Killer / Username | Vex_Rally - Killer / Team | Police - Victim / Username | brickhaus - Server / Slot | A ``` Rows with an arrow are objects — click to open them. A player, for example, contains a username, a Roblox ID, a team, and their linked Discord account. ## 3.2 - Whole Variables Some fields want a whole thing rather than text. **Issue Infraction** needs a person, not a name. Those fields show a short dropdown of only the compatible options. On a log event, that dropdown offers the log's creator and the log's target. On a kill event, the killer and the victim. This is why one block works across different events without extra setup. ## 3.3 - Validation If a variable is not available on the event that triggers it, the graph will not save and the editor tells you which block is wrong. This is deliberate — an automation that saves but silently produces blank messages is worse than one that refuses to save. # 4 - Blocks ## 4.1 - Events Events available today. More sources are being added. | Event | When it fires | | ----------------- | -------------------------------------------------------------------- | | Player Joined | A player enters the ER:LC server. | | Player Left | A player leaves. | | Team Changed | A player switches team. | | Player Kill | A kill appears in the log. Gives you both the killer and the victim. | | Mod Call | A player calls a moderator. | | Command Used | A command appears in the ER:LC command log. | | Entered Zone | A player enters a configured play zone. | | Left Zone | A player leaves a play zone. | | Team Over Limit | A team exceeds its configured member limit. | | Vehicle Violation | A player spawns a restricted vehicle without the required roles. | | Livery Violation | A player uses a restricted livery. | | Role Violation | A player lacks the roles required for a server or team. | | Schedule Fired | A configured interval or reminder comes due. | Play zones, vehicle restrictions, livery restrictions, team limits and role restrictions are configured in **ER:LC settings**, not here. They detect the situation and raise the event; the Action Engine decides what happens next. On their own they take no action. ## 4.2 - Actions | Action | What it does | | ---------------------- | --------------------------------------------------------------- | | ER:LC Command | Runs an in-game command such as `:pm`, `:kick`, or `:ban`. | | Discord Message | Posts to a Discord channel. | | Add Role / Remove Role | Changes a member's Discord roles. | | Create Log | Creates a real CADLY log entry. | | System Notification | Writes an internal notification, visible to staff in the panel. | | Issue Infraction | Issues a warning or strike against a member. | | Set Text | Builds a value you can reuse later in the graph. | | Convert User | Resolves a Roblox player to their linked Discord account. | **Convert User** is a separate block on purpose. Matching a Roblox player to a Discord account is a lookup that can fail, and having it as a visible step means you can see where it happened and branch on whether it worked. ## 4.3 - Conditions and Flow Control | Block | What it does | | ------------ | ---------------------------------------------------------------------------------------- | | Condition | One or more comparisons, combined with ALL, ANY, or NONE. Has a true and a false output. | | Invert | Swaps true and false. | | Wait for All | Continues once every incoming branch has arrived. | | Wait for Any | Continues as soon as the first branch arrives. | | Wait for N | Continues once a set number of branches arrive. | | Cooldown | Blocks repeat runs for a set time. | | Wait | Pauses before continuing. | | Percentage | Continues only a set percentage of the time. | | Randomize | Picks one outgoing path at random. | The comparisons offered depend on what you are comparing. Text offers contains and starts with; numbers offer greater than and less than; lists offer contains and count. You cannot build a comparison that makes no sense for the value. **Wait for Any does not cancel the other branches.** They keep running to completion. Only what comes _after_ the block continues early. ## 4.4 - Cooldown Scope A cooldown is either **global**, which limits the whole block, or **per value**, which limits separately for each thing you choose. Per value asks you which thing. On a kill event you might cool down per killer, so one player spamming kills does not silence alerts about everyone else. If the value you choose is empty when the automation runs, the cooldown blocks and records why rather than letting the action through. # 5 - Safety Limits ## 5.1 - Loop Protection Some actions cause the events that trigger them. Create Log causes On Log Created. Issue Infraction causes On Infraction Issued. Point one at the other and you have a loop. CADLY stops this. An automation that triggers itself is allowed to chain a few levels deep, then stops. When that happens the workspace is **disabled** and the reason is shown on the page and in Execution History. If your workspace switches itself off, this is almost always why. Find the block that triggers its own event, break the cycle, and re-enable. There is also a cap on how many times automations can run per minute. It is high enough that normal use never reaches it, and low enough that a runaway graph cannot flood your server. ## 5.2 - Block Limit | Plan | Blocks | | ---------- | ------ | | Free | 50 | | Server PRO | 150 | Counted across your whole canvas. Sticky notes do not count. If a server's PRO expires while over the limit, **existing automations keep running**. You can still edit and remove blocks; you just cannot add more until you are back under 50. ## 5.3 - Command Pacing In-game commands from automations share the same queue as staff commands and are paced so automation cannot crowd out a moderator trying to act. Automations that fire commands frequently will see them spread out rather than sent all at once. For anything that punishes, add a cooldown and a Discord Message action so there is a record a human can audit. # 6 - Troubleshooting ## 6.1 - The Automation Did Not Fire Check Execution History first — it will usually tell you directly. If there is no entry at all, the event never fired: confirm the event actually matches what you expect, and that the underlying feature is configured (a zone event needs a zone, a vehicle violation needs a restriction). If there is an entry that stopped early, the reason is recorded on it. ## 6.2 - The Workspace Disabled Itself An automation triggered itself in a loop. See [Loop Protection](#51---loop-protection). ## 6.3 - A Message Came Out Blank A variable resolved to nothing. This is recorded in Execution History rather than failing silently. Common cause: a player with no linked Discord account, where the automation expected one. Add a Condition checking the value was found before using it. ## 6.4 - The Graph Will Not Save A block references a variable the triggering event cannot provide. The editor names the block. This most often happens after changing which event feeds a chain. ## 6.5 - Commands Are Slow Expected under load. See [Command Pacing](#53---command-pacing). # 7 - Getting Support and Resources If you need help, several resources are available: - [CADLY Documentation](/docs): Detailed reference for all features. - [CADLY Support Server](https://discord.gg/cadly): Join for **fast help** from the team. - [CADLY Email Support](mailto:admin@cadly.me): Reach out **via email** for direct support.