Das offizielle Minecraft Wiki twittert hier: Wiki-Twitter     Noch keinen Server gefunden? Es gibt einen Wiki-Server
Nicht die Technik gefunden, die du suchst ? Dann schlag sie vor: Gemeinschaftsportal

Schaltnetze/Direktzugriffsspeicher (Befehle,plus)

Aus Technik Wiki
Wechseln zu: Navigation, Suche
Baustelle.svg
Diese Seite wird gerade von Nethonos neu erstellt oder grundlegend überarbeitet.
Fragen und Vorschläge bitte in die Diskussion. Fortschritt: Grid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block.pngGrid Redstone-Block blass.pngGrid Redstone-Block blass.pngGrid Redstone-Block blass.png


Gruppe: Grid Redstone-Verstärker.png
Schaltnetze

Grid Roter Sand blass.png mit Mechaniken

Grid Redstone.png mit Redstone

Grid Befehlsblock.png mit Befehlen

Diese Technik ist noch in
keiner Download-Welt enthalten.
                Hier:
Grid Wiederhol-Befehlsblock.png mehr Befehle
Disambig color.svg
Redstone-Schaltkreise Symbol.png
Diese Technik ist noch nicht in der aktuellen Redstone-Welt vorhanden.
In einem der nächsten Updates wird sie dort hinzugefügt werden.

Erweiterte Direktzugriffsspeicher ermöglichen das Speichern sowie das erneute Auslesen von Speicherzuständen in großem Stiel. Die zu speichernden Werte werden in sogenannte Felder (engl. Arrays) hinterlegt. Damit man große Mengen dieser Felder erzeugen kann, wird nicht nur auf eine Dimension zugegriffen, sondern gleich auf zwei, drei oder variabel-einstellbar viele.

Variante 1[Bearbeiten | Quelltext bearbeiten]

Schaltnetze Direktzugriffsspeicher (Befehle,plus) Bild 1.1.png Schaltnetze Direktzugriffsspeicher (Befehle,plus) Bild 1.2.png

Die zweidimensionalen Felder verhalten sich sehr ähnlich wie die eindimensionalen, es werden jedoch etwas mehr Variablen und Feldobjekte in Form von weiteren Befehlen benötigt. Zuerst werden die Punktestand-Ziele erstellt[B1.1][B1.2][B1.3][B1.4]. Anschließend wird das symbolische Feldobjekt[B1.5], welches das zweidimensionale Startfeld klassifiziert, erschaffen. Nun braucht man zwei Variablen die die beiden Dimensionen festlegen[B1.21][B1.22][B1.23][B1.24]. Diese können beide beliebig oft jeweils um eins erhöht werden. Legt man den Hebel von der drei Meter langen Befehlsblockkette um, so werden zuerst alle Felder die zuvor existierten gelöscht[B1.25], um dann die neue Anzahl der Felder an die Anzahl-Variable zu übergeben[B1.26][B1.27]. Nun wird die Befehlsblocksäule mit dem Wiederhol-Befehlsblock aktiv, denn sie erfasst nun, dass die Anzahl-Variable größer als null ist[B1.6]. Dadurch können nun die bedingten Ketten-Befehlsblöcke die Felder der ersten Dimension erzeugen[B1.7] und die Positionsdaten übergeben[B1.8][B1.9]. Damit jedes Feld eine bestimmte Positionsnummer hat. Nun sorgt der nachfolgende Ketten-Befehlsblock dafür, das die Felder der ersten Dimension die Anzahl der zweiten Dimension in sich speichern[B1.10]. Das wird dafür benötigt, um im Anschluss nur genau so viele Felder der zweiten Dimension zu erzeugen, wie es zuvor auch eingestellt wurde[B1.11]. Da sich in diesem Augenblick beide Felder (beider Dimensionen) an einem Fleck befinden, kann man direkt von der Position des Feldes (1. D.) eine Übergabe des Wertes auf das Feld (2. D.) stattfinden lassen[B1.12] und anschließend wird mit einem Etikett verhindert, das es nochmals zu einer Positionsübergabe kommen kann[B1.13], damit die Position nun endgültig fest steht.

Nun werden alle Felder der zweiten Dimension horizontal bewegt, bis sie alle in einer Reihe platziert sind[B1.14][B1.15], dies wird darüber entschieden, ob das letzte Feld (2. D.) einer Reihe erschaffen wurde[B1.16]. Dabei wird geprüft ob das Feld der ersten Dimension alle Felder seiner zweiten Dimension erzeugt hat, wenn das der Fall ist, hat das Feld (1. D.) den Wert null erreicht. Dann werden alle Felder der zweiten Dimension durch ein Etikett gestoppt. Sie werden dann nicht mehr horizontal (zur Seite) bewegt. Nun wird geprüft ob es noch Felder der ersten Dimension gibt, die noch nicht vertikal nach oben bewegt wurden, wenn das der Fall ist, wird ihnen ein Etikett gegeben[B1.17] und anschließend werden Felder der ersten, wie auch zweiten Dimension vertikal nach oben um einen Meter bewegt[B1.18].

Nun legt man über einen weiteren Befehlsblock mit bedingten Ketten-Befehlsblock den einzuspeichernden Wert für die Felder fest[B1.28]. Dieser wird dann auch im Chat ausgegeben[B1.29]. Diesen Wert möchte man nun auf ein bestimmten Feld speichern, dazu wird nun ein Zeiger für die erste und ein zweiter für die zweite Dimension benötigt, der erste wird schon beim Einschalten initialisiert[B1.55]. Diese zeigen dann immer genau auf ein bestimmtes Feld, welches den Wert übernehmen soll. Der Zeiger der zweiten Dimension bewegt sich durch die Felder[B1.30][B1.31][B1.32][B1.33][B1.34]. Wenn er das letzte Feld erreicht hat, wird er wieder zurückgesetzt, nur das der Zeiger der ersten Dimension dabei auch um eins erhöht wird[B1.35]. Dadurch kann man sich nun durch alle Felder des gesamten Feldes durchhangeln[B1.36][B1.37][B1.38][B1.39]. Der nächste Befehl sorgt dann dafür, das man auch im Chat angezeigt bekommt, wo sich gerade die beiden Zeiger aufhalten[B1.40]. Jedoch muss man nicht nur die Zeiger erhöhen, sondern auch in den Feldern speichern, wo sie gerade sind, sonst kann man den Inhalt nicht abfragen, dazu wird nun bei jedem Feld der ersten Dimension den einen Vergleichswert erzeugen, der immer nur dann null sein kann, wenn sich dort der Zeiger aufhält[B1.41][B1.42]. Anschließend muss das auch für die Felder der zweiten Dimension geschehen, dies ist etwas kniffliger, da man nur die Felder (2. D.) ansprechen will, die in einem bestimmten Feld (1. D.) sind[B1.43][B1.44]. Dazu nutzt man den Umstand, das die erste Zeiger-Position bekannt ist (Vergl = 0) und sucht genau von diesem Feld aus die Felder der zweiten Dimension und hat dann das entsprechende Feld. Damit die Zeiger aber auch grafisch in der Welt angezeigt werden, werden bei den Feldern bestimmte Effekt abgespielt[B1.19][B1.20][B1.45].

Nun kann man den Speicher-Wert, einem Feld übergeben und genau dort speichern[B1.46][B1.47]. Jetzt ist man in der Lage den Wert eines bestimmten Feldes ausgeben zu lassen[B1.48][B1.49]. Dazu wird eine Ausgabe-Variable mit dem Wert des gerade ausgewählten Feldes ausgestattet. Möchte man Werte aus den Feldern abfragen, dann kann man das über diese Variable tun. Wenn man die Felder ausschaltet, werden alle Punktestand-Ziele und alle Felder gelöscht[B1.50][B1.51][B1.52][B1.53][B1.54]


Befehlsblöcke mit Befehlen:

/scoreboard objectives add PZFeld:1pPos dummy
/scoreboard objectives add PZFeld:1pWert dummy
/scoreboard objectives add PZFeld:1pVergl dummy
/scoreboard objectives add PZFeld:1pDim dummy
/summon minecraft:armor_stand ~3 ~-2 ~ {NoGravity:1b,CustomName:"ObjFeld:1pStart",Tags:["EtiFeld:1pAlleFelder","EtiFeld:1pStart"],Small:1b,Invisible:1b,Marker:1b,ArmorItems:[{},{},{},{id:"minecraft:lime_shulker_box",Count:1b} ] }
/scoreboard players set #VarFeld:1pZeigerA PZFeld:1pPos 1


/scoreboard players test #VarFeld:1pAnzahl PZFeld:1pPos 1
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pStart,tag=EtiFeld:1pStart] ~ ~ ~ /summon minecraft:armor_stand ~ ~ ~ {NoGravity:1b,CustomName:"ObjFeld:1pInhaltA",Tags:["EtiFeld:1pAlleFelder"],Small:1b,Invisible:1b,Marker:1b,ArmorItems:[{},{},{},{id:"minecraft:red_shulker_box",Count:1b} ] }
/scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=!EtiFeld:1pPositionKopieVertikalStopp] PZFeld:1pPos = #VarFeld:1pAnzahl PZFeld:1pPos
/scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=!EtiFeld:1pPositionKopieVertikalStopp] PZFeld:1pDim = #VarFeld:1pSetzenB PZFeld:1pPos
/scoreboard players remove #VarFeld:1pAnzahl PZFeld:1pPos 1
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pDim_min=1] ~ ~ ~ /summon minecraft:armor_stand ~ ~ ~ {NoGravity:1b,CustomName:"ObjFeld:1pInhaltB",Tags:["EtiFeld:1pAlleFelder"],Small:1b,Invisible:1b,Marker:1b,ArmorItems:[{},{},{},{id:"minecraft:chest",Count:1b} ] }
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pDim_min=1] ~ ~ ~ /scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=!EtiFeld:1pPositionKopieHorizontalStopp,r=0,c=1] PZFeld:1pPos = @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pDim_min=1,r=0,c=1] PZFeld:1pDim
/scoreboard players tag @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=!EtiFeld:1pPositionKopieHorizontalStopp] add EtiFeld:1pPositionKopieHorizontalStopp
/tp @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=!EtiFeld:1pVertikalStopp] ~1 ~ ~
/scoreboard players remove @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pDim_min=0] PZFeld:1pDim 1
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pDim=0] ~ ~ ~ /scoreboard players tag @e[x=~,y=~,z=~,dx=256,dy=0,dz=0,type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=!EtiFeld:1pVertikalStopp] add EtiFeld:1pVertikalStopp
/scoreboard players tag @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=!EtiFeld:1pPositionKopieVertikalStopp] add EtiFeld:1pPositionKopieVertikalStopp
/execute @e[type=minecraft:armor_stand,tag=!EtiFeld:1pStart] ~ ~ ~ /tp @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder,r=0,c=1] ~ ~1 ~
/execute @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0] ~ ~ ~ /particle iconcrack ~ ~1.1 ~ 0 0 0 .1 1 normal @p[r=50] 155
/effect @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0] minecraft:glowing 1 1


/scoreboard players add #VarFeld:1pSetzenA PZFeld:1pPos 1
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Die Anzahl der Felder (1. Dimension) wurde erhöht: "},{"score":{"name":"#VarFeld:1pSetzenA","objective":"PZFeld:1pPos"} } ]


/scoreboard players add #VarFeld:1pSetzenB PZFeld:1pPos 1
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Die Anzahl der Felder (2. Dimension) wurde erhöht: "},{"score":{"name":"#VarFeld:1pSetzenB","objective":"PZFeld:1pPos"} } ]


/execute @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder] ~ ~ ~ /kill @e[type=minecraft:armor_stand,tag=!EtiFeld:1pStart,r=0,c=1]
/scoreboard players operation #VarFeld:1pAnzahl PZFeld:1pPos = #VarFeld:1pSetzenA PZFeld:1pPos
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Es wurden "},{"score":{"name":"#VarFeld:1pSetzenA","objective":"PZFeld:1pPos"} },{"text":" * "},{"score":{"name":"#VarFeld:1pSetzenB","objective":"PZFeld:1pPos"} },{"text":" neue Felder angelegt"} ]


/scoreboard players add #VarFeld:1pWert PZFeld:1pWert 1
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Der Speicher-Wert für die Felder wurde erhöht: "},{"score":{"name":"#VarFeld:1pWert","objective":"PZFeld:1pWert"} } ]


/scoreboard players add #VarFeld:1pZeigerB PZFeld:1pPos 1
/scoreboard players operation #VarFeld:1pSetzenB PZFeld:1pVergl = #VarFeld:1pZeigerB PZFeld:1pPos
/scoreboard players operation #VarFeld:1pSetzenB PZFeld:1pVergl -= #VarFeld:1pSetzenB PZFeld:1pPos
/scoreboard players test #VarFeld:1pSetzenB PZFeld:1pVergl 1
/scoreboard players set #VarFeld:1pZeigerB PZFeld:1pPos 1
/scoreboard players add #VarFeld:1pZeigerA PZFeld:1pPos 1
/scoreboard players operation #VarFeld:1pSetzenA PZFeld:1pVergl = #VarFeld:1pZeigerA PZFeld:1pPos
/scoreboard players operation #VarFeld:1pSetzenA PZFeld:1pVergl -= #VarFeld:1pSetzenA PZFeld:1pPos
/scoreboard players test #VarFeld:1pSetzenA PZFeld:1pVergl 1
/scoreboard players set #VarFeld:1pZeigerA PZFeld:1pPos 1
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Der erste und zweite Zeiger zeigen nun auf folgende Position "},{"score":{"name":"#VarFeld:1pZeigerA","objective":"PZFeld:1pPos"} },{"text":" (1. D.) und "},{"score":{"name":"#VarFeld:1pZeigerB","objective":"PZFeld:1pPos"} },{"text":" (2. D.)"} ]
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=EtiFeld:1pAlleFelder] ~ ~ ~ /scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=EtiFeld:1pAlleFelder,c=1,r=0] PZFeld:1pVergl = @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=EtiFeld:1pAlleFelder,c=1,r=0] PZFeld:1pPos
/scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=EtiFeld:1pAlleFelder] PZFeld:1pVergl -= #VarFeld:1pZeigerA PZFeld:1pPos
/execute @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0] ~ ~ ~ /execute @e[x=~,y=~,z=~,dx=256,dy=0,dz=0,type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder] ~ ~ ~ /scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder,c=1,r=0] PZFeld:1pVergl = @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder,c=1,r=0] PZFeld:1pPos
/scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder] PZFeld:1pVergl -= #VarFeld:1pZeigerB PZFeld:1pPos
/effect @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder] clear


/scoreboard players operation @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0] PZFeld:1pWert = #VarFeld:1pWert PZFeld:1pWert
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Das Feld mit der Position "},{"score":{"name":"@e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltA,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0]","objective":"PZFeld:1pPos"} },{"text":" (1. D.) und "},{"score":{"name":"@e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0]","objective":"PZFeld:1pPos"} },{"text":" (2. D.) wurde mit dem Speicher-Wert "},{"score":{"name":"#VarFeld:1pWert","objective":"PZFeld:1pWert"} },{"text":" ausgestattet"} ]


/scoreboard players operation #VarFeld:1pAusgabe PZFeld:1pWert = @e[type=minecraft:armor_stand,name=ObjFeld:1pInhaltB,tag=EtiFeld:1pAlleFelder,score_PZFeld:1pVergl_min=0,score_PZFeld:1pVergl=0] PZFeld:1pWert
/tellraw @a[r=15] [{"text":"Felder:plus:1"},{"text":" Der Zeiger zeigt auf das Feld mit der Position "},{"score":{"name":"#VarFeld:1pZeigerA","objective":"PZFeld:1pPos"} },{"text":" (1. D.) und "},{"score":{"name":"#VarFeld:1pZeigerB","objective":"PZFeld:1pPos"} },{"text":" (2. D.) und besitzt den Speicher-Wert "},{"score":{"name":"#VarFeld:1pAusgabe","objective":"PZFeld:1pWert"} } ]


/scoreboard objectives remove PZFeld:1pPos
/scoreboard objectives remove PZFeld:1pWert
/scoreboard objectives remove PZFeld:1pVergl
/scoreboard objectives remove PZFeld:1pDim
/kill @e[type=minecraft:armor_stand,tag=EtiFeld:1pAlleFelder]

Variante 2[Bearbeiten | Quelltext bearbeiten]


Die dreidimensionale Felder sind nochmals um eine ganze Ecke komplizierter. Es werden jedoch nur genauso viele Punktestand-Ziele benötigt, wie bei den zweidimensionalen Feldern[B2.1][B2.2][B2.3][B2.4]. Wenn man den Hebel an der Befehlsblocksäule umlegt, werden zuerst diese Punktestand-Ziele erstellt und im Anschluss das Startfeld, von dem aus alle anderen Felder erzeugt werden[B2.5]. Gleichzeitig wird auch der Wiederhol-Befehlsblock aktiv, der die dreidimensionalen Felder durch die nachfolgenden Ketten-Befehlsblöcke erstellt, dazu weiter unten mehr. Zuerst muss noch die Größe der drei Dimensionen festgelegt werden, bevor diese erstellt werden können.

Variante 3[Bearbeiten | Quelltext bearbeiten]


Damit man beliebig dimensional werden kann, benötigt man zuerst ein eindimensionales Hilfsfeld, in dem dessen Anzahl der Felder aussagt, wie viele Dimensionen unser späteres erstelltes Hauptfeld haben soll und deren jeweiliger Inhalt der Hilfsfelder wiederum aussagt, wie viele Felder die jeweilige Dimension des Hauptfeldes haben soll. Hierzu benötigt man eine Vielzahl an Punktestand-Zielen