Skip to content

Commit 45be10f

Browse files
authored
Update to 1.21.4: Final crowdin updates for 1.21 (FabricMC#260)
1 parent f5f2e06 commit 45be10f

File tree

385 files changed

+6418
-1787
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

385 files changed

+6418
-1787
lines changed

develop/sounds/dynamic-sounds.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ The sound loop will be played now only for the client, which ran that SoundInsta
173173

174174
This concludes the explanation of creating and using a simple custom `SoundInstance`.
175175

176-
## Advanced `SoundInstance`s {#advanced-soundinstances}
176+
## Advanced Sound Instances {#advanced-sound-instances}
177177

178178
::: warning
179179
The following content covers an advanced topic.

versions/1.21/translated/.gitkeep

Whitespace-only changes.

versions/1.21/translated/cs_cz/index.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ features:
1616
details: Jste hráč snícím o používání Fabric modů? Naše hráčské návody vám mohou pomoct. Tyto návody pomůžou se stahování, instalací a spravení Fabric modů.
1717
link: /players/
1818
linkText: Zjistit více
19-
20-
search: false
2119
---
2220

2321
<div class="vp-doc homepage-container">

versions/1.21/translated/cs_cz/players/faq.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
---
22
title: Často kladené otázky hráčů
33
description: Často kladené otázky hráčů a administrátorů ohledně Fabricu.
4-
5-
search: false
64
---
75

86
# Často kladené dotazy

versions/1.21/translated/de_de/contributing.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
---
22
title: Beitragsrichtlinen
33
description: Richtlinien zur Beitragserstellung für die Fabric-Dokumentation
4-
5-
search: false
64
---
75

86
# Wie man beiträgt {#contributing}
@@ -190,10 +188,10 @@ Dies wird die Zeilen 15-21 der Datei `FabricDocsReference.java` des Referenz-Mod
190188
::: code-group
191189

192190
```md
193-
<<< @/reference/1.21/src/main/java/com/example/docs/FabricDocsReference.java{15-21}
191+
<<< @/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java{15-21}
194192
```
195193

196-
<<< @/reference/1.21/src/main/java/com/example/docs/FabricDocsReference.java{15-21}[java]
194+
<<< @/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java{15-21}[java]
197195

198196
:::
199197

@@ -204,10 +202,10 @@ So werden beispielsweise die Abschnitte der obigen Datei eingebettet, die mit de
204202
::: code-group
205203

206204
```md
207-
@[code transcludeWith=#entrypoint](@/reference/1.21/src/main/java/com/example/docs/FabricDocsReference.java)
205+
@[code transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java)
208206
```
209207

210-
@[code transcludeWith=#entrypoint](@/reference/1.21/src/main/java/com/example/docs/FabricDocsReference.java)
208+
@[code transcludeWith=#entrypoint](@/reference/latest/src/main/java/com/example/docs/FabricDocsReference.java)
211209

212210
:::
213211

versions/1.21/translated/de_de/develop/automatic-testing.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ title: Automatisiertes Testen
33
description: Ein Leitfaden zum Schreiben von automatisierten Tests mit Fabric Loader JUnit.
44
authors:
55
- kevinthegreat1
6-
7-
search: false
86
---
97

108
# Automatisiertes Testen {#automated-testing}
@@ -29,7 +27,7 @@ Zuerst müssen wir Fabric Loader JUnit zu der Entwicklungsumgebung hinzufügen.
2927

3028
Dann müssen wir Gradle anweisen, Fabric Loader JUnit zum Testen zu verwenden. Du kannst dies tun, indem du den folgenden Code zu deiner `build.gradle`-Datei hinzufügst:
3129

32-
@[code lang=groovy transcludeWith=:::automatic-testing:2](@/reference/1.21/build.gradle)
30+
@[code lang=groovy transcludeWith=:::automatic-testing:2](@/reference/latest/build.gradle)
3331

3432
### Tests schreiben {#writing-tests}
3533

@@ -57,19 +55,19 @@ Beachte die grünen Pfeilindikatoren in dem Zwischenraum: Du kannst ganz einfach
5755

5856
Nun ist es an der Zeit, den eigentlichen Testcode zu schreiben. Du kannst Bedingungen mit Hilfe von `org.junit.jupiter.api.Assertions` prüfen. Siehe dazu den folgenden Test an:
5957

60-
@[code lang=java transcludeWith=:::automatic-testing:4](@/reference/1.21/src/test/java/com/example/docs/codec/BeanTypeTest.java)
58+
@[code lang=java transcludeWith=:::automatic-testing:4](@/reference/latest/src/test/java/com/example/docs/codec/BeanTypeTest.java)
6159

6260
Für eine Erklärung, was dieser Code tatsächlich tut, siehe [Codecs](./codecs#registry-dispatch).
6361

6462
#### Registries einrichten {#setting-up-registries}
6563

6664
Großartig, der erste Test war erfolgreich! Aber Moment, der zweite Test ist fehlgeschlagen? In den Logs wird einer der folgenden Fehler angezeigt.
6765

68-
@[code lang=java transcludeWith=:::automatic-testing:5](@/reference/1.21/src/test/java/com/example/docs/codec/BeanTypeTest.java)
66+
@[code lang=java transcludeWith=:::automatic-testing:5](@/reference/latest/src/test/java/com/example/docs/codec/BeanTypeTest.java)
6967

7068
Dies liegt daran, dass wir versuchen, auf die Registry oder eine Klasse zuzugreifen, die von der Registry abhängt (oder, in seltenen Fällen, von anderen Minecraft-Klassen wie `SharedConstants`), aber Minecraft wurde noch nicht initialisiert. Wir müssen es nur ein wenig initialisieren, damit die Registries funktionieren. Fügen einfach den folgenden Code an den Anfang deiner Methode `beforeAll`.
7169

72-
@[code lang=java transcludeWith=:::automatic-testing:7](@/reference/1.21/src/test/java/com/example/docs/codec/BeanTypeTest.java)
70+
@[code lang=java transcludeWith=:::automatic-testing:7](@/reference/latest/src/test/java/com/example/docs/codec/BeanTypeTest.java)
7371

7472
### Github Actions einrichten {#setting-up-github-actions}
7573

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
---
2+
title: Block Entitäten
3+
description: Lerne, wie du Block Entitäten für deine benutzerdefinierten Blöcke erstellst.
4+
authors:
5+
- natri0
6+
---
7+
8+
# Block Entitäten {#block-entities}
9+
10+
Block Entitäten sind ein Weg für Blöcke zusätzliche Daten, die nicht Teil des Blockzustands sind, zu speichern: Inventarinhalte, benutzerdefinierter Name und so weiter.
11+
Minecraft nutzt Block Entitäten für Blöcke, wie Kisten, Öfen und Befehlsblöcke.
12+
13+
Als Beispiel werden wir einen Block erstellen, der zählt, wie oft er mit der rechten Maustaste angeklickt wurde.
14+
15+
## Erstellen der Block Entität {#creating-the-block-entity}
16+
17+
Damit Minecraft die neuen Block Entitäten erkennt und lädt, müssen wir einen Block Entität Typen erstellen. Das machen wir, indem wir die `BlockEntity` Klasse erweitern und in einer neuen `ModBlockEntities` Klasse registrieren.
18+
19+
@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
20+
21+
Wenn eine `BlockEntity` registriert wird, gibt es einen `BlockEntityType` zurück, wie bei dem `COUNTER_BLOCK_ENTITY`, welches wir oben benutzt haben:
22+
23+
@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/entity/ModBlockEntities.java)
24+
25+
:::tip
26+
Man beachte, dass der Konstruktor von der `CounterBlockEntity` zwei Parameter benötigt, der Konstruktor von der `BlockEntity` jedoch drei: den `BlockEntityType`, `BlockPos` und den `BlockState`.
27+
Wenn wir den `BlockEntityType` nicht hart kodiert hätten, würde die Klasse `ModBlockEntities` nicht kompiliert werden! Das liegt daran, dass die `BlockEntityFactory`, die ein funktionales Interface ist, eine Funktion beschreibt, die nur zwei Parameter benötigt, genau wie unser Konstruktor.
28+
:::
29+
30+
## Erstellen des Blocks {#creating-the-block}
31+
32+
Um als Nächstes die Block Entität zu nutzen, brauchen wir einen Block, der `BlockEntityProvider` implementiert. Lass uns einen erstellen und `CounterBlock` nennen.
33+
34+
:::tip
35+
Es gibt zwei Wege, um das zu machen:
36+
37+
- Einen Block erstellen, der `BlockWithEntity` erweitert und die `createBlockEntity` Methode implementiert (_und_ die `getRenderType` Methode, da `BlockWithEntity` den Block standardmäßig Unsichtbar macht)
38+
- Einen Block erstellen, der `BlockEntityProvider` implementiert und die `createBlockEntity` Methode überschreibt
39+
40+
Wir werden in diesem Beispiel den ersten Weg nutzen, da `BlockWithEntity` ein paar nützliche Funktionen anbietet.
41+
:::
42+
43+
@[code transcludeWith=:::1](@/reference/latest/src/main/java/com/example/docs/block/custom/CounterBlock.java)
44+
45+
Da wir die `BlockWithEntity` Klasse erweitern, müssen wir auch die `createCodec` Methode implementieren, was aber recht leicht ist.
46+
47+
Im Gegensatz zu Blöcken, die Singletons sind, wird für jede Instanz des Blocks eine neue Blockentität erstellt. Dies geschieht mit der Methode `createBlockEntity`, die die Position und den `BlockState` entgegennimmt und ein `BlockEntity` zurückgibt, oder `null`, wenn es keins geben sollte.
48+
49+
Vergiss nicht, den Block in der Klasse `ModBlocks` zu registrieren, genau wie in der Anleitung [Deinen ersten Block erstellen](../blocks/first-block):
50+
51+
@[code transcludeWith=:::5](@/reference/latest/src/main/java/com/example/docs/block/ModBlocks.java)
52+
53+
## Nutzen der Block Entität {#using-the-block-entity}
54+
55+
Jetzt, da wir eine Blockentität haben, können wir sie verwenden, um die Anzahl der Rechtsklicks auf den Block zu speichern. Dafür werden wir der Klasse `CounterBlockEntity` ein Feld `clicks` hinzufügen:
56+
57+
@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
58+
59+
Die Methode `markDirty`, die in `incrementClicks` verwendet wird, teilt dem Spiel mit, dass die Daten dieser Entität aktualisiert wurden; dies wird nützlich sein, wenn wir die Methoden hinzufügen, um den Zähler zu serialisieren und ihn aus der Speicherdatei zurückzuladen.
60+
61+
Als Nächstes müssen wir dieses Feld jedes Mal erhöhen, wenn der Block mit der rechten Maustaste angeklickt wird. Dies geschieht indem die Methode `onUse` in der Klasse `CounterBlock` überschrieben wird:
62+
63+
@[code transcludeWith=:::2](@/reference/latest/src/main/java/com/example/docs/block/custom/CounterBlock.java)
64+
65+
Da die `BlockEntity` nicht an die Methode übergeben wird, verwenden wir `world.getBlockEntity(pos)`, und wenn die `BlockEntity` nicht gültig ist, kehren wir aus der Methode zurück.
66+
67+
!["You've clicked the block for the 6th time" Nachricht auf dem Bildschirm nach dem Rechtsklick](/assets/develop/blocks/block_entities_1.png)
68+
69+
## Speichern und Laden von Daten {#saving-loading}
70+
71+
Da wir nun einen funktionierenden Block haben, sollten wir dafür sorgen, dass der Zähler zwischen den Neustarts des Spiels nicht zurückgesetzt wird. Dies geschieht durch Serialisierung in NBT, wenn das Spiel speichert, und Deserialisierung, wenn es geladen wird.
72+
73+
Die Serialisierung erfolgt mit der Methode `writeNbt`:
74+
75+
@[code transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
76+
77+
Hier fügen wir die Felder hinzu, die in dem übergebenen `NbtCompound` gespeichert werden sollen: im Fall des Zählerblocks ist das das Feld `clicks`.
78+
79+
Das Lesen ist ähnlich, aber anstatt in dem `NbtCompound` zu speichern, holt man sich die Werte, die man vorher gespeichert hat, und speichert sie in den Feldern der BlockEntity:
80+
81+
@[code transcludeWith=:::4](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
82+
83+
Wenn wir nun speichern und das Spiel neu laden, sollte der Zählerblock dort weitermachen, wo er beim Speichern aufgehört hat.
84+
85+
## Ticker {#tickers}
86+
87+
Das Interface `BlockEntityProvider` definiert auch eine Methode namens `getTicker`, mit der für jede Instanz des Blocks bei jedem Tick Code ausgeführt werden kann. Wir können das implementieren, indem wir eine statische Methode erstellen, die als `BlockEntityTicker` verwendet wird:
88+
89+
Die Methode `getTicker` sollte auch prüfen, ob der übergebene `BlockEntityType` derselbe ist wie der, den wir verwenden, und wenn ja, die Funktion zurückgeben, die bei jedem Tick aufgerufen wird. Glücklicherweise gibt es eine Hilfsfunktion, die diese Prüfung in `BlockWithEntity` durchführt:
90+
91+
@[code transcludeWith=:::3](@/reference/latest/src/main/java/com/example/docs/block/custom/CounterBlock.java)
92+
93+
`CounterBlockEntity::tick` ist ein Verweis auf die statische Methode `tick`, die wir in der Klasse `CounterBlockEntity` erstellen sollten. Eine solche Strukturierung ist nicht erforderlich, aber es ist eine gute Praxis, um den Code sauber und übersichtlich zu halten.
94+
95+
Nehmen wir an, wir wollen, dass der Zähler nur alle 10 Ticks (2 Mal pro Sekunde) erhöht werden kann. Wir können dies tun, indem wir der Klasse `CounterBlockEntity` ein Feld `ticksSinceLast` hinzufügen und es bei jedem Tick erhöhen:
96+
97+
@[code transcludeWith=:::5](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
98+
99+
Vergiss nicht, dieses Feld zu serialisieren und zu deserialisieren!
100+
101+
Jetzt können wir `ticksSinceLast` verwenden, um zu prüfen, ob der Zähler in `incrementClicks` erhöht werden kann:
102+
103+
@[code transcludeWith=:::6](@/reference/latest/src/main/java/com/example/docs/block/entity/custom/CounterBlockEntity.java)
104+
105+
:::tip
106+
Wenn die Blockentität nicht zu ticken scheint, überprüfe den Registrierungscode! Es sollte die Blöcke, die für diese Entität gültig sind, an den `BlockEntityType.Builder`, übergeben, sonst wird eine Warnung in der Konsole ausgegeben:
107+
108+
```text
109+
[13:27:55] [Server thread/WARN] (Minecraft) Block entity fabric-docs-reference:counter @ BlockPos{x=-29, y=125, z=18} state Block{fabric-docs-reference:counter_block} invalid for ticking:
110+
```
111+
112+
:::
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
---
2+
title: Block Entität Renderer
3+
description: Erfahre, wie du das Rendern mit Block Entitäts Renderern aufwerten kannst.
4+
authors:
5+
- natri0
6+
---
7+
8+
# Block Entität Renderer {#block-entity-renderers}
9+
10+
Manchmal reicht das Nutzen von Minecraft's Modellformat nicht aus. Wenn du dynamisches Rendering zu diesen hinzufügen willst, wirst du einen `BlockEntityRenderer` nutzen müssen.
11+
12+
Lasst uns als Beispiel den Zählerblock aus dem [Artikel zu Block Entitäten](../blocks/block-entities) die Zahl an Klicks auf der Oberseite anzeigen lassen.
13+
14+
## Erstellen eines BlockEntityRenderer {#creating-a-blockentityrenderer}
15+
16+
Zuerst müssen wir einen `BlockEntityRenderer` für unsere `CounterBlockEntity` erstellen.
17+
18+
Beim Erstellen eines `BlockEntityRenderer` für die `CounterBlockEntity` ist es wichtig, wenn das Projekt geteilte Quellen für den Client und den Server nutzt, die Klasse in das passende Quellenverzeichnis, wie `src/client/`, zu platzieren. Der Zugriff auf Rendering-bezogene Klassen direkt im `src/main/` Quellenverzeichnis ist nicht sicher, da diese Klassen möglicherweise am Server nicht geladen sind.
19+
20+
@[code transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/rendering/blockentity/CounterBlockEntityRenderer.java)
21+
22+
Die neue Klasse hat einen Konstruktor mit einem `BlockEntityRendererFactory.Context` als Parameter. Der `Context` hat einige nützliche Rendering-Hilfsmittel, wie den `ItemRenderer` oder `TextRenderer`.
23+
Durch die Aufnahme eines derartigen Konstruktors, wird es außerdem möglich den Konstuktor als funktionales Interface der `BlockEntityRendererFactory` selbst zu verwenden:
24+
25+
@[code transcludeWith=:::1](@/reference/latest/src/client/java/com/example/docs/FabricDocsBlockEntityRenderer.java)
26+
27+
Füge den Einstiegspunkt zu der Datei `fabric.mod.json` hinzu, damit der Renderer registriert ist.
28+
29+
`BlockEntityRendererFactories` ist eine Registrierung, die jeden `BlockEntityType` mit benutzerdefinierten Rendering-Code dem entsprechenden `BlockEntityRenderer` zuordnet.
30+
31+
## Auf Blöcke zeichnen {#drawing-on-blocks}
32+
33+
Jetzt, da wir den Renderer haben, können wir zeichnen. Die Methode `render` wird bei jedem Frame aufgerufen und ist der Ort, an dem die Magie des Renderns passiert.
34+
35+
### Umher bewegen {#moving-around}
36+
37+
Zunächst müssen wir den Text versetzen und drehen, damit er sich auf der oberen Seite des Blocks befindet.
38+
39+
:::info
40+
Wie der Name bereits vermuten lässt ist der `MatrixStack` ein _Stapel_, was bedeutet, dass du Transformationen darauf hinzufügen (push) und davon entfernen (pop) kannst.
41+
Eine gute Faustregel ist es, einen neuen Block an den Anfang der `render`-Methode hinzuzufügen und ihn am Ende wieder zu entfernen, so dass das Rendern eines Blocks die anderen nicht beeinflusst.
42+
43+
Mehr Informationen zu dem `MatrixStack` kann in dem [Artikel zu den grundlegenden Konzepten des Rendering](../rendering/basic-concepts) gefunden werden.
44+
:::
45+
46+
Zum besseren Verständnis der erforderlichen Verschiebungen und Drehungen sollten wir sie visualisieren. In diesem Bild ist der grüne Block die Position, an der der Text gezeichnet werden würde, standardmäßig am äußersten linken unteren Punkt des Blocks:
47+
48+
![Standard Position des Rendern](/assets/develop/blocks/block_entity_renderer_1.png)
49+
50+
Zunächst müssen wir den Text auf der X- und Z-Achse in die Mitte und ihn dann an der Y-Achse an den oberen Rand des Blocks verschieben:
51+
52+
![Grüner Block am obersten zentriertem Punkt](/assets/develop/blocks/block_entity_renderer_2.png)
53+
54+
Died wird durch einen einzelnen `translate` Aufruf gemacht:
55+
56+
```java
57+
matrices.translate(0.5, 1, 0.5);
58+
```
59+
60+
Somit ist die _Verschiebung_ erledigt, _Drehung_ und _Skalierung_ bleiben.
61+
62+
Standardmäßig wird der Text auf der XY-Ebene gezeichnet, also müssen wir ihn um 90 Grad um die X-Achse drehen, damit er auf der XZ-Ebene nach oben zeigt:
63+
64+
![Grüner Block, nach oben schauend, am obersten zentriertem Punkt](/assets/develop/blocks/block_entity_renderer_3.png)
65+
66+
Der `MatrixStack` hat keine `rotate` Methode, stattdessen müssen wir `multiply` und `RotationAxis.POSITIVE_X` verwenden:
67+
68+
```java
69+
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90));
70+
```
71+
72+
Jetzt ist der Text an der korrekten Position, aber ist zu groß. Der `BlockEntityRenderer` ordnet den ganzen Block zu einem `[-0.5, 0.5]` Würfel zu, während der `TextRenderer` X-Koordinaten von `[0, 9]` verwendet. Somit müssen wir es um den Faktor 18 herunter skalieren:
73+
74+
```java
75+
matrices.scale(1/18f, 1/18f, 1/18f);
76+
```
77+
78+
Jetzt sieht die ganze Transformation wie folgt aus:
79+
80+
@[code transcludeWith=:::2](@/reference/latest/src/client/java/com/example/docs/rendering/blockentity/CounterBlockEntityRenderer.java)
81+
82+
### Zeichnen von Text {#drawing-text}
83+
84+
Wie bereits früher erwähnt, hat der an den Konstruktor unseres Renderers übergebene `Context` einen `TextRenderer`, welchen wir für das Zeichnen von Text einsetzen können. Für dieses Beispiel werden wir ihn in einem Feld speichern.
85+
86+
Der `TextRenderer` hat Methoden um Text zu messen (`getWidth`), welche für das Zentrieren nützlich ist, und um ihn zu zeichnen (`draw`).
87+
88+
@[code transcludeWith=:::3](@/reference/latest/src/client/java/com/example/docs/rendering/blockentity/CounterBlockEntityRenderer.java)
89+
90+
Die Methode `draw` nimmt einige Paramter, aber die Wichtigsten sind:
91+
92+
- der zu zeichnende `Text` (oder `String`);
93+
- seine `x` und `y` Koordinaten;
94+
- der RGB `color` Wert;
95+
- die `Matrix4f`, die beschreibt, wie er transformiert werden soll (um eine aus einem `MatrixStack` zu erhalten, können wir `.peek().getPositionMatrix()` verwenden, um die `Matrix4f` für den obersten Eintrag zu erhalten).
96+
97+
Und nach dieser ganzen Arbeit, ist hier das Ergebnis:
98+
99+
![Zählerblock mit einer Zahl auf der Oberseite](/assets/develop/blocks/block_entity_renderer_4.png)

0 commit comments

Comments
 (0)