Bestenliste (Befehle)

Die **Bestenliste** ermöglicht, dass Anzeigen von Punkteständen, Ränge und Spielernamen. Die Ränge werden durch die Punktestände berechnet. Meist werden Bestenlisten in Minispielen eingesetzt.

## Variante 1

* Grundmodule
* Befehl
* Befehlssignal
* Grund-Element (Befehle)
* Signal-Element (Befehle)
* Signalleitung (Befehle)
* Vorrichtungen
 * Zufallsgenerator (Befehle)
* Zähler (Befehle)
* Funktion
* Datenpaket

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

Diese Bestenliste bietet dem Spieler die Möglichkeit, einzustellen, wie viele Spieler auf der Bestenliste maximal gelistet werden sollen. Platziert man dann den Rüstungsständer, wird eine Bestenliste mit der eingestellten Anzahl an Plätzen erzeugt. Der Spieler mit den meisten Punkten wird ganz oben angezeigt, während der mit den wenigsten unten angezeigt wird. Es können aber auch deutlich mehr Spieler mitmachen, als es Plätze in der Bestenliste gibt. Die Bestenliste wird immer wieder aktualisiert, sodass Spieler die nun mehr Punkte haben, auch höher steigen.

Einschalten
* Befehl 1.1 Auf dem Wiederhol-Befehlsblock befindet sich ein Hebel. Legt man ihn um, wird zuerst der Befehlsblock mit der Start-Funktion bestenliste:v1start aktiviert.

Wiederholen
* Befehl 1.2 Gleichzeitig wird auch der Wiederhol-Befehlsblock mit der Zyklus-Funktion bestenliste:v1zyklus aktiv.

Ausschalten
* Befehl 1.3 Der Befehlsblock löst die Funktion bestenliste:v1stopp aus.

```
function bestenliste:v1start

```

↑ 1.2:

```
function bestenliste:v1zyklus

```

↑ 1.3:

```
function bestenliste:v1stopp

```

* *Anlagen*
	+ pack.mcmeta
	+ data
		- *bestenliste*
			* functions
				+ v1start.mcfunction
				+ v1zyklus.mcfunction
				+ v1name.mcfunction
				+ v1ausloeser.mcfunction
				+ v1tafel.mcfunction
				+ v1tafel\_erstellen.mcfunction
				+ v1rangfolge.mcfunction
				+ v1stopp.mcfunction

Variante 1: **Start-Funktion**

Die Start-Funktion erstellt zwei Punkte-Ziele, setzt ein Schild und gibt den Spielern Rüstungsständer mit denen die Bestenliste platziert werden kann.

```
# Zwei Punkte-Ziele werden erstellt.
scoreboard objectives add PZBestLi.1Ausl trigger ["Bestenliste.1: ",{"text":"Auslöser für Nachrichten","bold":true}]
scoreboard objectives add PZBestLi.1Wert dummy ["Bestenliste.1: ",{"text":"Punktestände der Spieler","bold":true}]

# Eine Variable und eine Konstante werden gesetzt.
scoreboard players set VarBestLi.1Max PZBestLi.1Wert 5
scoreboard players set KonstBestLi.1HUNDERT PZBestLi.1Wert 100

# Alle Spieler im Umkreis von 15 Blöcken erhalten den Wert eins und ein Etikett.
scoreboard players add @a[distance=..15] PZBestLi.1Wert 1
tag @a[distance=..15] add EtiBestLi.1Mitspieler

# Spieler im Umkreis von 15 Blöcken erhalten einen Rüstungsständer der die Bestenliste ermöglicht.
give @a[distance=..15] minecraft:armor\_stand{EigBestLi.1Alle:true,EigBestLi.1Tafel:true,Enchantments:[{id:-1}],display:{Name:'{"text":"Bestenliste","color":"red","bold":true}',Lore:['"Wähle den Rüstungsständer aus"','"um die Einstellungs-"','"Optionen anzeigen zu lassen."'] },EntityTag:{Small:true,Invisible:true,NoGravity:true,CustomNameVisible:true,CustomName:'{"text":"Bestenliste","color":"red","bold":true}',Tags:["EtiBestLi.1Alle","EtiBestLi.1Tafel","EtiBestLi.1TafelErstellen"] } }

# Spieler im Umkreis von 15 Blöcken erhalten einen Rüstungsständer mit dem man weitere Mitspieler erzeugen kann.
give @a[distance=..15] minecraft:armor\_stand{EigBestLi.1Alle:true,Enchantments:[{id:-1}],display:{Name:'{"text":"Mitspieler","color":"gold","bold":true}',Lore:['"Platziere den Rüstungsständer"','"um die weitere"','"Mitspieler zu erzeugen."'] },EntityTag:{Small:true,NoGravity:true,CustomNameVisible:true,CustomName:'{"text":"Mitspieler","color":"gold","bold":true}',Tags:["EtiBestLi.1Alle","EtiBestLi.1Mitspieler","EtiBestLi.1Name"] } }

# Es wird ein Markierer erzeugt, an dessen Stelle ein Schild positioniert wird, mit welchen man die Namen übertragen kann.
summon minecraft:marker ~ ~1 ~ {Tags:["EtiBestLi.1Alle","EtiBestLi.1Schild"]}
execute at @e[type=minecraft:marker,tag=EtiBestLi.1Schild] run setblock ~ ~ ~ minecraft:oak\_sign[rotation=12] replace

```

Variante 1: **Zyklus-Funktion**

Die Zyklus-Funktion gibt den Mitglieder-Rüstungsständer ihre Nummer, sie ermöglicht die Schaltflächen im Chat und ruft die Tafel-Funktion auf.

```
# Wird ein Mitspieler in Form eines Rüstungsständers platziert, wird von diesem aus die Namen-Funktion gestartet.
execute as @e[type=minecraft:armor\_stand,tag=EtiBestLi.1Mitspieler,tag=EtiBestLi.1Name] run function bestenliste:v1name

# Wenn der Stock ausgewählt ist, erhält der jenige Spieler ein Etikett.
tag @a[nbt={SelectedItem:{tag:{EigBestLi.1Tafel:true} } }] add EtiBestLi.1Ausgewaehlt

# Wenn der Spieler gerade zum Slot mit dem Rüstungsständer gewechselt hat, wird ihm ein Wert gegeben, sodass im Anschluss die Auslöser-Funktion geladen wird.
scoreboard players set @a[tag=EtiBestLi.1Ausgewaehlt,tag=!EtiBestLi.1Auswahl] PZBestLi.1Ausl -99

# Hat der Spieler den Stock ausgewählt und nicht den Wert null, so wird durch ihn die Auslöser-Funktion gestartet.
execute as @a[tag=EtiBestLi.1Ausgewaehlt] unless entity @s[scores={PZBestLi.1Ausl=0}] run function bestenliste:v1ausloeser

# Wenn der Spieler den Stock gerade ausgewählt hat oder ihne gerade nicht mehr auswählt bekommt er das Etikett oder es wird entfernt.
tag @a[tag=EtiBestLi.1Ausgewaehlt,tag=!EtiBestLi.1Auswahl] add EtiBestLi.1Auswahl
tag @a[tag=!EtiBestLi.1Ausgewaehlt,tag=EtiBestLi.1Auswahl] remove EtiBestLi.1Auswahl

# Das Etikett für die Auswahl des Stockes wird wieder entfernt.
tag @a[tag=EtiBestLi.1Ausgewaehlt] remove EtiBestLi.1Ausgewaehlt

# Damit die Tafel-Funktion alle 20 Ticks einmal ausgeführt wird, wird eine Variable hochgezählt.
scoreboard players add VarBestLi.1Tick PZBestLi.1Ausl 1
execute if score VarBestLi.1Tick PZBestLi.1Ausl matches 20.. as @e[type=minecraft:armor\_stand,tag=EtiBestLi.1Tafel] at @s run function bestenliste:v1tafel
execute if score VarBestLi.1Tick PZBestLi.1Ausl matches 20.. run scoreboard players set VarBestLi.1Tick PZBestLi.1Ausl 0

```

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

Die Auslöser-Funktion gibt den Spielern die Möglichkeit ihren eigenen Wert anzupassen und die Anzahl der Ränge die die Bestenliste anzeigen soll festzulegen.

```
# Wenn der Spieler auf die Variablen-Option geklickt hat, wird die Variable entweder um eins erhöht oder verringert.
scoreboard players add @s[scores={PZBestLi.1Ausl=1,PZBestLi.1Wert=..99}] PZBestLi.1Wert 1
scoreboard players remove @s[scores={PZBestLi.1Ausl=-1,PZBestLi.1Wert=1..}] PZBestLi.1Wert 1

execute if entity @s[scores={PZBestLi.1Ausl=2}] if score VarBestLi.1Max PZBestLi.1Wert matches ..9 run scoreboard players add VarBestLi.1Max PZBestLi.1Wert 1
execute if entity @s[scores={PZBestLi.1Ausl=-2}] if score VarBestLi.1Max PZBestLi.1Wert matches 4.. run scoreboard players remove VarBestLi.1Max PZBestLi.1Wert 1

# Dem Spieler wird im Chat die Optionen-Liste angezeigt, mit Logik-, Richtungs- und Variablen-Option.
tellraw @s ["Bestenliste.1:\n",{"text":"wert = ","bold":true},{"text":"wert + 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Wert + 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBestLi.1Ausl set 1"} },"\n",{"text":"wert = ","bold":true},{"text":"wert - 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Wert - 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBestLi.1Ausl set -1"} },"\n",{"text":"wert == ","bold":true},{"score":{"name":"@s","objective":"PZBestLi.1Wert"},"color":"dark\_purple","bold":true},"\n",{"text":"max = ","bold":true},{"text":"max + 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Max + 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBestLi.1Ausl set 2"} },"\n",{"text":"max = ","bold":true},{"text":"max - 1","color":"gray","bold":true,"underlined":true,"hoverEvent":{"action":"show\_text","contents":{"text":"Tippe für Max - 1"} },"clickEvent":{"action":"run\_command","value":"/trigger PZBestLi.1Ausl set -2"} },"\n",{"text":"max == ","bold":true},{"score":{"name":"VarBestLi.1Max","objective":"PZBestLi.1Wert"},"color":"dark\_purple","bold":true} ]

# Damit der Spieler nach dem anklicken der Optionen erneut die Berechtigung erhält um nochmals eine Option aktivieren zu können.
scoreboard players enable @s PZBestLi.1Ausl
scoreboard players set @s PZBestLi.1Ausl 0

```

Variante 1: **Namen-Funktion**

Die Namen-Funktion zählt eine Variable hoch und vergibt diesen Wert als Name in den Rüstungsständernamen. Zuletzt wird ein Zufallsgenerator benutzt um dem Rüstungsständer einen zufälligen Punktestand zu geben.

```
# Die Variable wird um eins erhöht.
scoreboard players add VarBestLi.1Nummer PZBestLi.1Wert 1

# Der Rüstungsständer erhält kurzzeitig ein Etikett, da das Schild keinen @s-Selektor unterstützt. Danach werden die Daten in dem Schild angepasst, sodass dort der Name sowie die Nummer in einem JSON-Text gespeichert werden. Anschließend wird der JSON-Text in den Namen des Rüstungsständers gespeichert.
tag @s add EtiBestLi.1Selbst
execute at @e[type=minecraft:marker,tag=EtiBestLi.1Schild,sort=nearest,limit=1] run data merge block ~ ~ ~ {Text1:'["",{"entity":"@e[tag=EtiBestLi.1Selbst,sort=nearest,limit=1]","nbt":"CustomName","interpret":true},{"score":{"name":"VarBestLi.1Nummer","objective":"PZBestLi.1Wert"},"color":"gold","bold":true}]'}
execute at @e[type=minecraft:marker,tag=EtiBestLi.1Schild,sort=nearest,limit=1] run data modify entity @s CustomName set from block ~ ~ ~ Text1
tag @s remove EtiBestLi.1Selbst

# Damit der Rüstungsständer einen zufälligen Zahlenwert besitzt, wird die erste von vier Zahlen aus der UUID geholt und modulo 100 gerechnet, sodass er einen Wert zwischen null und 99 besitzt.
execute store result score @s PZBestLi.1Wert run data get entity @s UUID[0] 1
scoreboard players operation @s PZBestLi.1Wert %= KonstBestLi.1HUNDERT PZBestLi.1Wert

# Das Etikett wird entfernt, sodass diese Funktion kein zweites mal aufgerufen wird.
tag @s remove EtiBestLi.1Name

```

Variante 1: **Tafel-Funktion**

Die Tafel-Funktion ruft die Tafel-Erstellen-Funktion auf, falls die Tafel-Funktion das erste mal für diese Bestenliste aufgerufen wurde. Anschließend wird die Rangfolgen-Funktion aufgerufen.

```
# Wenn der Tafel-Rüstungsständer platziert wurde, wird die Tafel-Erstellen-Funktion geladen und anschließend wird das Etikett entfernt.
execute store result score @s[tag=EtiBestLi.1TafelErstellen] PZBestLi.1Wert run scoreboard players operation VarBestLi.1Rangliste PZBestLi.1Wert = VarBestLi.1Max PZBestLi.1Wert
execute if entity @s[tag=EtiBestLi.1TafelErstellen] run function bestenliste:v1tafel\_erstellen
tag @s[tag=EtiBestLi.1TafelErstellen] remove EtiBestLi.1TafelErstellen

# Bevor die Rangfolgen-Funktion geladen wird, werden die Variablen vorher festgelegt und die Tafel-Rang-Rüstungsständer werden geleert.
scoreboard players set VarBestLi.1Rangfolge PZBestLi.1Wert 0
execute store result score VarBestLi.1Mitspieler PZBestLi.1Wert if entity @e[tag=EtiBestLi.1Mitspieler]
execute positioned ~-0.5 ~ ~-0.5 as @e[dx=0,dy=-10,dz=0,type=minecraft:armor\_stand,tag=EtiBestLi.1TafelRang] run data merge entity @s {CustomNameVisible:false,CustomName:'""'}
execute if score VarBestLi.1Mitspieler PZBestLi.1Wert matches 1.. run function bestenliste:v1rangfolge

# Zuletzt werden alle Etiketten die zuvor von der Rangfolgen-Funktion vergeben wurden, wieder entfernt.
tag @e[tag=EtiBestLi.1Erledigt] remove EtiBestLi.1Erledigt

```

Variante 1: **Tafel-Erstellen-Funktion**

Die Tafel-Erstellen-Funktion ruft sich so oft erneut auf, wie es Ränge in der Bestenliste geben soll und erzeugt dafür jedesmal einen unsichtbaren Rüstungsständer.

```
# Ein unsichtbarer und schwebender Rüstungsständer wird erzeugt, um später einen der Mitspieler aufzulisten.
summon minecraft:armor\_stand ~ ~ ~ {Small:true,Invisible:true,NoGravity:true,CustomNameVisible:false,CustomName:'""',Tags:["EtiBestLi.1Alle","EtiBestLi.1TafelRang"]}

# Der Rüstungsständer erhält die Nummer, die später auch den Rang des Spielers abbildet.
scoreboard players operation @e[type=minecraft:armor\_stand,tag=EtiBestLi.1TafelRang,sort=nearest,limit=1] PZBestLi.1Wert = VarBestLi.1Rangliste PZBestLi.1Wert

# Die Tafel-Erstellen-Funktion wird so oft erneut um ca. einen halben Meter höher aufgerufen, wie die Tafel an Spieler auflisten soll. Der Tafel-Rüstungsständer wird ganz zuletzt einen halben Meter über diese teleportiert.
scoreboard players remove VarBestLi.1Rangliste PZBestLi.1Wert 1
execute if score VarBestLi.1Rangliste PZBestLi.1Wert matches 0 run teleport @s ~ ~0.5 ~
execute if score VarBestLi.1Rangliste PZBestLi.1Wert matches 1.. positioned ~ ~0.4 ~ run function bestenliste:v1tafel\_erstellen

```

Variante 1: **Rangfole-Funktion**

Die Rangfolgen-Funktion berechnet bei jedem Aufruf den höchsten Punktestand aller Mitspieler und pickt sich den höchsten Mitspieler heraus. Dieser wird in die Bestenliste eingetragen.

```
# Zuerst wird die Rangfolge-Nummer bestimmt und anschließend wird von allen Mitspielern die noch nicht aufgelistet sind der Punktestand genommen und nur der mit dem höchsten Wert wird in die Variable gespeichert.
scoreboard players add VarBestLi.1Rangfolge PZBestLi.1Wert 1
scoreboard players set VarBestLi.1HoechsterWert PZBestLi.1Wert 0
scoreboard players operation VarBestLi.1HoechsterWert PZBestLi.1Wert > @e[tag=EtiBestLi.1Mitspieler,tag=!EtiBestLi.1Erledigt] PZBestLi.1Wert

# Der Spieler mit dem höchsten Punktestand wird herausgesucht. Allerdings kann es sein, dass es mehrere sind.
execute as @e[tag=EtiBestLi.1Mitspieler,tag=!EtiBestLi.1Erledigt] if score @s PZBestLi.1Wert = VarBestLi.1HoechsterWert PZBestLi.1Wert run tag @s add EtiBestLi.1Ranghoechste

# Damit nur einer ausgewählt wird, wird von denen die den höchsten Wert hat, der erste genommen.
tag @e[tag=EtiBestLi.1Ranghoechste,sort=arbitrary,limit=1] add EtiBestLi.1Erledigt

# An der Position des Markierers befindet sich das Schild und der Name des Mitspielers mit dem höchsten Wert in diesen Aufruf wird auf das Schild geschrieben, inklusive Rang und Punktzahl.
execute at @e[type=minecraft:marker,tag=EtiBestLi.1Schild,sort=nearest,limit=1] run data merge block ~ ~ ~ {Text1:'["",{"score":{"name":"VarBestLi.1Rangfolge","objective":"PZBestLi.1Wert"},"color":"aqua","bold":true},{"text":". ","color":"aqua","bold":true},{"selector":"@e[tag=EtiBestLi.1Ranghoechste,tag=EtiBestLi.1Erledigt,sort=nearest,limit=1]"},{"text":" - ","color":"gray","bold":true},{"score":{"name":"@e[tag=EtiBestLi.1Ranghoechste,tag=EtiBestLi.1Erledigt,sort=nearest,limit=1]","objective":"PZBestLi.1Wert"},"color":"dark\_purple","bold":true}]'}

# Der Rüstungsständer der den aktuellen Rang wiederspiegelt bekommt in seinen Namen den Text vom Schild gespeichert.
execute as @e[distance=..0.5,type=minecraft:armor\_stand,tag=EtiBestLi.1TafelRang] if score @s PZBestLi.1Wert = VarBestLi.1Rangfolge PZBestLi.1Wert at @e[type=minecraft:marker,tag=EtiBestLi.1Schild,sort=nearest,limit=1] store success entity @s CustomNameVisible byte 1 run data modify entity @s CustomName set from block ~ ~ ~ Text1

# Das Etikett wird wieder entfernt, damit es beim nächsten Aufruf dieser Funktion wieder verwendet werden kann.
tag @e[tag=EtiBestLi.1Ranghoechste] remove EtiBestLi.1Ranghoechste

# Die Variable die die Anzahl der Mitspieler repräsentiert wird um eins reduziert. Nur wenn es noch weitere Mitspieler gibt und die Tafel noch nicht den letzten Rang erreicht hat, wird die Rangfolge-Funktion erneut aufgerufen.
scoreboard players remove VarBestLi.1Mitspieler PZBestLi.1Wert 1
execute if score VarBestLi.1Mitspieler PZBestLi.1Wert matches 1.. if score VarBestLi.1Rangfolge PZBestLi.1Wert <= @s PZBestLi.1Wert positioned ~ ~-0.4 ~ run function bestenliste:v1rangfolge

```

Variante 1: **Stopp-Funktion**

Die Stopp-Funktion löscht die Punkte-Ziele, die Etiketten, das Schild und die Rüstungsständer aus dem Inventar und auf dem Boden.

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

# Die Rüstungsständer werden aus den Inventaren der Spieler entfernt.
clear @a minecraft:armor\_stand{EigBestLi.1Alle:true}

# Die Etiketten werden entfernt.
tag @a[tag=EtiBestLi.1Auswahl] remove EtiBestLi.1Auswahl
tag @a[tag=EtiBestLi.1Mitspieler] remove EtiBestLi.1Mitspieler

# Das Schild wird durch Luft ersetzt.
execute at @e[type=minecraft:marker,tag=EtiBestLi.1Schild] run setblock ~ ~ ~ minecraft:air replace

# Gedroppte Gegenstände und Objekte werden entfernt.
tag @e[type=minecraft:item,nbt={Item:{tag:{EigBestLi.1Alle:true} } }] add EtiBestLi.1Alle
kill @e[tag=EtiBestLi.1Alle]

```