Repository navigation
Version 1.0.0 - Experimental 7
Pre-releaseπ SER 1.0 update (experimental 7)
This version fixes adds new features / fixes compared to version 6:
- fixed argument parsing,
Random, door, event cancillation, networking, database, integration, duration token, flag verificattion and other issues- multi-flag scripts
- better diagnostics for scripts using
serstatus,serreloadandserrun- handling of disconnected players in user defined variables
-- requireSenderflag argument- added
SetPlayerIntercomandIntersectmethods- merged
GetIPInfo- expanded examples
This update represents a complete paradigm shift for the SER language. The flat, unstructured method architecture of v0.15.1 has been replaced with dot-notation namespacing, direct object manipulation, and dedicated syntax rules.
Caution
If you are upgrading from v0.15.1, your scripts will require rewriting.
π Community Shoutout
Luke & Jraylor - major SER sponsors! The 1.0 update wouldn't be possible without their support!
@RetroReul - newest SER contributor! Retro is behind some of the new methods and properties, glad to have you on our team! :)
1. Syntax & Operators Overhaul
The Arrow Operator (->) & Native Properties
The language now automatically hooks into underlying game objects, exposing their properties natively. You can drill through multiple objects in a single line, entirely replacing the old Info wrapper methods (like DamageInfo, ItemInfo, DoorInfo).
- Direct Access:
$name = @plr -> namecompletely replaces$name = {@plr name}. - Native Property Modification: You can now directly alter the game state using assignment expressions! If a property is settable, just assign it:
*generator -> isOpen = true. - Chaining: Drill down through data seamlessly:
$nameLengthOdd = @sender -> name -> length -> isOdd.
Mathematical Expressions
The "bracket tax" on mathematical operations has been eliminated. Math no longer requires wrapping in parentheses to be evaluated.
- Old:
$five = (2 + 3) - New:
$five = 2 + 3
2. Scope & Block Management
Inline Block Parameters (with)
Looping and function definitions now use the with keyword to attach parameters or iterators directly, cleaning up visual clutter.
over @all with @plr
Print {@plr -> name}
end
Multiple Flags in One Script
You can now define scripts with multiple flags:
!-- OnEvent RoundStarted
Print "Round started"
!-- OnEvent Death
-- require @evPlayer
Print "Player {@evPlayer -> name} died"
!-- CustomCommand status
-- requireSender
Reply "hi {@sender -> name}! the server is online"
Ephemeral Variables (ephm)
Introduced the ephm keyword to define variables that automatically delete themselves the moment their current block (like a func or if statement) finishes executing, preventing memory leaks in complex scripts.
3. Native Keywords vs. Methods
Core logic and memory management have been moved out of the method parser and into the engine's low-level keywords for better performance.
- Timing Flow:
Wait 5sis now the native keywordwait 5s. - Conditional Flow:
WaitUntil ...is now the native keywordwait_until .... - Memory Management: The old
PopVariable $varmethod has been replaced by the nativedelete $varkeyword. - Probability Flow: Added the native
chancestatement block to streamline random probability checks without needing math blocks.
4. The Great API Namespacing (Method Restructure)
Version 1.0 abandons the flat, cluttered global method list. Hundreds of methods were renamed and grouped into logical namespaces using dot-notation, while redundant methods were purged entirely.
- Audio System (
Audio.*&Speaker.*):LoadAudiois nowAudio.Load.CreateGlobalSpeakeris nowSpeaker.CreateGlobal. - Admin Toys (
Toy.*):CreateToyis nowToy.Create.TPToyPosis nowToy.TPPosition. - Collections (
Coll.*):CollectionInsertis nowColl.Insert.EmptyCollectionis nowColl.Create. - Discord (
Discord.*&Embed.*):DiscordMessageis nowDiscord.CreateMessage.DiscordEmbedis nowEmbed.Create. - Web & Data (
HTTP.*,JSON.*,DB.*):HTTPGetis nowHTTP.Get.AppendDBis nowDB.Add. - Text (
Text.*):PadTextis nowText.Pad.SubTextis nowText.Slice.
5. New Core Frameworks
Brand new structural features were added to extend what SER scripts are capable of building.
- Dictionaries (
Dict.*): A full C#-style key-value mapping system natively implemented (Dict.Add,Dict.Contains,Dict.Create,Dict.Get,Dict.Remove). - Custom Roles (
CRole.*): Base-game custom role handling without multi-file setups. IncludesCRole.Register,CRole.SetCallbacks, and native framework integrations likeCRole.CreateBracketSpawnSystem. - Configurations (
Config.*): Scripts can now generate and read personalized configuration options natively (Config.GetOption,Config.Read). - Unified Map Queries: Added a singular, high-performance
GetFromMapmethod that queries any object layout or structural element in the active round instance. - ProjectMER: Added 28 methods and the
!-- OnPMERflag for various map editing needs.
6. Player Control & Interactions
- Native Base-Game Effects: Full status-effect bindings without requiring external EXILED plugin hooks (
GiveEffect,ClearEffect). - Stamina & Actions: Added direct control over stamina (
Staminamethod) , jump height (Jump) , and combat visuals (ShowHitMarker). - Targeting & Rulesets: Added
AddDamageRule/RemoveDamageRuleandAddTeslaIgnoreRule/RemoveTeslaIgnoreRule. - Network / IP Data: Integrated
GetIPInfoandGetIPInfoWithKeyfor proxy and connection validation directly inside scripts.
7. Compiler Safety & Tooling
Documentation website
- An integrated construct search to look for SER methods, variables, events, etc.
- A better tutorial series, made specifically for beginners
- A new language reference to search for key language features
- and more!
VS Code extension
- Method, keyword, flag, event, variable, enum, and option completions
- Hover documentation and signature help
- Shared diagnostics for incomplete values, malformed function calls,
unclosed statements, and unsafeforeverloops - An
SER: Open Blocks Editoroption/command
SER Blocks Editor
Scratch-like visual editor for basic SER script creation.
Purposefully limited in scope to serve as a friendly introduction to SER.
Compile-time reliability
SER uses its example scripts as a first wall of defence against bugs.
When compiling SER.dll, the example scripts are then checked by the newly
created SER.dll to ensure their (compile time) correctness.
- Invalid expressions inside text strings are caught at compile time.
- Nested curly-brace expressions are parsed safely by the tokenizer.
π Real-World Examples: v1.0 Syntax in Action
To give you a vague idea of how clean and readable SER scripting has become, here are a few snippets utilizing the new v1.0.0 syntax!
Example 1: Ephemeral Variables & Namespaces (Discord Webhooks)
Using the new ephm keyword to automatically clean up variables, and the new dot-notation namespaces for Discord embeds.
func *GetDiscordMessage
# variables using 'ephm' are ephemeral and will be deleted after the function ends
ephm $title = "{ServerInfo name} status"
ephm $content = "There are {AmountOf @all} players on the server:{Show @all name "<br> -" true}"
return Discord.CreateMessage _ $title _ {Embed.Create $title $content}
end
# ... later in the script ...
*msg = run *GetDiscordMessage
Discord.EditMessage $url $messageId *msg
Example 2: The chance block & Arrow Syntax (Chaos Coin)
A clean implementation of random probabilities using the new chance block, and direct object evaluation using the -> operator.
# 50% chance to lose the coin
chance 50%
Hint @evPlayer 3s "<color=#ff5555>Your coin has turned into dust..."
AdvDestroyItem {@evPlayer -> heldItemRef}
end
# Check if the player's role changed during a countdown
if {@evPlayer -> role} isnt $initRole
ClearCountdown @evPlayer
SetPlayerData @evPlayer "coin locked" false
stop
end
Example 3: Native Custom Roles Framework
Registering custom roles natively in one file using the new CRole.* framework.
!-- OnEvent WaitingForPlayers
*spawnSystem = CRole.CreateChanceSpawnSystem ClassD 20%
CRole.Register janitor "LCZ Janitor" ClassD *spawnSystem
!-- OnCRole spawned
-- forRoles janitor
TPRoom @evPlayer LczToilets
GiveItem @evPlayer KeycardJanitor