1 votes

La recette de Forge 1.16.4-35.1.28 ne fonctionne pas

Je suis assez novice en matière de modélisation avec Forge, donc cette question peut être stupide ou idiote.

Tout d'abord, il y a mon fichier : (situé à ~/forge-1.16.4-35.1.28-mdk/data/chemc/recipes/H2_O2__H2O.json)

{
    "type": "minecraft:crafting_shapeless",
    "ingredients":
    [
        {
            "item": "chemc:hydrogen"
        },
        {
            "item": "chemc:oxygen"
        }
    ],
    "result":
    {
        "item": "minecraft:water_bucket"
    }
}

Le problème est que, lorsque je charge le jeu et passe à la survie plus essayer de combiner l'hydrogène et l'oxygène pour faire un seau d'eau, mais il semble qu'il ne peut pas être fabriqué.

Supposons que les objets soient enregistrés correctement, puisque je peux les obtenir dans le jeu. Fichier principal du Mod pour que vous puissiez voir le nom non localisé des objets.

package com.***.***.mcmods.chemc;

import com.***.***.mcmods.chemc.items.Hydrogen;
import com.***.***.mcmods.chemc.items.Oxygen;

import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.Item.Properties;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;

// The value here should match an entry in the META-INF/mods.toml file
@Mod(CheMC.modid)
public class CheMC {

    public static final String modid = "chemc";
    static Item i_h = new Hydrogen(new Properties()).setRegistryName("chemc", "hydrogen");
    static Item i_o = new Oxygen(new Properties()).setRegistryName("chemc", "oxygen");

    public CheMC() {
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event) {
    }

    // You can use EventBusSubscriber to automatically subscribe events on the
    // contained class (this is subscribing to the MOD
    // Event bus for receiving Registry Events)
    @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
            // register a new block here
            // blockRegistryEvent.getRegistry().registerAll();
        }

        @SubscribeEvent
        public static void onItemsRegistry(final RegistryEvent.Register<Item> itemRegistryEvent) {
            // register a new item here
            itemRegistryEvent.getRegistry().registerAll(i_h,i_o);
        }
    }
}

La documentation que j'ai examinée : ReadTheDocs Forge 1.16

Sortie de ./gradlew runClient --full-stacktrace --debug --info --parallel

Toute réponse serait appréciée !

1voto

Dan Points 488

La meilleure façon d'enregistrer des éléments dans les nouveaux mods de forge est d'utiliser le système de registre différé (qui s'occupe de la gestion des événements pour vous). Lorsque vous devez accéder aux éléments dans le code, vous devez utiliser, par exemple, les éléments suivants ModItems.HYDROGEN.get() au lieu de simplement ModItems.HYDROGEN .

// The value here should match an entry in the META-INF/mods.toml file
@Mod(CheMC.MODID)
public class CheMC {

    public static final String MODID = "chemc";

    public CheMC() {
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        MinecraftForge.EVENT_BUS.register(this);
        ModItems.init();
    }

    private void setup(final FMLCommonSetupEvent event) {
    }
}

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, CheMC.MODID);

    public static final ItemGroup ITEM_GROUP = new ItemGroup(CheMC.MODID) {
        @Override
        public ItemStack createIcon() {
            // pick any item here, it will be the icon for your creative tab
            return new ItemStack(HYDROGEN.get());
        }
    };

    public static void init() {
        ITEMS.register(FMLJavaModLoadingContext.get().getModEventBus());
    }

    public static final RegistryObject<Hydrogen> HYDROGEN = ITEMS.register("hydrogen", () -> new Hydrogen(new Properties().group(ITEM_GROUP)));
    public static final RegistryObject<Oxygen> OXYGEN = ITEMS.register("oxygen", () -> new Oxygen(new Properties().group(ITEM_GROUP)));
}

J'ai également séparé le registre des objets en une classe distincte pour vous et modifié certaines conventions de dénomination pour les adapter aux meilleures pratiques. Notez que vous n'avez pas besoin de créer une classe distincte pour chaque élément, sauf si vous surchargez certaines méthodes de la classe, vous pouvez simplement utiliser new Item. Mais je ne connais pas le reste de votre code, donc je n'ai pas changé cela.

(Aussi, juste une note de conception : votre recette donne à l'utilisateur un seau gratuit, qui peut être réutilisé une fois vidé. Vous voudrez peut-être ajouter un seau vide aux ingrédients)

EDIT : ...Je viens de me rendre compte que je n'ai pas répondu à votre question concernant la recette (j'ai mal interprété l'autre partie de votre message en suggérant qu'ils... n'étaient pas enregistrés correctement - s'ils fonctionnent, c'est parfait, bien que vous puissiez trouver le système basé sur le registre différé plus évolutif à mesure que vous ajoutez des éléments).

Le dossier de données doit être situé sous src/main/resources et non à la racine du projet. De plus, le nom du fichier doit être tout en minuscules.

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X