🇩🇪 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
Ein Blockzustand entspricht ein wenig Daten, die einem einzelnen Block in der Minecraft-Welt zugeordnet sind und Informationen über den Block in Form von Eigenschaften enthält - einige Beispiele für Eigenschaften, die Vanilla in Blockzuständen speichert:
Du kannst wahrscheinlich sehen, warum sie nützlich sind - sie vermeiden die Notwendigkeit, NBT-Daten in einer Blockentität zu speichern - was die Weltgröße reduziert und TPS-Probleme verhindert!
Blockzustand-Definitionen finden sich im Ordner assets/<mod id here>/blockstates
.
Minecraft verfügt bereits über einige benutzerdefinierte Klassen, mit denen man schnell bestimmte Arten von Blöcken erstellen kann - in diesem Beispiel wird die Erstellung eines Blocks mit der Eigenschaft axis
durch die Erstellung eines „Condensed Oak Log“-Blocks erläutert.
Die Vanilla PillarBlock
Klasse erlaubt, dass der Block in der X, Y oder Z Axe platziert werden kann.
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());
});
Säulenblöcke haben zwei Texturen, oben und an der Seite - sie verwenden das Modell block/cube_column
.
Wie immer bei allen Blocktexturen befinden sich die Texturdateien in assets/<mod id here>/textures/block
.
Da der Säulenblock zwei Positionen hat, eine horizontale und eine vertikale, müssen wir zwei separate Modelldateien erstellen:
condensed_oak_log_horizontal.json
welche das block/cube_column_horizontal
Modell erweitert.condensed_oak_log.json
welche das block/cube_column
Modell erweitert.Ein Beispiel der Datei condensed_oak_log_horizontal.json
:
{
"parent": "block/cube_column_horizontal",
"textures": {
"end": "fabric-docs-reference:block/condensed_oak_log_top",
"side": "fabric-docs-reference:block/condensed_oak_log"
}
}
INFO
Remember, blockstate files can be found in the assets/<mod id here>/blockstates
folder, the name of the blockstate file should match the block ID used when registering your block in the ModBlocks
class. For instance, if the block ID is condensed_oak_log
, the file should be named condensed_oak_log.json
.
Einen tieferen Einblick in alle Modifikatoren, die in den Blockzustand-Dateien verfügbar sind, findest du auf der Seite Minecraft Wiki - Models (Block States).
Als nächstes müssen wir eine Blockzustand-Datei erstellen. Die Blockzustand-Datei ist der Ort, an dem sich die Magie abspielt - Säulenblöcke haben drei Achsen, daher werden wir für die folgenden Situationen spezielle Modelle verwenden:
axis=x
- Wenn der Block entlang der X-Achse platziert wird, drehen wir das Modell so, dass es in die positive X-Richtung zeigt.axis=y
- Wenn der Block entlang der Y-Achse platziert wird, verwenden wir das normale vertikale Modell.axis=z
- Wenn der Block entlang der Z-Achse platziert wird, drehen wir das Modell so, dass es in die positive X-Richtung zeigt.{
"variants": {
"axis=x": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "mod_id:block/condensed_oak_log"
},
"axis=z": {
"model": "mod_id:block/condensed_oak_log_horizontal",
"x": 90
}
}
}
Wie immer musst du eine Übersetzung für deinen Block und ein Objektmodell erstellen, das einem der beiden Modelle übergeordnet ist.
Benutzerdefinierte Blockzustände sind ideal, wenn dein Block einzigartige Eigenschaften hat - manchmal kannst du feststellen, dass dein Block Vanilla-Eigenschaften wiederverwenden kann.
Dieses Beispiel wird eine einzigartiges boolesche Eigenschaft mit dem Namen activated
erstellen - wenn ein Spieler den Block rechtsklickt, wird der Block von activated=false
zu activated=true
wechseln - und seine Textur entsprechend ändern.
Zunächst musst du die Eigenschaft selbst erstellen - da es sich um eine boolesche Eigenschaft handelt, wird die Methode BooleanProperty.of
verwendet.
public class PrismarineLampBlock extends Block {
public static final BooleanProperty ACTIVATED = BooleanProperty.of("activated");
}
Als Nächstes müssen wir die Eigenschaft mit der Methode appendProperties
an den Blockzustand-Manager anhängen. Du musst die Methode überschreiben, um auf den Builder zuzugreifen:
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(ACTIVATED);
}
Außerdem musst du im Konstruktor deines benutzerdefinierten Blocks einen Standardzustand für die Eigenschaft activated
festlegen.
public PrismarineLampBlock(Settings settings) {
super(settings);
// Set the default state of the block to be deactivated.
setDefaultState(getDefaultState().with(ACTIVATED, false));
}
WARNING
Vergiss nicht, deinen Block mit der benutzerdefinierten Klasse anstelle von Block
zu registrieren!
In diesem Beispiel wird die boolesche Eigenschaft activated
umgeschaltet, wenn der Spieler mit dem Block interagiert. Hierfür können wir die Methode onUse
überschreiben:
public PrismarineLampBlock(Settings settings) {
super(settings);
// Set the default state of the block to be deactivated.
setDefaultState(getDefaultState().with(ACTIVATED, false));
}
Bevor du die Blockzustand-Datei erstellst, musst du Texturen für den aktivierten und den deaktivierten Zustand des Blocks sowie für das Blockmodell bereitstellen.
Nutze dein Wissen über Blockmodelle, um zwei Modelle für den Block zu erstellen: Eines für den aktivierten Zustand und eines für den deaktivierten Zustand. Danach kannst du mit der Erstellung der Blockzustand-Datei beginnen.
Da du eine neue Eigenschaft erstellt hast, musst du die Blockzustand-Datei für den Block aktualisieren, um diese Eigenschaft zu berücksichtigen.
Wenn du mehrere Eigenschaften bei einem Block hast, musst du alle möglichen Kombinationen berücksichtigen. Zum Beispiel würden activated
und axis zu 6 Kombinationen führen (zwei mögliche Werte für
activatedund drei mögliche Werte für
axis`).
Da es für diesen Block nur zwei mögliche Varianten gibt, da er nur eine Eigenschaft hat (activated
), sieht der Blockzustand JSON etwa so aus:
{
"variants": {
"activated=false": {
"model": "fabric-docs-reference:block/prismarine_lamp"
},
"activated=true": {
"model": "fabric-docs-reference:block/prismarine_lamp_on"
}
}
}
Da es sich bei dem Beispielblock um eine Lampe handelt, müssen wir auch dafür sorgen, dass sie Licht ausstrahlt, wenn die Eigenschaft activated
true ist. Dies kann über die Blockeinstellungen erfolgen, die bei der Registrierung des Blocks an den Konstruktor übergeben werden.
Du kannst die luminance
-Methode verwenden, um die vom Block ausgestrahlte Lichtstärke einzustellen. Wir können eine statische Methode in der PrismarineLampBlock
-Klasse erstellen, um die Lichtstärke auf der Grundlage der activated
-Eigenschaft zurückzugeben, und sie als Methodenreferenz an die luminance
-Methode übergeben:
public static int getLuminance(BlockState currentBlockState) {
// Get the value of the "activated" property.
boolean activated = currentBlockState.get(PrismarineLampBlock.ACTIVATED);
// Return a light level if activated = true
return activated ? 15 : 0;
}
public static final Block PRISMARINE_LAMP = register(
new PrismarineLampBlock(
AbstractBlock.Settings.create()
.sounds(BlockSoundGroup.LANTERN)
.luminance(PrismarineLampBlock::getLuminance)
), "prismarine_lamp", true
);
Wenn du alles vervollständigt hast, sollte das Endergebnis etwa so aussehen wie das folgende: