Ein Item hinzuzufügen ist eines der ersten Schritte beim Modden. Du musst dein Item
-Objekt hinzufügen, es registrieren und eine Textur geben. Um zusätzliches Verhalten zu einem Item hinzuzufügen, musst du eine benutzerdefinierte Item-Klasse. In diesem Tutorial und allen weiteren, wird “tutorial” als Platzhalter genutzt. Wenn du eine eigene Mod-ID hast, fühl dich frei, diese stattdessen zu nuztzen.
Als erstes, erstelle eine Instanz von Item
. Wir speichern es oben in der Initialisierer-Klasse. Der Konstruktor benötigt eine Item.Settings
(oder eine FabricItemSettings
)-Instanz, welches genutzt wird, um Sachen wie Haltbarkeit, Kategorie oder max. Stapelgröße festzulegen.
Du nutzt das Vannila-Registrierungssystem um den neuen Kontent zu Registrieren. Die Synax ist normalerweise
public class ExampleMod implements ModInitializer { // an instance of our new item public static final Item CUSTOM_ITEM = new Item(new FabricItemSettings().method_7892(ItemGroup.field_7932)); [...] }
Registry.register(Register Typ, Identifier, Kontent)
. Register-Typen sind gespeichert als statisches Feld in der Registry
-Klasse, und der Identifier
kennzeichnet den Inhalt. Der Kontent ist die Instanz von was immer du hinzufügen willst. Dies kann überall aufgerufen werden, solange es während der Initialisierung auftritt.
Dein Item wurde nun zu Minecraft hinzugefügt Führ den
public class ExampleMod implements ModInitializer { // an instance of our new item public static final Item CUSTOM_ITEM = new Item(new FabricItemSettings().method_7892(ItemGroup.field_7932)); @Override public void onInitialize() { } }
runClient
Gradle-Befehl aus um es in Aktion zu sehen!
Das Registrieren von Texturen benötigt Model .json-Dateien und ein Texturbild. Du wirst sie zu deinem Ressourcenverzeichnis hinzufügen. Der direkte Pfad für beides ist:
Item-Model: .../resources/assets/mod-id/models/item/custom_item.json Item-Texture: .../resources/assets/mod-id/textures/item/custom_item.png
Unsere Beispieltextur kann unter diesem Link gefunden werden.
Wenn du dein Item im ersten Schritt richtig registriert hast, beschwert sich Minecraft auf ähnliche Weise wegen fehlender Textur bei dir:
[Server-Worker-1/WARN]: Unable to load model: 'tutorial:custom_item#inventory' referenced from: tutorial:custom_item#inventory: java.io.FileNotFoundException: tutorial:models/item/custom_item.json
It conveniently tells you exactly where it expects your asset[s] to be found– when in doubt, check the log.
Ein typisches Item-Modell(Beispiel):
{ "parent": "item/generated", "textures": { "layer0": "tutorial:item/custom_item" } }
Das parent
von deinem Item ändert, wie es in der Hand gerendert wird und ist nützlich für Dinge wie Block-Items im Inventar. “item/handheld” wird für Werkzeuge, die am unterem linken Eck von der Textur gehalten werden, genutzt. textures/layer0 ist der Ort, an dem deine Textur gespeichert ist.
Das finale Ergebnis:
Um zusätzliches Verhalten zu deinem Item hinzuzufügen musst du eine Item-Klasse generieren. Der Standart-Konstruktor benötigt ein Item.Settings
-Objekt.
public class CustomItem extends Item { public CustomItem(Settings settings) { super(settings); } }
Ein praktischer Anwendungsfall für eine benutzerdefinierte Item-Klasse wäre, den Item einen Ton abspielen zu lassen, wenn man ihn verwendet:
public class CustomItem extends Item { public CustomItem(Settings settings) { super(settings); } @Override public TypedActionResult<ItemStack> use(World world, PlayerEntity playerEntity, Hand hand) { playerEntity.playSound(SoundEvents.BLOCK_WOOL_BREAK, 1.0F, 1.0F); return TypedActionResult.success(playerEntity.getStackInHand(hand)); } }
Ersetze das alte Item-Objekt durch eine Instanz deiner neuen Item-Klasse:
Wenn du alles richtig gemacht hast, spielt das Item beim nutzen des Items einen Ton ab.
public class ExampleMod implements ModInitializer { // an instance of our new item public static final CustomItem CUSTOM_ITEM = new CustomItem(new FabricItemSettings().method_7892(ItemGroup.field_7932)); [...] }
Dafür würdest du maxCount(int size)
in den FabricItemSettings
um die max. Stapelgröße festzulegen. Beachte, dass dies nicht gesetzt werden kann, wenn das Item beschädigt werden kann, da sonst eine RuntimeException geworfen wird.
public class ExampleMod implements ModInitializer { // Eine Instanz von unserem Item, wenn die max. Stapelgröße 16 betragen soll. public static final CustomItem CUSTOM_ITEM = new CustomItem(new FabricItemSettings().method_7892(ItemGroup.field_7932)).maxCount(16)); [...] }
Wenn du dein Item in Brennstoff verwandeln willst, um es in einem Ofen zu nutzen, kannst du es ins FuelRegistry
eintragen, ein Beispiel:
public class ExampleMod implements ModInitializer { [...] @Override public void onInitialize() { [...] FuelRegistry.INSTANCE.add(CUSTOM_ITEM, 300) } }
Ähnlich kannst du CompostingChanceRegistry
nutzen um es in einem Komposter kompostierbar zu machen.