Notatki operatora · Seria datapack
Datapack: własne przedmioty i advancementy w Minecraft
Czwarta i ostatnia część serii o datapackach. Jak w czystym vanilla zrobić „custom item” przez komponenty przedmiotu z wersji 1.20.5+, jak użyć advancementu jako triggera, który wykrywa akcję gracza i odpala funkcję, oraz jak loot table pozwala wsadzić Twój przedmiot do łupu. Na końcu działający przykład: przedmiot wydawany graczowi przez advancement.
Czytasz część 4 (ostatnią) serii o datapackach.
- Część 1: Datapack w Minecraft od zera (hub serii)
- Część 2: własne przepisy craftingu
- Część 3: funkcje i scoreboardy
- Część 4: własne przedmioty i advancementy (ta część)
W skrócie: w vanilla nie dodasz zupełnie nowego ID przedmiotu, ale możesz wziąć istniejący przedmiot i nadać mu własną nazwę, opis, zaklęcia i osobny model przez komponenty (od 1.20.5 składnia w nawiasach kwadratowych: minecraft:diamond_sword[custom_name=...], koniec ze starym {display:{...}}). Advancement (od 1.21 folder w liczbie pojedynczej advancement/) ma criteria z triggerem wykrywającym zdarzenie i pole rewards.function, które po spełnieniu odpala Twoją funkcję. Loot table wsadza przedmiot do łupu mobów i skrzyń. Wersja docelowa w tym poradniku: Minecraft Java 1.21+.
Najpierw o wersji: 1.20.5 i 1.21
Ten temat wyjątkowo mocno zależy od wersji, więc ustalmy to na starcie, żeby uniknąć typowego błędu „skopiowana komenda nie działa”.
- 1.20.5 wprowadziła komponenty przedmiotu w miejsce starego formatu tagów NBT. To wtedy
diamond_sword{display:{Name:...}}zostało zastąpione przezdiamond_sword[custom_name=...]. Jeśli Twój serwer chodzi na 1.20.5 lub nowszej, używasz wyłącznie składni komponentów. - 1.21 zmieniła nazwy kilku folderów w datapacku z liczby mnogiej na pojedynczą. Najważniejsze dla nas:
advancementsstało sięadvancement,functionsstało sięfunction, aloot_tablesstało sięloot_table.
W całym poradniku zakładam Minecraft Java 1.21+: składnia komponentów plus foldery w liczbie pojedynczej. Jeśli akurat siedzisz na 1.20.x, komendy /give z komponentami zadziałają (komponenty są od 1.20.5), ale foldery datapacku nazywaj jeszcze w liczbie mnogiej (advancements, functions). To jedna z najczęstszych pułapek przy kopiowaniu starszych poradników.
Czym jest „custom item” w vanilla
Najpierw szczera uwaga, która oszczędza rozczarowania: w czystym datapacku nie stworzysz nowego rodzaju przedmiotu z własnym ID (na przykład minecraft:mithril_sword). Nowe bloki i przedmioty to domena modów (Forge, Fabric, NeoForge), nie datapacków.
To, co realnie robisz w vanilla, to wzięcie istniejącego przedmiotu i nadanie mu cech, które sprawiają, że wygląda i zachowuje się jak coś unikatowego:
- własna nazwa (komponent
custom_name), - własny opis pod nazwą (komponent
lore), - narzucone zaklęcia (komponent
enchantments), - osobny wygląd modelu przez
custom_model_data(działa, jeśli serwer korzysta z resource packu, który podmienia model dla danej wartości).
Technicznie taki przedmiot nadal jest diamentowym mieczem, ale dla gracza to „Ostrze Świtu” z czerwonym opisem i ostrzem V. W praktyce to zupełnie wystarcza do questów, nagród i fabularnych itemów.
Komponenty przedmiotu w komendzie /give (1.20.5+)
Składnia jest taka: /give <komu> <przedmiot>[komponent1=...,komponent2=...]. Komponenty wpisujesz w nawiasach kwadratowych, oddzielone przecinkami. Oto cztery, których używa się najczęściej.
custom_name: własna nazwa
Nazwa przyjmuje komponent tekstowy. Najprościej podać go jako obiekt z polem text i opcjonalnym kolorem oraz wyłączoną kursywą (vanilla domyślnie pisze nazwane itemy kursywą, więc italic:false daje czysty wygląd):
/give @s minecraft:diamond_sword[custom_name={text:"Ostrze Świtu",color:"gold",italic:false}]
lore: opis pod nazwą
Opis to lista linijek, każda linijka to osobny komponent tekstowy. Dwie linie opisu wyglądają tak:
/give @s minecraft:diamond_sword[lore=[{text:"Wykute o świcie",color:"gray",italic:false},{text:"Relikt straży",color:"dark_gray",italic:false}]]
enchantments: narzucone zaklęcia
Zaklęcia podajesz jako mapę nazwa_zaklęcia:poziom. Miecz z Ostrością III i Odrzutem II:
/give @s minecraft:diamond_sword[enchantments={sharpness:3,knockback:2}]
custom_model_data: osobny wygląd
Ten komponent sam w sobie nic nie zmienia w grze waniliowej, ale jest punktem zaczepienia dla resource packu, który dla danej wartości podstawia inny model. W 1.21.4+ przyjmuje obiekt z listami (między innymi floats):
/give @s minecraft:diamond_sword[custom_model_data={floats:[1.0]}]
Wszystko składasz w jedną komendę. Pełny „custom item” z nazwą, opisem i zaklęciem:
/give @s minecraft:diamond_sword[custom_name={text:"Ostrze Świtu",color:"gold",italic:false},lore=[{text:"Relikt straży",color:"gray",italic:false}],enchantments={sharpness:3}]
Uwaga na cudzysłowy: w pliku .mcfunction wpisujesz dokładnie taką samą komendę jak na czacie, bez / na początku. Najwięcej błędów bierze się z cudzysłowów w komponencie tekstowym, pilnuj, żeby każdy " miał parę. Gdy gra zgłasza błąd składni, najpierw policz cudzysłowy i nawiasy.
Nadanie przedmiotu przez funkcję
Skoro komenda /give działa na czacie, to ta sama linijka (bez /) zadziała w funkcji. Funkcje omawialiśmy w części 3; tu wykorzystamy je tylko jako miejsce, gdzie trzymamy komendę wydającą przedmiot.
W 1.21+ pliki funkcji leżą w data/<namespace>/function/ (liczba pojedyncza). Tworzymy funkcję, która wydaje nasz przedmiot:
data/quest/function/daj_ostrze.mcfunction
give @s minecraft:diamond_sword[custom_name={text:"Ostrze Świtu",color:"gold",italic:false},lore=[{text:"Relikt straży",color:"gray",italic:false}],enchantments={sharpness:3}]
Wywołasz ją ręcznie komendą /function quest:daj_ostrze. Za chwilę podepniemy ją pod advancement, żeby odpalała się sama.
Advancementy: trigger i nagroda
Advancement to nie tylko „osiągnięcie” w menu. To przede wszystkim wykrywacz zdarzeń. Każdy advancement ma sekcję criteria, a w niej kryterium z triggerem, który gra sprawdza automatycznie. Gdy trigger się odpali i spełnione są warunki, advancement zostaje zdobyty, a wtedy możemy uruchomić nagrodę.
W 1.21+ pliki advancementów leżą w data/<namespace>/advancement/ (liczba pojedyncza, dawniej advancements).
Najważniejsze pola
- criteria: zbiór kryteriów. Każde ma własną nazwę i pole
trigger(na przykładminecraft:inventory_changed,minecraft:player_killed_entity,minecraft:location). Wconditionsdoprecyzowujesz, co dokładnie ma wykryć. - rewards: co się stanie po zdobyciu. Najważniejsze dla nas pole to
function, które uruchamia funkcję podaną jakonamespace:sciezka. Możesz też daćexperience,lootalborecipe.
Przykładowe triggery
| Trigger | Kiedy się odpala |
|---|---|
minecraft:inventory_changed | Gdy zmienia się ekwipunek gracza, najczęściej używany, gdy chcesz wykryć zdobycie konkretnego przedmiotu. |
minecraft:player_killed_entity | Gdy gracz zabije określone stworzenie (na przykład bossa). |
minecraft:location | Gdy gracz znajdzie się w danym miejscu, biomie albo strukturze. |
minecraft:tick | Co tick gry, do warunków sprawdzanych nieustannie (używaj ostrożnie). |
Działający przykład: przedmiot za zdobycie diamentu
Zrobimy kompletny, mały mechanizm: gdy gracz po raz pierwszy zdobędzie diament, dostaje nasze „Ostrze Świtu”. Wykryjemy to advancementem, a nagrodę wyda funkcja.
Struktura plików
quest_pack/
pack.mcmeta
data/
quest/
advancement/
zdobyto_diament.json
function/
daj_ostrze.mcfunction
pack.mcmeta
Dla 1.21 ustaw pack_format zgodny z wersją serwera (szczegóły formatu omawialiśmy w części 1). Przykład dla rodziny 1.21:
{
"pack": {
"pack_format": 48,
"description": "Quest: Ostrze Świtu"
}
}
Funkcja, która wydaje przedmiot
Plik data/quest/function/daj_ostrze.mcfunction:
give @s minecraft:diamond_sword[custom_name={text:"Ostrze Świtu",color:"gold",italic:false},lore=[{text:"Za pierwszy diament",color:"gray",italic:false}],enchantments={sharpness:3}]
Advancement, który to odpala
Plik data/quest/advancement/zdobyto_diament.json:
{
"criteria": {
"ma_diament": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{ "items": "minecraft:diamond" }
]
}
}
},
"rewards": {
"function": "quest:daj_ostrze"
}
}
Jak to działa razem:
- Gracz podnosi (albo wykopuje) diament. Trigger
minecraft:inventory_changedwykrywa zmianę ekwipunku. - Warunek
itemssprawdza, że to akurat diament, więc kryteriumma_diamentzostaje spełnione i advancement zdobyty. - Sekcja
rewards.functionuruchamiaquest:daj_ostrze, a ta wydaje graczowi „Ostrze Świtu”.
Test: wrzuć folder do world/datapacks/, wpisz /reload, potem /give @s minecraft:diamond. Jeśli nic się nie stanie, najpierw sprawdź log konsoli przy /reload (literówka w JSON wywala wczytywanie całego datapacku), a potem czy advancement nie został już zdobyty wcześniej, advancement odpala nagrodę tylko raz na gracza. Do ponownego testu użyj /advancement revoke @s only quest:zdobyto_diament.
Krótko o loot tables
Advancement świetnie nadaje się do reakcji na pojedyncze zdarzenie. Gdy jednak chcesz, żeby Twój przedmiot losowo wypadał z mobów, skrzyń czy bloków, sięgasz po loot tables. W 1.21+ leżą w data/<namespace>/loot_table/ (liczba pojedyncza, dawniej loot_tables).
Loot table to JSON opisujący pule (pools) i wpisy (entries), z których gra losuje łup. Nadpisując tabelę istniejącego stworzenia jego ścieżką (na przykład data/minecraft/loot_table/entities/zombie.json), możesz dorzucić do dropu swój przedmiot, a komponenty (nazwę, opis, zaklęcia) nadajesz mu funkcją set_components wewnątrz wpisu. To temat na osobny poradnik, ale zasada wyboru jest prosta:
- Advancement: gdy reagujesz na konkretne zdarzenie (zdobycie przedmiotu, zabicie bossa, wejście do struktury).
- Loot table: gdy chodzi o stałą, losową zawartość łupu z wielu źródeł.
Typowe problemy
- Skopiowana komenda /give nie działa. Niemal zawsze to stary format NBT (
{display:{Name:...}}) wklejony na 1.20.5+. Przepisz na komponenty ([custom_name=...]). To najczęstszy błąd przy tym temacie. - Datapack się nie wczytuje. Najpierw zła nazwa folderu: na 1.21+ musi być
advancement,function,loot_table(liczba pojedyncza), na 1.20.x jeszcze w mnogiej. Po drugie literówka w JSON, konsola przy/reloadwypisze, na którym pliku poległa. - Advancement nie odpala funkcji. Sprawdź ścieżkę w
rewards.function(formatnamespace:sciezka, bez rozszerzenia.mcfunction) i czy sama funkcja istnieje. Pamiętaj też, że nagroda leci raz na gracza, do testów rób/advancement revoke. - Nazwa przedmiotu jest pochylona. To domyślne zachowanie vanilla dla nazwanych itemów. Dodaj
italic:falsew komponencie tekstowymcustom_name(i w każdej liniilore). - custom_model_data nic nie zmienia. To normalne, ten komponent działa tylko z resource packiem, który podmienia model dla danej wartości. Bez packu przedmiot wygląda standardowo.
Najczęstsze pytania
Czy w vanilla można zrobić w pełni nowy przedmiot bez moda?
Nie tworzysz nowego ID, ale bierzesz istniejący przedmiot i nadajesz mu własną nazwę, opis, zaklęcia i model przez komponenty (od 1.20.5). To wystarcza do questów i nagród. Zupełnie nowe bloki i przedmioty wymagają moda.
Czym różni się nowa składnia komponentów od starych tagów NBT?
W 1.20.5 stary format {display:{...}} zastąpiono komponentami w nawiasach kwadratowych [custom_name=...]. Na 1.20.5+ używasz wyłącznie komponentów; stare poradniki z NBT nie zadziałają.
W jakim folderze leży plik advancementu?
Od 1.21 w data/<namespace>/advancement/ (liczba pojedyncza). Wcześniej w advancements. Razem z nim na pojedynczą przeszły function i loot_table.
Jak advancement odpala funkcję po akcji gracza?
W criteria jest trigger (na przykład minecraft:inventory_changed), który wykrywa zdarzenie, a pole rewards.function uruchamia wtedy wskazaną funkcję jako namespace:sciezka. To czysto vanilla, bez pluginów.
Do czego służą loot tables?
Definiują, co wypada z mobów, skrzyń i bloków (folder loot_table/ od 1.21). Pozwalają wsadzić Twój przedmiot do łupu. Advancement jest do pojedynczych zdarzeń, loot table do stałej zawartości łupu.
Podsumowanie serii
To koniec czteroczęściowej serii o datapackach. Po drodze przeszliśmy całą drogę od zera do działających mechanik:
- Część 1: czym jest datapack, struktura folderów,
pack.mcmetai pierwsze wczytanie. - Część 2: własne przepisy craftingu.
- Część 3: funkcje i scoreboardy, czyli logika i liczniki.
- Część 4 (ta): własne przedmioty przez komponenty i advancementy jako triggery uruchamiające funkcje.
Mając te cztery klocki, składasz w czystym vanilla zaskakująco dużo: questy, nagrody, fabularne itemy i automatyczne reakcje na poczynania graczy, bez ani jednego moda. Datapacki działają na każdym serwerze Java, więc to, co tu zbudujesz, przeniesiesz między światami i hostami bez przeróbek.
Powiązane
- Jeśli chcesz testować datapacki na serwerze dostępnym dla znajomych przez całą dobę, gotowy serwer z dostępem do plików świata znajdziesz w hostingu Minecraft Java w Supercraft, datapack wrzucasz do folderu
world/datapacksprzez panel, a serwer aktualizuje się sam. - Część 1: Datapack w Minecraft od zera (hub serii)
- Serwer Minecraft z modami: Forge, Fabric, NeoForge
- Hosting serwera Minecraft: VPS vs zarządzany, dobór i koszt