Bankautomat (Befehle)

Ein **Bankautomat** ermöglicht es, für jeden Spieler, an einem beliebigen Ort mit Automat, Beträge von seinem Konto sich ein- oder auszahlen zu lassen. Der Vorteil besteht darin, dass der Spieler nicht alles bei sich tragen muss und stattdessen zu einem Automaten gehen kann, um dort seine Beträge abzuholen. Er kann aber nur soviel herausholen wie er auch vorher eingezahlt hat. Ins Minus kann daher das Konto nie gelangen.

## Variante 1

* Grundmodule
* Befehl
* Befehlssignal
* Grund-Element (Befehle)
* Signal-Element (Befehle)
* Signalleitung (Befehle)
* Vorrichtungen
* Anlagen
 * Speicherzelle (Befehle)
* Benutzerschnittstelle (Befehle)
* Standort-Markierung (Befehle)
* Zähler (Befehle)
* Drop-Sensor (Befehle)
* Anzeigetafel

* 1 Redstone-Fackel
* 2 Befehlsblock
* 1 Wiederhol-Befehlsblock

Man erhält beim Einschalten einen Rüstungsständer, welcher platziert werden kann, um den Automaten an der gewünschten Position zu erzeugen. Ebenso erhält man zu Beginn 64 Smaragde die man auch sofort einzahlen kann. Dazu stellt man sich neben den Automaten und man erhält ohne weiteres Zutun eine Chat-Nachricht. Klickt man T um den Chat zu öffnen, kann man die Maus frei bewegen und so auch über die Schaltflächen manövrieren. Man kann in dem Menü einen gewünschten Betrag per Schaltflächen einstellen. Hat man den gewünschten eingestellt, kann man auf die Schaltflächen fürs Buchen klicken. Dann wird der entsprechende Betrag gutgeschrieben oder abgezogen. Ebenso werden die Smaragde aus dem Inventar entfernt oder dazu gegeben. Den Automaten kann man entfernen, in dem man die Werkbank abbaut. Dann erscheint ein Drop des Rüstungsständer, mit dem man den Automaten wieder errichten kann.

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

* Befehl 1.1 Die Funktion bankautomat:v1start wird aktiviert.

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

* Befehl 1.2 die Funktion bankautomat:v1zyklus wird jeden Tick erneut ausgeführt.

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

* Befehl 1.3 Die Funktion bankautomat:v1stopp wird einmal ausgeführt.

```
function bankautomat:v1start

```

↑ 1.2:

```
function bankautomat:v1zyklus

```

↑ 1.3:

```
function bankautomat:v1stopp

```

* *Maschinen*
	+ pack.mcmeta
	+ data
		- *bankautomat*
			* functions
				+ v1start.mcfunction
				+ v1zyklus.mcfunction
				+ v1ausloeser.mcfunction
				+ v1buchen.mcfunction
				+ v1stopp.mcfunction

Variante 1: **Start-Funktion**

Die Start-Funktion erstellt die Punkte-Ziele und gibt dem Spieler den Rüstungsständer (Automat) und Smaragde um sie einzuzahlen.

```
# Zwei Punkte-Ziele für den Kontostand und den Auslöser werden erstellt.
scoreboard objectives add PZBankA.1Wert dummy ["Bankautomat.1: ",{"text":"Kontostand","bold":true}]
scoreboard objectives add PZBankA.1Ausl trigger ["Bankautomat.1: ",{"text":"Auslöser","bold":true}]

# Eine Konstante für das Rechnen.
scoreboard players set KonstBankA.1ZWEI PZBankA.1Wert 2

# Spieler im Umkreis von 15 Metern bekommen 16 Rüstungsständer und 64 Smaragde.
give @a[distance=..15] minecraft:armor\_stand{EigBankA.1Alle:true,display:{Name:'{"text":"Bankautomat","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um einen Bankautomat"','"zu erstellen"'] },EntityTag:{NoGravity:true,Invisible:true,CustomNameVisible:true,CustomName:'{"text":"Bankautomat","color":"gold","bold":true}',Tags:["EtiBankA.1Alle","EtiBankA.1Automat"]} } 16

give @a[distance=..15] minecraft:emerald{EigBankA.1Alle:true} 64

```

Variante 1: **Zyklus-Funktion**

Die Zyklus-Funktion sorgt für die Partikel-Kreise um die Automaten, sie sorgt dafür, dass der Automat in Form ein Werkbank platziert wird und dafür, dass der Spieler die Möglichkeit erhält Schaltflächen im Chat anzuklicken.

```
# Um den Automaten wird eine Kreislinie gezogen.
execute as @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat] at @s run teleport @s ~ ~ ~ ~5 0
execute at @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat] run particle minecraft:totem\_of\_undying ^ ^0.5 ^5 0 0 0 0.1 10 force @a[distance=..15]

# Wenn der Automat das erste mal gesetzt wurde und kein anderer Automat in der Nähe ist, wird eine Werkbank an dessen Stelle gesetzt. Ebenso bekommt er den Wert eins dafür.
execute as @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat] unless entity @s[scores={PZBankA.1Wert=1..}] at @s unless entity @e[distance=1..10,type=minecraft:armor\_stand,tag=EtiBankA.1Automat,limit=1] store success score @s PZBankA.1Wert run setblock ~ ~ ~ minecraft:crafting\_table replace

# Je nach dem ob an der Position des Automatens eine Werkbank ist, wird ihm der Wert null oder eins gegeben.
execute as @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat] at @s store success score @s PZBankA.1Ausl if block ~ ~ ~ minecraft:crafting\_table

# Wenn keine Werkbank vorhanden ist, wird ein Drop erzeugt und der Automat-Rüstungsständer wird entfernt.
execute at @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat,scores={PZBankA.1Ausl=0}] run summon minecraft:item ~ ~ ~ {Item:{id:"minecraft:armor\_stand",Count:1b,tag:{EigBankA.1Alle:true,display:{Name:'{"text":"Bankautomat","color":"dark\_purple","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um einen Bankautomat"','"zu erstellen"'] },EntityTag:{NoGravity:true,Invisible:true,CustomNameVisible:true,CustomName:'{"text":"Bankautomat","color":"dark\_purple","bold":true}',Tags:["EtiBankA.1Alle","EtiBankA.1Automat"]} } },Motion:[0.0d,0.3d,0.0d]}
kill @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat,scores={PZBankA.1Ausl=0}]

# Wenn Spieler sich dem Automaten nähern, wird ihnen ein Etikett gegeben.
execute as @a at @s if entity @e[distance=..5,type=minecraft:armor\_stand,tag=EtiBankA.1Automat,sort=nearest,limit=1] run tag @s add EtiBankA.1Anwesend

# Wenn Spieler erst gerade dabei sind, wird ihnen der Auslöse-Wert gesetzt, ansonsten wieder entfernt.
scoreboard players set @a[tag=EtiBankA.1Anwesend,tag=!EtiBankA.1Dabei] PZBankA.1Ausl -99
scoreboard players reset @a[tag=!EtiBankA.1Anwesend,tag=EtiBankA.1Dabei] PZBankA.1Ausl

# Wenn Spieler beim Automaten sind und dabei auf die Schaltflächen im Chat geklickt haben, wird die Auslöser-Funktion geladen.
execute as @a[tag=EtiBankA.1Anwesend] unless entity @s[scores={PZBankA.1Ausl=0}] at @s as @e[distance=..5,type=minecraft:armor\_stand,tag=EtiBankA.1Automat,sort=nearest,limit=1] run function bankautomat:v1ausloeser

# Je nach dem, ob die Spieler gerade beim Automaten sind oder nicht wird ihnen dementsprechend ein Etikett gegeben oder entfernt.
tag @a[tag=EtiBankA.1Anwesend,tag=!EtiBankA.1Dabei] add EtiBankA.1Dabei
tag @a[tag=!EtiBankA.1Anwesend,tag=EtiBankA.1Dabei] remove EtiBankA.1Dabei

# Das Etikett wird wieder entfernt.
tag @a[tag=EtiBankA.1Anwesend] remove EtiBankA.1Anwesend

```

Variante 1: **Auslöser-Funktion**

Die Auslöser-Funktion prüft die Eingaben des Spielers und reagiert entsprechend. Die Schaltflächen werden im Chat angezeigt.

```
# Der Wert des Spielers wird ausgelesen und in den Wert des Rüstungsständers gespeichert. Falls der Spieler nicht gefunden wurde, wird stattdessen der Wert null gespeichert. Zusätzlich bekommt der Spieler den Wert null aufsummiert, sodass er in jedem Fall einen Wert besitzt, falls er noch keinen hat.
execute store result score @s PZBankA.1Ausl run scoreboard players get @p[distance=..1] PZBankA.1Ausl
scoreboard players add @p[distance=..1] PZBankA.1Wert 0

# Der Wert der Buchtung wird um eins erhöht oder verringert.
scoreboard players add @s[scores={PZBankA.1Ausl=1}] PZBankA.1Wert 1
scoreboard players remove @s[scores={PZBankA.1Ausl=-1,PZBankA.1Wert=2..}] PZBankA.1Wert 1

# Der Wert der Buchung wird mal oder geteilt durch zwei genommen.
scoreboard players operation @s[scores={PZBankA.1Ausl=2}] PZBankA.1Wert \*= KonstBankA.1ZWEI PZBankA.1Wert
scoreboard players operation @s[scores={PZBankA.1Ausl=-2,PZBankA.1Wert=2..}] PZBankA.1Wert /= KonstBankA.1ZWEI PZBankA.1Wert

# Falls der Wert der Buchung den maximalen Wert überschreitet wird er entsprechend auf das Maximum gesetzt.
scoreboard players set @s[scores={PZBankA.1Ausl=1..2,PZBankA.1Wert=2305..}] PZBankA.1Wert 2304

# Der Betrag des Spielers wird auf den Rüstungsständer übertragen.
scoreboard players operation @s[scores={PZBankA.1Ausl=-3}] PZBankA.1Wert = @p[distance=..1] PZBankA.1Wert

# Die Anzahl der Smaragde des Spielers wird ausgelesen.
execute if entity @s[scores={PZBankA.1Ausl=3..4}] store result score VarBankA.1Anzahl PZBankA.1Wert run clear @p[distance=..1] minecraft:emerald 0

# Der Wert wird auf die Anzahl festgelegt.
scoreboard players operation @s[scores={PZBankA.1Ausl=3}] PZBankA.1Wert = VarBankA.1Anzahl PZBankA.1Wert

# Reicht der Wert nicht aus, weil der Spieler nicht genug Smaragde bei sich hat, wird der Auslöse-Wert auf null gesetzt.
execute if score @s[scores={PZBankA.1Ausl=4}] PZBankA.1Wert > VarBankA.1Anzahl PZBankA.1Wert run scoreboard players set @s PZBankA.1Ausl 0

# Reicht der Wert nicht aus, bekommt der Spieler eine Fehlermeldung.
execute if entity @s[scores={PZBankA.1Ausl=0}] run tellraw @p[distance=..1,scores={PZBankA.1Ausl=4}] ["Bankautomat.1:\n",{"text":"Du hast nichts oder nicht genug um es einzuzahlen!","color":"red","bold":true} ]

# Wenn das Inventar genug Smaragde beinhaltet, wird die Variable auf die Anzahl der Smaragde gesetzt und anschließend wird die Buchen-Funktion vom Spieler aus aufgerufen.
execute if entity @s[scores={PZBankA.1Ausl=4}] run scoreboard players operation VarBankA.1Anzahl PZBankA.1Wert = @s PZBankA.1Wert
execute if entity @s[scores={PZBankA.1Ausl=4}] as @p[distance=..1,] run function bankautomat:v1buchen

# Der Betrag wird dem Spieler gutgeschrieben.
execute if entity @s[scores={PZBankA.1Ausl=4}] run scoreboard players operation @p[distance=..1] PZBankA.1Wert += @s PZBankA.1Wert

# Wenn der Spieler seinen Betrag auf der Bank abbuchen will, muss er mindestens genauso viel auf dem Konto haben, ansonsten wird der Wert auf null gesetzt.
execute if score @s[scores={PZBankA.1Ausl=-4}] PZBankA.1Wert > @p[distance=..1] PZBankA.1Wert run scoreboard players set @s PZBankA.1Ausl 0

# Hat der Spieler nicht genug, wird ihm eine Fehlermeldung ausgegeben.
execute if entity @s[scores={PZBankA.1Ausl=0}] run tellraw @p[distance=..1,scores={PZBankA.1Ausl=-4}] ["Bankautomat.1:\n",{"text":"Du hast nichts auf deinem Konto um es auszahlen zu lassen!","color":"red","bold":true} ]

# Falls der Spieler einen Betrag größer als 127 abbuchen will, wird ihm ebenfalls eine Fehlermeldung gegeben.
scoreboard players set @s[scores={PZBankA.1Ausl=-4,PZBankA.1Wert=128..}] PZBankA.1Ausl 0
execute if entity @s[scores={PZBankA.1Ausl=0,PZBankA.1Wert=128..}] run tellraw @p[distance=..1,scores={PZBankA.1Ausl=-4}] ["Bankautomat.1:\n",{"text":"Man kann maximal den Wert 127 vom Konto abbuchen!","color":"red","bold":true} ]

# Der Drop wird erzeugt, sodass der Spieler ihn direkt aufnehmen kann.
execute if entity @s[scores={PZBankA.1Ausl=-4}] run summon minecraft:item ~ ~ ~ {PickupDelay:32767s,Item:{id:"minecraft:emerald",Count:1b},Tags:["EtiBankA.1Alle","EtiBankA.1Ware"]}
execute if entity @s[scores={PZBankA.1Ausl=-4}] store result entity @e[type=minecraft:item,tag=EtiBankA.1Ware,sort=nearest,limit=1] Item.Count byte 1 run scoreboard players get @s PZBankA.1Wert
execute if entity @s[scores={PZBankA.1Ausl=-4}] run data modify entity @e[type=minecraft:item,tag=EtiBankA.1Ware,sort=nearest,limit=1] PickupDelay set value 0

# Der abgebuchte Betrag wird vom Konto abgezogen.
execute if entity @s[scores={PZBankA.1Ausl=-4}] run scoreboard players operation @p[distance=..1,scores={PZBankA.1Ausl=-4}] PZBankA.1Wert -= @s PZBankA.1Wert

# Dem Spieler wird die Nachricht im Chat angezeigt, in dem sich mehrere Schaltflächen befinden auf die er klicken kann.
tellraw @p[distance=..1] ["Bankautomat.1:\n",{"text":"buchung = ","bold":true},{"text":"buchung + 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Buchung + 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set 1"},"bold":true},"\n",{"text":"buchung = ","bold":true},{"text":"buchung - 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Buchung - 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set -1"},"bold":true},"\n",{"text":"buchung = ","bold":true},{"text":"buchung \* 2","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Buchung \* 2"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set 2"},"bold":true},"\n",{"text":"buchung = ","bold":true},{"text":"buchung / 2","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Buchung / 2"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set -2"},"bold":true},"\n",{"text":"buchung = ","bold":true},{"text":"kontostand","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für alles vom Konto"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set -3"},"bold":true},"\n",{"text":"buchung = ","bold":true},{"text":"Inventar()","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für alles im Inventar"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set 3"},"bold":true},"\n",{"text":"buchung == ","bold":true},{"score":{"name":"@s","objective":"PZBankA.1Wert"},"color":"dark\_purple","bold":true},{"text":"€","color":"dark\_purple","bold":true},"\n",{"text":"kontostand = ","bold":true},{"text":"haben(buchung)","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Betrag aus Inventar buchen"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set 4"},"bold":true},"\n",{"text":"kontostand = ","bold":true},{"text":"soll(buchung)","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Betrag vom Konto buchen"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBankA.1Ausl set -4"},"bold":true},"\n",{"text":"kontostand == ","bold":true},{"score":{"name":"@p[distance=..1]","objective":"PZBankA.1Wert"},"color":"dark\_purple","bold":true},{"text":"€","color":"dark\_purple","bold":true}]

# Der Wert wird wieder auf null gesetzt und der Spieler bekommt die Berechtigung erneut auf die Schaltflächen klicken zu können.
scoreboard players enable @p[distance=..1] PZBankA.1Ausl
scoreboard players set @p[distance=..1] PZBankA.1Ausl 0

```

Variante 1: **Buchen-Funktion**

Die Buchen-Funktion zieht aus dem Inventar die eingestellte Menge ab.

```
# Es wird dem Spieler entsprechend so viel abgezogen wie er es eingestellt hat.
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 64.. run clear @s minecraft:emerald 64
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 64.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 64

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 32.. run clear @s minecraft:emerald 32
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 32.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 32

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 16.. run clear @s minecraft:emerald 16
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 16.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 16

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 8.. run clear @s minecraft:emerald 8
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 8.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 8

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 4.. run clear @s minecraft:emerald 4
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 4.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 4

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 2.. run clear @s minecraft:emerald 2
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 2.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 2

execute if score VarBankA.1Anzahl PZBankA.1Wert matches 1.. run clear @s minecraft:emerald 1
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 1.. run scoreboard players remove VarBankA.1Anzahl PZBankA.1Wert 1

# Wenn noch immer nicht alle Gegenstände abgezogen wurden, wird diese Funktion erneut aufgerufen.
execute if score VarBankA.1Anzahl PZBankA.1Wert matches 1.. run function bankautomat:v1buchen

```

Variante 1: **Stopp-Funktion**

Die Stopp-Funktion löscht die Punkte-Ziele, die Gegenstände und Etiketten wieder.

```
# Die zwei Punkte-Ziele werden entfernt.
scoreboard objectives remove PZBankA.1Wert
scoreboard objectives remove PZBankA.1Ausl

# Die Gegenstände werden aus dem Inventar gelöscht.
clear @a[nbt={Inventory:[{tag:{EigBankA.1Alle:true} } ] }] minecraft:emerald
clear @a minecraft:armor\_stand{EigBankA.1Alle:true}

# Das eventuell noch vorhandene Etikett wird entfernt.
tag @a[tag=EtiBankA.1Dabei] remove EtiBankA.1Dabei

# An der Position des Automaten wird die Werkbank entfernt.
execute at @e[type=minecraft:armor\_stand,tag=EtiBankA.1Automat] run setblock ~ ~ ~ minecraft:air replace

# Gedroppte Gegenstände und die Rüstungsständer werden entfernt.
tag @e[type=minecraft:item,nbt={Item:{tag:{EigBankA.1Alle:true} } }] add EtiBankA.1Alle
kill @e[tag=EtiBankA.1Alle]

```

*Spendermaschine* => Redstone;
*Lagermaschine* => Redstone;
*Tauschmaschine* => Redstone, Befehle;
***Bankautomat* =>** **Befehle**;