Technik Wiki
Registrieren
Advertisement
Gruppe: Grid Ketten-Befehlsblock
Systeme

Grid Roter Sand blass mit Mechaniken

Grid Redstone blass mit Redstone
                Hier:
Grid Befehlsblock mit Befehlen
Verfügbar in:
Wiki Mechanik-Welt Mechanik-Welt

Das Wegfindungssystem (engl. Pathfinding) setzt alles daran den kürzesten Weg zum Ziel zu finden. Je nach Ausführung kann es auch Hindernisse in Form von Wänden oder auch Irrgärten umgehen.

Variante 1[]

Wegfindungssystem (Befehle) Bild 1.1 Wegfindungssystem (Befehle) Bild 1.2

Bei diesem Wegfindungssystem erhält man einen Start- und einen Endpunkt-Rüstungsständer in die Hand. Man kann beide platzieren und es wird ein Weg vom Startpunkt ausgehend zum Zielpunkt gesucht. Dabei können sich auch Hindernisse auf dem Weg befinden.

Einschalten
  • Befehl 1.1 Wenn der Hebel umgelegt wird, wird die Start-Funktion gestartet.
Wiederholen
  • Befehl 1.2 Beim Einschalten wird auch der Wiederhol-Befehlsblock gestartet, der jeden Tick die Zyklus-Funktion lädt.
Ausschalten
  • Befehl 1.3 Wenn der Hebel wieder in Ausgangsstellung zurück gelegt wird, wird die Stopp-Funktion ausgelöst und schaltet alles wieder ab.

Befehlsblöcke mit Befehlen:


Variante 1: Start-Funktion
Die Start-Funktion erstellt die Punktestand-Ziele und gibt dem Spieler zwei Rüstungsständer für den Start und das Ziel.

Editor Icon wegfindungssystem:v1start.mcfunction
# Zwei Punktestand-Ziele für die Berechnung des Weges werden erstellt.
scoreboard objectives add PZWegFS.1Wert dummy ["Wegfindungssystem.1: ",{"text":"Wert","bold":true}]
scoreboard objectives add PZWegFS.1Vergl dummy ["Wegfindungssystem.1: ",{"text":"Temporärer Wert","bold":true}]

# Die Variable Vorgänger wird angelegt und mit dem Wert eins belegt.
scoreboard players set #VarWegFS.1Vorgaenger PZWegFS.1Wert 1

# Dem nächstgelegenen Spieler in einem Umkreis von 15 Metern werden zwei Rüstungsständer ins Inventar gelegt. Welche den Startpunkt und den Endpunkt darstellen.
give @p[distance=..15] minecraft:armor_stand{wegfindungssystem:"v1gegenstand",display:{Name:'{"text":"Startpunkt","color":"blue","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um den Startpunkt zu markieren"']},EntityTag:{Small:true,Invisible:true,CustomNameVisible:true,CustomName:'{"text":"Startpunkt","color":"blue","bold":true}',Tags:["EtiWegFS.1Alle","EtiWegFS.1Erstellen"] } }
give @p[distance=..15] minecraft:armor_stand{wegfindungssystem:"v1gegenstand",display:{Name:'{"text":"Endpunkt","color":"green","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um den Endpunkt zu markieren"']},EntityTag:{Small:true,Invisible:true,CustomNameVisible:true,CustomName:'{"text":"Endpunkt","color":"green","bold":true}',Tags:["EtiWegFS.1Alle","EtiWegFS.1Ziel"] } }

Variante 1: Zyklus-Funktion
Die Zyklus-Funktion schaut ob der Spieler den Startpunkt-Rüstungsständer platziert hat und ruft daraufhin die Erstellen-Funktion auf. Gleichzeitig wird geprüft ob der Weg noch nicht komplett gefunden ist und dann wird die Knoten-Funktion aufgerufen.

Editor Icon wegfindungssystem:v1zyklus.mcfunction
# Wenn der Startpunkt-Rüstungsständer platziert wurde, wird von seiner Position zentrisch aus die Erstellen-Funktion geladen
execute as @e[tag=EtiWegFS.1Erstellen] at @s align xyz positioned ~0.5 ~ ~0.5 run function wegfindungssystem:v1erstellen

# Solange noch nicht der Zielpunkt gefunden wurde, wird von Knoten-Rüstungsständern aus die Knoten-Funktion aufgerufen.
execute unless entity @e[tag=EtiWegFS.1Fertig] if entity @e[tag=EtiWegFS.1Ziel] as @e[tag=EtiWegFS.1Knoten] at @s align xyz positioned ~0.5 ~ ~0.5 run function wegfindungssystem:v1knoten

Variante 1: Erstellen-Funktion
Die Erstellen-Funktion sorgt für den Start der Wegberechnung, in dem der Start-Rüstungsständer als Knoten behandelt wird und von ihm aus weitere Knoten erzeugt werden.

Editor Icon wegfindungssystem:v1erstellen.mcfunction
# Immer wenn der Startpunkt-Rüstungsständer erstellt wurde, wird ein vorhandener Weg wieder gelöscht.
kill @e[tag=EtiWegFS.1Knoten]

# Der Startpunkt-Rüstungsständer erhält drei neue Etiketten, sodass sein Erstellen-Etikett entfernt wird und er bekommt den Wert null.
data merge entity @s {Tags:["EtiWegFS.1Alle","EtiWegFS.1Knoten","EtiWegFS.1Start"]}
scoreboard players set @e[tag=EtiWegFS.1Start] PZWegFS.1Wert 0

Variante 1: Knoten-Funktion
Die Knoten-Funktion schaut ob sich ein Hindernis zwischen Start- und Endpunkt befindet, falls es der Fall ist, wird die Hindernis-Funktion aufgerufen. Ansonsten wird ein neuer Knoten in Richtung Endpunkt platziert und mit den Werten ausgestattet. Die Alias-Datei #wegfindungssystem:v1nichtsolide beinhaltet alle nicht soliden Blöcken.

Editor Icon wegfindungssystem:v1knoten.mcfunction
# Wenn sich ander aktuellen Position solide Blöcke aufhalten, wird die Hindernis-Funktion aufgerufen
execute unless block ~ ~ ~ #wegfindungssystem:v1nichtsolide run function wegfindungssystem:v1hindernis

# Wenn sich innerhalb eines Meters um den Knoten der Zielpunkt befindet, wird ihm das Etikett gegeben.
execute if entity @e[tag=EtiWegFS.1Ziel,distance=..0.99] run tag @s add EtiWegFS.1Fertig

# Wenn der eigene Rüstungsständer keines von zwei Etiketten besitzt, so schaut er Richtung Ziel und die nächste zentrische Position aus wird angepeilt um dort zu prüfen ob sich dort nicht schon ein Knoten-Rüstungsständer befindet. Falls nicht wird einer erzeugt.
execute if entity @s[tag=!EtiWegFS.1NichtSpawnen,tag=!EtiWegFS.1Hindernis] facing entity @e[tag=EtiWegFS.1Ziel] feet anchored feet align xyz positioned ~0.5 ~ ~0.5 positioned ^ ^ ^1 anchored feet align xyz positioned ~0.5 ~0.5 ~0.5 unless entity @e[tag=EtiWegFS.1Knoten,distance=..0.99] run summon minecraft:armor_stand ~ ~ ~ {Small:true,NoGravity:true,Marker:true,Invisible:true,Tags:["EtiWegFS.1Alle","EtiWegFS.1NrFehlt","EtiWegFS.1Knoten"],ArmorItems:[{},{},{},{id:"minecraft:cyan_concrete",Count:1b}]}

# Wenn die Nummer bei einem oder mehreren Knoten fehlt, wird der aktuelle Wert mit dem Wert der Vorgänger-Variable addiert und dem übergeben, dem die Nummer fehlt.
execute store result score @e[tag=EtiWegFS.1NrFehlt] PZWegFS.1Wert run scoreboard players operation @s PZWegFS.1Wert += #VarWegFS.1Vorgaenger PZWegFS.1Wert
execute if entity @e[tag=EtiWegFS.1NrFehlt] run scoreboard players operation @s PZWegFS.1Wert -= #VarWegFS.1Vorgaenger PZWegFS.1Wert
tag @e[tag=EtiWegFS.1NrFehlt] remove EtiWegFS.1NrFehlt

Variante 1: Hindernis-Funktion
Die Hindernis-Funktion prüft um den Knoten-Rüstungsständer ob dort noch ein neuer Knoten für den Weg gebildet werden kann, ansonsten wird der eigene Rüstungsständer entfernt. Falls neue Wege möglich sind, wird die Schritte-Funktion aufgerufen.

Editor Icon wegfindungssystem:v1hindernis.mcfunction
# Dem Knoten-Rüstungsständer werden zwei Etiketten gegeben und der Kopfslot wird geleert.
data merge entity @s {ArmorItems:[{},{},{},{}]}
tag @s add EtiWegFS.1Hindernis
tag @s add EtiWegFS.1Selbst

# Der aktuelle Punktestand wird kopiert und anschließend zieht der Wert der Vorgänger-Variable sich von diesem ab.
scoreboard players operation @s PZWegFS.1Vergl = @s PZWegFS.1Wert
scoreboard players operation @s PZWegFS.1Vergl -= #VarWegFS.1Vorgaenger PZWegFS.1Wert

# An der aktuellen zentrierten Position muss sich ein solider Block befinden, dann wird in einem Radius von 1,2 Metern nach Knoten-Rüstungsständern geschaut die zur Seite stehen und den gleichen Wert besitzen. Von diesen wird die Schritte-Funktion aufgerufen.
execute at @s align xyz positioned ~0.5 ~ ~0.5 unless block ~ ~1 ~ #wegfindungssystem:v1nichtsolide as @e[tag=EtiWegFS.1Knoten,distance=..1.2] at @s if entity @s[tag=!EtiWegFS.1NichtSeite] if score @s PZWegFS.1Wert = @e[tag=EtiWegFS.1Selbst,limit=1] PZWegFS.1Vergl run function wegfindungssystem:v1schritte
tag @s remove EtiWegFS.1Selbst

# Der eigene Rüstungsständer wird entfernt, wenn er das Etikett immer noch besitzt.
kill @s[tag=EtiWegFS.1Hindernis]

Variante 1: Schritte-Funktion
Die Schritte-Funktion erzeugt in jede Richtung einen Knoten-Rüstungsständer, von dem aus der Weg weiter berechnet wird.

Editor Icon wegfindungssystem:v1schritte.mcfunction
# Der Rüstungsständer bekommt zwei Etiketten.
tag @s add EtiWegFS.1NichtSpawnen
tag @s add EtiWegFS.1NichtSeite

# In den vier Himmelsrichtungen wird geprüft ob sich dort noch kein Rüstungsständer aufhält. Falls das der Fall ist, wird an der jeweiligen Stelle ein Rüstungsständer gespawnt.
execute positioned ~1 ~ ~ unless entity @e[tag=EtiWegFS.1Knoten,distance=..0.5] run summon minecraft:armor_stand ~ ~ ~ {Small:true,NoGravity:true,Marker:true,Invisible:true,Tags:["EtiWegFS.1Alle","EtiWegFS.1NrFehlt","EtiWegFS.1Knoten"],ArmorItems:[{},{},{},{id:"minecraft:cyan_concrete",Count:1b}]}
execute positioned ~ ~ ~1 unless entity @e[tag=EtiWegFS.1Knoten,distance=..0.5] run summon minecraft:armor_stand ~ ~ ~ {Small:true,NoGravity:true,Marker:true,Invisible:true,Tags:["EtiWegFS.1Alle","EtiWegFS.1NrFehlt","EtiWegFS.1Knoten"],ArmorItems:[{},{},{},{id:"minecraft:cyan_concrete",Count:1b}]}
execute positioned ~-1 ~ ~ unless entity @e[tag=EtiWegFS.1Knoten,distance=..0.5] run summon minecraft:armor_stand ~ ~ ~ {Small:true,NoGravity:true,Marker:true,Invisible:true,Tags:["EtiWegFS.1Alle","EtiWegFS.1NrFehlt","EtiWegFS.1Knoten"],ArmorItems:[{},{},{},{id:"minecraft:cyan_concrete",Count:1b}]}
execute positioned ~ ~ ~-1 unless entity @e[tag=EtiWegFS.1Knoten,distance=..0.5] run summon minecraft:armor_stand ~ ~ ~ {Small:true,NoGravity:true,Marker:true,Invisible:true,Tags:["EtiWegFS.1Alle","EtiWegFS.1NrFehlt","EtiWegFS.1Knoten"],ArmorItems:[{},{},{},{id:"minecraft:cyan_concrete",Count:1b}]}

# Bei allen, bei denen die Nummer fehlt, wird die Nummer berechnet in dem sie das ergebnis aus der Addition des eigenen Rüstungsständer plus dem Vorgänger bekommen.
execute store result score @e[tag=EtiWegFS.1NrFehlt] PZWegFS.1Wert run scoreboard players operation @s PZWegFS.1Wert += #VarWegFS.1Vorgaenger PZWegFS.1Wert
execute if entity @e[tag=EtiWegFS.1NrFehlt] run scoreboard players operation @s PZWegFS.1Wert -= #VarWegFS.1Vorgaenger PZWegFS.1Wert
tag @e[tag=EtiWegFS.1NrFehlt] remove EtiWegFS.1NrFehlt

Variante 1: Stopp-Funktion
Die Stopp-Funktion löscht die beiden Punktestand-Ziele und entfernt die Rüstungsständer aus dem Inventar und auf dem Boden.

Editor Icon wegfindungssystem:v1stopp.mcfunction
# Die beiden Punktestand-Ziele werden entfernt.
scoreboard objectives remove PZWegFS.1Wert
scoreboard objectives remove PZWegFS.1Vergl

# Die Rüstungsständer werden aus dem Inventar wieder gelöscht.
clear @a minecraft:armor_stand{wegfindungssystem:"v1gegenstand"}

# Falls die Rüstungsständer auf den Boden gedroppt wurden erhalten sie ein Etikett. Alle Objekte mit dem Etikett werden gelöscht.
tag @e[type=minecraft:item,nbt={Item:{tag:{wegfindungssystem:"v1gegenstand"} } }] add EtiWegFS.1Alle
kill @e[tag=EtiWegFS.1Alle]
Advertisement