{"id":22205365,"url":"https://github.com/stevertus/mcscript","last_synced_at":"2025-04-05T14:03:35.524Z","repository":{"id":44513940,"uuid":"123604986","full_name":"Stevertus/mcscript","owner":"Stevertus","description":"A programming language for Minecraft Vanilla","archived":false,"fork":false,"pushed_at":"2024-07-17T03:36:45.000Z","size":1123,"stargazers_count":245,"open_issues_count":24,"forks_count":18,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-29T13:09:32.600Z","etag":null,"topics":["cli","compiler","minecraft","minecraft-script","node","programming","programming-language","vanilla"],"latest_commit_sha":null,"homepage":"https://mcscript.stevertus.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Stevertus.png","metadata":{"files":{"readme":"README-DE.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-03-02T16:46:04.000Z","updated_at":"2025-03-07T23:00:56.000Z","dependencies_parsed_at":"2024-01-15T15:46:04.983Z","dependency_job_id":"5aecfaf1-4984-4eb0-8ea5-2cf12f2411c4","html_url":"https://github.com/Stevertus/mcscript","commit_stats":{"total_commits":52,"total_committers":9,"mean_commits":5.777777777777778,"dds":"0.42307692307692313","last_synced_commit":"91c8087032182171cf1153b0401662dc339d8676"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stevertus%2Fmcscript","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stevertus%2Fmcscript/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stevertus%2Fmcscript/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Stevertus%2Fmcscript/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Stevertus","download_url":"https://codeload.github.com/Stevertus/mcscript/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247345849,"owners_count":20924102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","compiler","minecraft","minecraft-script","node","programming","programming-language","vanilla"],"created_at":"2024-12-02T17:30:04.832Z","updated_at":"2025-04-05T14:03:35.507Z","avatar_url":"https://github.com/Stevertus.png","language":"JavaScript","readme":"\n\n\n\n\n![](https://i.imgur.com/YedWe7W.png)\n\n# Minecraft Script Dokumentation\n\u003e Update 0.2.1: [Alle Änderungen](https://github.com/Stevertus/mcscript/releases)\n\nMinecraft Script ist eine Programmiersprache für Entwickler der mcfunctions, sowie für die Minecraft Map und Package Erschaffer. Die .mcscript Dateien werden dabei zu mcfunction compiled und generiert. Dies bietet dem Entwickler erweiterte Möglichkeiten, wie zum Beispiel Modals, Loops, Variablen, Konstanten und Command-Wrapping.\n\nBesuche die offizielle Website für weitere Informationen, Guides und Videos: https://mcscript.stevertus.com/de\n\nEnglish documentation [here](https://mcscript.stevertus.com)\n## Table of Contents\n1) [Installation](#install)\n    - [Installation von Node.js](#install-nodejs)\n    - [Installation von Minecraft Script](#install-mcscript)\n2) [Cli Commands](#cli)\n    - [mcscript new](#cli-new)\n    - [mcscript compile](#cli-compile)\n    - [mcscript watch](#cli-watch)\n3) [file system](#files)\n\t  - [file setup](#files)\n    - [Dateien erweitern](#extend)\n    - [Globale Dateien](#global)\n4) [Syntax](#syntax)\n    - [Command Grouping](#groups)\n    - [Funktionen](#functions)\n    - [Variablen](#vars)\n    - [Boolean Variablen](#boolean)\n    - [Konstanten](#consts)\n    - [If Statements](#if)\n    - [Logische Operatoren](#operators)\n    - [Switches](#switch)\n    - [For-Loop](#for)\n    - [Raycasting](#raycast)\n    - [while-Loops](#while)\n    - [do-while-Loops](#dowhile)\n    - [forEach-Loops](#foreach)\n    - [Modals](#modals)\n    - [JavaScript Modals](#modaljs)\n    - [System Modals](#systemModals)\n    - [Fehler und Debugging](#debugging)\n5) [IDEs und Syntax Highlighting](#ide)\n\u003ca id=\"install\"\u003e\u003c/a\u003e\n## 1) Installation\n\nDer Compiler wird auch als [Node.js/](https://nodejs.org/en/download/) Package angeboten, das lokal auf dem PC installiert wird und viele Features mehr hat: als die Online-Version hat.  \nz.B: Alle Dateien in einem Ordner gleichzeitig compilen, direkter Output in neuen Dateien, auf Dateiänderungen \"watchen\", uvm.\n\u003ca id=\"install-nodejs\"\u003e\u003c/a\u003e\n### 1.1 Installation von Node.js\n\nFür die Installation wird die Node.js Umgebung und der Node Package Manager benötigt.\n\nDiese installiert man am besten über den Installer: [nodejs.org/en/download/](https://nodejs.org/en/download/)  \nDen einfach ausführen und installieren lassen.\n\u003ca id=\"install-mcscript\"\u003e\u003c/a\u003e\n### 1.2 Installation von Minecraft Script\n\nÖffne nun die Konsole deines PCs (Am besten über Suche unter CMD zu erreichen).\n\nHier muss nun dieser Command eingegeben werden:\n\u003e ```npm install -g mcscript```  \n\nBei einer erfolgreichen Antwort hast du alles richtig gemacht und kannst durchstarten.\n\u003ca id=\"cli\"\u003e\u003c/a\u003e\n##  2) CLI Commands\n\n\nDas Tool kannst du nun anwenden, indem du die Command Line in deinen Datapacks Ordner startest  \n(über Shift + Rechtsklick auf Ordner -\u003e Eingabeaufforderung hier öffnen)  \nNun kannst du die Kommandos benutzen:\n\u003ca id=\"cli-new\"\u003e\u003c/a\u003e\n### 2.1 mcscript new\n\nDieser Command generiert dir ein vorgefertigtes Datapack mit allen basic Dateien und einem Scripts-Ordner. Als Argument muss die Id des Packs angegeben werden!\n\u003ca id=\"cli-compile\"\u003e\u003c/a\u003e\n### 2.2 mcscript compile\n\nDieser Command wandelt alle .mcscript Dateien in .mcfunction Format um. Was in den mcscript Dateien möglich ist, kannst du hier nachlesen.  \nIn der Konsole werden alle generierten Dateien angezeigt oder ein Fehler ausgeworfen, falls etwas nicht korrekt war.\n\nAlternativ kannst mit `mcscript compile *filepath*` einen speziellen Pfad oder spezielle Datei angeben.\nMit der zusätzlichen `-fullErr` flag können ganze Fehler mit code Referenzen angezeigt werden.\n\u003ca id=\"cli-watch\"\u003e\u003c/a\u003e\n### 2.3 mcscript watch\n\nHiermit wird dein Code automatisch compiled, wenn du irgendwelche Änderungen machst (speicherst). So musst du nicht bei jeder Änderung den obigen Command eingeben.\n\nAuch hier kann ein Pfad angegeben und -fullErr verwendet werden.\n\u003ca id=\"cli-add\"\u003e\u003c/a\u003e\n### 2.4 mcscript add [url or package]\nDieser Conmmand kann ein datapack zu deiner Welt hinzufügen.\nAls Argument kann entweder eine Url direkt zur Datei oder der Name einer mcScript Extension genutzt werden.\n\nEine Liste aller McScript Extensions kann bekommen werden mit `mcscript add`\n\n\u003ca id=\"cli-modals\"\u003e\u003c/a\u003e\n### 2.4 Dev: mcscript modals\n\n!!Dieser Command ist nur für Entwicker gedacht, die ihre Modals in den Compiler einbauen wollen.  \nEs muss eine Datei angegeben werden und die Modals aus dieser Datei werden dann in eine Konfigurationsdatei geschrieben.\n\u003ca id=\"files\"\u003e\u003c/a\u003e\n## 3) File system\n### 3.1 File setup\nIn einem Minecraft Datapack können alle Datein in ein scripts Ordner gepackt werden, um dann in `/functions` den Output zu generieren.\nEs werden immer Dateien mit gleichem Namen, wie ihr Root generiert.\n\nEin benutzerdefinierter Name kann mit `#file: *name*` gesetzt werden.  \nBitte ohne `.mcfunction`!!\n\nStatt des Namen kann auch gleich ein ganzer Pfad, an dem die neue Datei sein soll, angegeben werden:\n\n*   `#file: C:/test/neu`\n*   `#file: ./neu` (Im gleichen Ordner)\n*   `#file: ./unterordner/neu`\n*   `#file: ../neu` (Ein Ordner dadrüber)\n*   `#file: ../unterordner/neu`\n\nEs können auch mehrere Dateien spezifiziert werden:\n\n    #file: neu\n    //commands hier\n    #file: zwei\n    //Commands für zwei hier\n\nAuch sehr gut mit [for-loops](#loops) kombinierbar:\n\n    #file: neu\n    //commands hier\n    for(1,5){\n    \t#file: test$(i)\n    \t//Commands für jede Datei hier\n    }\n\u003ca id=\"extend\"\u003e\u003c/a\u003e\n### 3.2 Dateien erweitern\nEine bereits bestehende Datei, vorher mit `#file:`, kann nun auch aus anderen Dateien erweitert werden und neuer Code einfach hinten drangehängt werden:\n```\n#extend: ./test\n/commands kommen hier.\n```\n\u003ca id=\"global\"\u003e\u003c/a\u003e\n### 3.3 Globale Dateien\n[Variablen](#vars), [Konstanten](#consts) und [Modals](#modals) werden für jede Datei seperat gespeichert.\nJetzt kann man eine globale Datei mit der Endung `.gl.mcscript` erstellen. Der Compiler erkennt diese automatisch und verwendet die deklarierten Objekte auch in anderen Dateien.\nSo kann man die Modals zum Beispiel in eine eigende Datei schreiben.\n\u003ca id=\"syntax\"\u003e\u003c/a\u003e\n##  Minecraft Script Syntax\n\n\nDer Code wird in Dateien mit der Endung .mcscript geschrieben. Es wird ein Code-Editor(IDE) empfohlen, um die Dateien zu verwalten und den Syntax farbig zu markieren. [Mehr hier](#ide)\n\nAnders als bei mcfunction wird jeder Command mit einem \"/\" oder \"run: \" injektiert.\n\nKommentare werden mit \"//\" angekündigt, falls Kommentare auch in der neuen Datei auftauchen sollen mit \"#\"\nEin Kommentar über mehrere Zeilen muss mit\n```\n*/\nangegeben werden\n/*\n```\n\nLeerzeilen und Zeilensprünge werden nicht beachtet.  \nFalls eine Leerzeile aus Struktur in der mcfunction gewünscht ist,drücke dies mit einem # ohne Kommentar aus.  \nZwei Leerzeilen können mit \"##\" erreicht werden.\n\u003ca id=\"groups\"\u003e\u003c/a\u003e\n\n### 4.1 Command Gruppen / Wrapping\n\u003e ```[subcommand]([argument]){  [wrapped actions]   }```\n\n\"as, at, positioned,align,dimension,rotated,anchored\" können zusammengefasst werden:\n\n\n    as(@a){\t \n    \t/commands \t=\u003e /execute positioned ~ ~ ~ run command\n    }\t\t \n\n\nIn den Klammern muss das jeweilige Argument als String, sprich \" \" oder ' ' stehen!\nAuch ist der eigende `asat()` möglich\n```\nasat(@s){\n    /commands =\u003e execute as @s at @s run commands\n}\n```\n\"Gruppen können auch aufgelistet werden:\n\n\n    as(@p), at(@s), positioned('~ ~1 ~'){\n    \t/say command\n    }\n    ==\u003e /execute as @p at @s positioned ~ ~-1 ~ run say command\n\n    // also with if\n    as(@p), at(@s), positioned('~ ~1 ~'), if(@s[tag=mytag]){\n    \t/say command\n    }\n    ==\u003e /execute as @p at @s positioned ~ ~-1 ~ if entity @s[tag=mytag] run say command\n\u003ca id=\"functions\"\u003e\u003c/a\u003e\n### 4.2 Funktionen\n ```\n[run] function \"name|path\" {\n\t/commands\n}\n```\n\u003e run optional\n\u003e ein Pfad sollte als String angegeben werden\n\u003e ein nur aus Buchstaben bestehender name auch ohne \"\"\n\nEine Funktion generiert eine weitere mcfunction mit den angegebenen Namen oder Pfad. Mit dem run keyword kann eine Funktion auch direkt ausgeführt werden.\nDies ist eine alternative zu einer wesentlich komplizierteren Variante mit `#file:`.\nBsp:\n```\nrun function test {\n\t/say function\n}\n/say not function\n=\n/function prj:test\n/say not function\n\n#file: ./test\n/say function\n```\n\u003ca id=\"vars\"\u003e\u003c/a\u003e\n### 4.3 Variablen\nWie jede Programmiersprache hat auch Minecraft Script Variablen. Sie müssen wiefolgt initialisiert werden:\n`var test`\nDer Variablen kann ein Wert hinzugewiesen werden:\n```\nvar test = 5\n# oder\nvar test\ntest = 6\n```\nDieser Wert kann beliebig oft wieder verändert werden.\n\n```\nvar test\ntest @s = 10\n```\nSo können Werte auch nur speziellen Minecraft Selektoren zugewiesen werden.\nAuch mit Spielernamen oder Placeholdern möglich:\n```\ntest Spielername = 10\n```\nAlle Werte werden in einem scoreboard mit dem Variablennamen gespeichert. Also können die Werte auch ganz standart mäßig verändert und ausgelesen werden:\n```\nvar test\ntest @s = 10\n/scoreboard players get @s test ==\u003e 10\n/scoreboard players set @s test 5\n# etc\n```\n\nVariablen können auch mit anderen zusammen gerechnet und zusammengefügt werden:\n```\nvar test = 10\nvar neu = 5\n# Achtung: Der Einfachkeit halber starte ich immer wieder mit diesen Werten. Das Programm macht es nartürlich anders!\n\ntest += 2 ==\u003e 12\ntest -= 2 ==\u003e 8\n```\nEtwas gekürzt:\n```\ntest++ ==\u003e test += 1\ntest-- ==\u003e test -= 1\n\ntest += neu ==\u003e 15\ntest -= neu ==\u003e 5\ntest *= neu ==\u003e 50\ntest /= neu ==\u003e 2\ntest %= neu ==\u003e 0\n```\n**Command Response in Variable speichern:**\n```\nvar res = run: command\n==\u003e execute store result score res res run command\n```\nDas Ergebnis des command wird in die Variable res geschrieben.\nBeispiel mit /data get:\n`var varResult = run: data get entity @s Pos[0]`\n\n\u003ca id=\"boolean\"\u003e\u003c/a\u003e\n### 4.4 Boolean Variablen (Tags)\n\u003e `bool [name] [selector](optional) = true|false`\n\nSo können Wahrheitswerte deklariert werden.\n`bool isCool = true =\u003e tag [global] add isCool`\nEine Boolean Variable kann später noch verändert werden:\n`isCool = false =\u003e tag [global] remove isCool`\n\nMit [If](#if) testbar:\n```\nif(isCool){\n    /commands =\u003e execute if entity [global][tag=isCool] run commands\n}\n```\n\u003ca id=\"consts\"\u003e\u003c/a\u003e\n### 4.5 Konstanten\nEine andere Art Variable ist die Konstante, so deklariert:\n\u003e `const [name] = [value]`\n\nDiese Art kann nicht verändert werden!\nDu kannst sie mit `$(var_name)` irgendwo in deinem Code benutzen um lange Strings und wiederholende Phrasen zu vermeiden:\n```\nconst einString = \"Hier könnte sehr viel Schrott stehen.\"\nconst eineNum = 5\n\n/say $(einString)       ==\u003e /say Hier könnte sehr viel Schrott stehen.\nvar test = $(eineNum)   ==\u003e var test = 5\n```\n**Replace Konstanten**\nDer Wert einer Konstante kann bei der Verwendung noch umgeändert werden. Hierzu ein `.repl()` an die Verwendung anfügen:\n\u003e `$(const).repl([suchwert],[replacement])`\n\nBei unserem Beispiel wollen wir das viel replacen:\n```\n/say $(einString).repl(\"viel\",\"sehr viel\") ==\u003e /say Hier könnte sehr sehr viel Schrott stehen.\n```\nAuch kann hier ein [RegEx](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp) eingefügt werden und auch auf diesen im Replacement zugegriffen werden:\n`$(const).repl([/regex/],[\"$\u0026\"])`\n\u003ca id=\"maps\"\u003e\u003c/a\u003e\n#### Maps\nMaps sind schlüssel-wert Paare ähnlich wie bei einem Wörterbuch. Wir definieren eine Map mit dem Map-Operator:\n```js\nconst testMap = Map{\n\n}\n```\nIn den Klammern kannst du so viele Paare angeben, wie du magst:\n```js\nconst testMap = Map{\n\t\"key1\":\"value\",\n\t\"key2\":\"value2\"\n}\n```\nWir können dann auf die Werte so zugreifen:\n```js\n/say $(testMap).key1\n\n⇒ /say value\n```\n\u003ca id=\"arrays\"\u003e\u003c/a\u003e\n#### Arrays\nArrays sind ziemlich ähnlich zu Maps, nur dass wir nicht Paare sondern eine einfache Liste an Werten haben.\n```js\nconst testArr = Array{\n\t\"value\", // index 0\n\t\"value2\" // index 1\n}\n```\nDie Werte können mit dem Index des Elements abgerufen werden:\n```js\n/say $(testArr).0\n⇒ /say value\n/say $(testArr).1\n⇒ /say value2\n```\n\u003ca id=\"if\"\u003e\u003c/a\u003e\n### 4.6 If/Else Statements\n\nIf funktioniert ähnlich wie das Command Wrapping:\n\n\n    if('statement'){\n    \t/commands \t=\u003e /execute if statement run command\n    }\t\t \n\n\nMit einigen extra Features:\n\n*   Vor dem Argument kann ein \"!\" eingefügt werden um dies umzukehren:\n\n\n        if(!'statement'){\n        \t/commands \t=\u003e /execute unless statement run command\n        }\t\t \n\n\n*   Nach dem Schluss kann ein \"else\" angehängt werden:\n```\n    if('statement'){\n    \t/commands \t=\u003e /execute if statement run command\n    } else {\t\t   /execute unless statement run command2\n    \t/commands2\n    }\n```\n\nHier darauf achten das Argument nicht zu verändern!\n```\n    if(@s[tag=test]){\n    \t/tag @s remove test \t\n    \t} else {\t\t  \t\t\n    \t/tag @s remove test\t\t\n    }\n```\nHier werden beide ausgeführt!! Verbessert:\n```\n    if(@s[tag=test]){\n    \t/tag @s add testIf\n    }\n    if(@s[tag=testIf]){\n    \t/tag @s remove test \t\n    \t} else {\t\t  \t\t\n    \t/tag @s remove test\t\t\n    }\n```\n\n*   auch \"else if\" ist möglich:\n```\n    if('statement'){\n    \t/commands \t\t\t\t=\u003e /execute if statement run command\n    } else if('statement2') {\t   /execute unless statement if statement2 run command2\n    \t/commands2\n    }\n```\n\n\u003ca id=\"operators\"\u003e\u003c/a\u003e\n### 4.7 Logische Operatoren\n\nIn Kombination mit Command Gruppen und If-Else-Statements können zusätzlich logische Operatoren benutzt werden:\n\n*   Der Oder-Operator kann bei den Gruppierungen auf zwei Arten benutzt werden:\n```\n    as(@s||@p){\n    \t/command \t\n    }\n    ==\u003e execute as @s run command\n        execute at @p run command\n\n    # oder als Liste\n    if(@s[tag=entity1],'entity @s[tag=entity2]'){\n    # hier gehen beide Varianten ^\n    \t/command \t\n    }\n    ==\u003e execute if entity @s[tag=entity1] run command\n        execute if entity @s[tag=entity2] @p run command\n```\n\n*   Der Und-Operator wird so definiert: (nur für if-statements sinnvoll)\n```\n    if('entity @s'\u0026\u0026'entity @p'){\n    \t/command \t\n    }\n    ==\u003e execute if entity @s if entity @p run command\n```\n*   Überprüfung von Variablen:\n```\nvar test = 5\n\n# genau gleich\nif(test == 5){\n    /commands\n}\n\n# größer/kleiner gleich\nif(test \u003e= 5){\n    /commands\n}\n\n# größer/kleiner\nif(test \u003e 5){\n    /commands\n}\n\n# auch im Vergleich möglich\nif(test \u003e test2){\n    /commands\n}\n\n# oder mit entity variablen\nif(test @s \u003e test2 @a){\n    /commands\n}\n```\n\u003ca id=\"switch\"\u003e\u003c/a\u003e\n### 4.8 Switch-Cases\n```\nswitch([var_name]){\n    case \u003c=|\u003c|==|\u003e|\u003e= [other_var]|[number] {\n        [actions]\n    },\n    default(optional) {\n        [default actions]\n    }\n}\n```\nSwitches erleichtern dem Benutzer die vielen If-Bedingungen. Es kann einfach und übersichtlich auf verschiedene Werte von Variablen getestet werden.\nbsp:\n```\nvar test = 10\nswitch(test){\n    case \u003e 10 {\n        /say var ist über 10\n    },\n    case \u003c 10 {\n        /say var ist unter 10\n    },\n    default {\n        /say nichts traf zu.\n    }\n}\n```\nHier wird also test geprüft auf über 10, wenn das nicht zutrifft auf unter 10 und als standart default ausgegeben.\nAuch abkürzbar:\n```\nvar test = 10\nswitch(test){\n    case \u003e 10 run: say var ist über 10\n    , case \u003c 10 run: say var ist unter 10\n    , default run: say nichts traf zu.\n}\n```\n\u003ca id=\"for\"\u003e\u003c/a\u003e\n### 4.9 For-Loops\n```\nfor([from],[to],[var_name](optional)){\n    [actions]\n}\n```\nEiner der hilfreichsten Features ist der For-Loop. Als Argumente werden ganze Zahlen angenommen.\n\nVon `erstes Argument` bis `zweites Argument` wird optional ausgegeben als `drittes Argument`\n```\nfor(1,5){\n\t/commands\n\t# es wird 5x command ausgegeben\n}\n```\n```\nfor(1,5){\n\t/say $(i)\n\t# es wird 5x say mit 1 - 5 ausgegeben\n}\n```\n\nMit $(var_name) kann auf den Loopwert zugegriffen werden.\n\nvar_name ist normalerweise als \"i\" definiert, kann aber im 3.Argument geändert werden:\n\n\n    for(1,5,X){\n    \t/say $(X)\n    \t# es wird 5x say mit 1 - 5 ausgegeben\n    }\t \t\t\t\t\t\n\n\nDas ist bei 2 dimensionalen Loops sinnvoll:\n\n\n    for(1,5,i){\n    \tfor(1,2,j){\n    \t\t/say $(i).$(j)\n    \t}\n    \t# es wird 10x say mit 1.1 - 5.2 ausgegeben\n    }\n\u003ca id=\"raycast\"\u003e\u003c/a\u003e\n### 4.10 Raycasting\n```\nraycast([distance](optional), [block to travel through](optional),entity | block [target](optional) ){\n    [actions on hitted block or entity]\n},{\n    [actions for every flight step]\n}\ndefault distance = 100 Blocks\ndefault block = air\ndefault target = any block\n```\nRaycasting ist eine große Sache in Minecraft 1.13 und bietet viele Möglichkeiten.\nEs ist allerdings bisschen schwierig, also warum nicht leichter machen?\nMit Minecraft Script ist das nun sehr sehr einfach:\n```\nraycast {\n    /setblock ~ ~ ~ stone\n}\n```\nDas alleine setzt überall, wo man hinschaut einen Steinblock.\nPartikel und Blockbegrenzung auch noch sehr einfach:\n```\nraycast(10) {\n    /setblock ~ ~ ~ stone\n}, {\n    /particle flame ~ ~ ~\n}\n```\nJetzt haben wir schöne Effekte und eine maximale Range von 10 Blöcken.\nDas zweite optinale Argument gibt die durchlässigen Blöcke an.\n```\nraycast(10,\"air\") {\n    /setblock ~ ~ ~ stone\n}\n```\nDas Raycasting geht also nur durch Luft.\nAuch kann man die durchlässigen Blöcke negieren und mit einem \"!\" angeben, welche Blöcke nicht durchlässig sind:\n```\nraycast(10,!\"white_wool\") {\n    /setblock ~ ~ ~ stone\n}\n```\nDas Raycasting geht also durch alle Blöcke außer weiße Wolle.\n\nAls drittes optionales Argument kann man ein Ziel angeben:\n```\nraycast(10,\"air\",block \"white_wool\") {\n    /setblock ~ ~ ~ stone\n}\n```\nJetzt weiß Mcscript, dass das Ziel ein Block ist und führt den Command nur aus, wenn der Block weiße Wolle ist.\n```\nraycast(10,\"air\",entity @e[type=armor_stand]) {\n    /say test\n}\n```\nMcscript weiß nun, dass das Ziel eine Entity ist und führt den Command als diese aus, wenn sie getroffen wurde.\nAlso würde der Armor Stand test sagen.\n\u003ca id=\"while\"\u003e\u003c/a\u003e\n### 4.11 while-Loops\nDer while-Loop ist so zu definieren:\n```\nwhile([cond]){\n    /commands\n}\n```\nDie gruppierten Commands werden solange ausgeführt, wie die Bedingung[cond] war ist.\n\u003e Wenn die Bedingung zum Start nicht wahr ist, wird die Gruppierung nicht ausgeführt!\n\nAls Bedingung können hier alle Operatoren und Argumente der If-Bedingungen verwendet werden. z.B.\n```\nvar test = 0\nwhile(test \u003c 10){\n    /commands hier\n    test += 1\n}\n# ==\u003e Die Commands werden innerhalb eines Ticks 10mal ausgeführt.\n```\nBei while-Loops kann auch mit stop und continue gearbeitet werden:\n```\nvar test = 0\nwhile(test \u003c 10){\n    test += 1\n    if(test == 5){\n        continue\n        # Wenn test 5 ist werden die restlichen Commands übersprungen\n    }\n    /commands hier\n    if(test \u003e= 9){\n        stop\n        # Wenn test 9 oder über 9 ist wird die Schleife abgebrochen\n    }\n}\n```\n\u003ca id=\"dowhile\"\u003e\u003c/a\u003e\n### 4.12 do-while-Loops\n```\ndo {\n    /commands\n} while([cond])\n```\nDer do-while-Loop funktioniert ähnlich, wie der while-Loop mit dem kleinen Unterschied, dass der Codeblock ausgeführt wird und danach erst die Bedingung geprüft wird.\nDer Loop wird also mindestens einmal durchlaufen.\n\u003ca id=\"foreach\"\u003e\u003c/a\u003e\n### 4.13 forEach-Loop\n```\nforEach(var [var_name] = [startwert]; [var_name] ==|\u003e|\u003c|\u003c=|\u003e=|!= [other_var]|[number]; [varname]++){\n    /commands\n}\n```\nDer forEach-Loop ist ein Loop, wie man ihn in fast jeder Programmiersprache vorfindet.\nEr ähnelt sich zu dem for-Loop von Minecraft Script, funktioniert aber dynamisch(d.h wird nicht beim generieren ausgeführt, sondern von Minecraft)\n\nBsp:\n```\nforEach(var i = 0; i \u003c 10; i++){\n    /say hey\n}\n```\nDer Command wird also 10mal ausgeführt und der aktuelle Wert jeweils in dem scoreboard i gespeichert.\nSo kann man auch auf den Wert zugreifen. Bsp. Fakultät:\n```\nvar result = 1\nforEach(var i = 2; i \u003c= 10; i++){\n    result *= i\n}\n==\u003e result = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10\n```\n\u003ca id=\"modals\"\u003e\u003c/a\u003e\n### 4.14 Modals\n\u003e ```\n\u003e modal [name]([arguments]){\n\u003e    [actions]\n\u003e}\n\u003e```\nModals kann man wie functions oder Methoden verstehen, dass heißt man kann sie definieren:\n\n\n    modal newModal(argument){\n    \t/say $(argument)\n    }\t \t\t\t\t\t\n\n\nEin Modal wird immer mit dem Keyword eingeleitet, gefolgt von dem Namen und in Klammern alle benötigten Argumente.\n\nAuf diese Argumente kann dann innerhalb mit $(argument_name) Referenz genommen werden.\n\n\n    modal newModal(argument){\n    \t/say $(argument)\n    }\n\n    newModal('test')\n\n    # =\u003e say test\t \t\t\t\t\t\n\n\nWenn man das Modal so benutzt, dann werden die Werte eingesetzt und alles ausgegeben.\n\n\n    modal createCommand(command,argument1,argument2){\n    \t/$(command) $(argument1) $(argument2)\n    }\n\n    createCommand('say', 'hallo', 'du')\n\n    # =\u003e say hallo du \t\t\t\t\t\n\n\nEs können so auch mehrere Argumente benutzt werden.\n\nAuch sind optionale und vordefinierte Argumente verfügbar:\n\n\n    modal say(argument = \"hallo\"){\n    \t/say $(argument)\n    }\n\n    say()\n    # =\u003e say hallo\n\n    say('test')\n    # =\u003e say test\t\t\t\t\n\n**Maps und Arrays benutzen**\nDu kannst auch die [Map](#maps) und[Array](#arrays) typen der Konstanten in Modals benutzen:\n```js\nmodal defaultMap(args = Map{\"key\":\"value\"}){\n    /say $(args).key\n}\ndefaultMap()\ndefaultMap(Map{\n    \"key\":\"value2\"\n})\n\n⇒ /say value\n⇒ /say value2\n```\n\n\n**Modals überschreiben**\nBereits erstellte modals können innerhalb des Prozesses überschrieben werden:\n\u003e ```\n\u003e override modal [name]([arguments]){\n\u003e    [actions]\n\u003e}\n\u003e```\n\nDabei werden Argumente und Actions komplett getauscht und für den fortlaufenden Prozess verwendet.\n\n**Argumente ersetzen**\nDer Wert eines Arguments kann bei der Verwendung noch umgeändert werden. Hierzu ein `.repl()` an die Verwendung anfügen:\n\u003e `$(argument).repl([suchwert],[replacement])`\n\nBei unserem Beispiel wollen wir ein eingegebenes test replacen:\n```\n/say $(argument).repl(\"test\",\"no test\") ==\u003e /say no test\n```\nAuch kann hier ein [RegEx](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/RegExp) eingefügt werden und auch auf diesen im Replacement mit `$\u0026` zugegriffen werden:\n`$(argument).repl([/regex/],[\"$\u0026\"])`\n\u003ca id=\"modaljs\"\u003e\u003c/a\u003e\n### 4.15 JavaScript Modals\nJavaScript Modals sind modals, die in Javascript geschrieben sind. Du kannst sie, wie andere modals auch, so definieren:\n\n\u003e ```\n\u003e modaljs [name]([argumente]){\n\u003e     [aktionen]\n\u003e     return [Text]\n\u003e }\n\u003e ```\n\u003e\nDas JavaScript Modal muss mit einem return statement enden. Das, was zurückgegeben wurde, wird in der `.mcfunction` Datei als einfacher Text erscheinen.\n\n\tmodaljs newModal(){\n    \treturn \"say hi\";\n\t}\n\n    newModal()\n\n\t# =\u003e say hi\nFür Absätze empfehle ich etwas ähnliches zu dem:\n\n\tmodaljs newModal(){\n\t\tvar ret = \"\";\n\n\t\tret += \"say hi\\n\";\n\t\tret += \"say ho\\n\";\n\n    \treturn ret;\n    }\n\n\tnewModal()\n\n\t# =\u003e say hi\n\t# =\u003e say ho\nAchtung: Du musst Absätze manuell mit `\\n` hinzufügen.\n\nEin JavaScript modal ist immer deklariert durch das Keyword gefolgt vom Name und den Argumenten in den Klammern.\n\nDie Argumente sind aufrufbar in dem Code.\n\n    modaljs newModal(argument){\n    \treturn \"say \" + argument;\n    }\n\n    newModal('test')\n\n    # =\u003e say test\t \t\t\t\t\t\n\nDu kannst auch mehrere Argumente verwenden:\n\n\tmodaljs newModal(text,monster){\n\t\tvar ret = \"\";\n\n\t\tret += \"say \" + text + \"\\n\";\n\t\tret += \"summon \" + monster + \"\\n\";\n\n    \treturn ret;\n    }\n\n\tnewModal(\"Gehirne!!!\",\"minecraft:zombie\")\n\n\t# =\u003e say Gehirne!!!\n\t# =\u003e summon minecraft:zombie\n\nEs gibt ebenfalls optionale Argumente:\n\n    modaljs say(argument = \"hallo\"){\n    \treturn \"say \" + argument ;\n    }\n\n    say()\n    # =\u003e say hallo\n\n    say('test')\n    # =\u003e say test\n\n**Tipps und Tricks**\n\nBenutze `console.log`, um einige Informationen in der Konsole, während des Kompelieren, auszugeben, ohne den Wert zu verändern.\n\u003ca id=\"systemModals\"\u003e\u003c/a\u003e\n### 4.16 System Modals\n\nEs gibt schon einige vordefinierte Modals, die hilfreich sein könnten. Bitte schaue dir dafür die spezifischen Dokumentationen [hier](https://github.com/Stevertus/mcscript/blob/master/Core%20Modals.md) an.\n\nDu hast Ideen, welche Modals unbedingt als Standart-Modal aufgegriffen werden müssen? Sende mir einfach die [Konfigurationsdatei](#24_Dev_mcscript_modals_54) zur Überprüfung.\n\u003ca id=\"debugging\"\u003e\u003c/a\u003e\n### 4.17 Error handling und Debugging\nMinecraft Script zeigt mit der Version 0.2 nur noch begrenzt Fehler an mit der Zeilen- und Dateiangabe.\nBenutze beim generieren bitte die Flag `-fullErr`, um vollständige alte Fehler wiederzuerlangen, falls du sie wünscht.\n\nFalls du Fehlerangaben findest, die im Kontext keinen Sinn machen, wende dich bitte an das Team.\n\n**Debug keyword**\nMit \"Debug\" kannst du deinen Code debuggen und auch mögliche Fehler in Minecraft Script viel leichter entdecken. Sie können irgendwo im Code platziert werden und beeinflussen den generierten Code nicht.*\n* `debug message: [message]`\nSendet eine einfache Nachricht in die Konsole mit Zeilen- und Dateiangaben.\n* `debug success: [message]`\nSendet eine erfolgreiche Nachricht mit grüner Kennzeichnung in die Konsole mit Zeilen- und Dateiangaben.\n* `debug break: [message]`\nDein Programm bricht an dieser Stelle ab und sendet erneut eine Nachricht.\n* `debug error: [message]`\nDein Programm bricht an dieser Stelle ab und gibt einen kritischen Fehler mit Systeminformationen und relevanten Codestellen aus.\n\n\u003ca id=\"ide\"\u003e\u003c/a\u003e\n\n## IDEs and Syntax Highlighting\n\n  *   Visual Studio Code:\n  [Stevertus.mcscript](https://marketplace.visualstudio.com/items?itemName=Stevertus.mcscript)\n\n  *   GitHubs Atom Editor:\n  [mcscript](https://atom.io/packages/mcscript) (credit: [Trojaner](https://github.com/TrojanerHD))\n\n  *   Notepad++:\n  [code](https://github.com/Stevertus/mcscript/blob/master/Nodepad%2B%2B%20Highlighter.xml) | [download](http://download1496.mediafire.com/x2k7loq5imbg/4534q4tual7zccm/Nodepad+++Highlighter.xml)\n\nJetzt bleibt nichts mehr übrig als: **Happy Developing**\n--------------------------------------------------------\n\nVielen Dank an alle die Minecraft Script benutzen und diese Dokumentation gelesen haben. Bei Vorschlägen, Problemen oder Fehlern bitte mich kontaktieren.\nIch freue mich euch ebenfalls euch auf meinem Discord begrüßen zu dürfen und Vorschläge und Kritik zu hören.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevertus%2Fmcscript","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevertus%2Fmcscript","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevertus%2Fmcscript/lists"}