Minecraft Datapacks - hanselmarcel/TechLab GitHub Wiki

Links:

Youtuber, die super Videos zu Datenpaketen und ihren Einsatzmöglichkeiten anbieten:

Datenpaket Grundstruktur erstellen:

  1. Im Ordner “.minecraft/saves/Weltname/datapacks” neuer Datenpaket Ordner benennen
  2. Innerhalb dieses Ordners eine neue Datei erstellen mit Namen “pack.meta” und folgendem Inhalt (wobei pack_format Nummer je nach Minecraft Version anders ist):
    {
      "pack": {
        "pack_format": 12,
        "description": "Lasse ein Haufen Tiere um den Spieler herum erscheinen"
      }
    }
  3. Innerhalb des Datenpaket Ordners einen neuen Ordner namens “data” erstellen
  4. Dann kann man innerhalb dieses “data” Ordners seine eigenen Namensräume (= weitere Ordner) erstellen, z. Bsp. “marcel” mit allen Funktionen, die was mit meinem spezifischen Datenpaket zu tun haben
  5. Innerhalb des “marcel” Ordners muss dann noch ein Ordner “functions” sein, worin dann alle eigenen Funktionen sind.
  6. Es ist sinnvoll, innerhalb des “functions” Ordners nochmals eine weitere Ordnerhierarchie zu erstellen, wenn man verschieden Funktionen für verschiedene Dinge (Entitäten, Wetter, Zeit, etc.) erstellen will (im untenstehenden Beispiel wäre dies der Ordner “animals”). Notwendig ist dies aber nicht.
  7. In den Ordner kommen dann die eigenen Funktionen mit der Endung .mcfunction, z. Bsp. “spawn.mcfunction”, mit Befehlen darin, die diverse Tiere erzeugen
  8. Der gesammte Verzeichnispfad würde dann so lauten: “.minecraft/saves/Weltname/datapacks/data/marcel/functions/animals/spawn.mcfunction”
  9. Ein Template kann hier runtergeladen werden → Datenpaket Template

Funktionen:

  • Minecraft Wiki zu den Funktionen
  • Eine eigen erstellte Minecraft Datenpaket-Funktion ist ein Textfile und hat immer die Endung “.mcfunction”
  • Innerhalb dieses Textfiles (zu Öffnen mit einem Texteditor wie z. Bsp. Notepad++) können dann die Befehle geschrieben werden.
  • Jede Zeile steht für einen Befehl
  • Der “/”, der im Ingame-Chat jeweils für Befehle verwendet wird, wird hier im Textfile weggelassen
  • Alle Befehle werden dann Zeile für Zeile innerhalb eines Ticks abgearbeitet
  • Hier eine Beispiel-Funktion “spawn.mcfunction”, welche diverse Tiere um den Spieler herum erscheinen lässt:
    #Lasse beim Spieler Kühe, Schafe, Schweine, Ziegen und Lamas erscheinen
    summon cow
    summon sheep
    summon pig
    summon goat
    summon llama
    
  • Die Funktion kann nun innerhalb des Spieles mittels der Konsole und der Eingabe von /function marcel:animals/spawn gestartet werden. Wenn man anschliessend was in der Funktion ändert, muss man nicht jedes Mal Minecraft neu starten, sondern nur mittels dem Befehl /reload das Datenpaket neu laden.

Load und Tick Funktionen:

  • Es gibt in einem Datenpaket auch die Möglichkeit, eine Funktion direkt beim erstmaligen Laden des Datapacks oder bei jedem Tick (20mal pro Sekunde) ausführen zu lassen.
  • Beim Datapack Start könnte man zum Beispiel eine Funktion laufen lassen, die dem Spieler eine Willkommensnachricht sendet.
  • Bei jedem Tick könnte man eine Funktion laufen lassen, die obige spawn Funktion ausführt, sobald der Spieler auf einem bestimmten Block steht.
  • Die Struktur der Ordner sieht dann so aus:
    data/
        minecraft/
          tags/
            functions/
              load.json
        marcel/
          functions/
            animals/
              load.mcfunction
              spawn.mcfunction
    
  • Funktion bei Spielstart laufen lassen:
  1. “.minecraft/saves/Weltname/datapacks/data/minecraft/tags/functions/load.json” öffnen.
  2. innerhalb des JSON Files folgenes schreiben:
    {
        "values": ["marcel:animals/load"]
    }
  3. Die Funktion(en), die man hier ins load.json File reinschreibt, werden bei 1. Starten des Datapacks direkt geladen.
  4. Dann in einer neuen Funktion load.mcfunction die Befehle eingeben, die man bei Spielstart ausführen will
    
    say Hallo, lieber Spielender!
    
  • Funktion jeden Tick laufen lassen:

Die Struktur der Ordner bei der Tick Funktion sieht genau gleich aus wie bei Load:

data/
    minecraft/
      tags/
        functions/
          tick.json
    marcel/
      functions/
        animals/
          tick.mcfunction
          spawn.mcfunction
  1. “.minecraft/saves/Weltname/datapacks/data/minecraft/tags/functions/tick.json” öffnen.
  2. innerhalb des JSON Files folgendes schreiben:
    {
        "values": ["marcel:animals/tick"]
    }
  3. Die Funktion(en), die man hier ins tick.json File reinschreibt, werden nun bei jedem Tick ausgeführt.
  4. Dann in einer neuen Funktion tick.mcfunction die Befehle eingeben, die man bei jedem Tick ausführen will
    #Achtung. Untenstehender Befehl nicht ausführen, da der Befehl nun 20mal pro Sekunde eine Kuh erscheinen lassen würde und das Spiel so überfordern würde
    summon cow
    
  5. Frage, wie können wir nun den Befehl in der Tick Funktion ändern, so dass eine Kuh nur dann erscheint, wenn der Spieler auf einem Sand Block steht?

Bedingungen testen

  • execute Befehl
  • Beispiel:
    execute if block ~ ~ ~ sand run say "Du stehst auf einem Sand-Block!"
    
  • Der “execute if block ~ ~ ~ sand” Teil überprüft, ob der Block beim Spielerstandort (~ ~ ~ = aktueller Ort) aus Sand besteht.
  • Der “run …” Teil führt dann einen weiteren Befehl aus, falls die Bedingung wahr ist.
  • Man kann die Bedingung auch umkehren, in dem man “unless” anstatt “if” schreibt.
    execute unless block ~ ~ ~ sand run say "Du stehst nicht auf einem Sand-Block!"
    
  • Man kann den Standort (~ ~ ~) auch ändern, indem man Koordinaten reinschreibt.
    execute if block 30 45 100 sand run say "Du stehst auf einem Sand-Block, der genau bei den Koordinaten 30 45 100 ist!"
    
  • Wenn man nun zum vorherigen Beispiel mit den Tieren nur Tiere 4 Blöcke vor dem Spieler erscheinen lassen will, wenn man selbst auf einem Sand-Block steht…
    execute if block ~ ~ ~ sand run function marcel:animals/spawn ^ ^ ^4"
    

Zielauswahl

  • Man kann anstatt den Spieler auch andere Ziele für die Befehle bestimmen
  • Hier eine Übersicht:
    @p = wählt nur den Spieler, der der Ausführung des Befehls am nächsten ist
    @a = wählt jeden Spieler in der Welt (nützlich für Multiplayer-Server/Realms)
    @e = wählt jeden Spieler, jedes Tier und jede Entität in der Welt
    @s = wählt nur die Entität, die den Befehl ausgeführt hat
  • Hierzu kann man nun noch den Typ des Ziels bestimmen, z. Bsp.:
    # Wählt alle Schweine
    @e[type=pig]
    

    # Wählt genau ein Schwein
    @e[type=pig,limit=1]

    # Wählt das beim Befehlsort am nächsten gelegenen Schwein
    @e[type=pig,limit=1,sort=nearest]

    # Wählt alle Spieler, die im Überlebensmodus sind
    @p[gamemode=survival]
    
  • Wenn man nun den Befehl bei einer Entität ausführen will, der nicht der Spieler sein soll, schreibt man das so:
    # Führt den Befehl bei allen Schweinen genau einmal aus und tötet diese
    execute as @e[type=pig] run kill @s
  • Wichtig dabei ist aber zu betonen, dass der Befehl immer noch von der Position des Spieler aus ausgeführt wird. Wenn man dies ändern will, muss man dem Befehl noch ein “at @s” anhängen:
    # Führt die Funktion "spawn" am Standort beim nächstgelegenen Schwein aus
    execute as @e[type=pig,limit=1,sort=nearest] at @s run function marcel/animals/spawn

Tags

  • Mittels Tags kann man einzelne Blöcke, Entities, Funktionen, etc. gruppieren.
  • Die Struktur sieht so aus:
    data/
        marcel/
          tags/
            functions/
              animals.json
          functions/
            animals/
              function1.function
              function2.function
    
  • Wir können nun diese 2 Funktionen (function1, function2) in der animals.json Datei aufführen. Hier die animals.json Datei:
    {
     "values": [
     "marcel:/animals/function1",
     "marcel:/animals/function2"
     ]
    }
  • Um nun beide Funktionen gleichzeitig auszuführen, müssen wir nur folgende Funktion ausführen:
    /function #marcel:animals"
  • Man kann aber ebenso Blöcke gruppieren.
    data/
        marcel/
          tags/
            blocks/
              blocks.json
    
  • Und hier die blocks.json Datei:
    {
     "values":[
     "minecraft:diamond_block",
     "minecraft:gold_block",
     "minecraft:emerald_block",
     ]
    }
  • Wenn ich nun folgenden Befehl ausführe, werden automatisch alle Blöcke angesprochen, welche ich in der “blocks.json” Datei reingeschrieben habe:
    /execute at @p if block ~ ~ ~ #marcel:blocks run say Der Spieler steht auf einem wertvollen Block.

Prädikate

  • Mittels Prädikaten kann man sozusagen weitere Bedingungen zum Spiel hinzufügen.
  • Die Struktur sieht so aus:
    data/
        marcel/
          predicates/
              animal_sneaking.json
    
  • Und in der Json Datei könnte man nun folgendes reinschreiben:
    {
      "condition": "minecraft:entity_properties",
      "entity": "this",
      "predicate": {
        "type": "minecraft:pig",
        "stepping_on": {
          "block": {
            "blocks": [
              "minecraft:sand"
            ]
          }
        }
      }
    }
  • Diese Json Datei überprüft nun, ob irgendein Schwein in der Spielwelt auf einem Sand-Block steht.
  • Tipp: Um eine Json Prädikat Datei einfacher zu erstellen, kann man Prädikat Generatoren benutzen.
  • Wenn man nun im Spiel folgenden Befehl eingibt, wird der Befehl nu dann ausgeführt, wenn das Prädikat erfüllt wird:
    /execute if predicate marcel:animal_sneaking run Irgendein Schwein steht nun auf einem Sandblock.
⚠️ **GitHub.com Fallback** ⚠️