Szukaj…


Wprowadzenie

Stworzenie prostego przedmiotu za pomocą Kuźni jest jednym z pierwszych zadań, których początkujący modder będzie musiał się nauczyć. Jak to zrobić, zmieniło się w różnych wersjach Minecrafta i prawdopodobnie znajduje się na „umiarkowanym” poziomie trudności po wersji 1.7.10 ze względu na ogromną liczbę łatwych do popełnienia błędów, szczególnie z poprawnym renderowaniem.

Uwagi

Jeśli coś pójdzie nie tak i twój element niestandardowy ma brakującą teksturę (czarny / fioletowy) lub model (domyślny sześcian, który jest zbyt duży, gdy jest trzymany) sprawdź dziennik. Problemy tego rodzaju prawie zawsze pojawiają się w dzienniku, pod warunkiem, że poprawnie zarejestrowałeś rzeczy.

Pierwszą rzeczą, która się pojawi, jest linia "Exception loading model for variant..." lub podobna, informująca, który blok lub element nie załadował się poprawnie. Po kilkunastu liniach zaczynających się od at... pojawi się kolejna linia Caused by...

Ten wiersz „Spowodowany przez” jest ważny, ponieważ informuje, który plik nie został poprawnie załadowany i może być jednym z kilku błędów, takich jak:

  • Zniekształcony JSON (plik JSON jest nieprawidłowy i ma literówkę)
  • Plik nie znaleziony (plik, którego szuka Minecraft, nie ma prawidłowej nazwy lub nie znajduje się we właściwym miejscu)
  • Brak wyjątku wariantu (JSON Blockstate jest niekompletny)

Możesz nawet otrzymać więcej niż jeden błąd polegający na jednym błędzie! Jeśli nie wiesz, który element jest problemem, skomentuj każdy blok i element, o którym wiesz, że działa, zmniejsz listę błędów do odpowiedniego bloku (lub bloków). Być może będziesz musiał to zrobić kilka razy.

Dodatkowo tekstura miksowania pokazuje się inaczej niż prosta lista wszystkich brakujących zasobów dla danej domeny (identyfikator mod).

Klasa przedmiotu

Ta część nie zmieniła się zbytnio w stosunku do wersji Minecrafta, chociaż były pewne mutacje w dokładnych podpisach metod, a także w hierarchii klas. Podstawowy przedmiot (taki, który nie ma żadnej funkcjonalności, taki jak kij lub wlewek: to prawda, oba są przedmiotami bezużytecznymi!)

public class CustomItem extends Item {

    public CustomItem () {
        super();
        this.setMaxDamage(0);
        this.setCreativeTab(CreativeTabs.MISC);
    }
}

W tym momencie niewiele miejsca na personalizację, w przeciwieństwie do bloków. Wszystko, co możemy zrobić, to zmienić, czy przedmiot może przyjąć obrażenia (używają tego narzędzia) i w jakiej zakładce kreacji będzie on istniał. Nazwa i tekstura zajmiemy się, gdy zarejestrujemy przedmiot w GameRegistry.

Jest to jednak wszystko, co jest potrzebne, aby trzymać, nosić, upuszczać, wytwarzać, pachnieć i w inny sposób wykorzystywać przedmiot. Niektóre przedmioty w Minecrafcie (takie jak kije) nawet nie mają unikalnej klasy i po prostu używają new Item() . Możemy to zrobić tutaj, jednak każdy przedmiot z dodatkową funkcjonalnością będzie potrzebował klasy.

Model przedmiotu

Podobnie jak w przypadku bloków, przedmioty również potrzebują modeli.

{
    "parent": "item/generated",
    "textures": {
        "layer0": "example:items/basic"
    }
}

To prawie wszystko, co jest potrzebne, aby działało po zarejestrowaniu elementu. Jedyną ważną rzeczą jest to, że nazwa pliku odpowiada nazwie rejestru użytej do zarejestrowania bloku i powinna być pisana małymi literami (1.11+ nazwy plików muszą być pisane małymi literami, wcześniej jest to tylko wielkość liter).

Zauważ, że „warstwa0” jest jedyną potrzebną teksturą i jest bardzo mało prawdopodobne, aby w ogóle została określona jakakolwiek inna tekstura (chociaż niektóre przedmioty, takie jak mikstury i skórzana zbroja, mają „warstwę1”). Wszystkie nazwy są zdefiniowane przez item/builtin (wewnętrzny najwyższy model nadrzędny dla elementów), w przeciwieństwie do bloków.

Nazwij plik JSON modelu my_item.json (zgodny z nazwą rejestru, którą my_item.json mu później) i zapisz go w my_item.json src\main\resources\assets\example\models\item\ (gdzie example jest identyfikatorem mod określonym w @Mod adnotacja twojej głównej klasy mod).

Dodatkowo utwórz teksturę dla swojego przedmiotu, nazwij go basic.png i zapisz w src\main\resources\assets\example\textures\items\

Model przedmiotu wykorzystuje tutaj element nadrzędny przedmiotu / wygenerowany, co oznacza, że zostanie użyta pojedyncza dostarczona tekstura (jak w przypadku większości przedmiotów nieblokowanych) i będzie trzymana w ręce gracza w domyślnej orientacji. Istnieje również przedmiot / urządzenie ręczne, które określa różne orientacje wyświetlacza (dla narzędzi). Przedmioty mogą również podawać własny atrybut „display”, zastępując te nadrzędne, ale nie są potrzebne w 99,9% przypadków.

Rejestracja przedmiotu

Rejestracja elementów odbywa się z głównej klasy mod lub metody klasy ModItems przywołanej z głównej klasy mod podczas preInit.

Item item = new CustomItem();
string registryname = "my_item";
item.setRegistryName(registryname);
item.setUnlocalizedName(item.getRegistryName().toString());
GameRegistry.register(item);

Istnieje ważny powód, aby używać item.setUnlocalizedName(item.getRegistryName().toString()); także! Zapewnia to, że niezlokalizowana nazwa elementu zawiera identyfikator modu, aby uniknąć konfliktów plików językowych między modami.

Teraz przedmiot również potrzebuje modelu, i tutaj sytuacja stała się trudna po wersji 1.7.10, która polegała tylko na podaniu Minecraftowi nazwy tekstury do załadowania i mogła zostać określona w konstruktorze elementu.

final ModelResourceLocation fullModelLocation = new ModelResourceLocation(item.getRegistryName().toString(), "inventory");
ModelBakery.registerItemVariants(item, fullModelLocation);
ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition()
    {
        public ModelResourceLocation getModelLocation(ItemStack stack)
        {
            return fullModelLocation;
        }
    });

Należy zauważyć, że ta sekcja musi znajdować się tylko po stronie klienta (tj. Proxy klienta), ponieważ wiele klas, do których istnieją odniesienia, nie istnieje na serwerze dedykowanym.

Rejestrowanie elementów z wariantami, np. Sadzonki, musi być wykonane w inny sposób, przy użyciu ModelLoader.setCustomModelResourceLocation(item, metadata, resourceLocation) chociaż pozwala nam użyć pliku Blockstate do określenia naszych wariantów (co jest znacznie bardziej preferowane niż alternatywa). Nasz przedmiot nie używa wariantów, więc skończyliśmy.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow