Technik Wiki
Advertisement
Gruppe: Grid Schiene.png
Schienenverkehrsanlagen

Grid Roter Sand blass.png mit Mechaniken

Grid Redstone blass.png mit Redstone

Grid Befehlsblock.png mit Befehlen
Verfügbar in:
Wiki Schienen-Welt.png Schienen-Welt
                Hier:
Grid Wiederhol-Befehlsblock.png mehr Befehle
Wiki Schienen-Welt.png
Alle neuen oder überarbeiteten Techniken auf dieser Seite sind noch nicht in der aktuellen Schienen-Welt vorhanden.
In einem der nächsten Updates werden sie dort hinzugefügt werden.

Die erweiterte Schwebebahn ist ähnlich wie die Eisenbahn ein Schienenfahrzeug, jedoch bewegt sich die Magnetschwebebahn über dem Boden auf der Strecke. In der Regel besitzt die Schwebebahn eine Lore ganz vorne in der Bahn in die man sich hineinsetzten kann. Von dort aus gibt es eine Art Benutzeroberfläche mit der man die Schwebebahn steuern kann. Diese fährt über vorgefertigte Streckenspuren die man selbst vorher platzieren konnte. Die Schwebebahn kann dabei auch Höhenunterschiede von einen Block überwinden. Stößt die Schwebebahn auf eine Kreuzung, so lässt sich sich in die gewünschte Richtung drehen und fährt dort dann weiter. Stationen können damit angefahren werden und die Bahn hält dort automatisch.

Variante 1[]

Schwebebahn (Befehle, erweitert) Bild 1.1.png Schwebebahn (Befehle, erweitert) Bild 1.2.png Schwebebahn (Befehle, erweitert) Bild 1.3.png Schwebebahn (Befehle, erweitert) Bild 1.4.png Schwebebahn (Befehle, erweitert) Bild 1.5.png Schwebebahn (Befehle, erweitert) Bild 1.6.png

Diese Schwebebahn ist dem Transrapid nachempfunden und fährt wie sein reales Vorbild auf den Magnetbahnen entlang. Schaltet man die Technik ein, erhält man vier Rüstungsständer mit denen man die Schwebebahn, eine gerade Spur, eine Spur-Kreuzung und eine Station platzieren kann. Wählt man einen der beiden Spuren-Rüstungsständer aus, erhält man im Chat ein Menü und kann dort die Höhe der Spur einstellen. Platziert man die Schwebebahn auf eine der Spuren, wird diese erzeugt, sofern die Spuren existieren und auf diesen alles frei ist. Um die Schwebebahn zu steuern setzt man sich in die Lore ganz vorne in der Bahn hinein. Hat man dabei das erhaltene Holzschwert ausgewählt, erhält man ebenfalls im Chat ein Menü um die Bahn zu steuern. Die Bahn kann sofern sie auf einer Kreuzung steht gedreht werden und ihr Tempo kann angepasst werden. Bis zu drei Werte sind möglich. Als letztes kann man den Tempomat einschalten, sodass die Bahn automatisch in dem eingestellten Tempo losfährt. Sie hält an Stationen und Kreuzungen automatisch.

Einschalten

Wird der Hebel umgelegt, startet der Befehlsblock und führt die Start-Funktion einmal aus.

Wiederholen

Der Wiederhol-Befehlsblock führt jeden Tick die Zyklus-Funktion aus.

Ausschalten

Sobald der Hebel wieder in Ausgangsstellung zurück gelegt wurde, wird die Stopp-Funktion aktiviert.


Befehlsblöcke mit Befehlen:
Datenpaket


Variante 1: Start-Funktion
Die Start-Funktion gibt dem Spieler die Rüstungsdständer und erzeugt die benötigten Punkte-Ziele.

Editor Icon.png schwebebahn:vp1start.mcfunction
# Es werden vier Punkte-Ziele erstellt.
scoreboard objectives add PZSchwB.p1Ausgewaehlt dummy ["Schwebebahn.erweitert.1: ",{"text":"Ausgewaehlter Wert","bold":true}]
scoreboard objectives add PZSchwB.p1Auswahl dummy ["Schwebebahn.erweitert.1: ",{"text":"Wert der Auswahl","bold":true}]
scoreboard objectives add PZSchwB.p1Ausl trigger ["Schwebebahn.erweitert.1: ",{"text":"Auslöser für Optionen","bold":true}]
scoreboard objectives add PZSchwB.p1Wert dummy ["Schwebebahn.erweitert.1: ",{"text":"Wert der Variablen","bold":true}]

# Eine Konstante wird angelegt.
scoreboard players set KonstSchwB.p1MINUSEINS PZSchwB.p1Wert -1

# Spieler in der Nähe erhalten vier Rüstungsständer, mit denen die Schwebebahn, die Spur, die Spur-Kreuzung und die Station platziert werden können.
give @a[distance=..15] minecraft:armor_stand{EigSchwB.p1Alle:true,display:{Name:'{"text":"Transrapid","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"auf eine Transrapid-Strecke"','"um einen Transrapid"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Erstellen"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p1Alle:true,EigSchwB.p1Ausgewaehlt:2,display:{Name:'{"text":"Spur","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um eine Transrapid-Strecke"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Bauwerk","EtiSchwB.p1Spuren","EtiSchwB.p1Spur"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p1Alle:true,EigSchwB.p1Ausgewaehlt:2,display:{Name:'{"text":"Spur-Kreuz","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um eine Transrapid-Kreuzung"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Bauwerk","EtiSchwB.p1Spuren","EtiSchwB.p1SpurKreuz"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p1Alle:true,display:{Name:'{"text":"Station","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um eine Transrapid-Station"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Bauwerk","EtiSchwB.p1Station"] } }

# Ein Erklärtext wird den Spielern angezeigt.
tellraw @a[distance=..15] ["Schwebebahn.erweitert.1:\n",{"text":"Drücke E um das Inventar zu öffnen und fahre mit der Maus über die Rüstungsständer, um zu erfahren wie man sie einsetzt um die Schwebebahn zu benutzen.","bold":true}]

# Der Chunk in dem die Technik gestartet wurde, wird dauerhaft geladen.
forceload add ~ ~

Variante 1: Zyklus-Funktion
Die Zyklus-Funktion sorgt dafür, dass die Schwebebahn und die Bauwerke erzeugt werden können und dass die Auswahl des Steuers ermöglichst wird.

Editor Icon.png schwebebahn:vp1zyklus.mcfunction
# Wird eines der Bauwerke platziert, wird die Bauwerks-Funktion geladen.
execute as @e[type=minecraft:armor_stand,tag=EtiSchwB.p1Bauwerk] at @s align y run function schwebebahn:vp1bauwerk

# Wird die Schwebebahn platziert, wird die Erstellen-Funktion geladen.
execute as @e[type=minecraft:armor_stand,tag=EtiSchwB.p1Erstellen] at @s align y run function schwebebahn:vp1erstellen

# Wenn der Spieler sich in die Lore gesetzt hat, erhält er ein Etikett zur Markierung.
execute at @e[type=minecraft:marker,tag=EtiSchwB.p1Bahn] positioned ^ ^1 ^17 run tag @p[distance=..5,nbt={RootVehicle:{Entity:{Tags:["EtiSchwB.p1Halter"]} } }] add EtiSchwB.p1Sitzen

# Die Auswahl die der Spieler vor einem Tick getroffen hat, wird kopiert, sodass zurückverfolgt werden kann, wenn sich die Auswahl ändert.
execute as @a run scoreboard players operation @s PZSchwB.p1Auswahl = @s PZSchwB.p1Ausgewaehlt

# Wenn der Spieler einen der Rüstungsständer oder das Schwert ausgewählt hat, wird der entsprechende Wert vom Gegenstand auf den Spieler-Wert übertragen, ansonsten wird der Wert null gespeichert.
execute as @a store result score @s PZSchwB.p1Ausgewaehlt run data get entity @s SelectedItem.tag."EigSchwB.p1Ausgewaehlt"

# Wenn der Spieler das Holzschwert ausgewählt hat, aber nicht sitzt, so wird seine Auswahl auf null gesetzt.
scoreboard players set @a[tag=!EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1,PZSchwB.p1Auswahl=1}] PZSchwB.p1Auswahl 0

# Wenn die Spieler das Schwert oder den Rüstungsständer gerade ausgewählt haben, wird ihnen der Ausöser-Wert gesetzt sowie der Wert.
scoreboard players set @a[scores={PZSchwB.p1Ausgewaehlt=1..,PZSchwB.p1Auswahl=0}] PZSchwB.p1Ausl -99
scoreboard players add @a[scores={PZSchwB.p1Ausgewaehlt=1..,PZSchwB.p1Auswahl=0}] PZSchwB.p1Wert 0

# Spieler die Sitzen und das Holzschwert ausgewählt haben, laden von dem Bahn-Markierer aus die Auslöser-Funktion.
execute as @a[tag=EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1}] unless entity @s[scores={PZSchwB.p1Ausl=0}] at @s at @e[distance=..5,type=minecraft:armor_stand,tag=EtiSchwB.p1Halter,sort=nearest,limit=1] positioned ^ ^-1 ^-17 as @e[distance=..5,type=minecraft:marker,tag=EtiSchwB.p1Bahn,sort=nearest,limit=1] positioned ^ ^1 ^17 run function schwebebahn:vp1ausloeser

# Wenn der Spieler einen der Rüstungsständer für Spuren ausgewählt hat, wird die Auslöser-Funktion geladen.
execute as @a[scores={PZSchwB.p1Ausgewaehlt=2}] unless entity @s[scores={PZSchwB.p1Ausl=0}] at @s run function schwebebahn:vp1ausloeser

# Je nach ob der Spieler nicht sitzt oder sitzt und nicht das Schwert ausgewählt hat, wird die entsprechende Titel-Nachricht angezeigt.
title @a[tag=!EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1,PZSchwB.p1Auswahl=0}] actionbar ["",{"text":"Spieler sitzt == ","bold":true},{"text":"falsch","color":"red","bold":true}]
title @a[tag=EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=0,PZSchwB.p1Auswahl=1}] actionbar ["",{"text":"Steuer ausgewählt == ","color":"gray","bold":true},{"text":"falsch","color":"red","bold":true}]

# Die Eigenschaft des Bahn-Markierers wird in seinen Namen kopiert, da die Namensabfrage einfacher funktioniert.
execute as @e[type=minecraft:marker,tag=EtiSchwB.p1Bahn] run data modify entity @s CustomName set from entity @s data."EigSchwB.p1Tempomat"

# Wenn sich in der Nähe des Markierers kein Spieler aufhält der das Schwert ausgewählt hat, wird, falls der Tempomat aktiv ist, dieser deaktiviert, in dem die NBT-Eigenschaft geändert wird.
execute as @e[type=minecraft:marker,tag=EtiSchwB.p1Bahn,name="wahr"] at @s unless entity @p[distance=..18,tag=EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1}] run data modify entity @s data."EigSchwB.p1Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'

# Wenn der Markierer, der den Wahrheitswert für den Tempomat speichert, den Namen wahr besitzt, wird dem Fahrer der Wert sieben gegeben, sodass die Bahn losfährt. Dazu wird jeden Tick der Wert der Tick-Variable um eins erhöht und bei vier wieder auf null gesetzt. Das ermöglicht dem Fahrer, der die Option Tempomat gewählt hat, dass die Bahn nur alle vier Ticks nach vorne fährt.
scoreboard players add VarSchwB.p1Tick PZSchwB.p1Ausl 1
execute if score VarSchwB.p1Tick PZSchwB.p1Ausl matches 4.. as @e[type=minecraft:marker,tag=EtiSchwB.p1Bahn,name="wahr"] at @s positioned ^ ^1 ^17 run scoreboard players set @p[distance=..5,tag=EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1,PZSchwB.p1Ausl=0}] PZSchwB.p1Ausl 7
execute if score VarSchwB.p1Tick PZSchwB.p1Ausl matches 4.. run scoreboard players set VarSchwB.p1Tick PZSchwB.p1Ausl 0

# Das Etikett wird wieder entfernt, damit der Spieler es nur besitzt, wenn er in der Bahn noch sitzt.
tag @a[tag=EtiSchwB.p1Sitzen] remove EtiSchwB.p1Sitzen

Variante 1: Bauwerks-Funktion
Die Bauwerks-Funktion sorgt dafür, dass die Spuren und die Station entsprechend errichtet werden.

Editor Icon.png schwebebahn:vp1bauwerk.mcfunction
# Die Richtung wird angepasst.
teleport @s[y_rotation=-45..45] ~ ~ ~ 0 0
teleport @s[y_rotation=45..135] ~ ~ ~ 90 0
teleport @s[y_rotation=135..-135] ~ ~ ~ 180 0
teleport @s[y_rotation=-135..-45] ~ ~ ~ -90 0

# Da der Rüstungsständer immer exakt 180° in die andere Richtung schaut wird er umgedreht.
execute at @s run teleport @s ~ ~ ~ ~180 0

# Der eingestellte Wert des Spielers wird kopiert.
scoreboard players operation @s PZSchwB.p1Wert = @p PZSchwB.p1Wert

# Ein Quarzblock für das Fundament der Spur wird platziert und anschließend wird die Bauwerks-Höhen-Funktion geladen.
execute at @s[tag=EtiSchwB.p1Spuren] run setblock ^ ^ ^15 minecraft:quartz_block replace
execute at @s[tag=EtiSchwB.p1Spuren] positioned ^ ^ ^15 run function schwebebahn:vp1bauwerk_hoehe

# Wenn die Station platziert werden soll, wird geprüft ob sich darunter überhaupt eine Spur befindet und nur dann wird der Konstruktionsblock dafür platziert und der Rüstungsständer ehrält dann den Wert eins.
execute at @s[tag=EtiSchwB.p1Station] store success score @s PZSchwB.p1Wert if block ~ ~-1 ~ minecraft:stone_brick_stairs[half=bottom] if block ^-1 ^-1 ^ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^-1 ^ minecraft:stone_brick_stairs[half=bottom] run setblock ^-20 ^-2 ^3 minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp1station",posY:0} replace

# Je nach Blickrichtung des Rüstungsständers werden die benötigten Daten in den Konstruktionsblock gespeichert.
execute at @s[tag=EtiSchwB.p1Station,y_rotation=-135..-45] run data merge block ^-20 ^-2 ^3 {rotation:"NONE",posX:0,posZ:-40}
execute at @s[tag=EtiSchwB.p1Station,y_rotation=-45..45] run data merge block ^-20 ^-2 ^3 {rotation:"CLOCKWISE_90",posX:40,posZ:0}
execute at @s[tag=EtiSchwB.p1Station,y_rotation=45..135] run data merge block ^-20 ^-2 ^3 {rotation:"CLOCKWISE_180",posX:0,posZ:40}
execute at @s[tag=EtiSchwB.p1Station,y_rotation=135..-135] run data merge block ^-20 ^-2 ^3 {rotation:"COUNTERCLOCKWISE_90",posX:-40,posZ:0}

# Nur wenn der Konstruktionsblock platziert werden konnte, wird ein Redstone-Block daneben platziert um diesen zu aktivieren.
execute at @s[tag=EtiSchwB.p1Station,scores={PZSchwB.p1Wert=1}] run setblock ^-20 ^-1 ^3 minecraft:redstone_block replace

# Es wird eine rote Netherziegelstufe platziert, sodass die Bahn dort hält.
execute at @s[tag=EtiSchwB.p1Station,scores={PZSchwB.p1Wert=1}] run setblock ~ ~-1 ~ minecraft:red_nether_brick_slab replace

# Falls keine Spur gefunden wurde um die Station zu platzieren, wird eine Fehlermeldung ausgegeben.
execute at @s[tag=EtiSchwB.p1Station] unless entity @s[scores={PZSchwB.p1Wert=1}] run tellraw @a[distance=..5] ["Schwebebahn.erweitert.1:\n",{"text":"Unter dem Rüstungsständer wurde keine Spur gefunden!","color":"red","bold":true}]

# Der Rüstungsständer wird anschließend gelöscht.
kill @s

Variante 1: Bauwerks-Höhen-Funktion
Die Bauwerks-Höhen-Funktion sorgt dafür, dass die Spur in der richtigen Höhe platziert wird.

Editor Icon.png schwebebahn:vp1bauwerk_hoehe.mcfunction
# Wurde die End-Höhe erreicht, wird der Konstruktionsblock platziert.
execute if entity @s[scores={PZSchwB.p1Wert=0}] run setblock ~ ~ ~ minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp1spur",posY:0} replace

# Je nach dem ob die Blickrichtung in Richtung Pole oder Äquator ist, werden entsprechende Daten kopiert.
execute if entity @s[scores={PZSchwB.p1Wert=0},y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~ ~ ~ {rotation:"NONE",posX:-15,posZ:-1}
execute if entity @s[scores={PZSchwB.p1Wert=0},y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_90",posX:1,posZ:-15}

# Der Redstone-Blöcke wird platziert um die Spur zu laden.
execute if entity @s[scores={PZSchwB.p1Wert=0}] run setblock ~ ~1 ~ minecraft:redstone_block replace

# Das Spur-Kreuz wird platziert.
execute if entity @s[tag=EtiSchwB.p1SpurKreuz,scores={PZSchwB.p1Wert=0}] run setblock ~ ~ ~ minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp1spur_kreuz",posY:0} replace

# Je nach Blickrichtung werden die entsprechenden Daten kopiert.
execute if entity @s[tag=EtiSchwB.p1SpurKreuz,scores={PZSchwB.p1Wert=0},y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_90",posX:1,posZ:-15}
execute if entity @s[tag=EtiSchwB.p1SpurKreuz,scores={PZSchwB.p1Wert=0},y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~ {rotation:"NONE",posX:-15,posZ:-1}

# Der Redstone-Block wird platziert.
execute if entity @s[tag=EtiSchwB.p1SpurKreuz,scores={PZSchwB.p1Wert=0}] run setblock ~ ~1 ~ minecraft:redstone_block replace

# Solange noch nicht die End-Höhe erreicht ist, werden Säulen platziert.
execute if entity @s[scores={PZSchwB.p1Wert=1..}] run setblock ^1 ^ ^ minecraft:quartz_pillar replace
execute if entity @s[scores={PZSchwB.p1Wert=1..}] run setblock ^-1 ^ ^ minecraft:quartz_pillar replace

# Solange noch nicht die End-Höhe erreicht ist, wird die Funktion um einen Block nach oben nochmal aufgerufen.
scoreboard players remove @s PZSchwB.p1Wert 1
execute if entity @s[scores={PZSchwB.p1Wert=0..}] positioned ~ ~1 ~ run function schwebebahn:vp1bauwerk_hoehe

Variante 1: Erstellen-Funktion
Die Erstellen-Funktion prüft ob alle Bedingungen erfüllt sind um eine Schwebebahn zu errichten.

Editor Icon.png schwebebahn:vp1erstellen.mcfunction
# Der Rüstungsständer wird ausgerichtet.
teleport @s[y_rotation=-45..45] ~ ~ ~ 0 0
teleport @s[y_rotation=45..135] ~ ~ ~ 90 0
teleport @s[y_rotation=135..-135] ~ ~ ~ 180 0
teleport @s[y_rotation=-135..-45] ~ ~ ~ -90 0

# Anschließend wird er umgedreht.
execute at @s run teleport @s ~ ~ ~ ~180 0

# Zuerst wird geprüft ob sich unter dem Rüstungsständer überhaupt eine Spur befindet und wenn nicht wird eine Fehlermeldung ausgegeben.
execute store result score @s PZSchwB.p1Wert if block ~ ~-1 ~ minecraft:stone_brick_stairs[half=bottom]
execute if entity @s[tag=EtiSchwB.p1Erstellen,scores={PZSchwB.p1Wert=0}] run tellraw @p[distance=..5] ["Schwebebahn.erweitert.1:\n",{"text":"Es wurde unter der zu erzeugenden Schwebebahn keine vollständige Schwebebahn-Spur gefunden!","color":"red","bold":true}]
tag @s[scores={PZSchwB.p1Wert=0}] remove EtiSchwB.p1Erstellen

# Falls die Spur um 90° gedreht an der Position ist, wird der Rüstungsständer gedreht.
execute at @s[scores={PZSchwB.p1Wert=1}] if block ^ ^-1 ^-1 minecraft:quartz_stairs[half=top] if block ^ ^-1 ^1 minecraft:quartz_stairs[half=top] run teleport @s ~ ~ ~ ~90 0

# Wenn sich eine Spur an der Position des Rüstungsständers befindet, wird ihm der Wert zwei gegeben.
execute at @s[scores={PZSchwB.p1Wert=1}] if block ^-1 ^-1 ^ minecraft:quartz_stairs[half=top] if block ^1 ^-1 ^ minecraft:quartz_stairs[half=top] run scoreboard players set @s PZSchwB.p1Wert 2
tag @s[scores={PZSchwB.p1Wert=1}] remove EtiSchwB.p1Erstellen

# Wenn eine Spur vorhanden ist, wird jetzt geprüft ob über der Spur genug Platz für die Bahn ist.
execute at @s[tag=EtiSchwB.p1Erstellen] store result score @s PZSchwB.p1Wert run fill ^-2 ^ ^-20 ^2 ^5 ^20 minecraft:structure_void replace minecraft:air
execute at @s[tag=EtiSchwB.p1Erstellen] run fill ^-2 ^ ^-20 ^2 ^5 ^20 minecraft:air replace minecraft:structure_void
tag @s[tag=EtiSchwB.p1Erstellen,scores={PZSchwB.p1Wert=..1229}] remove EtiSchwB.p1Erstellen

# Falls kein Platz vorhanden ist, wird eine Fehlermeldung ausgegeben.
execute if entity @s[tag=!EtiSchwB.p1Erstellen] run tellraw @p[distance=..5] ["Schwebebahn.erweitert.1:\n",{"text":"Die Schwebebahn kann nicht an der geforderten Position erzeugt werden!","color":"red","bold":true}]

# Wenn alles in Ordnung ist, wird dem Spieler das Holzschwert für das Steuern der Bahn gegeben.
execute if entity @s[tag=EtiSchwB.p1Erstellen] run give @p[distance=..5] minecraft:wooden_sword{EigSchwB.p1Alle:true,EigSchwB.p1Steuer:true,EigSchwB.p1Ausgewaehlt:1,Unbreakable:true,HideFlags:6,AttributeModifiers:[{AttributeName:"minecraft:generic.attack_damage",Amount:-1,Name:"Extraschaden",Operation:0,UUID:[0,0,0,1],Slot:"mainhand"}],Enchantments:[{id:-1}],display:{Name:'{"text":"Steuer","color":"gold","bold":true}',Lore:['"Setze dich in die Lore"','"und wähle das Steuer aus"','"um die Bahn zu steuern."'] } }

# Der Markierer für die eigentliche Bahn wird erzeugt.
execute at @s[tag=EtiSchwB.p1Erstellen] run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Ausrichten","EtiSchwB.p1Bahn"],data:{EigSchwB.p1Tempomat:'{"bold":true,"color":"red","text":"falsch"}'} }

# Ein zweiter Markierer, der die alte Position der Bahn markiert, wird erzeugt.
execute at @e[distance=..1,type=minecraft:marker,tag=EtiSchwB.p1Bahn,sort=nearest,limit=1] run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Ausrichten","EtiSchwB.p1Unbeachten","EtiSchwB.p1AltePosition"]}

# Ein unsichtbarer Rüstungsständer mit einer Lore darauf werden etwas versetzt von der Mitte erzeugt.
execute at @s run summon minecraft:armor_stand ^ ^1.3 ^17 {Small:true,Invisible:true,NoGravity:true,Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Ausrichten","EtiSchwB.p1Halter"],Passengers:[{id:"minecraft:minecart",Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Unbeachten","EtiSchwB.p1Sitz"] } ] }

# Die beiden Markierer und auch der Rüstungsständer werden entsprechend ausgerichtet.
execute at @s[tag=EtiSchwB.p1Erstellen] as @e[distance=..18,tag=EtiSchwB.p1Ausrichten,sort=nearest,limit=3] positioned as @s run teleport @s ~ ~ ~ ~ 0

# Danach wird ihnen das Etikett entfernt.
tag @e[distance=..18,tag=EtiSchwB.p1Ausrichten,sort=nearest,limit=3] remove EtiSchwB.p1Ausrichten

# Der Bahn-Markierer ruft die Bahn-Funktion auf und dabei wird ihm auch der Wert fürs Tempo auf eins gesetzt.
execute at @s as @e[distance=..1,type=minecraft:marker,tag=EtiSchwB.p1Bahn,sort=nearest,limit=1] at @s store success score @s PZSchwB.p1Wert run function schwebebahn:vp1bahn

# Anschließend wird der Rüstungsständer entfernt.
kill @s

Variante 1: Auslöser-Funktion
Die Auslöser-Funktion gibt dem Spieler im Chat alle Optionen um die Schwebebahn zu steuern.

Editor Icon.png schwebebahn:vp1ausloeser.mcfunction
# Der Wert des Spielers wird ausgelesen und in den Wert des Markierers gespeichert. Falls der Spieler nicht gefunden wurde, wird stattdessen der Wert null gespeichert.
execute store result score @s PZSchwB.p1Ausl run scoreboard players get @p[distance=..1,scores={PZSchwB.p1Ausgewaehlt=1..,PZSchwB.p1Ausl=1..}] PZSchwB.p1Ausl
execute store result score @s PZSchwB.p1Ausgewaehlt run scoreboard players get @p[distance=..1,scores={PZSchwB.p1Ausgewaehlt=1..}] PZSchwB.p1Ausgewaehlt

# Zuerst wird geprüft ob der Markierer überhaupt die Eigenschaft für die Richtung besitzt und falls nicht, wird ihm der Wert eins gegeben, sodass anschließend die Drehen-Funktion geladen wird. Sie wird ansonsten auch geladen, wenn der Spieler in eine der drei anderen Richtungen die Bahn drehen möchte.
execute store success score @s[scores={PZSchwB.p1Ausl=0}] PZSchwB.p1Ausl unless data entity @s data."EigSchwB.p1Richtung"[1]
execute at @s[scores={PZSchwB.p1Ausl=1..4}] run function schwebebahn:vp1drehen

# Der Spieler kann das Tempo der Bahn erhöhen oder verringern.
scoreboard players add @s[scores={PZSchwB.p1Ausl=8,PZSchwB.p1Wert=..2}] PZSchwB.p1Wert 1
scoreboard players remove @s[scores={PZSchwB.p1Ausl=9,PZSchwB.p1Wert=2..}] PZSchwB.p1Wert 1

# Der Spieler kann den Tempomat ein und ausschalten.
data modify entity @s[scores={PZSchwB.p1Ausl=5}] data."EigSchwB.p1Tempomat" set value '{"bold":true,"color":"green","text":"wahr"}'
data modify entity @s[scores={PZSchwB.p1Ausl=6}] data."EigSchwB.p1Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'

# Wenn der Spieler fahren möchte, wird zuvor die Bewegen-Variable auf null gesetzt und das Tempo vom Spieler-Wert kopiert, anschließend wird dann die Fahren-Funktion geladen.
scoreboard players set VarSchwB.p1Bewegen PZSchwB.p1Wert 0
scoreboard players operation VarSchwB.p1Tempo PZSchwB.p1Wert = @s[scores={PZSchwB.p1Ausl=7}] PZSchwB.p1Wert
execute at @s[scores={PZSchwB.p1Ausl=7}] run function schwebebahn:vp1fahren

# Wenn der Spieler die Spur-Höhe anpassen will, wird dies darüber gelöst.
scoreboard players add @s[scores={PZSchwB.p1Ausl=10,PZSchwB.p1Wert=..63}] PZSchwB.p1Wert 1
scoreboard players remove @s[scores={PZSchwB.p1Ausl=11,PZSchwB.p1Wert=1..}] PZSchwB.p1Wert 1

# Die Optionen sollen nur dann angezeigt werden, wenn der Spieler nicht gerade den Tempomaten am laufen hat und nur, wenn der Spieler auch das Schwert ausgewählt hat.
execute unless entity @s[scores={PZSchwB.p1Ausl=7},nbt={data:{EigSchwB.p1Tempomat:'{"bold":true,"color":"green","text":"wahr"}'} }] run tellraw @p[distance=..1,tag=EtiSchwB.p1Sitzen,scores={PZSchwB.p1Ausgewaehlt=1}] ["Schwebebahn.erweitert.1:\n",{"text":"richtung = ","bold":true},{"text":"drehen(","extra":[{"entity":"@s","nbt":"data.\"EigSchwB.p1Richtung\"[1]","color":"gray","interpret":true},{"text":")"}],"color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für nach Rechts"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 2"} },"\n",{"text":"richtung = ","bold":true},{"text":"drehen(","extra":[{"entity":"@s","nbt":"data.\"EigSchwB.p1Richtung\"[-1]","color":"gray","interpret":true},{"text":")"}],"color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für nach Links"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 3"} },"\n",{"text":"richtung = ","bold":true},{"text":"drehen(","extra":[{"entity":"@s","nbt":"data.\"EigSchwB.p1Richtung\"[2]","color":"gray","interpret":true},{"text":")"}],"color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Drehung um 180°"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 4"} },"\n",{"text":"richtung == ","bold":true},{"entity":"@s","nbt":"data.\"EigSchwB.p1Richtung\"[0]","interpret":true},"\n",{"text":"tempo = ","bold":true},{"text":"tempo + 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Tempo + 1"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 8"} },"\n",{"text":"tempo = ","bold":true},{"text":"tempo - 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Tempo - 1"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 9"} },"\n",{"text":"tempo == ","bold":true},{"score":{"name":"@s","objective":"PZSchwB.p1Wert"},"color":"dark_purple","bold":true},"\n",{"text":"tempomat = ","bold":true},{"text":"wahr","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Wert wahr"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 5"} },"\n",{"text":"tempomat = ","bold":true},{"text":"falsch","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Wert falsch"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 6"} },"\n",{"text":"tempomat == ","bold":true},{"entity":"@s","nbt":"data.\"EigSchwB.p1Tempomat\"","interpret":true},"\n",{"text":"solange(tempomat) fahren(tempo,richtung)","color":"gray","bold":true}]

# Falls der Spieler den Rüstungsständer ausgewählt hat, werden ihm die Spuren-Optionen angezeigt.
tellraw @s[scores={PZSchwB.p1Ausgewaehlt=2}] ["Schwebebahn.erweitert.1:\n",{"text":"hoehe = ","bold":true},{"text":"hoehe + 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Spur-Höhe + 1"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 10"} },"\n",{"text":"hoehe = ","bold":true},{"text":"hoehe - 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show_text","contents":{"text":"Tippe für Spur-Höhe - 1"} },"clickEvent":{"action":"run_command","value":"/trigger PZSchwB.p1Ausl set 11"} },"\n",{"text":"hoehe == ","bold":true},{"score":{"name":"@s","objective":"PZSchwB.p1Wert"},"color":"dark_purple","bold":true} ]

# Dem Spieler wird der Auslöser-Wert auf null gesetzt und er bekommt erneut die Berechtigung fürs auslösen.
scoreboard players enable @p[distance=..1,scores={PZSchwB.p1Ausgewaehlt=1..}] PZSchwB.p1Ausl
scoreboard players set @p[distance=..1,scores={PZSchwB.p1Ausgewaehlt=1..}] PZSchwB.p1Ausl 0

Variante 1: Drehen-Funktion
Die Drehen-Funktion prüft ob eine Drehung möglich ist und nur dann wird auch die Drehungs-Funktion geladen.

Editor Icon.png schwebebahn:vp1drehen.mcfunction
# Die beiden Variablen werden auf null gesetzt und werden im späteren Verlauf erhöht, wenn das Drehen möglich ist.
scoreboard players set VarSchwB.p1Spur PZSchwB.p1Wert 0
scoreboard players set VarSchwB.p1Drehen PZSchwB.p1Wert 0

# Möchte der Spieler nach rechts oder links drehen, wird geprüft ob sich an der entsprechenden Stelle überhaupt eine Spur befindet.
execute if entity @s[scores={PZSchwB.p1Ausl=2..3}] rotated ~90 0 positioned ^ ^-1 ^3 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] positioned ^ ^ ^-6 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p1Spur PZSchwB.p1Wert 1

# Wenn Spuren vorhanden sind, wird anschließend rechts wie auch links geprüft ob dort nichts im Weg ist.
scoreboard players set VarSchwB.p1Unbelegt PZSchwB.p1Wert 0
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if entity @s[scores={PZSchwB.p1Ausl=2..3}] store result score VarSchwB.p1Unbelegt PZSchwB.p1Wert run fill ^-20 ^ ^-2 ^-3 ^5 ^2 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 1.. run fill ^-20 ^ ^-2 ^-3 ^5 ^2 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 540 run scoreboard players set VarSchwB.p1Drehen PZSchwB.p1Wert 1

scoreboard players set VarSchwB.p1Unbelegt PZSchwB.p1Wert 0
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 1 if entity @s[scores={PZSchwB.p1Ausl=2..3}] store result score VarSchwB.p1Unbelegt PZSchwB.p1Wert run fill ^20 ^ ^-2 ^3 ^5 ^2 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 1 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 1.. run fill ^20 ^ ^-2 ^3 ^5 ^2 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p1Spur PZSchwB.p1Wert matches 1 if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 1 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 540 run scoreboard players set VarSchwB.p1Drehen PZSchwB.p1Wert 2

# Möchte der Spieler die Bahn um 180° umdrehen, dann wird ihm einfach der Wert gesetzt, da dies ohne Prüfung möglich ist.
execute if entity @s[scores={PZSchwB.p1Ausl=4}] run scoreboard players set VarSchwB.p1Drehen PZSchwB.p1Wert 2

# Wenn der Spieler die Bahn in eine andere Richtung drehen möchte in die die Bahn nicht gedreht werden kann, wird eine Fehlermeldung ausgegeben.
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 0..1 at @s[scores={PZSchwB.p1Ausl=2..4}] positioned ^ ^1 ^17 run tellraw @p[distance=..5,scores={PZSchwB.p1Ausgewaehlt=1}] ["Schwebebahn.erweitert.1:\n",{"text":"Die Schwebebahn kann an dieser Stelle nicht gedreht werden!","color":"red","bold":true}]

# Wenn das Drehen möglich ist, werden je nach Blickrichtung der Bahn die Insassen mit einem Etikett ausgestattet.
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 at @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ~-20 ~-1 ~-1 run tag @e[dx=39,dy=3,dz=3,tag=!EtiSchwB.p1Sitzen,tag=!EtiSchwB.p1Unbeachten] add EtiSchwB.p1Bewegen
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 at @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ~-1 ~-1 ~-20 run tag @e[dx=3,dy=3,dz=39,tag=!EtiSchwB.p1Sitzen,tag=!EtiSchwB.p1Unbeachten] add EtiSchwB.p1Bewegen

# Für die Drehung werden die Mittelpunkt-Koordinaten der Bahn in Variablen gespeichert.
execute store result score VarSchwB.p1X PZSchwB.p1Wert run data get entity @s Pos[0] 100
execute store result score VarSchwB.p1Z PZSchwB.p1Wert run data get entity @s Pos[2] 100

# Um die Richtung abfragen zu können, wird der Wert des Spielers in eine Variable gespeichert.
scoreboard players operation VarSchwB.p1Richtung PZSchwB.p1Wert = @s PZSchwB.p1Ausl

# Wenn das Drehen möglich ist, werden alle Insassen ausgewählt und diese rufen jeweils fürs sich die Drehungs-Funktion auf.
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 as @e[distance=..20,tag=EtiSchwB.p1Bewegen] run function schwebebahn:vp1drehung

# Wenn die Drehung möglich ist, werden alle Insassen so gedreht wie es der Fahrer vorgegeben hat.
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 at @s[scores={PZSchwB.p1Ausl=2}] as @e[distance=..20,tag=EtiSchwB.p1Bewegen] at @s run teleport @s ~ ~ ~ ~90 0
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 at @s[scores={PZSchwB.p1Ausl=3}] as @e[distance=..20,tag=EtiSchwB.p1Bewegen] at @s run teleport @s ~ ~ ~ ~-90 0
execute at @s[scores={PZSchwB.p1Ausl=4}] as @e[distance=..20,tag=EtiSchwB.p1Bewegen] at @s run teleport @s ~ ~ ~ ~180 0

# Danach wird das Etikett nicht mehr gebraucht und entfernt.
tag @e[distance=..20,tag=EtiSchwB.p1Bewegen] remove EtiSchwB.p1Bewegen

# Dem Bahn-Markierer wird die Richtungs-Eigenschaft gegeben, sodass sie abhängig der Blickrichtung, richtig sortiert werden kann.
data modify entity @s data."EigSchwB.p1Richtung" set value ['{"bold":true,"color":"gold","text":"Westen"}','{"bold":true,"color":"blue","text":"Norden"}','{"bold":true,"color":"gold","text":"Osten"}','{"bold":true,"color":"blue","text":"Süden"}']

data modify entity @s[y_rotation=135..45] data."EigSchwB.p1Richtung" append from entity @s data."EigSchwB.p1Richtung"[0]
data remove entity @s[y_rotation=135..45] data."EigSchwB.p1Richtung"[0]

data modify entity @s[y_rotation=-135..45] data."EigSchwB.p1Richtung" append from entity @s data."EigSchwB.p1Richtung"[0]
data remove entity @s[y_rotation=-135..45] data."EigSchwB.p1Richtung"[0]

data modify entity @s[y_rotation=-45..45] data."EigSchwB.p1Richtung" append from entity @s data."EigSchwB.p1Richtung"[0]
data remove entity @s[y_rotation=-45..45] data."EigSchwB.p1Richtung"[0]

# Wenn die Drehung möglich ist, wird die Bahn-Funktion von der neuen Richtung des Bahn-Markierers aus geladen.
execute if score VarSchwB.p1Drehen PZSchwB.p1Wert matches 2 at @s run function schwebebahn:vp1bahn

Variante 1: Drehungs-Funktion
Die Drehungs-Funktion sorgt dafür, dass die Insassen entweder um 90 Grad nach rechts oder links gedreht werden oder um 180 Grad.

Editor Icon.png schwebebahn:vp1drehung.mcfunction
# Die Position des Insassen wird ausgelesen und in Variablen gespeichert.
execute store result score VarSchwB.p1DX PZSchwB.p1Wert run data get entity @s Pos[0] 100
execute store result score VarSchwB.p1DZ PZSchwB.p1Wert run data get entity @s Pos[2] 100

# Von den Koordinaten des Insassen werden die Mittelpunkt-Koordinaten abgezogen um die Koordinaten auf den Nullpunkt zu bekommen.
scoreboard players operation VarSchwB.p1DX PZSchwB.p1Wert -= VarSchwB.p1X PZSchwB.p1Wert
scoreboard players operation VarSchwB.p1DZ PZSchwB.p1Wert -= VarSchwB.p1Z PZSchwB.p1Wert

# Je nach gewünschte Drehung nach rechts, links oder umgedrehen, wird eine der beiden oder beide Koordinaten mal minus eins gerechnet.
execute if score VarSchwB.p1Richtung PZSchwB.p1Wert matches 2..4 unless score VarSchwB.p1Richtung PZSchwB.p1Wert matches 3 run scoreboard players operation VarSchwB.p1DZ PZSchwB.p1Wert *= KonstSchwB.p1MINUSEINS PZSchwB.p1Wert
execute if score VarSchwB.p1Richtung PZSchwB.p1Wert matches 3..4 run scoreboard players operation VarSchwB.p1DX PZSchwB.p1Wert *= KonstSchwB.p1MINUSEINS PZSchwB.p1Wert
execute if score VarSchwB.p1Richtung PZSchwB.p1Wert matches 4 run scoreboard players operation VarSchwB.p1DZ PZSchwB.p1Wert >< VarSchwB.p1DX PZSchwB.p1Wert

# Ein Markierer wird an der Position des Insassen erzeugt. Dieser ehrält auch die exakte Rotation.
execute at @s run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p1Alle","EtiSchwB.p1Drehung"]}
execute at @s run teleport @e[type=minecraft:marker,tag=EtiSchwB.p1Drehung,sort=nearest,limit=1] ~ ~ ~ ~ ~

# Anschließend wird die neue Position berechnet und in den Markierer gespeichert.
execute store result entity @e[type=minecraft:marker,tag=EtiSchwB.p1Drehung,sort=nearest,limit=1] Pos[0] double 0.01 run scoreboard players operation VarSchwB.p1DZ PZSchwB.p1Wert += VarSchwB.p1X PZSchwB.p1Wert
execute store result entity @e[type=minecraft:marker,tag=EtiSchwB.p1Drehung,sort=nearest,limit=1] Pos[2] double 0.01 run scoreboard players operation VarSchwB.p1DX PZSchwB.p1Wert += VarSchwB.p1Z PZSchwB.p1Wert

# Der Insasse wird an die neue gedrehte Position teleportiert.
teleport @s @e[type=minecraft:marker,tag=EtiSchwB.p1Drehung,sort=nearest,limit=1]

# Danach wird der Markierer wieder gelöscht.
kill @e[type=minecraft:marker,tag=EtiSchwB.p1Drehung,sort=nearest,limit=1]

Variante 1: Fahren-Funktion
Die Fahren-Funktion prüft ob die Bahn vorwärts fahren kann und je nach eingestellten Tempo wird sie mehrmals einen Block voraus selbst erneut aufgerufen.

Editor Icon.png schwebebahn:vp1fahren.mcfunction
# Die beiden Variablen werden auf null gesetzt um später auf andere Werte gesetzt zu werden, sofern das möglich ist.
scoreboard players set VarSchwB.p1Ebene PZSchwB.p1Wert 0
scoreboard players set VarSchwB.p1Fahren PZSchwB.p1Wert 0

# Zuerst wird geprüft ob voraus eine Spur eine Ebene höher als die aktuelle Fahrbahn ist.
execute positioned ^ ^ ^21 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p1Ebene PZSchwB.p1Wert 3

# Wenn das nicht der Fall ist, wird geprüft ob sich die Bahn noch auf einer ebenen Spur befindet.
scoreboard players set VarSchwB.p1Unbelegt PZSchwB.p1Wert 0
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 0 store result score VarSchwB.p1Unbelegt PZSchwB.p1Wert positioned ^ ^-1 ^21 run fill ^ ^ ^ ^ ^ ^-40 minecraft:structure_void replace minecraft:stone_brick_stairs[half=bottom]
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 0 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 1.. if entity @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ^ ^-1 ^21 run fill ^ ^ ^ ^ ^ ^-40 minecraft:stone_brick_stairs[half=bottom,facing=west] replace minecraft:structure_void
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 0 if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 1.. if entity @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ^ ^-1 ^21 run fill ^ ^ ^ ^ ^ ^-40 minecraft:stone_brick_stairs[half=bottom,facing=north] replace minecraft:structure_void
execute if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 1.. run scoreboard players set VarSchwB.p1Ebene PZSchwB.p1Wert 2

# Wenn auch dass nicht mehr der Fall ist, wird geprüft ob die Spur eine Ebene unter der aktuellen Spur ist.
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 0 positioned ^ ^-2 ^-19 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p1Ebene PZSchwB.p1Wert 1

# Wenn alle drei Prüfungen fehl schlugen befindet sich garkeine Spur voraus und der Spieler erhält eine Fehlermeldung.
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 0 at @s positioned ^ ^1 ^17 run tellraw @p[distance=..5,scores={PZSchwB.p1Ausgewaehlt=1..}] ["Schwebebahn.erweitert.1:\n",{"text":"Keine Fahrbahn voraus!","color":"red","bold":true}]

# Wenn die Bahn ein Halten-Etikett besitzt, wird die Ebenen-Variable auf null gesetzt sodass scheinbar doch keine Spur voraus sei und der Spieler erhält eine Nachricht.
execute if entity @s[tag=EtiSchwB.p1Halten] run scoreboard players set VarSchwB.p1Ebene PZSchwB.p1Wert 0
execute at @s[tag=EtiSchwB.p1Halten] positioned ^ ^1 ^17 run tellraw @p[distance=..5,scores={PZSchwB.p1Ausgewaehlt=1..}] ["Schwebebahn.erweitert.1:\n",{"text":"Station oder Fahrbahn-Kreuzung erreicht!","color":"green","bold":true}]

# Das Etikett fürs Halten wird sofern vorhanden wieder entfernt und nur dann gegeben, wenn einen Block voraus eine rote Netherzoiegelstufe auf Spur-Ebene oder eine Ebene darunter sich befindet.
tag @s[tag=EtiSchwB.p1Halten] remove EtiSchwB.p1Halten
execute if block ^ ^-1 ^1 minecraft:red_nether_brick_slab run tag @s add EtiSchwB.p1Halten
execute if block ^ ^-2 ^1 minecraft:red_nether_brick_slab run tag @s add EtiSchwB.p1Halten

# Falls sich eine Spur voraus befindet, wird geprüft ob direkt vor der Bahn alles frei ist.
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 1..3 positioned ^ ^1 ^21 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air positioned ~ ~1 ~ if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air positioned ~ ~1 ~ if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players set VarSchwB.p1Fahren PZSchwB.p1Wert 1

# Anschließend wird geprüft ob der untere Bereich vor der Bahn frei ist.
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 1..2 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 1 positioned ^ ^ ^21 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players set VarSchwB.p1Fahren PZSchwB.p1Wert 2

# Ebenso wird geprüft ob der obere Bereich vor der Bahn frei ist.
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 2..3 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 1..2 positioned ^ ^4 ^21 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players add VarSchwB.p1Fahren PZSchwB.p1Wert 2

# Je nach dem was frei ist, wird dann geprüft ob die Bahn nach unten fahren kann. Ist der Bereich unter der Bahn frei wird die Variable entsprechend gesetzt.
scoreboard players set VarSchwB.p1Unbelegt PZSchwB.p1Wert 0
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 1 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 2 store result score VarSchwB.p1Unbelegt PZSchwB.p1Wert positioned ^2 ^-1 ^21 run fill ^ ^ ^ ^-4 ^ ^-40 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 1 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 2 positioned ^2 ^-1 ^21 run fill ^ ^ ^ ^-4 ^ ^-40 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 205 run scoreboard players set VarSchwB.p1Fahren PZSchwB.p1Wert 5

# Falls Bereiche frei sind, die fürs nach oben Fahren deuten, wird geprüft ob die Bahn nach oben fahren könnte und dann entsprechend eine Variable mit Wert gesetzt.
scoreboard players set VarSchwB.p1Unbelegt PZSchwB.p1Wert 0
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 3 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 3 store result score VarSchwB.p1Unbelegt PZSchwB.p1Wert positioned ^2 ^6 ^21 run fill ^ ^ ^ ^-4 ^ ^-40 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 3 if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 3 positioned ^2 ^6 ^21 run fill ^ ^ ^ ^-4 ^ ^-40 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p1Unbelegt PZSchwB.p1Wert matches 205 run scoreboard players set VarSchwB.p1Fahren PZSchwB.p1Wert 6

# Wenn eine Spur voraus war, aber der Bereich nicht frei ist, wird eine Fehlermeldung ausgegeben und der Tempomat deaktivert.
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 0..3 run data modify entity @s[nbt={data:{EigSchwB.p1Tempomat:'{"bold":true,"color":"green","text":"wahr"}'} }] data."EigSchwB.p1Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'
execute if score VarSchwB.p1Ebene PZSchwB.p1Wert matches 1.. if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 0..3 at @s positioned ^ ^1 ^17 run tellraw @p[distance=..5,scores={PZSchwB.p1Ausgewaehlt=1..}] ["Schwebebahn.erweitert.1:\n",{"text":"Fahrbahn ist blockiert!","color":"red","bold":true}]

# Wenn das Fahren möglich ist, wird die Bewegen-Variable auf eins gesetzt.
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 4..6 run scoreboard players set VarSchwB.p1Bewegen PZSchwB.p1Wert 1

# Ebenso werden alle Insassen, je nach Blickrichtung der Bahn, mit einem Etikett ausgestattet.
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 4..6 at @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ~-20 ~-1 ~-1 run tag @e[dx=39,dy=3,dz=3,tag=!EtiSchwB.p1Sitzen,tag=!EtiSchwB.p1Unbeachten] add EtiSchwB.p1Bewegen
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 4..6 at @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ~-1 ~-1 ~-20 run tag @e[dx=3,dy=3,dz=39,tag=!EtiSchwB.p1Sitzen,tag=!EtiSchwB.p1Unbeachten] add EtiSchwB.p1Bewegen

# Wenn das Fahren möglich ist, werden alle Insassen nach vorne bewegt und abhängig davon ob die Bahn nach unten oder oben fahren soll auch dies berücksichtigt.
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 4..6 at @s as @e[distance=..20,tag=EtiSchwB.p1Bewegen] positioned as @s run teleport @s ^ ^ ^1
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 5 as @e[distance=..20,tag=EtiSchwB.p1Bewegen] at @s run teleport @s ~ ~-1 ~
execute if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 6 as @e[distance=..20,tag=EtiSchwB.p1Bewegen] at @s run teleport @s ~ ~1 ~

# Danach wird das Etikett wieder entfernt.
tag @e[distance=..20,tag=EtiSchwB.p1Bewegen] remove EtiSchwB.p1Bewegen

# Jedesmal wenn diese Funktion sich selbst aufruft, wird die Tempo-Variable um eins reduziert. Falls jedoch das Fahren nicht möglich ist, wird sie direkt auf null gesetzt.
scoreboard players remove VarSchwB.p1Tempo PZSchwB.p1Wert 1
execute if score VarSchwB.p1Tempo PZSchwB.p1Wert matches 1.. if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 0..3 run scoreboard players set VarSchwB.p1Tempo PZSchwB.p1Wert 0

# Wenn die Fahrbahn frei ist, wird von der aktualisierten Position der Schwebebahn die Bahn-Funktion aufgerufen. Sofern die Temp-Variable bereits bei null angekommen ist, ansonsten wird diese Funktion erneut aufgerufen.
execute if score VarSchwB.p1Tempo PZSchwB.p1Wert matches 0 if score VarSchwB.p1Bewegen PZSchwB.p1Wert matches 1 at @s run function schwebebahn:vp1bahn
execute if score VarSchwB.p1Tempo PZSchwB.p1Wert matches 1.. if score VarSchwB.p1Fahren PZSchwB.p1Wert matches 4..6 at @s run function schwebebahn:vp1fahren

Variante 1: Bahn-Funktion
Die Bahn-Funktion löscht die Bahn an der alten Position und platziert sie an der neuen.

Editor Icon.png schwebebahn:vp1bahn.mcfunction
# Wenn der Spieler die Richtung ändert, wird die Schwebebahn an der alten Position entfernt, sodass die Schwebebahn an der neuen Position erscheinen kann, ohne Rückstände zu hinterlassen.
execute at @e[distance=..8,type=minecraft:marker,tag=EtiSchwB.p1AltePosition,sort=nearest,limit=1] run fill ^-2 ^ ^-20 ^2 ^5 ^20 minecraft:air replace

# Zwei Konstruktionsblöcke für den vorderen und den hinteren Teil der Bahn werden platziert.
setblock ^ ^ ^1 minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp1bahn",posY:0} replace
setblock ^ ^ ^-1 minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp1bahn",posY:0} replace

# Je nach Blickrcihtung werden die beiden Blöcke mit Daten versorgt.
execute if entity @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~-1 ~ ~ {rotation:"NONE",posX:-19,posZ:-2}
execute if entity @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~1 ~ ~ {rotation:"CLOCKWISE_180",mirror:"LEFT_RIGHT",posX:19,posZ:-2}

execute if entity @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~-1 {rotation:"CLOCKWISE_90",posX:2,posZ:-19}
execute if entity @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~1 {rotation:"COUNTERCLOCKWISE_90",mirror:"LEFT_RIGHT",posX:2,posZ:19}

# Danach werden die Blöcke mit Redstone-Blöcken aktiviert.
fill ^ ^1 ^-1 ^ ^1 ^1 minecraft:redstone_block replace

# Der Markierer für die alte Position wird an die aktuelle befördert.
teleport @e[distance=..8,type=minecraft:marker,tag=EtiSchwB.p1AltePosition,sort=nearest,limit=1] ~ ~ ~ ~ ~

Variante 1: Stopp-Funktion
Die Stopp-Funktion löscht alle Punkte-Ziele, Gegenstände und Objekte wieder.

Editor Icon.png schwebebahn:vp1stopp.mcfunction
# Die Punkte-Ziele werden wieder gelöscht.
scoreboard objectives remove PZSchwB.p1Ausgewaehlt
scoreboard objectives remove PZSchwB.p1Auswahl
scoreboard objectives remove PZSchwB.p1Ausl
scoreboard objectives remove PZSchwB.p1Wert

# Die Rüstungsständer und das Holzschwert werden entfernt.
clear @a minecraft:armor_stand{EigSchwB.p1Alle:true}
clear @a minecraft:wooden_sword{EigSchwB.p1Alle:true}

# Die Schwebahn wird entfernt.
execute at @e[type=minecraft:marker,tag=EtiSchwB.p1Bahn] run fill ^-2 ^ ^-20 ^2 ^5 ^20 minecraft:air replace

# Drops und alle Objekte werden entfernt.
tag @e[type=minecraft:item,nbt={Item:{tag:{EigSchwB.p1Alle:true} } }] add EtiSchwB.p1Alle
kill @e[tag=EtiSchwB.p1Alle]

# Der Chunk wird wieder entladen.
forceload remove ~ ~

Variante 2[]

Schwebebahn (Befehle, erweitert) Bild 2.1.png Schwebebahn (Befehle, erweitert) Bild 2.2.png Schwebebahn (Befehle, erweitert) Bild 2.3.png Schwebebahn (Befehle, erweitert) Bild 2.4.png Schwebebahn (Befehle, erweitert) Bild 2.5.png Schwebebahn (Befehle, erweitert) Bild 2.6.png

Diese Schwebebahn ist dem Hyperloop nachempfunden. Wie ihr reales Vorbild fährt sie in röhrenartigen Strecken entlang. Beim Einschalten erhält man vier Rüstungsständer. Einen für die Schwebebahn, einen für die normale Spur, einen für eine Spur-Kreuzung und einen für die Station. Wählt man einen der Spuren-Rüstungsständer aus, so kann man mit der taste F dafür sorgen, dass die Höhe angepasst werden kann. Mehrmaliges Drücken von F sorgt für eine höhere Höhe der Spur, wenn man den Rüstungsständer danach platziert. Platziert man den Rüstungsständer für die Schwebebahn, so wird diese erzeugt, sofern eine Spur darunter vorhanden ist und auf der Spur Platz für die Bahn ist. Man erhält dann ein Holzschwert das man zum Steuern nutzen kann, wenn man sich in die Lore in der Bahn gesetzt hat. Sitzt man mit dem Schwert, so erscheint eine Güterlore, die das Menü darstellt. Öffnet man das Inventar von dieser, erhält man über verschiedene Gegenstände die Möglichkeit bestimmte Einstellungen zu treffen. So kann man auf einen der drei Kompasse klicken um die Bahn zu drehen, sofern sie auf einer Kreuzung steht. Man kann ebenso auf die Lore oder Antriebslore klicken um den Tempomaten ein oder aus zu schalten. Es gibt auch ein Lagerfeuer dass das Tempo mit der Stapel-Anzahl anzeigt. Als letztes gibt es ein Fernrohr dass für die Ansicht verwendet wird. Klickt man auf dieses so wird man samt Lore außerhalb der Bahn hingesetzt, sodass man besser erkennen kann wo man hinfährt.

Einschalten

Wird der Hebel umgelegt, startet der Befehlsblock und führt die Start-Funktion einmal aus.

Wiederholen

Der Wiederhol-Befehlsblock führt jeden Tick die Zyklus-Funktion aus.

Ausschalten

Sobald der Hebel wieder in Ausgangsstellung zurück gelegt wurde, wird die Stopp-Funktion aktiviert.


Befehlsblöcke mit Befehlen:
Datenpaket


Variante 2: Start-Funktion
Die Start-Funktion erstellt die Punkte-Ziele und gibt den Spielern die vier verschiedenen Rüstungsständer.

Editor Icon.png schwebebahn:vp2start.mcfunction
# Es werden vier Punkte-Ziele erstellt.
scoreboard objectives add PZSchwB.p2Ausgewaehlt dummy ["Schwebebahn.erweitert.2: ",{"text":"Ausgewaehlter Wert","bold":true}]
scoreboard objectives add PZSchwB.p2Auswahl dummy ["Schwebebahn.erweitert.2: ",{"text":"Wert der Auswahl","bold":true}]
scoreboard objectives add PZSchwB.p2Ausl dummy ["Schwebebahn.erweitert.2: ",{"text":"Auslöser für Optionen","bold":true}]
scoreboard objectives add PZSchwB.p2Wert dummy ["Schwebebahn.erweitert.2: ",{"text":"Wert der Variablen","bold":true}]

# Eine Konstante für den Wert minus eins wird gesetzt.
scoreboard players set KonstSchwB.p2MINUSEINS PZSchwB.p2Wert -1

# Die Spieler erhalten vier Rüstungsständer, mit denen man die Bahn, die Spur, das Spur-Kreuz und die Station platzieren kann.
give @a[distance=..15] minecraft:armor_stand{EigSchwB.p2Alle:true,display:{Name:'{"text":"Hyperloop","color":"red","bold":true}',Lore:['"Platziere den Rüstungsständer"','"auf eine Hyperloop-Strecke"','"um eine Hyperloop"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Erstellen"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p2Alle:true,EigSchwB.p2Ausgewaehlt:2,display:{Name:'{"text":"Spur","color":"red","bold":true}',Lore:['"Drücke F um die Höhe einzustellen."','"Platziere den Rüstungsständer"','"um eine Hyperloop-Strecke"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Bauwerk","EtiSchwB.p2Spuren","EtiSchwB.p2Spur"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p2Alle:true,EigSchwB.p2Ausgewaehlt:2,display:{Name:'{"text":"Spur-Kreuz","color":"red","bold":true}',Lore:['"Drücke F um die Höhe einzustellen."','"Platziere den Rüstungsständer"','"um eine Hyperloop-Kreuzung"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Bauwerk","EtiSchwB.p2Spuren","EtiSchwB.p2SpurKreuz"] } }

give @a[distance=..15] minecraft:armor_stand{EigSchwB.p2Alle:true,display:{Name:'{"text":"Station","color":"red","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um eine Hyperloop-Station"','"zu erstellen"'] },EntityTag:{Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Bauwerk","EtiSchwB.p2Station"] } }

# Die Spieler erhalten eine Nachricht, wie sie die Bahn verwenden können.
tellraw @a[distance=..15] ["Schwebebahn.erweitert.2: ",{"text":"Drücke E um das Inventar zu öffnen und fahre mit der Maus über die Rüstungsständer, um zu erfahren wie man sie einsetzt um die Schwebebahn zu benutzen.","bold":true}]

# Der Chunk wird dauerhaft geladen.
forceload add ~ ~

Variante 2: Zyklus-Funktion
Die Zyklus-Funktion ruft die Bauwerks- und Erstellen-Funktion für die Spuren und Bahnen auf. Ebenso sorgt sie dafür, dass die Eingaben des Spielers für die Bahn ausgewertet werden.

Editor Icon.png schwebebahn:vp2zyklus.mcfunction
# An der Position eines gesetzten Rüstungsständer, der für Bauwerke verwendet wird, wird die Bauwerks-Funktion geladen.
execute as @e[type=minecraft:armor_stand,tag=EtiSchwB.p2Bauwerk] at @s align y run function schwebebahn:vp2bauwerk

# Wird die Schwebebahn platziert, wird die Erstellen-Funktion geladen.
execute as @e[type=minecraft:armor_stand,tag=EtiSchwB.p2Erstellen] at @s align y run function schwebebahn:vp2erstellen

# Wenn der Spieler sich in die Lore von der Schwebebahn gesetzt hat, erhält er ein Etikett.
execute at @e[type=minecraft:marker,tag=EtiSchwB.p2Bahn] run tag @p[distance=..20,nbt={RootVehicle:{Entity:{Tags:["EtiSchwB.p2Halter"]} } }] add EtiSchwB.p2Sitzen

# Den Wert den der Spieler vor einen Tick besaß wird kopiert um Rückschlüsse zu ziehen, was er zuvor ausgewählt hatte.
execute as @a run scoreboard players operation @s PZSchwB.p2Auswahl = @s PZSchwB.p2Ausgewaehlt

# Die Rüstungsständer und das Holzschwert besitzen eine spezielle Eigenschaft die einen wert besitzt, diese wird ausgelesen und gespeichert, falls ein anderer Gegenstand ausgewählt wurde, besitzt man den Wert null.
execute as @a store result score @s PZSchwB.p2Ausgewaehlt run data get entity @s SelectedItem.tag."EigSchwB.p2Ausgewaehlt"

# Hatte man vor einen Tick den Rüstungsständer ausgewählt für Spuren, und trägt diesen jetzt in der Zweithand, so wird ein Etikett vergeben.
tag @a[scores={PZSchwB.p2Ausgewaehlt=0,PZSchwB.p2Auswahl=2},nbt={Inventory:[{Slot:-106b,tag:{EigSchwB.p2Ausgewaehlt:2} } ] }] add EtiSchwB.p2Hoehe

# Wenn der Spieler dieses Etikett nicht mehr besitzt, wird der Wert auf null gesetzt.
scoreboard players set @a[tag=!EtiSchwB.p2Hoehe,scores={PZSchwB.p2Ausgewaehlt=0,PZSchwB.p2Auswahl=2}] PZSchwB.p2Wert 0

# Besitzt er das Etikett wird, sein wert um eins erhöht und der Rpüstungsständer wird wieder in die Haupthand gelegt.
scoreboard players add @a[tag=EtiSchwB.p2Hoehe] PZSchwB.p2Wert 1
execute as @a[tag=EtiSchwB.p2Hoehe] run item replace entity @s weapon.mainhand from entity @s weapon.offhand
execute as @a[tag=EtiSchwB.p2Hoehe] run item replace entity @s weapon.offhand with minecraft:air
tag @a[tag=EtiSchwB.p2Hoehe] remove EtiSchwB.p2Hoehe

# Wenn der Spieler den Rüstungsständer gerade ausgewählt hat, wird sein Wert auf null gesetzt, falls er noch keinen hatte. Anschließend wird sein Wert in dem Chat als Höhe angezeigt.
scoreboard players add @a[scores={PZSchwB.p2Ausgewaehlt=2,PZSchwB.p2Auswahl=0}] PZSchwB.p2Wert 0
execute as @a[scores={PZSchwB.p2Ausgewaehlt=2,PZSchwB.p2Auswahl=0}] run tellraw @s ["Schwebebahn.erweitert.2:\n",{"text":"hoehe == ","bold":true},{"score":{"name":"@s","objective":"PZSchwB.p2Wert"},"color":"dark_purple","bold":true}]

# Wenn der Spieler das Holzschwert ausgewählt hat und dabei nicht sitzt, wird ihm die Auswahl auf null gesetzt.
scoreboard players set @a[tag=!EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1,PZSchwB.p2Auswahl=1}] PZSchwB.p2Auswahl 0

# Wenn Spieler das Steuer gerade erst ausgewählt haben, wird an ihrer Position eine Güterlore erzeugt. Anschließend bekommt die Güterlore den Wert null.
execute at @a[tag=EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1,PZSchwB.p2Auswahl=0}] run summon minecraft:chest_minecart ~ ~0.5 ~ {NoGravity:true,Invulnerable:true,CustomName:'{"text":"Hyperloop","color":"red","bold":true}',Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Menu"]}
execute at @a[tag=EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1,PZSchwB.p2Auswahl=0}] run scoreboard players set @e[distance=..6,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] PZSchwB.p2Ausl 0

# Wenn der Spieler nicht sitzt aber das Schwert ausgewählt hat, wird seine Auswahl auf null gesetzt.
execute as @a[tag=!EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1}] store success score @s PZSchwB.p2Auswahl run scoreboard players set @s PZSchwB.p2Ausgewaehlt 0

# Wenn der Spieler das Holzschwert nicht mehr auswählt, wird die Güterlore geleert und anschließend gelöscht.
execute at @a[scores={PZSchwB.p2Ausgewaehlt=0,PZSchwB.p2Auswahl=1}] run data remove entity @e[distance=..6,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] Items
execute at @a[scores={PZSchwB.p2Ausgewaehlt=0,PZSchwB.p2Auswahl=1}] run kill @e[distance=..6,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1]

# Solange der Spieler das Holzschwert ausgewählt hat, wird die Güterlore immer an seine Position geholt.
execute at @a[scores={PZSchwB.p2Ausgewaehlt=1}] run teleport @e[distance=..6,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] ~ ~0.5 ~ ~ 0

#Von der Güterlore wird die Anzahl der belegten Slots ausgelesen und nur wenn sie nicht mit der normalen Anzahl übereinstimmt, wird die Menü-Funktion geladen.
execute as @e[type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu] store result score @s PZSchwB.p2Wert run data get entity @s Items
execute as @e[type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu] unless entity @s[scores={PZSchwB.p2Wert=6}] at @s run function schwebebahn:vp2menu

# Je nach ob der Spieler nicht sitzt oder sitzt und nicht das Schwert ausgewählt hat, wird die entsprechende Titel-Nachricht angezeigt.
title @a[tag=!EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1,PZSchwB.p2Auswahl=0}] actionbar ["",{"text":"Spieler sitzt == ","bold":true},{"text":"falsch","color":"red","bold":true}]
title @a[tag=EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=0,PZSchwB.p2Auswahl=1}] actionbar ["",{"text":"Steuer ausgewählt == ","color":"gray","bold":true},{"text":"falsch","color":"red","bold":true}]

# Die Eigenschaft für den Tempomat wird in den Namen des Bahn-Markierers kopiert, sodass man eine einfachere Abfragemöglichkeit hat.
execute as @e[type=minecraft:marker,tag=EtiSchwB.p2Bahn] run data modify entity @s CustomName set from entity @s data."EigSchwB.p2Tempomat"

# Wenn sich in der Nähe des Markierers kein Spieler aufhält der das Schwert ausgewählt hat, wird, falls der Tempomat aktiv ist, dieser deaktiviert, in dem die NBT-Eigenschaft geändert wird.
execute as @e[type=minecraft:marker,tag=EtiSchwB.p2Bahn,name="wahr"] at @s unless entity @p[distance=..18,tag=EtiSchwB.p2Sitzen,scores={PZSchwB.p2Ausgewaehlt=1}] run data modify entity @s data."EigSchwB.p2Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'

# Wenn der Markierer, der den Wahrheitswert für den Tempomat speichert, den Namen wahr besitzt, wird dem Fahrer der Wert sieben gegeben, sodass die Bahn losfährt. Dazu wird jeden Tick der Wert der Tick-Variable um eins erhöht und bei vier wieder auf null gesetzt. Das ermöglicht dem Fahrer, der die Option Tempomat gewählt hat, dass die Bahn nur alle vier Ticks nach vorne fährt.
scoreboard players add VarSchwB.p2Tick PZSchwB.p2Ausl 1
execute if score VarSchwB.p2Tick PZSchwB.p2Ausl matches 4.. at @e[type=minecraft:marker,tag=EtiSchwB.p2Bahn,name="wahr"] run data remove entity @e[distance=..18,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] Items[0]
execute if score VarSchwB.p2Tick PZSchwB.p2Ausl matches 4.. run scoreboard players set VarSchwB.p2Tick PZSchwB.p2Ausl 0

# Das Etikett wird wieder entfernt, damit der Spieler es nur besitzt, wenn er in der Bahn noch sitzt.
tag @a[tag=EtiSchwB.p2Sitzen] remove EtiSchwB.p2Sitzen

Variante 2: Bauwerks-Funktion
Die Bauwerks-Funktion erzeugt die Spuren oder Stationen.

Editor Icon.png schwebebahn:vp2bauwerk.mcfunction
# Die Richtung wird angepasst.
teleport @s[y_rotation=-45..45] ~ ~ ~ 0 0
teleport @s[y_rotation=45..135] ~ ~ ~ 90 0
teleport @s[y_rotation=135..-135] ~ ~ ~ 180 0
teleport @s[y_rotation=-135..-45] ~ ~ ~ -90 0

# Da der Rüstungsständer immer exakt 180° in die andere Richtung schaut wird er umgedreht.
execute at @s run teleport @s ~ ~ ~ ~180 0

# Der eingestellte Wert des Spielers wird kopiert.
scoreboard players operation @s PZSchwB.p2Wert = @p PZSchwB.p2Wert

# Ein Quarzblock für das Fundament der Spur wird platziert und anschließend wird die Bauwerks-Höhen-Funktion geladen.
execute at @s[tag=EtiSchwB.p2Spuren] run setblock ^ ^ ^15 minecraft:quartz_block replace
execute at @s[tag=EtiSchwB.p2Spuren] positioned ^ ^ ^15 run function schwebebahn:vp2bauwerk_hoehe

# Wenn die Station platziert werden soll, wird geprüft ob sich darunter überhaupt eine Spur befindet und nur dann wird der Konstruktionsblock dafür platziert und der Rüstungsständer ehrält dann den Wert eins.
execute at @s[tag=EtiSchwB.p2Station] store success score @s PZSchwB.p2Wert if block ~ ~-1 ~ minecraft:stone_brick_stairs[half=bottom] if block ^-1 ^-1 ^ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^-1 ^ minecraft:stone_brick_stairs[half=bottom] run setblock ^-20 ^-2 ^3 minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp2station",posY:0} replace

# Je nach Blickrichtung des Rüstungsständers werden die benötigten Daten in den Konstruktionsblock gespeichert.
execute at @s[tag=EtiSchwB.p2Station,y_rotation=-135..-45] run data merge block ^-20 ^-2 ^3 {rotation:"NONE",posX:0,posZ:-40}
execute at @s[tag=EtiSchwB.p2Station,y_rotation=-45..45] run data merge block ^-20 ^-2 ^3 {rotation:"CLOCKWISE_90",posX:40,posZ:0}
execute at @s[tag=EtiSchwB.p2Station,y_rotation=45..135] run data merge block ^-20 ^-2 ^3 {rotation:"CLOCKWISE_180",posX:0,posZ:40}
execute at @s[tag=EtiSchwB.p2Station,y_rotation=135..-135] run data merge block ^-20 ^-2 ^3 {rotation:"COUNTERCLOCKWISE_90",posX:-40,posZ:0}

# Nur wenn der Konstruktionsblock platziert werden konnte, wird ein Redstone-Block daneben platziert um diesen zu aktivieren.
execute at @s[tag=EtiSchwB.p2Station,scores={PZSchwB.p2Wert=1}] run setblock ^-20 ^-1 ^3 minecraft:redstone_block replace

# Es wird eine rote Netherziegelstufe platziert, sodass die Bahn dort hält.
execute at @s[tag=EtiSchwB.p2Station,scores={PZSchwB.p2Wert=1}] run setblock ~ ~-1 ~ minecraft:red_nether_brick_slab replace

# Falls keine Spur gefunden wurde um die Station zu platzieren, wird eine Fehlermeldung ausgegeben.
execute at @s[tag=EtiSchwB.p2Station] unless entity @s[scores={PZSchwB.p2Wert=1}] run tellraw @a[distance=..5] ["Schwebebahn.erweitert.2:\n",{"text":"Unter dem Rüstungsständer wurde keine Spur gefunden!","color":"red","bold":true}]

# Der Rüstungsständer wird anschließend gelöscht.
kill @s

Variante 2: Bauwerks-Höhen-Funktion
Die Bauwerks-Höhen-Funktion erzeugt die Spuren in der eingestellten Höhe.

Editor Icon.png schwebebahn:vp2bauwerk_hoehe.mcfunction
# Wurde die End-Höhe erreicht, wird der Konstruktionsblock platziert.
execute if entity @s[scores={PZSchwB.p2Wert=0}] run setblock ~ ~ ~ minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp2spur",posY:0} replace

# Je nach dem ob die Blickrichtung in Richtung Pole oder Äquator ist, werden entsprechende Daten kopiert.
execute if entity @s[scores={PZSchwB.p2Wert=0},y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~ ~ ~ {rotation:"NONE",posX:-15,posZ:-3}
execute if entity @s[scores={PZSchwB.p2Wert=0},y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_90",posX:3,posZ:-15}

# Der Redstone-Blöcke wird platziert um die Spur zu laden.
execute if entity @s[scores={PZSchwB.p2Wert=0}] run setblock ~ ~1 ~ minecraft:redstone_block replace

# Das Spur-Kreuz wird platziert.
execute if entity @s[tag=EtiSchwB.p2SpurKreuz,scores={PZSchwB.p2Wert=0}] run setblock ~ ~ ~ minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp2spur_kreuz",posY:0} replace

# Je nach Blickrichtung werden die entsprechenden Daten kopiert.
execute if entity @s[tag=EtiSchwB.p2SpurKreuz,scores={PZSchwB.p2Wert=0},y_rotation=-135..135] unless entity @s[y_rotation=-45..45] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_90",posX:3,posZ:-15}
execute if entity @s[tag=EtiSchwB.p2SpurKreuz,scores={PZSchwB.p2Wert=0},y_rotation=135..45] unless entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~ {rotation:"NONE",posX:-15,posZ:-3}

# Der Redstone-Block wird platziert.
execute if entity @s[tag=EtiSchwB.p2SpurKreuz,scores={PZSchwB.p2Wert=0}] run setblock ~ ~1 ~ minecraft:redstone_block replace

# Solange noch nicht die End-Höhe erreicht ist, werden Säulen platziert.
execute if entity @s[scores={PZSchwB.p2Wert=1..}] run setblock ^1 ^ ^ minecraft:quartz_pillar replace
execute if entity @s[scores={PZSchwB.p2Wert=1..}] run setblock ^-1 ^ ^ minecraft:quartz_pillar replace

# Solange noch nicht die End-Höhe erreicht ist, wird die Funktion um einen Block nach oben nochmal aufgerufen.
scoreboard players remove @s PZSchwB.p2Wert 1
execute if entity @s[scores={PZSchwB.p2Wert=0..}] positioned ~ ~1 ~ run function schwebebahn:vp2bauwerk_hoehe

Variante 2: Erstellen-Funktion
Die Erstellen-Funktion erzeugt die Bahn, wenn Spuren und Freiraum vorhanden sind.

Editor Icon.png schwebebahn:vp2erstellen.mcfunction
# Der Rüstungsständer wird ausgerichtet.
teleport @s[y_rotation=-45..45] ~ ~ ~ 0 0
teleport @s[y_rotation=45..135] ~ ~ ~ 90 0
teleport @s[y_rotation=135..-135] ~ ~ ~ 180 0
teleport @s[y_rotation=-135..-45] ~ ~ ~ -90 0

# Anschließend wird er umgedreht.
execute at @s run teleport @s ~ ~ ~ ~180 0

# Zuerst wird geprüft ob sich unter dem Rüstungsständer überhaupt eine Spur befindet und wenn nicht wird eine Fehlermeldung ausgegeben.
execute store result score @s PZSchwB.p2Wert if block ~ ~-1 ~ minecraft:stone_brick_stairs[half=bottom]
execute if entity @s[tag=EtiSchwB.p2Erstellen,scores={PZSchwB.p2Wert=0}] run tellraw @p[distance=..5] ["Schwebebahn.erweitert.2:\n",{"text":"Es wurde unter der zu erzeugenden Schwebebahn keine vollständige Schwebebahn-Spur gefunden!","color":"red","bold":true}]
tag @s[scores={PZSchwB.p2Wert=0}] remove EtiSchwB.p2Erstellen

# Falls die Spur um 90° gedreht an der Position ist, wird der Rüstungsständer gedreht.
execute at @s[scores={PZSchwB.p2Wert=1}] if block ^ ^-1 ^-1 minecraft:quartz_stairs[half=top] if block ^ ^-1 ^1 minecraft:quartz_stairs[half=top] run teleport @s ~ ~ ~ ~90 0

# Wenn sich eine Spur an der Position des Rüstungsständers befindet, wird ihm der Wert zwei gegeben.
execute at @s[scores={PZSchwB.p2Wert=1}] if block ^-1 ^-1 ^ minecraft:quartz_stairs[half=top] if block ^1 ^-1 ^ minecraft:quartz_stairs[half=top] run scoreboard players set @s PZSchwB.p2Wert 2
tag @s[scores={PZSchwB.p2Wert=1}] remove EtiSchwB.p2Erstellen

# Wenn eine Spur vorhanden ist, wird jetzt geprüft ob über der Spur genug Platz für die Bahn ist.
execute at @s[tag=EtiSchwB.p2Erstellen] store result score @s PZSchwB.p2Wert run fill ^-2 ^ ^-14 ^2 ^5 ^14 minecraft:structure_void replace minecraft:air
execute at @s[tag=EtiSchwB.p2Erstellen] run fill ^-2 ^ ^-14 ^2 ^5 ^14 minecraft:air replace minecraft:structure_void
tag @s[tag=EtiSchwB.p2Erstellen,scores={PZSchwB.p2Wert=..869}] remove EtiSchwB.p2Erstellen

# Falls kein Platz vorhanden ist, wird eine Fehlermeldung ausgegeben.
execute if entity @s[tag=!EtiSchwB.p2Erstellen] run tellraw @p[distance=..5] ["Schwebebahn.erweitert.2:\n",{"text":"Die Schwebebahn kann nicht an der geforderten Position erzeugt werden!","color":"red","bold":true}]

# Wenn alles in Ordnung ist, wird dem Spieler das Holzschwert für das Steuern der Bahn gegeben.
execute if entity @s[tag=EtiSchwB.p2Erstellen] run give @p[distance=..5] minecraft:wooden_sword{EigSchwB.p2Alle:true,EigSchwB.p2Steuer:true,EigSchwB.p2Ausgewaehlt:1,Unbreakable:true,HideFlags:6,AttributeModifiers:[{AttributeName:"minecraft:generic.attack_damage",Amount:-1,Name:"Extraschaden",Operation:0,UUID:[0,0,0,1],Slot:"mainhand"}],Enchantments:[{id:-1}],display:{Name:'{"text":"Steuer","color":"gold","bold":true}',Lore:['"Setze dich in die Lore"','"und wähle das Steuer aus"','"um die Bahn zu steuern."'] } }

# Der Markierer für die eigentliche Bahn wird erzeugt.
execute at @s[tag=EtiSchwB.p2Erstellen] run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Ausrichten","EtiSchwB.p2Bahn"],data:{EigSchwB.p2Tempomat:'{"bold":true,"color":"red","text":"falsch"}',EigSchwB.p2Ansicht:'{"bold":true,"color":"red","text":"falsch"}'} }

# Ein zweiter Markierer, der die alte Position der Bahn markiert, wird erzeugt.
execute at @e[distance=..1,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Ausrichten","EtiSchwB.p2Unbeachten","EtiSchwB.p2AltePosition"]}

# Ein unsichtbarer Rüstungsständer mit einer Lore darauf werden etwas versetzt von der Mitte erzeugt.
execute at @s run summon minecraft:armor_stand ^ ^1.3 ^8 {Small:true,Invisible:true,NoGravity:true,Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Ausrichten","EtiSchwB.p2Halter"],Passengers:[{id:"minecraft:minecart",Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Unbeachten","EtiSchwB.p2Sitz"] } ] }

# Die beiden Markierer und auch der Rüstungsständer werden entsprechend ausgerichtet.
execute at @s[tag=EtiSchwB.p2Erstellen] as @e[distance=..18,tag=EtiSchwB.p2Ausrichten,sort=nearest,limit=3] positioned as @s run teleport @s ~ ~ ~ ~ 0

# Danach wird ihnen das Etikett entfernt.
tag @e[distance=..18,tag=EtiSchwB.p2Ausrichten,sort=nearest,limit=3] remove EtiSchwB.p2Ausrichten

# Der Bahn-Markierer ruft die Bahn-Funktion auf und dabei wird ihm auch der Wert fürs Tempo auf eins gesetzt.
execute at @s as @e[distance=..1,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] at @s store success score @s PZSchwB.p2Wert run function schwebebahn:vp2bahn

# Anschließend wird der Rüstungsständer entfernt.
kill @s

Variante 2: Menü-Funktion
Die Menü-Funktion sorgt dafür, dass in der Güterlore die Gegenstände gesetzt werden, die als Schaltflächen benutzt werden.

Editor Icon.png schwebebahn:vp2menu.mcfunction
# Wenn der Spieler einen der Gegenstände in der Güterlore angeklickt hat oder mit Q rausgeworfen hat, wird ihm der Wert auf eins gesetzt.
execute as @a[distance=..5] store success score @s PZSchwB.p2Wert run clear @s #schwebebahn:vp2menu{EigSchwB.p2Alle:true}
execute as @a[distance=..5,scores={PZSchwB.p2Wert=0}] store success score @s PZSchwB.p2Wert run kill @e[distance=..5,type=minecraft:item,nbt={Item:{tag:{EigSchwB.p2Alle:true} } }]

# Wenn der Spieler auf eine der drei Kompasse geklickt hat, wird die entsprechende Richtung als Wert gespeichert.
execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] run scoreboard players set @s[nbt=!{Items:[{Slot:4b,id:"minecraft:compass",Count:1b}]}] PZSchwB.p2Ausl 4

execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] run scoreboard players set @s[nbt=!{Items:[{Slot:12b,id:"minecraft:compass",Count:1b}]}] PZSchwB.p2Ausl 3

execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] run scoreboard players set @s[nbt=!{Items:[{Slot:14b,id:"minecraft:compass",Count:1b}]}] PZSchwB.p2Ausl 2

# Danach wird die Richtung in den Bahn-Markierer kopiert.
execute store success score @s PZSchwB.p2Ausl run scoreboard players operation @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] PZSchwB.p2Ausl = @s PZSchwB.p2Ausl

# Anschließend wird geprüft ob der Markierer die Eigenschaft für die Richtung besitzt und falls nicht erhält er den Wert eins. Wenn er den Wert eins bis vier besitzt wird die Drehen-Funktion geladen.
execute as @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,scores={PZSchwB.p2Ausl=0},sort=nearest,limit=1] store success score @s PZSchwB.p2Ausl unless data entity @s data."EigSchwB.p2Richtung"[1]
execute as @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,scores={PZSchwB.p2Ausl=1..4},sort=nearest,limit=1] at @s run function schwebebahn:vp2drehen

# Wenn der Spieler auf das Lagerfeuer geklickt hat, wird ein etikett zur Markierung vergeben.
execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] if entity @s[nbt=!{Items:[{Slot:22b,id:"minecraft:campfire"}]}] run tag @s add EtiSchwB.p2Tempo

# Der Wert der Bahn wird kopiert.
scoreboard players operation @s[tag=EtiSchwB.p2Tempo] PZSchwB.p2Wert = @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] PZSchwB.p2Wert

# Anschließend wird der Wert um eins erhöht, falls er aber vier oder höher ereicht, wird er wieder auf eins gesetzt.
scoreboard players add @s[tag=EtiSchwB.p2Tempo] PZSchwB.p2Wert 1
scoreboard players set @s[scores={PZSchwB.p2Wert=4..}] PZSchwB.p2Wert 1

# Das aktuelle Tempo wird als Nachricht angezeigt.
execute if entity @s[tag=EtiSchwB.p2Tempo] run tellraw @p[distance=..5,scores={PZSchwB.p2Wert=1}] ["Schwebebahn.erweitert.2:\n",{"text":"tempo == ","bold":true},{"score":{"name":"@s","objective":"PZSchwB.p2Wert"},"color":"dark_purple","bold":true}]

# Danach wird das neue Tempo wieder in den Bahn-Markierer kopiert.
execute if entity @s[tag=EtiSchwB.p2Tempo] run scoreboard players operation @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] PZSchwB.p2Wert = @s PZSchwB.p2Wert

# Das Etikett wird wieder entfernt.
tag @s[tag=EtiSchwB.p2Tempo] remove EtiSchwB.p2Tempo

# Das Lagerfeuer wird in den entsprechenden Slot gesetzt.
item replace entity @s container.22 with minecraft:campfire{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Tempo","color":"dark_purple","bold":true}'} }

# Je nach Tempo wird die Stapel-Anzahl angepasst.
execute store result entity @s[scores={PZSchwB.p2Wert=2..}] Items[{Slot:22b}].Count byte 1 run scoreboard players get @s PZSchwB.p2Wert

# Wenn das Fernrohr angeklickt wurde wird ein Etikett vergeben.
execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] if entity @s[nbt=!{Items:[{Slot:3b,Count:1b}]}] run tag @s add EtiSchwB.p2Ansicht

# Zuerst wird das Etikett entfernt um es anschließend wieder zu vergeben, wenn der Bahn-Markierer die Eigenschaft besitzt.
tag @s[tag=EtiSchwB.p2Ansicht] remove EtiSchwB.p2AnsichtWahr
execute if entity @s[tag=EtiSchwB.p2Ansicht] if entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,nbt={data:{EigSchwB.p2Ansicht:'{"bold":true,"color":"red","text":"falsch"}'} },sort=nearest,limit=1] run tag @s add EtiSchwB.p2AnsichtWahr

# Je nach dem ob die Ansicht aktiviert oder deaktivert werden soll, wird die Eigenschaft angepasst.
execute if entity @s[tag=EtiSchwB.p2Ansicht,tag=!EtiSchwB.p2AnsichtWahr] run data modify entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Ansicht" set value '{"bold":true,"color":"red","text":"falsch"}'
execute if entity @s[tag=EtiSchwB.p2Ansicht,tag=EtiSchwB.p2AnsichtWahr] run data modify entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Ansicht" set value '{"bold":true,"color":"green","text":"wahr"}'

# Je nach Ansicht wird die Lore in die Bahn oder vor die Bahn teleportiert.
execute if entity @s[tag=EtiSchwB.p2Ansicht,tag=!EtiSchwB.p2AnsichtWahr] at @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] run teleport @e[distance=..20,type=minecraft:armor_stand,tag=EtiSchwB.p2Halter,sort=nearest,limit=1] ^ ^1.3 ^8

execute if entity @s[tag=EtiSchwB.p2Ansicht,tag=EtiSchwB.p2AnsichtWahr] at @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] run teleport @e[distance=..20,type=minecraft:armor_stand,tag=EtiSchwB.p2Halter,sort=nearest,limit=1] ^ ^1.3 ^14

# Die Güterlore wird an die neue Position teleportiert.
execute if entity @s[tag=EtiSchwB.p2Ansicht] at @e[distance=..20,type=minecraft:armor_stand,tag=EtiSchwB.p2Halter,sort=nearest,limit=1] run teleport @s ~ ~ ~

# Das Etikett wird entfernt.
tag @s[tag=EtiSchwB.p2Ansicht] remove EtiSchwB.p2Ansicht

# Wenn die Lore angeklickt wurde, wird ein Etikett vergeben.
execute if entity @p[distance=..5,scores={PZSchwB.p2Wert=1}] if entity @s[nbt=!{Items:[{Slot:13b,Count:1b}]}] run tag @s add EtiSchwB.p2Tempomat

# Es wird der aktuelle Zustand ausgelesen.
execute if entity @s[tag=EtiSchwB.p2Tempomat] store success score VarSchwB.p2Tempomat PZSchwB.p2Wert if entity @s[tag=EtiSchwB.p2TempomatWahr]

# Je nach Zustand wird der jeweils andere aktiv.
execute if entity @s[tag=EtiSchwB.p2Tempomat] if score VarSchwB.p2Tempomat PZSchwB.p2Wert matches 0 run tag @s add EtiSchwB.p2TempomatWahr
execute if entity @s[tag=EtiSchwB.p2Tempomat] if score VarSchwB.p2Tempomat PZSchwB.p2Wert matches 1 run tag @s remove EtiSchwB.p2TempomatWahr

# Danach wird das Etikett entfernt.
tag @s[tag=EtiSchwB.p2Tempomat] remove EtiSchwB.p2Tempomat

# Die Eigenschaft Tempomat wird entsprechend gesetzt.
execute if entity @s[tag=!EtiSchwB.p2TempomatWahr] run data modify entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'
execute if entity @s[tag=EtiSchwB.p2TempomatWahr] run data modify entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Tempomat" set value '{"bold":true,"color":"green","text":"wahr"}'

# Je nach dem ob die Ansicht aktiv oder nicht aktiv ist, wird das Fernrohr mit entsprechenden Text in den Slot gelegt.
item replace entity @s[tag=!EtiSchwB.p2AnsichtWahr] container.3 with minecraft:spyglass{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Ansicht = wahr","color":"green","bold":true}'} }
item replace entity @s[tag=EtiSchwB.p2AnsichtWahr] container.3 with minecraft:spyglass{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Ansicht = falsch","color":"red","bold":true}'} }

# Die drei Kompasse werden in die entsprechenden Slots gelegt.
item replace entity @s container.4 with minecraft:compass{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Drehung = 180","color":"gold","bold":true}'} }
item replace entity @s container.12 with minecraft:compass{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Drehung = Links","color":"blue","bold":true}'} }
item replace entity @s container.14 with minecraft:compass{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Drehung = Rechts","color":"blue","bold":true}'} }

# Die drei Kompasse bekommen entsprechende Beschreibungen in denen die neue Richtung angezeigt wird.
data modify entity @s Items[{Slot:4b}].tag.display.Lore append from entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Richtung"[2]
data modify entity @s Items[{Slot:12b}].tag.display.Lore append from entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Richtung"[-1]
data modify entity @s Items[{Slot:14b}].tag.display.Lore append from entity @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,sort=nearest,limit=1] data."EigSchwB.p2Richtung"[1]

# Je nach dem ob der Tempomat aktiv oder nicht aktiv ist, wird eine Lore oder Antriebslore in den Slot gelegt.
item replace entity @s[tag=!EtiSchwB.p2TempomatWahr] container.13 with minecraft:minecart{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Tempomat == falsch","color":"red","bold":true}'} }
item replace entity @s[tag=EtiSchwB.p2TempomatWahr] container.13 with minecraft:furnace_minecart{EigSchwB.p2Alle:true,EigSchwB.p2Menu:true,display:{Name:'{"text":"Tempomat == wahr","color":"green","bold":true}'} }

# Wenn die Bahn einen aktiven Tempomaten besitzt, wird der Wert entsprechend gesetzt.
scoreboard players set @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,nbt={data:{EigSchwB.p2Tempomat:'{"bold":true,"color":"green","text":"wahr"}'} },sort=nearest,limit=1] PZSchwB.p2Ausl 7

# Bevor die Fahren-Funktion aufgerufen wird, werden die Variablen entsprechend gesetzt.
scoreboard players set VarSchwB.p2Bewegen PZSchwB.p2Wert 0
scoreboard players operation VarSchwB.p2Tempo PZSchwB.p2Wert = @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,scores={PZSchwB.p2Ausl=7},sort=nearest,limit=1] PZSchwB.p2Wert
execute as @e[distance=..20,type=minecraft:marker,tag=EtiSchwB.p2Bahn,scores={PZSchwB.p2Ausl=7},sort=nearest,limit=1] at @s run function schwebebahn:vp2fahren

Variante 2: Drehen-Funktion
Die Drehen-Funktion dreht die Bahn um 90 oder 180 Grad, wenn die Spuren vorhanden sind und auch der Freiraum.

Editor Icon.png schwebebahn:vp2drehen.mcfunction
# Die beiden Variablen werden auf null gesetzt und werden im späteren Verlauf erhöht, wenn das Drehen möglich ist.
scoreboard players set VarSchwB.p2Spur PZSchwB.p2Wert 0
scoreboard players set VarSchwB.p2Drehen PZSchwB.p2Wert 0

# Möchte der Spieler nach rechts oder links drehen, wird geprüft ob sich an der entsprechenden Stelle überhaupt eine Spur befindet.
execute if entity @s[scores={PZSchwB.p2Ausl=2..3}] rotated ~90 0 positioned ^ ^-1 ^3 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] positioned ^ ^ ^-6 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p2Spur PZSchwB.p2Wert 1

# Wenn Spuren vorhanden sind, wird anschließend rechts wie auch links geprüft ob dort nichts im Weg ist.
scoreboard players set VarSchwB.p2Unbelegt PZSchwB.p2Wert 0
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if entity @s[scores={PZSchwB.p2Ausl=2..3}] store result score VarSchwB.p2Unbelegt PZSchwB.p2Wert run fill ^-14 ^ ^-2 ^-3 ^5 ^2 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 1.. run fill ^-14 ^ ^-2 ^-3 ^5 ^2 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 360 run scoreboard players set VarSchwB.p2Drehen PZSchwB.p2Wert 1

scoreboard players set VarSchwB.p2Unbelegt PZSchwB.p2Wert 0
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 1 if entity @s[scores={PZSchwB.p2Ausl=2..3}] store result score VarSchwB.p2Unbelegt PZSchwB.p2Wert run fill ^14 ^ ^-2 ^3 ^5 ^2 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 1 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 1.. run fill ^14 ^ ^-2 ^3 ^5 ^2 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p2Spur PZSchwB.p2Wert matches 1 if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 1 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 360 run scoreboard players set VarSchwB.p2Drehen PZSchwB.p2Wert 2

# Möchte der Spieler die Bahn um 180° umdrehen, dann wird ihm einfach der Wert gesetzt, da dies ohne Prüfung möglich ist.
execute if entity @s[scores={PZSchwB.p2Ausl=4}] run scoreboard players set VarSchwB.p2Drehen PZSchwB.p2Wert 2

# Wenn der Spieler die Bahn in eine andere Richtung drehen möchte in die die Bahn nicht gedreht werden kann, wird eine Fehlermeldung ausgegeben.
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 0..1 at @s[scores={PZSchwB.p2Ausl=2..4}] positioned ^ ^1 ^11 run tellraw @p[distance=..5,scores={PZSchwB.p2Ausgewaehlt=1}] ["Schwebebahn.erweitert.2:\n",{"text":"Die Schwebebahn kann an dieser Stelle nicht gedreht werden!","color":"red","bold":true}]

# Wenn das Drehen möglich ist, werden je nach Blickrichtung der Bahn die Insassen mit einem Etikett ausgestattet.
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 at @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ~-14 ~-1 ~-1 run tag @e[dx=27,dy=3,dz=3,tag=!EtiSchwB.p2Sitzen,tag=!EtiSchwB.p2Unbeachten] add EtiSchwB.p2Bewegen
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 at @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ~-1 ~-1 ~-14 run tag @e[dx=3,dy=3,dz=27,tag=!EtiSchwB.p2Sitzen,tag=!EtiSchwB.p2Unbeachten] add EtiSchwB.p2Bewegen

# Für die Drehung werden die Mittelpunkt-Koordinaten der Bahn in Variablen gespeichert.
execute store result score VarSchwB.p2X PZSchwB.p2Wert run data get entity @s Pos[0] 100
execute store result score VarSchwB.p2Z PZSchwB.p2Wert run data get entity @s Pos[2] 100

# Um die Richtung abfragen zu können, wird der Wert des Spielers in eine Variable gespeichert.
scoreboard players operation VarSchwB.p2Richtung PZSchwB.p2Wert = @s PZSchwB.p2Ausl

# Wenn das Drehen möglich ist, werden alle Insassen ausgewählt und diese rufen jeweils fürs sich die Drehungs-Funktion auf.
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 as @e[distance=..20,tag=EtiSchwB.p2Bewegen] run function schwebebahn:vp2drehung

# Wenn die Drehung möglich ist, werden alle Insassen so gedreht wie es der Fahrer vorgegeben hat.
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 at @s[scores={PZSchwB.p2Ausl=2}] as @e[distance=..20,tag=EtiSchwB.p2Bewegen] at @s run teleport @s ~ ~ ~ ~90 0
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 at @s[scores={PZSchwB.p2Ausl=3}] as @e[distance=..20,tag=EtiSchwB.p2Bewegen] at @s run teleport @s ~ ~ ~ ~-90 0
execute at @s[scores={PZSchwB.p2Ausl=4}] as @e[distance=..20,tag=EtiSchwB.p2Bewegen] at @s run teleport @s ~ ~ ~ ~180 0

# Danach wird das Etikett nicht mehr gebraucht und entfernt.
tag @e[distance=..20,tag=EtiSchwB.p2Bewegen] remove EtiSchwB.p2Bewegen

# Dem Bahn-Markierer wird die Richtungs-Eigenschaft gegeben, sodass sie abhängig der Blickrichtung, richtig sortiert werden kann.
data modify entity @s data."EigSchwB.p2Richtung" set value ['{"bold":true,"color":"gold","text":"Westen"}','{"bold":true,"color":"blue","text":"Norden"}','{"bold":true,"color":"gold","text":"Osten"}','{"bold":true,"color":"blue","text":"Süden"}']

data modify entity @s[y_rotation=135..45] data."EigSchwB.p2Richtung" append from entity @s data."EigSchwB.p2Richtung"[0]
data remove entity @s[y_rotation=135..45] data."EigSchwB.p2Richtung"[0]

data modify entity @s[y_rotation=-135..45] data."EigSchwB.p2Richtung" append from entity @s data."EigSchwB.p2Richtung"[0]
data remove entity @s[y_rotation=-135..45] data."EigSchwB.p2Richtung"[0]

data modify entity @s[y_rotation=-45..45] data."EigSchwB.p2Richtung" append from entity @s data."EigSchwB.p2Richtung"[0]
data remove entity @s[y_rotation=-45..45] data."EigSchwB.p2Richtung"[0]

# Wenn die Drehung möglich ist, wird die Bahn-Funktion von der neuen Richtung des Bahn-Markierers aus geladen.
execute if score VarSchwB.p2Drehen PZSchwB.p2Wert matches 2 at @s run function schwebebahn:vp2bahn

Variante 2: Drehungs-Funktion
Die Drehungs-Funktion dreht die Insassen entsprechend der eingestellten Drehung.

Editor Icon.png schwebebahn:vp2drehung.mcfunction
# Die Position des Insassen wird ausgelesen und in Variablen gespeichert.
execute store result score VarSchwB.p2DX PZSchwB.p2Wert run data get entity @s Pos[0] 100
execute store result score VarSchwB.p2DZ PZSchwB.p2Wert run data get entity @s Pos[2] 100

# Von den Koordinaten des Insassen werden die Mittelpunkt-Koordinaten abgezogen um die Koordinaten auf den Nullpunkt zu bekommen.
scoreboard players operation VarSchwB.p2DX PZSchwB.p2Wert -= VarSchwB.p2X PZSchwB.p2Wert
scoreboard players operation VarSchwB.p2DZ PZSchwB.p2Wert -= VarSchwB.p2Z PZSchwB.p2Wert

# Je nach gewünschte Drehung nach rechts, links oder umgedrehen, wird eine der beiden oder beide Koordinaten mal minus eins gerechnet.
execute if score VarSchwB.p2Richtung PZSchwB.p2Wert matches 2..4 unless score VarSchwB.p2Richtung PZSchwB.p2Wert matches 3 run scoreboard players operation VarSchwB.p2DZ PZSchwB.p2Wert *= KonstSchwB.p2MINUSEINS PZSchwB.p2Wert
execute if score VarSchwB.p2Richtung PZSchwB.p2Wert matches 3..4 run scoreboard players operation VarSchwB.p2DX PZSchwB.p2Wert *= KonstSchwB.p2MINUSEINS PZSchwB.p2Wert
execute if score VarSchwB.p2Richtung PZSchwB.p2Wert matches 4 run scoreboard players operation VarSchwB.p2DZ PZSchwB.p2Wert >< VarSchwB.p2DX PZSchwB.p2Wert

# Ein Markierer wird an der Position des Insassen erzeugt. Dieser ehrält auch die exakte Rotation.
execute at @s run summon minecraft:marker ~ ~ ~ {Tags:["EtiSchwB.p2Alle","EtiSchwB.p2Drehung"]}
execute at @s run teleport @e[type=minecraft:marker,tag=EtiSchwB.p2Drehung,sort=nearest,limit=1] ~ ~ ~ ~ ~

# Anschließend wird die neue Position berechnet und in den Markierer gespeichert.
execute store result entity @e[type=minecraft:marker,tag=EtiSchwB.p2Drehung,sort=nearest,limit=1] Pos[0] double 0.01 run scoreboard players operation VarSchwB.p2DZ PZSchwB.p2Wert += VarSchwB.p2X PZSchwB.p2Wert
execute store result entity @e[type=minecraft:marker,tag=EtiSchwB.p2Drehung,sort=nearest,limit=1] Pos[2] double 0.01 run scoreboard players operation VarSchwB.p2DX PZSchwB.p2Wert += VarSchwB.p2Z PZSchwB.p2Wert

# Der Insasse wird an die neue gedrehte Position teleportiert.
teleport @s @e[type=minecraft:marker,tag=EtiSchwB.p2Drehung,sort=nearest,limit=1]

# Danach wird der Markierer wieder gelöscht.
kill @e[type=minecraft:marker,tag=EtiSchwB.p2Drehung,sort=nearest,limit=1]

Variante 2: Fahren-Funktion
Die Fahren-Funktion prüft ob das Fahren nach vorne möglich ist und bewegt die Insassen nach vorne.

Editor Icon.png schwebebahn:vp2fahren.mcfunction
# Die beiden Variablen werden auf null gesetzt um später auf andere Werte gesetzt zu werden, sofern das möglich ist.
scoreboard players set VarSchwB.p2Ebene PZSchwB.p2Wert 0
scoreboard players set VarSchwB.p2Fahren PZSchwB.p2Wert 0

# Zuerst wird geprüft ob voraus eine Spur eine Ebene höher als die aktuelle Fahrbahn ist.
execute positioned ^ ^ ^15 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p2Ebene PZSchwB.p2Wert 3

# Wenn das nicht der Fall ist, wird geprüft ob sich die Bahn noch auf einer ebenen Spur befindet.
scoreboard players set VarSchwB.p2Unbelegt PZSchwB.p2Wert 0
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 0 store result score VarSchwB.p2Unbelegt PZSchwB.p2Wert positioned ^ ^-1 ^15 run fill ^ ^ ^ ^ ^ ^-28 minecraft:structure_void replace minecraft:stone_brick_stairs[half=bottom]
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 0 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 1.. if entity @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ^ ^-1 ^15 run fill ^ ^ ^ ^ ^ ^-28 minecraft:stone_brick_stairs[half=bottom,facing=west] replace minecraft:structure_void
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 0 if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 1.. if entity @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ^ ^-1 ^15 run fill ^ ^ ^ ^ ^ ^-28 minecraft:stone_brick_stairs[half=bottom,facing=north] replace minecraft:structure_void
execute if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 1.. run scoreboard players set VarSchwB.p2Ebene PZSchwB.p2Wert 2

# Wenn auch dass nicht mehr der Fall ist, wird geprüft ob die Spur eine Ebene unter der aktuellen Spur ist.
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 0 positioned ^ ^-2 ^-13 if block ~ ~ ~ minecraft:stone_brick_stairs[half=bottom] if block ^1 ^ ^ minecraft:quartz_stairs[half=top] if block ^-1 ^ ^ minecraft:quartz_stairs[half=top] run scoreboard players set VarSchwB.p2Ebene PZSchwB.p2Wert 1

# Wenn alle drei Prüfungen fehl schlugen befindet sich garkeine Spur voraus und der Spieler erhält eine Fehlermeldung.
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 0 at @s positioned ^ ^1 ^11 run tellraw @p[distance=..5,scores={PZSchwB.p2Ausgewaehlt=1..}] ["Schwebebahn.erweitert.2:\n",{"text":"Keine Fahrbahn voraus!","color":"red","bold":true}]

# Wenn die Bahn ein Halten-Etikett besitzt, wird die Ebenen-Variable auf null gesetzt sodass scheinbar doch keine Spur voraus sei und der Spieler erhält eine Nachricht.
execute if entity @s[tag=EtiSchwB.p2Halten] run scoreboard players set VarSchwB.p2Ebene PZSchwB.p2Wert 0
execute at @s[tag=EtiSchwB.p2Halten] positioned ^ ^1 ^11 run tellraw @p[distance=..5,scores={PZSchwB.p2Ausgewaehlt=1..}] ["Schwebebahn.erweitert.2:\n",{"text":"Station oder Fahrbahn-Kreuzung erreicht!","color":"green","bold":true}]

# Das Etikett fürs Halten wird sofern vorhanden wieder entfernt und nur dann gegeben, wenn einen Block voraus eine rote Netherzoiegelstufe auf Spur-Ebene oder eine Ebene darunter sich befindet.
tag @s[tag=EtiSchwB.p2Halten] remove EtiSchwB.p2Halten
execute if block ^ ^-1 ^1 minecraft:red_nether_brick_slab run tag @s add EtiSchwB.p2Halten
execute if block ^ ^-2 ^1 minecraft:red_nether_brick_slab run tag @s add EtiSchwB.p2Halten

# Falls sich eine Spur voraus befindet, wird geprüft ob direkt vor der Bahn alles frei ist.
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 1..3 positioned ^ ^1 ^15 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air positioned ~ ~1 ~ if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air positioned ~ ~1 ~ if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players set VarSchwB.p2Fahren PZSchwB.p2Wert 1

# Anschließend wird geprüft ob der untere Bereich vor der Bahn frei ist.
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 1..2 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 1 positioned ^ ^ ^15 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players set VarSchwB.p2Fahren PZSchwB.p2Wert 2

# Ebenso wird geprüft ob der obere Bereich vor der Bahn frei ist.
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 2..3 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 1..2 positioned ^ ^4 ^15 if block ~ ~ ~ minecraft:air if block ^-1 ^ ^ minecraft:air if block ^1 ^ ^ minecraft:air if block ^-2 ^ ^ minecraft:air if block ^2 ^ ^ minecraft:air run scoreboard players add VarSchwB.p2Fahren PZSchwB.p2Wert 2

# Je nach dem was frei ist, wird dann geprüft ob die Bahn nach unten fahren kann. Ist der Bereich unter der Bahn frei wird die Variable entsprechend gesetzt.
scoreboard players set VarSchwB.p2Unbelegt PZSchwB.p2Wert 0
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 1 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 2 store result score VarSchwB.p2Unbelegt PZSchwB.p2Wert positioned ^2 ^-1 ^15 run fill ^ ^ ^ ^-4 ^ ^-28 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 1 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 2 positioned ^2 ^-1 ^15 run fill ^ ^ ^ ^-4 ^ ^-28 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 145 run scoreboard players set VarSchwB.p2Fahren PZSchwB.p2Wert 5

# Falls Bereiche frei sind, die fürs nach oben Fahren deuten, wird geprüft ob die Bahn nach oben fahren könnte und dann entsprechend eine Variable mit Wert gesetzt.
scoreboard players set VarSchwB.p2Unbelegt PZSchwB.p2Wert 0
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 3 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 3 store result score VarSchwB.p2Unbelegt PZSchwB.p2Wert positioned ^2 ^6 ^15 run fill ^ ^ ^ ^-4 ^ ^-28 minecraft:structure_void replace minecraft:air
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 3 if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 3 positioned ^2 ^6 ^15 run fill ^ ^ ^ ^-4 ^ ^-28 minecraft:air replace minecraft:structure_void
execute if score VarSchwB.p2Unbelegt PZSchwB.p2Wert matches 145 run scoreboard players set VarSchwB.p2Fahren PZSchwB.p2Wert 6

# Wenn eine Spur voraus war, aber der Bereich nicht frei ist, wird eine Fehlermeldung ausgegeben und der Tempomat deaktivert.
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 0..3 run data modify entity @s[nbt={data:{EigSchwB.p2Tempomat:'{"bold":true,"color":"green","text":"wahr"}'} }] data."EigSchwB.p2Tempomat" set value '{"bold":true,"color":"red","text":"falsch"}'
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 0..3 run tag @e[distance=..18,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] remove EtiSchwB.p2TempomatWahr
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 0..3 run data remove entity @e[distance=..18,type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu,sort=nearest,limit=1] Items[0]
execute if score VarSchwB.p2Ebene PZSchwB.p2Wert matches 1.. if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 0..3 at @s positioned ^ ^1 ^11 run tellraw @p[distance=..5,scores={PZSchwB.p2Ausgewaehlt=1..}] ["Schwebebahn.erweitert.2:\n",{"text":"Fahrbahn ist blockiert!","color":"red","bold":true}]

# Wenn das Fahren möglich ist, wird die Bewegen-Variable auf eins gesetzt.
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 4..6 run scoreboard players set VarSchwB.p2Bewegen PZSchwB.p2Wert 1

# Ebenso werden alle Insassen, je nach Blickrichtung der Bahn, mit einem Etikett ausgestattet.
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 4..6 at @s[y_rotation=-135..135] unless entity @s[y_rotation=-45..45] positioned ~-14 ~-1 ~-1 run tag @e[dx=27,dy=3,dz=3,tag=!EtiSchwB.p2Sitzen,tag=!EtiSchwB.p2Unbeachten] add EtiSchwB.p2Bewegen
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 4..6 at @s[y_rotation=135..45] unless entity @s[y_rotation=-135..-45] positioned ~-1 ~-1 ~-14 run tag @e[dx=3,dy=3,dz=27,tag=!EtiSchwB.p2Sitzen,tag=!EtiSchwB.p2Unbeachten] add EtiSchwB.p2Bewegen

# Wenn das Fahren möglich ist, werden alle Insassen nach vorne bewegt und abhängig davon ob die Bahn nach unten oder oben fahren soll auch dies berücksichtigt.
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 4..6 at @s as @e[distance=..20,tag=EtiSchwB.p2Bewegen] positioned as @s run teleport @s ^ ^ ^1
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 5 as @e[distance=..20,tag=EtiSchwB.p2Bewegen] at @s run teleport @s ~ ~-1 ~
execute if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 6 as @e[distance=..20,tag=EtiSchwB.p2Bewegen] at @s run teleport @s ~ ~1 ~

# Danach wird das Etikett wieder entfernt.
tag @e[distance=..20,tag=EtiSchwB.p2Bewegen] remove EtiSchwB.p2Bewegen

# Jedesmal wenn diese Funktion sich selbst aufruft, wird die Tempo-Variable um eins reduziert. Falls jedoch das Fahren nicht möglich ist, wird sie direkt auf null gesetzt.
scoreboard players remove VarSchwB.p2Tempo PZSchwB.p2Wert 1
execute if score VarSchwB.p2Tempo PZSchwB.p2Wert matches 1.. if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 0..3 run scoreboard players set VarSchwB.p2Tempo PZSchwB.p2Wert 0

# Wenn die Fahrbahn frei ist, wird von der aktualisierten Position der Schwebebahn die Bahn-Funktion aufgerufen. Sofern die Temp-Variable bereits bei null angekommen ist, ansonsten wird diese Funktion erneut aufgerufen.
execute if score VarSchwB.p2Tempo PZSchwB.p2Wert matches 0 if score VarSchwB.p2Bewegen PZSchwB.p2Wert matches 1 at @s run function schwebebahn:vp2bahn
execute if score VarSchwB.p2Tempo PZSchwB.p2Wert matches 1.. if score VarSchwB.p2Fahren PZSchwB.p2Wert matches 4..6 at @s run function schwebebahn:vp2fahren

Variante 2: Bahn-Funktion
Die Bahn-Funktion löscht die Bahn an der alten Position und setzt sie an der neuen Position.

Editor Icon.png schwebebahn:vp2bahn.mcfunction
# Wenn der Spieler die Richtung ändert, wird die Schwebebahn an der alten Position entfernt, sodass die Schwebebahn an der neuen Position erscheinen kann, ohne Rückstände zu hinterlassen.
execute at @e[distance=..8,type=minecraft:marker,tag=EtiSchwB.p2AltePosition,sort=nearest,limit=1] run fill ^-2 ^ ^-14 ^2 ^5 ^14 minecraft:air replace

# Der Konstruktionsblock wird platziert.
setblock ~ ~ ~ minecraft:structure_block{mode:"LOAD",name:"schwebebahn:vp2bahn",posY:0} replace

# Je nach Blickrichtung der Bahn werden bestimmte Daten übertragen.
execute if entity @s[y_rotation=45..135] run data merge block ~ ~ ~ {rotation:"NONE",posX:-14,posZ:-2}
execute if entity @s[y_rotation=135..-135] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_90",posX:2,posZ:-14}
execute if entity @s[y_rotation=-135..-45] run data merge block ~ ~ ~ {rotation:"CLOCKWISE_180",posX:14,posZ:2}
execute if entity @s[y_rotation=-45..45] run data merge block ~ ~ ~ {rotation:"COUNTERCLOCKWISE_90",posX:-2,posZ:14}

# Der Redstone-Block wird zum Aktivieren platziert.
setblock ~ ~1 ~ minecraft:redstone_block replace

# Der Markierer für die alte Position wird an die aktuelle befördert.
teleport @e[distance=..8,type=minecraft:marker,tag=EtiSchwB.p2AltePosition,sort=nearest,limit=1] ~ ~ ~ ~ ~

Variante 2: Stopp-Funktion
Die Stopp-Funktion löscht die Punkte-Ziele, die Gegenstände und Objekte wieder.

Editor Icon.png schwebebahn:vp2stopp.mcfunction
# Die Punkte-Ziele werden gelöscht.
scoreboard objectives remove PZSchwB.p2Ausgewaehlt
scoreboard objectives remove PZSchwB.p2Auswahl
scoreboard objectives remove PZSchwB.p2Ausl
scoreboard objectives remove PZSchwB.p2Wert

# Die Rüstungsständer und das Schwert werden aus dem Inventar entfernt.
clear @a minecraft:armor_stand{EigSchwB.p2Alle:true}
clear @a minecraft:wooden_sword{EigSchwB.p2Alle:true}

# Die Bahn wird entfernt.
execute at @e[type=minecraft:marker,tag=EtiSchwB.p2Bahn] run fill ^-2 ^ ^-14 ^2 ^5 ^14 minecraft:air replace

# Die Güter-Lore mit der Benutzeroberfläche wird geleert, damit sie beim Löschen nicht ihren Inhalt droppt.
execute as @e[type=minecraft:chest_minecart,tag=EtiSchwB.p2Menu] run data remove entity @s Items

# Die Drops und Objekte werden gelöscht.
tag @e[type=minecraft:item,nbt={Item:{tag:{EigSchwB.p2Alle:true} } }] add EtiSchwB.p2Alle
kill @e[tag=EtiSchwB.p2Alle]

# Der Chunk wird entladen.
forceload remove ~ ~
Advertisement