Tworzenie pierwszego bloku
Bloki stanowią podstawę gry Minecraft – tak jak wszystko inne w grze, są przechowywane w rejestrach.
Przygotowywanie Klasy Naszego Bloku
Jeśli przeczytałeś/aś stronę Tworzenie pierwszego własnego przedmiotu, proces ten będzie Ci się wydawał bardzo znajomy — będziesz musiał utworzyć metodę, która zarejestruje Twój blok i jego item.
Powinieneś umieścić tę metodę w klasie ModBlocks (lub jakkolwiek chcesz ją nazwać).
Mojang robi to bardzo podobnym sposobem dla swoich bloków; jeśli chcesz zobaczyć, jak to zrobili, możesz zajrzeć do klasy Blocks.
java
public class ModBlocks {
private static Block register(String name, Function<BlockBehaviour.Properties, Block> blockFactory, BlockBehaviour.Properties settings, boolean shouldRegisterItem) {
// Create a registry key for the block
ResourceKey<Block> blockKey = keyOfBlock(name);
// Create the block instance
Block block = blockFactory.apply(settings.setId(blockKey));
// Sometimes, you may not want to register an item for the block.
// Eg: if it's a technical block like `minecraft:moving_piston` 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.
ResourceKey<Item> itemKey = keyOfItem(name);
BlockItem blockItem = new BlockItem(block, new Item.Properties().setId(itemKey).useBlockDescriptionPrefix());
Registry.register(BuiltInRegistries.ITEM, itemKey, blockItem);
}
return Registry.register(BuiltInRegistries.BLOCK, blockKey, block);
}
private static ResourceKey<Block> keyOfBlock(String name) {
return ResourceKey.create(Registries.BLOCK, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
private static ResourceKey<Item> keyOfItem(String name) {
return ResourceKey.create(Registries.ITEM, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name));
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Podobnie jak w przypadku przedmiotów, należy upewnić się, że klasa jest załadowana, tak aby wszystkie statyczne pola zawierające wystąpienia bloku zostały zainicjowane.
Można to zrobić, tworząc fikcyjną metodę initialize, którą można wywołać w inicjalizatorze moda w celu wywołania statycznej inicjalizacji.
INFO
Jeśli nie wiesz, na czym polega inicjalizacja statyczna, jest to proces inicjalizacji pól statycznych w klasie. Odbywa się, to gdy klasa jest ładowana przez maszynę wirtualną Java (JVM), i przed utworzeniem jakichkolwiek wystąpień klasy.
java
public class ModBlocks {
// ...
public static void initialize() {}
}1
2
3
4
5
2
3
4
5
java
public class ExampleModBlocks implements ModInitializer {
@Override
public void onInitialize() {
ModBlocks.initialize();
}
}1
2
3
4
5
6
2
3
4
5
6
Tworzenie i rejestrowanie bloku
Podobnie jak przedmioty, bloki przyjmują w swoim konstruktorze klasę BlockBehaviour.Properties, która określa właściwości bloku, takie jak dźwięki i szybkość niszczenia.
Nie omówimy tutaj wszystkich opcji: możesz obejrzeć klasę i zapoznać się z różnymi opcjami, które powinny być oczywiste.
Na przykład, stworzymy prosty blok, który będzie miał właściwości bloku ziemi, ale będzie wykonany z innego materiału.
- Ustawienia bloku tworzymy w podobny sposób, jak robiliśmy to z ustawieniami przedmiotów w poradniku o przedmiotach.
- Przekazujemy metodzie
registerutworzenie instancjiBlockz ustawień bloku poprzez wywołanie konstruktoraBlock.
TIP
Można również użyć BlockBehaviour.Properties.ofFullCopy(BlockBehaviour block), aby skopiować ustawienia istniejącego bloku; w tym przypadku moglibyśmy użyć Blocks.DIRT, aby skopiować ustawienia bloku ziemi, ale dla przykładu użyjemy konstruktora.
java
public static final Block CONDENSED_DIRT = register(
"condensed_dirt",
Block::new,
BlockBehaviour.Properties.of().sound(SoundType.GRASS),
true
);1
2
3
4
5
6
2
3
4
5
6
Aby automatycznie utworzyć element bloku, możemy przekazać true do parametru shouldRegisterItem metody register, którą utworzyliśmy w poprzednim kroku.
Dodawanie Przedmiotu Bloku do Karty w Ekwipunku Kreatywnym
Ponieważ element BlockItem jest tworzony i rejestrowany automatycznie, aby dodać go do karty w ekwipunku kreatywnym, należy użyć metody Block.asItem() w celu pobrania instancji BlockItem.
W tym przykładzie dodamy blok do karty BUILDING_BLOCKS. Aby zamiast tego dodać blok do własnej karty, zapoznaj się z tematem Niestandardowe karty kreadywne.
java
CreativeModeTabEvents.modifyOutputEvent(CreativeModeTabs.BUILDING_BLOCKS).register((creativeTab) -> {
creativeTab.accept(ModBlocks.CONDENSED_DIRT.asItem());
});1
2
3
2
3
Powinieneś umieścić to w funkcji initialize() swojej klasy.
Teraz powinieneś zauważyć, że twój blok jest już w ekwipunku kreatywnym i możesz go umieścić w świecie gry!

Jest jednak kilka problemów: przedmiot bloku nie ma nazwy, a sam blok nie ma tekstury, modelu bloku ani modelu przedmiotu.
Dodawanie Tłumaczeń do Bloków
Aby dodać tłumaczenie, musisz stworzyć klucz tłumaczenia w pliku tłumaczenia - assets/example-mod/lang/en_us.json (możesz zmienić na pl_pl.json).
Minecraft będzie używać tego tłumaczenia w ekwipunku kreatywnym i innych miejscach, w których wyświetlana jest nazwa bloku, np. w informacjach zwrotnych od komend.
json
{
"block.example-mod.condensed_dirt": "Condensed Dirt"
}1
2
3
2
3
Możesz ponownie uruchomić grę lub skompilować twój mod i nacisnąć F3+T, aby zastosować zmiany. Powinieneś zobaczyć, że blok ma nazwę w ekwipunku kreatywnym i innych miejscach.
Modele i Tekstury
Wszystkie tekstury bloków można znaleźć w folderze assets/example-mod/textures/block - przykładowa tekstura "Condensed Dirt" jest bezpłatna.
Aby tekstura była widoczna w grze, musisz utworzyć model bloku, który utworzysz jako assets/example-mod/models/block/condensed_dirt.json dla bloku "Condensed Dirt". W tym bloku wykorzystamy typ modelu block/cube_all.
json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
Aby blok był widoczny w Twoim ekwipunku, musisz utworzyć Ustawienia wyglądu przedmiotu wskazujący na model Twojego bloku. W tym przykładzie element klienta dla bloku "Condensed Dirt" można znaleźć w pliku assets/example-mod/items/condensed_dirt.json.
json
{
"model": {
"type": "minecraft:model",
"model": "example-mod:block/condensed_dirt"
}
}1
2
3
4
5
6
2
3
4
5
6
TIP
Musisz utworzyć ustawienia wyglądu przedmiotu tylko wtedy, gdy zarejestrowałeś BlockItem wraz ze swoim blokiem!
Po załadowaniu gry możesz zauważyć, że nadal brakuje tekstury na ustawionym przez ciebie bloku. Dzieje się tak ponieważ trzeba dodać definicję stanu bloku (blockstate).
Tworzenie definicji stanu bloku
Definicja stanu bloku służy do poinstruowania gry, który model ma renderować na podstawie bieżącego stanu bloku.
W przypadku przykładowego bloku, który nie ma złożonego stanu bloku, w definicji potrzebny jest tylko jeden wpis.
Plik ten powinien znajdować się w folderze assets/example-mod/blockstates, a jego nazwa powinna odpowiadać identyfikatorowi bloku użytemu podczas rejestrowania bloku w klasie ModBlocks. Na przykład, jeśli identyfikator bloku to condensed_dirt, plik powinien nazywać się condensed_dirt.json.
json
{
"variants": {
"": {
"model": "example-mod:block/condensed_dirt"
}
}
}1
2
3
4
5
6
7
2
3
4
5
6
7
TIP
Stany bloków są niezwykle trudne, dlatego też zostaną omówione na osobnej stronie.
Ponowne uruchomienie gry lub ponowne wczytanie za pomocą F3+T w celu zastosowania zmian — powinieneś móc zobaczyć teksturę bloku w ekwipunku i fizycznie w świecie:

Dodawanie Łupu z Bloku
Podczas niszczenia bloku w trybie przetrwania możesz zauważyć, że blok nic nie upuszcza. Ta funkcjonalność może okazać się przydatna, jednak aby blok wypadał jako przedmiot po rozbiciu, musisz zaimplementować jego tabelę łupów (ang. loot table). Plik tabeli łupów powinien znajdować się w folderze data/example-mod/loot_table/blocks.
INFO
Aby lepiej zrozumieć tabele łupów, możesz zapoznać się ze stroną Minecraft Wiki - Tabele Łupów.
json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "example-mod:condensed_dirt"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Ta tabela łupów przedstawia pojedynczy przedmiot, który można zdobyć, gdy blok zostanie zniszczony lub gdy zostanie wysadzony w powietrze w wyniku eksplozji.
Polecanie narzędzia do zbioru
Możesz również sprawić, że blok będzie można zbierać tylko przy użyciu konkretnego narzędzia, na przykład możesz chcieć, aby blok dało się szybciej zbierać łopatą.
Wszystkie tagi narzędzi powinny zostać umieszczone w folderze data/minecraft/tags/block/mineable/, gdzie nazwa pliku zależy od rodzaju użytego narzędzia, jednego z następujących:
hoe.json(motyka)axe.json(siekiera)pickaxe.json(kilof)shovel.json(łopata)
Zawartość pliku jest dość prosta — jest to lista przedmiotów, które należy dodać do tagu.
Ten przykład dodaje blok "Condensed Dirt" do tagu shovel.
json
{
"replace": false,
"values": ["example-mod:condensed_dirt"]
}1
2
3
4
2
3
4
Jeśli chcesz, aby do wydobycia bloku wymagane było jakieś narzędzie, musisz dodać .requiresCorrectToolForDrops() do ustawień bloku, a także dodać odpowiedni tag poziomu wydobycia.
Poziomy Wydobywania
Podobnie, tag poziomu wydobycia można znaleźć w folderze data/minecraft/tags/block i zachowuje on następujący format:
needs_stone_tool.json- Minimalny poziom narzędzi to narzędzia kamiennymineeds_iron_tool.json- Minimalny poziom narzędzi to narzędzia żelaznymineeds_diamond_tool.json- Minimalny poziom narzędzi to narzędzia diamentowe.
Plik ma ten sam format, co plik narzędzia do zbioru — listę elementów, które mają zostać dodane do tagu.
Dodatkowe Informacje
Jeśli dodajesz wiele bloków do swojego moda, możesz użyć Generatora Danych w celu zautomatyzowania procesu tworzenia modeli bloków i przedmiotów, definicji stanu bloku i tabel łupów.






