# SCRIPTED EVENTS RELOADED (SER) - Language Spec v1.0.0 ## 1. Data Types & Variables Variables must always include their specific prefix so the engine knows the data type. Create or update variables using `=`. ### The Four Data Types From most to least used: | Type | Prefix | Description | Examples | |----------------|--------|:---------------------------------------------|--------------------------------------------------| | **Player** | `@` | Array of players | `@sender`, `@all`, `@evAttacker` | | **Literal** | `$` | Numbers, text, time, booleans, colors, enums | `$age = 10`, `$time = 5s`, `$role = "Scientist"` | | **Reference** | `*` | C# objects (e.g., rooms, items) | `*spawnRoom`, `*evRoom` | | **Collection** | `&` | A list of multiple items | `&inventory`, `&rooms` | ### Memory Scopes * **Local (Default):** Deleted when the script finishes. (`$var = 10`) * **Global:** Persists for the entire round. Accessible by other scripts. You **must** use the `global` keyword when assigning/changing it to avoid local name collisions. Read without the keyword. * *Set:* `global $score = 100` * *Read:* `Print {$score}` * *Verify:* `if {VarExists $myGlobal} is false` * **Ephemeral:** Exists only inside a specific loop or function. (`ephm $x = 1`) --- ## 2. Text, Math, & Syntax ### Text Interpolation & Comments * **Basic Text:** Enclosed in double quotes (`"Hello!"`). * **Interpolation (`{}`):** Insert variables/properties into text (`"Hello {$name}"`). * **Escaping (`~`):** Prevent interpolation (`"var: ~{$var}"` prints `var: {$var}`). * **Newlines:** Use `
`. * **Comments (`#`):** Must have a space after the pound sign (`# Comment`). ### Math Expressions * **Operators:** `+`, `-`, `*`, `/`, `%` (Handled via NCalc 1.3.8). * **Negative Values:** Script parsing relies on whitespace, so negatives don't need parentheses (e.g., `TPPosition @plr -37 313 -140`). * **Percent Sign (`%`):** Divides a number by 100 (`50%` becomes `0.5`). --- ## 3. Methods & Properties ### Methods (Commands) Methods perform actions and are written in `PascalCase`. * **Syntax:** `MethodName Arg1 Arg2` (e.g., `Broadcast @all 5s "Hello"`) * **Return Values:** Can be stored directly (`$name = ServerInfo name`) * **The Wildcard (`*`):** Targets ALL of something, excluding players (`CloseDoor *`) * **Omit Arguments (`_`):** Skip optional arguments (`*embed = Embed.Create "Title" _ _ "Author"`) ### Properties (`->`) Access internal data of values. Can be chained (e.g., `@plr -> name -> length -> isOdd`). * **Player Properties:** MUST strictly be one player. Use `{AmountOf @all}` if you need a length count. * **Reference Validity:** C# objects can become null. Always validate before use: `if {*room -> isInvalid}`. * **Context Rules:** * *Variable definitions:* No brackets (`$name = @plr -> name`) * *Conditions & Interpolation:* Use brackets (`if {@plr -> role} is "ClassD"`) * **Enum Conversion:** In methods, bare enum tokens work (`SetRole @plr ClassD`). In properties/conditions, enums are converted to strings (`if {@plr -> role} is "ClassD"`). --- ## 4. Control Flow & Execution ### Conditionals (`if`, `elif`, `else`) Compare values using standard operators (`is`/`==`, `isnt`/`!=`, `>`, `<`, `and`/`&&`, `or`/`||`). * *Note:* `!` and `not` are illegal. * *Early Return:* Use `stop` to immediately end the script. ### Loops | Loop Type | Description | Example Syntax | |---------------|-----------------------------------------|--------------------------------| | **`repeat`** | Fixed iterations. | `repeat 5 with $iter` | | **`while`** | Runs while condition is true. | `while $count < 10 with $iter` | | **`over`** | Iterates through collections/arrays. | `over @all with @plr` | | **`forever`** | Infinite loop. **Must include `wait`.** | `forever with $iter` | * **Loop Control:** `break` (exit loop) and `continue` (skip iteration). * **`with` Keyword:** Assigns a name to the current item or iteration number. ### Waiting & Yielding * **`wait`:** Pause for duration (`wait 5s`, `wait 100ms`). * **`wait_until`:** Pause until a condition is met (`wait_until {AmountOf @all} > 0`). --- ## 5. Functions & Errors ### Functions Must be hoisted (defined before use). The prefix in the name defines the return type(`$Name` = literal, `@Name` = players, `*Name` = reference, `&Name` = collection, `Name` = nothing). Call using `run`. ```ser func $Add with $a $b return $a + $b end $sum = run $Add 5 3 ``` ### Error Handling Use `attempt` and `on_error` to catch exceptions without breaking the script. ```ser attempt PlayAudio "invalid speaker" "invalid clip name" on_error with $msg Print "Error: {$msg}" end ``` --- ## 6. Script Entry Points (Flags) A script can optionally start with **one** flag, defining how it triggers. Use `serreload` if modifying a flagged script on a live server. | Flag Type | Syntax Example | Description | |--------------------|-----------------------------------------------------------|-------------------------------------------| | **Utility** | *(No flag)* | Run manually via `serrun` or `RunScript`. | | **Custom Command** | `!-- CustomCommand heal`
`-- availableFor RemoteAdmin` | Binds the script to a custom command. | | **Event** | `!-- OnEvent Dying`
`-- require @evPlayer` | Triggers on a LabAPI game event. | * *Event Cancellation:* Use `IsAllowed false` followed by `stop` to cancel the base game event. * *Event Variables:* Provided via C# reflection, but may not always exist. Use `--require` to validate. --- ## 7. Quick Reference Cheat Sheet ### Top Essential Methods | Category | Methods | |---------------------|---------------------------------------------------------------------------------------------------------------------------| | **Communication** | `Broadcast`, `Hint`, `Cassie` | | **Player Control** | `GiveItem`, `ClearInventory`, `SetRole`, `SetSize`, `GiveEffect` | | **Health & Damage** | `Kill`, `Damage`, `Heal`, `SetHealth`, `SetMaxHealth`, `Explode` | | **Environment** | `CloseDoor`, `OpenDoor`, `LockDoor`, `UnlockDoor` | | **Movement** | `TPPlayer`, `TPPosition` | | **Utility** | `AmountOf`, `Take`, `Random`, `Chance`, `SetRoundLock`, `SetLobbyLock`, `SetPlayerData`, `GetPlayerData`, `HasPlayerData` | ### Top Essential Events | Event | Variables Provided | Common Use Cases | |-----------------------|------------------------------------------------------------|-----------------------------------| | **RoundStarted** | None | Round logic. | | **WaitingForPlayers** | None | Server systems. | | **Death** | `@evPlayer`, `@evAttacker`, `$evOldRole`, `*evOldPosition` | Kill streaks, death rewards. | | **Hurt** | `@evPlayer`, `@evAttacker`, `$evDamage` | Hit reactions, damage tracking. | | **Joined** | `@evPlayer` | Welcome messages, tutorial hints. | | **ChangedRole** | `@evPlayer`, `$evOldRole`, `$evNewRole` | Class transitions, spawn effects. | ### Common Scripting Patterns **Select Random Player:** ```ser @plr = Take @all 1 ``` **Check % Chance & SCP Team:** ```ser if {Chance 25%} and {@plr -> team} is "SCPs" # 25% chance to run for SCPs end ``` **Player Data Management:** ```ser SetPlayerData @plr "kills" 5 $kills = GetPlayerData @plr "kills" ```