🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
Diese Seite ist für folgende Version geschrieben:
1.21.4
Diese Seite ist für folgende Version geschrieben:
1.21.4
Blöcke sind die Baublöcke von Minecraft (kein Wortspiel beabsichtigt) - genau wie alles andere in Minecraft, werden sie in Registern gespeichert.
Wenn du die Seite Dein erstes Item erstellen abgeschlossen hast, wird dir dieser Prozess sehr vertraut vorkommen - Du musst eine Methode erstellen, die deinen Block und sein Block-Item registriert.
Du solltest diese Methode in eine Klasse mit dem Namen ModBlocks
(oder wie auch immer du sie nennen willst) einfügen.
Mojang macht etwas sehr ähnliches mit Vanilleblöcken; Sie können sich die Klasse Blocks
ansehen, um zu sehen, wie sie es machen.
public class ModBlocks {
public static Block register(Block block, RegistryKey<Block> blockKey, boolean shouldRegisterItem) {
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:air` or `minecraft:end_gateway`
if (shouldRegisterItem) {
// Items need to be registered with a different type of registry key, but the ID
// can be the same.
RegistryKey<Item> itemKey = RegistryKey.of(RegistryKeys.ITEM, blockKey.getValue());
BlockItem blockItem = new BlockItem(block, new Item.Settings().registryKey(itemKey));
Registry.register(Registries.ITEM, itemKey, blockItem);
}
return Registry.register(Registries.BLOCK, blockKey, block);
}
}
Genau wie bei den Items musst du sicherstellen, dass die Klasse geladen ist, damit alle statischen Felder, die Ihre Blockinstanzen enthalten, initialisiert werden.
Du kannst dies tun, indem du eine Dummy-Methode initialize
erstellst, die in deinem Mod-Initialisierer aufgerufen werden kann, um die statische Initialisierung auszulösen.
INFO
Wenn du nicht weißt, was statische Initialisierung ist, ist es der Prozess der Initialisierung von statischen Feldern in einer Klasse. Dies geschieht, wenn die Klasse von der JVM geladen wird, und zwar bevor Instanzen der Klasse erstellt werden.
public class ModBlocks {
// ...
public static void initialize() {}
}
public static final RegistryKey<Block> CONDENSED_DIRT_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "condensed_dirt")
);
public static final Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().registryKey(CONDENSED_DIRT_KEY).sounds(BlockSoundGroup.GRASS)),
CONDENSED_DIRT_KEY,
true
);
Ähnlich wie Items nehmen Blöcke in ihrem Konstruktor die Klasse Blocks.Settings
auf, die Eigenschaften des Blocks festlegt, wie z.B. seine Soundeffekte und die Abbauebene.
Wir werden hier nicht alle Optionen behandeln - Du kannst die Klasse selbst ansehen, um die verschiedenen Optionen zu sehen, die selbsterklärend sein sollten.
Als Beispiel werden wir einen einfachen Block erstellen, der die Eigenschaften von Erde hat, aber ein anderes Material ist.
RegistryKey<Block>
, der als eindeutiger Bezeichner für unseren Block verwendet wird. Dieser wird in der vorherigen Hilfsmethode an Registry.register
übergeben.RegistryKey<Block>
auch vom AbstractBlock.Settings
-Builder benötigt.TIP
Du kannst auch AbstractBlock.Settings.copy(AbstractBlock block)
verwenden, um die Einstellungen eines bestehenden Blocks zu kopieren. In diesem Fall hätten wir auch Blocks.DIRT
verwenden können, um die Einstellungen von Erde zu kopieren, aber für das Beispiel verwenden wir den Builder.
public static final RegistryKey<Block> CONDENSED_DIRT_KEY = RegistryKey.of(
RegistryKeys.BLOCK,
Identifier.of(FabricDocsReference.MOD_ID, "condensed_dirt")
);
public static final Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().registryKey(CONDENSED_DIRT_KEY).sounds(BlockSoundGroup.GRASS)),
CONDENSED_DIRT_KEY,
true
);
Um das Blockitem automatisch zu erstellen, können wir dem Parameter shouldRegisterItem
der Methode register
, die wir im vorherigen Schritt erstellt haben, true
übergeben.
Um das Blockitem automatisch zu erstellen, können wir dem Parameter shouldRegisterItem
der Methode register
, die wir im vorherigen Schritt erstellt haben, true
übergeben.
In diesem Beispiel wird eine benutzerdefinierte Itemgruppe verwendet, die auf der Seite Benutzerdefinierte Itemgruppe erstellt wurde.
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
Du solltest dies innerhalb deiner initialize()
-Funktion deiner Klasse hinzufügen.
Du solltest nun feststellen, dass sich dein Block im Kreativ-Inventar befindet und in der Welt platziert werden kann!
Es gibt jedoch ein paar Probleme - das Blockitem ist nicht benannt, und der Block hat keine Textur, kein Blockmodell und kein Itemmodell.
Um eine Übersetzung hinzuzufügen, musst du einen Übersetzungsschlüssel in deiner Übersetzungsdatei erstellen - assets/mod-id/lang/en_us.json
.
Minecraft verwendet diese Übersetzung im Kreativ-Inventar und an anderen Stellen, an denen der Blockname angezeigt wird, wie z. B. bei der Befehlsrückmeldung.
{
"block.mod_id.condensed_dirt": "Condensed Dirt"
}
Du kannst entweder das Spiel neu starten oder deinen Mod erstellen und F3+T drücken, um die Änderungen zu übernehmen - und du solltest sehen, dass der Block einen Namen im kreativen Inventar und an anderen Stellen wie dem Statistikbildschirm hat.
Alle Blocktexturen befinden sich im Ordner assets/mod-id/textures/block
- eine Beispieltextur für den Block "Condensed Dirt" ist frei verwendbar.
Damit die Textur im Spiel angezeigt wird, musst du ein Blockmodell erstellen, das in der Datei assets/mod-id/models/block/condensed_dirt.json
für den "Condensed Dirt"-Block gefunden werden kann. Für diesen Block werden wir den Modelltyp block/cube_all
verwenden.
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}
Damit der Block in deinem Inventar angezeigt wird, musst du eine Itemmodell-Beschreibung erstellen, die auf dein Blockmodell verweist. In diesem Beispiel ist die Beschreibung des Itemmodells für den Block "Condensed Dirt" unter assets/mod-id/items/condensed_dirt.json
zu finden.
{
"model": {
"type": "minecraft:model",
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
TIP
Du musst nur dann eine Beschreibung des Itemmodells erstellen, wenn du ein BlockItem
zusammen mit deinem Block registriert hast!
Wenn du das Spiel lädst, wirst du feststellen, dass die Textur noch fehlt. Dies liegt daran, dass du eine Blockzustand-Definition hinzufügen musst.
Die Blockzustand-Definition wird verwendet, um dem Spiel mitzuteilen, welches Modell je nach dem aktuellen Zustand des Blocks gerendert werden soll.
Für den Beispielblock, der keinen komplexen Blockzustand hat, ist nur ein Eintrag in der Definition erforderlich.
Diese Datei sollte sich im Ordner assets/mod-id/blockstates
befinden, und ihr Name sollte mit der Block-ID übereinstimmen, die bei der Registrierung des Blocks in der Klasse ModBlocks
verwendet wurde. Wenn die Block-ID beispielsweise condensed_dirt
lautet, sollte die Datei condensed_dirt.json
heißen.
{
"variants": {
"": {
"model": "fabric-docs-reference:block/condensed_dirt"
}
}
}
TIP
Blockstates sind unglaublich komplex, weshalb sie als Nächstes auf einer eigenen Seite behandelt werden.
Starte das Spiel neu oder lade es über F3+T neu, um die Änderungen zu übernehmen - Du solltest die Blocktextur im Inventar und physisch in der Welt sehen können:
Wenn man den Block im Survival-Modus abbaut, kann es sein, dass der Block nicht fallen gelassen wird - diese Funktionalität ist vielleicht erwünscht, aber um den Block als Item fallen zu lassen, wenn er abgebaut wird, muss man seine Beutetabelle implementieren - die Beutetabellendatei sollte in den Ordner data/mod-id/loot_table/blocks/
abgelegt werden.
INFO
Für ein besseres Verständnis der Beutetabellen kannst du dir die Seite Minecraft Wiki - Beutetabellen ansehen.
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "fabric-docs-reference:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
Diese Beutetabelle enthält einen einzelnen Gegenstand, der fallen gelassen wird, wenn der Block abgebaut wird und wenn er durch eine Explosion gesprengt wird.
Vielleicht möchtest du auch, dass dein Block nur mit einem bestimmten Werkzeug abgebaut werden kann - zum Beispiel möchtest du, dass dein Block schneller mit einer Schaufel abgebaut werden kann.
Alle Tool-Tags sollten im Ordner data/minecraft/tags/block/mineable/
abgelegt werden - der Name der Datei hängt von der Art des verwendeten Tools ab, einer der folgenden:
hoe.json
axe.json
pickaxe.json
shovel.json
Der Inhalt der Datei ist recht einfach - es handelt sich um eine Liste von Elementen, die dem Tag hinzugefügt werden sollen.
In diesem Beispiel wird der Block "Condensed Dirt" zum Tag shovel
hinzugefügt.
{
"replace": false,
"values": ["fabric-docs-reference:condensed_dirt"]
}
Wenn du möchtest, dass ein Tool zum Abbau des Blocks erforderlich ist, musst du die Blockeinstellungen um den Zusatz .requiresTool()
erweitern und das entsprechende Mining-Tag hinzufügen.
Ähnlich verhält es sich mit dem Mining-Level-Tag, das im Ordner data/minecraft/tags/block/
zu finden ist und das folgende Format hat:
needs_stone_tool.json
- Eine minimale Ebene für Steinwerkzeuge.needs_iron_tool.json
- Eine minimale Ebene für Eisenwerkzeuge.needs_diamond_tool.json
- Eine minimale Ebene für Diamantwerkzeuge.Die Datei hat das gleiche Format wie die Datei des Abbauwerkzeuges - eine Liste von Items, die dem Tag hinzugefügt werden sollen.
Wenn du mehrere Blöcke zu deinem Mod hinzufügst, solltest du die Datengenerierung in Betracht ziehen, um den Prozess der Erstellung von Block- und Itemmodellen, Blockzustandsdefinitionen und Beutetabellen zu automatisieren.