🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
🇩🇪 Deutsch (German)
🇩🇪 Deutsch (German)
Erscheinungsbild
Diese Seite ist für folgende Version geschrieben:
1.21
Diese Seite ist für folgende Version geschrieben:
1.21
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, String name, boolean shouldRegisterItem) {
// Register the block and its item.
Identifier id = Identifier.of(FabricDocsReference.MOD_ID, name);
// 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) {
BlockItem blockItem = new BlockItem(block, new Item.Settings());
Registry.register(Registries.ITEM, id, blockItem);
}
return Registry.register(Registries.BLOCK, id, 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 Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS)),
"condensed_dirt",
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.
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 Block CONDENSED_DIRT = register(
new Block(AbstractBlock.Settings.create().sounds(BlockSoundGroup.GRASS)),
"condensed_dirt",
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.
Da das BlockItem
automatisch erstellt und registriert wird, musst du, um ihn zu einer Itemgruppe hinzuzufügen, die Methode Block.asItem()
verwenden, um die BlockItem
-Instanz zu erhalten.
In diesem Beispiel wird eine benutzerdefinierte Itemgruppe verwendet, die auf der Seite Benutzerdefinierte Itemgruppe erstellt wurde.
public static final Block CONDENSED_OAK_LOG = register(
new PillarBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.WOOD)
), "condensed_oak_log", true
);
ItemGroupEvents.modifyEntriesEvent(ModItems.CUSTOM_ITEM_GROUP_KEY).register((itemGroup) -> {
itemGroup.add(ModBlocks.CONDENSED_DIRT.asItem());
});
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 here>/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 here>/textures/block
- eine Beispieltextur für den Block "Condensed Dirt" ist frei verwendbar.
Damit die Textur im Spiel angezeigt wird, musst du einen Block und ein Itemmodell erstellen, die du an den entsprechenden Stellen für den "Condensed Dirt"-Block finden kannst:
assets/<mod id here>/models/block/condensed_dirt.json
assets/<mod id here>/models/item/condensed_dirt.json
Das Itemmodell ist ziemlich einfach, es kann einfach das Blockmodell als Elternteil verwenden - da die meisten Blockmodelle Unterstützung für die Darstellung in einer grafischen Benutzeroberfläche haben:
{
"parent": "fabric-docs-reference:block/condensed_dirt"
}
Das Blockmodell muss jedoch in unserem Fall dem Modell block/cube_all
übergeordnet sein:
{
"parent": "block/cube_all",
"textures": {
"all": "fabric-docs-reference:block/condensed_dirt"
}
}
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": "mod_id:block/condensed_dirt" }
}
}
Blockzustände sind sehr komplex, weshalb sie auf einer späteren Seite behandelt werden: Blockzustände
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 here>/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.