GameHosting.pl

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.

Opublikowano · ~9 min czytania

Czytasz część 4 (ostatnią) serii o datapackach.

  1. Część 1: Datapack w Minecraft od zera (hub serii)
  2. Część 2: własne przepisy craftingu
  3. Część 3: funkcje i scoreboardy
  4. 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”.

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:

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

Przykładowe triggery

TriggerKiedy się odpala
minecraft:inventory_changedGdy zmienia się ekwipunek gracza, najczęściej używany, gdy chcesz wykryć zdobycie konkretnego przedmiotu.
minecraft:player_killed_entityGdy gracz zabije określone stworzenie (na przykład bossa).
minecraft:locationGdy gracz znajdzie się w danym miejscu, biomie albo strukturze.
minecraft:tickCo 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:

  1. Gracz podnosi (albo wykopuje) diament. Trigger minecraft:inventory_changed wykrywa zmianę ekwipunku.
  2. Warunek items sprawdza, że to akurat diament, więc kryterium ma_diament zostaje spełnione i advancement zdobyty.
  3. Sekcja rewards.function uruchamia quest: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:

Typowe problemy

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:

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