Jump to content

Recommended Posts

Posted

Forge version 1.14.4-28.0.45

Context:

I'm trying to implement an override for the new vanilla block "Blast Furnace" to make it produce 2 ingots for every supplied ore block.
For now I'm trying it out on a separate block but it will in the future override the vanilla block.

 

So far the json file for the recipe has been created:

Spoiler

{
  "type": "bettervanilla:blasting",
  "ingredient": {
    "item": "minecraft:iron_ore"
  },
  "result": "minecraft:iron_ingot",
  "count": 2,
  "experience": 0.7,
  "cookingtime": 100
}

 

Diff between this and the regular blasting recipe is the type of "bettervanilla:blasting" as well as "count".

 

As far as I've read through the code of vanilla this requires adding a new IRecipeType as one is needed when overriding AbstractCookingRecipe (as the vanilla BlastingRecipe does):

Spoiler

public AbstractCookingRecipe(IRecipeType<?> typeIn, ResourceLocation idIn, String groupIn, Ingredient ingredientIn, ItemStack resultIn, float experienceIn, int cookTimeIn) {
      ///...
   }

 

 

Issue:

I can't seem to figure out how to register a new IRecipeType as I can't subscribe to RegistryEvent<IRecipeType<?>>

Spoiler

// issue on IRecipeType<?>
// "Error:(48, 76) java: type argument net.minecraft.item.crafting.IRecipeType<?> is not within bounds of type-variable T"

@SubscribeEvent
    public static void onRecipeTypeRegistry(final RegistryEvent<IRecipeType<?>> RecipeTypeRegistry) {
        RecipeTypeRegistry.getRegistry().registerAll(

        );
    }

 

My guess for this issue is that "ForgeRegistries" does not have an "IForgeRegistry<IRecipeType<?>>" variable defined, but I really shouldn't be guessing on this.

I messed around with adding a registry for IRecipeType but gave up quickly as I just didn't know what I was doing.

 

It might just be that I'm doing it all backwards.

 

Any help is greatly appreciated, even if it's just a quick slap in the right direction.

Thanks!

 

(Will provide more information as quickly as I can if/when asked for.)

Posted
4 hours ago, DiscardedMarrow said:

I can't seem to figure out how to register a new IRecipeType as I can't subscribe to RegistryEvent<IRecipeType<?>>

It's not an IRecipeType you need to register it's an IRecipeSerializer.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

I registered a RecipeSerializer before posting, which in hindsight i should've mentioned.
 

Spoiler

//setRegistryName("bettervanilla","blasting"); is called within the constructor for BlastingRecipeSerializer

public static final IRecipeSerializer<BlastingRecipe> BETTERBLASTINGRECIPE = new BlastingRecipeSerializer<>(BlastingRecipe::new,100);

@SubscribeEvent
    public static void onRecipeSerializerRegistry(final RegistryEvent.Register<IRecipeSerializer<?>> RecipesSerializerRegistry) {

        RecipesSerializerRegistry.getRegistry().registerAll(
                BETTERBLASTINGRECIPE
        );
    }

 

I also wasn't fully clear on that I'm trying to EXTEND AbstractCookingRecipe which requires an IRecipeType to be sent from the new constructor (in BlastingRecipe) via the super constructor for AbstractCookingRecipe.

Spoiler

public class BlastingRecipe extends AbstractCookingRecipe {
    ///...

    public BlastingRecipe(ResourceLocation idIn, String groupIn, Ingredient ingredientIn, ItemStack resultIn, float experienceIn, int cookTimeIn, int countIn) {
        super( /*IRecipeType<?> typeIn*/ , idIn, groupIn, ingredientIn, resultIn, experienceIn, cookTimeIn);
		///...
    }

 


So what I'm reading from your responses is basically that there's no point to extending AbstractCookingRecipe and instead, BlastingRecipe should just implement "IRecipe<IInventory>"?

Posted
14 hours ago, DiscardedMarrow said:

I'm trying to implement an override for the new vanilla block "Blast Furnace" to make it produce 2 ingots for every supplied ore block.

If this is your end goal. Just create an IRecipeSerializer that outputs a BlastingRecipe and register it. Then using its registry name in a recipe file(json) make the recipe you want iron_ore --> iron_ingotx2. And I think you'll want it to be data.minecraft.recipes.iron_ingot_from_blasting.json

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
5 minutes ago, Animefan8888 said:

Just create an IRecipeSerializer that outputs a BlastingRecipe and register it.

That's what I've done yes, which isn't the issue. The issue is:

 

14 minutes ago, DiscardedMarrow said:

I'm trying to EXTEND AbstractCookingRecipe which requires an IRecipeType to be sent from the new constructor (in BlastingRecipe) via the super constructor for AbstractCookingRecipe.

And there doesn't seem to be a way to create new instances or extended instances of IRecipeType.
 

Basically if I can't send the super I can't create an instance of BlastingRecipe which in turn means I can't instanciate BlastingRecipeSerializer.
This is just telling me to avoid extending AbstractCookingRecipe so I'll try that and see where it takes me.

Posted
8 minutes ago, DiscardedMarrow said:

This is just telling me to avoid extending AbstractCookingRecipe so I'll try that and see where it takes me.

You don't need to do this at all.

9 minutes ago, DiscardedMarrow said:

I can't instanciate BlastingRecipeSerializer.

Why would you want to do that in the first place. Make your own serializer and copy the relevant code.

10 minutes ago, DiscardedMarrow said:

I can't create an instance of BlastingRecipe

The BlastingRecipe constructor is public you can instantiate one. new BlastingRecipe(...)

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
9 minutes ago, Animefan8888 said:
21 minutes ago, DiscardedMarrow said:

This is just telling me to avoid extending AbstractCookingRecipe so I'll try that and see where it takes me.

You don't need to do this at all.

I don't know what you're referring to. I don't need to avoid extending it??

 

10 minutes ago, Animefan8888 said:
21 minutes ago, DiscardedMarrow said:

I can't instanciate BlastingRecipeSerializer.

Why would you want to do that in the first place. Make your own serializer and copy the relevant code

So I can register it??

Spoiler
36 minutes ago, DiscardedMarrow said:

I registered a RecipeSerializer before posting, which in hindsight i should've mentioned.
 

  Reveal hidden contents



//setRegistryName("bettervanilla","blasting"); is called within the constructor for BlastingRecipeSerializer

public static final IRecipeSerializer<BlastingRecipe> BETTERBLASTINGRECIPE = new BlastingRecipeSerializer<>(BlastingRecipe::new,100);

@SubscribeEvent
    public static void onRecipeSerializerRegistry(final RegistryEvent.Register<IRecipeSerializer<?>> RecipesSerializerRegistry) {

        RecipesSerializerRegistry.getRegistry().registerAll(
                BETTERBLASTINGRECIPE
        );
    }

 

I also wasn't fully clear on that I'm trying to EXTEND AbstractCookingRecipe which requires an IRecipeType to be sent from the new constructor (in BlastingRecipe) via the super constructor for AbstractCookingRecipe.

  Reveal hidden contents



public class BlastingRecipe extends AbstractCookingRecipe {
    ///...

    public BlastingRecipe(ResourceLocation idIn, String groupIn, Ingredient ingredientIn, ItemStack resultIn, float experienceIn, int cookTimeIn, int countIn) {
        super( /*IRecipeType<?> typeIn*/ , idIn, groupIn, ingredientIn, resultIn, experienceIn, cookTimeIn);
		///...
    }

 


So what I'm reading from your responses is basically that there's no point to extending AbstractCookingRecipe and instead, BlastingRecipe should just implement "IRecipe<IInventory>"?

 

 

Posted

Instead of extending AbstractCookingRecipe I now implement IRecipe<IInventory> but I still need to send back an IRecipeType<?> due to the implemented method "IRecipeType<?> getType()"

Spoiler

///...

/** Should look like {@link net.minecraft.item.crafting.AbstractCookingRecipe} **/
public class BlastingRecipe implements IRecipe<IInventory> {
    public final ResourceLocation id;
    public final String group;
    public final Ingredient ingredient;
    public final ItemStack result;
    public final float experience;
    public final int cookTime;
    public final int count;

    public BlastingRecipe(ResourceLocation idIn, String groupIn, Ingredient ingredientIn, ItemStack resultIn, float experienceIn, int cookTimeIn, int countIn) {
        this.id = idIn;
        this.group = groupIn;
        this.ingredient = ingredientIn;
        this.result = resultIn;
        this.experience = experienceIn;
        this.cookTime = cookTimeIn;
        this.count = countIn;
    }

    public boolean matches(IInventory inv, World worldIn) {
        return this.ingredient.test(inv.getStackInSlot(0));
    }

    public ItemStack getCraftingResult(IInventory inv) {
        return this.result.copy();
    }

    /**
     * Used to determine if this recipe can fit in a grid of the given width/height
     */
    public boolean canFit(int width, int height) {
        return true;
    }

    public NonNullList<Ingredient> getIngredients() {
        NonNullList<Ingredient> nonnulllist = NonNullList.create();
        nonnulllist.add(this.ingredient);
        return nonnulllist;
    }

    /**
     * Gets the experience of this recipe
     */
    public float getExperience() {
        return this.experience;
    }

    /**
     * Get the result of this recipe, usually for display purposes (e.g. recipe book). If your recipe has more than one
     * possible result (e.g. it's dynamic and depends on its inputs), then return an empty stack.
     */
    public ItemStack getRecipeOutput() {
        return this.result;
    }

    /**
     * Recipes with equal group are combined into one button in the recipe book
     */
    public String getGroup() {
        return this.group;
    }

    /**
     * Gets the cook time in ticks
     */
    public int getCookTime() {
        return this.cookTime;
    }

    public ResourceLocation getId() {
        return this.id;
    }

    public int getCount() {
        return count;
    }

    @Override
    public IRecipeSerializer<?> getSerializer() {
        return MiscInit.BETTERBLASTINGRECIPE;
    }

	//This is passed as null for now since I don't know what to pass which obviously gives me a NullPointerException
    public IRecipeType<?> getType() {
        return null;
    }
}

 

I get a NullPointerException as I don't know what to pass through getType() (using any of the vanilla recipe types obv wouldnt work so i should pass a type for my recipe) but what it says is kind of interesting:

Caused by: java.lang.NullPointerException: null key in entry: null={bettervanilla:iron_ingot_from_blasting=chokemonster.bettervanilla.recipes.BlastingRecipe@37d5d3647}

It seems to be understanding that the recipe is there at least but I don't know what else to make out of this error.

 

Here's my code for the BlastingRecipeSerializer if it helps shed some light on the situation:

Spoiler

///...

public class BlastingRecipeSerializer<T extends BlastingRecipe> extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T> {

    private final int cookingTime;
    private final BlastingRecipeSerializer.IFactory<T> iBlastRecipeFactory;

    public BlastingRecipeSerializer(BlastingRecipeSerializer.IFactory<T> factoryIn, int cookingTimeIn) {
        this.cookingTime = cookingTimeIn;
        this.iBlastRecipeFactory = factoryIn;
        setRegistryName("bettervanilla","betterblasting");
    }
  
  	//The reads and writes will be cleaned up when I'm done with this issue
  
    public T read(ResourceLocation recipeId, JsonObject json) {
        String s = JSONUtils.getString(json, "group", "");
        JsonElement jsonelement = (JsonElement)(JSONUtils.isJsonArray(json, "ingredient") ? JSONUtils.getJsonArray(json, "ingredient") : JSONUtils.getJsonObject(json, "ingredient"));
        Ingredient ingredient = Ingredient.deserialize(jsonelement);
        //Forge: Check if primitive string to keep vanilla or a object which can contain a count field.
        if (!json.has("result")) throw new com.google.gson.JsonSyntaxException("Missing result, expected to find a string or object");
        ItemStack itemstack;
        if (json.get("result").isJsonObject()) itemstack = ShapedRecipe.deserializeItem(JSONUtils.getJsonObject(json, "result"));
        else {
            String s1 = JSONUtils.getString(json, "result");
            ResourceLocation resourcelocation = new ResourceLocation(s1);
            itemstack = new ItemStack(ForgeRegistries.ITEMS.getValue(resourcelocation));
        }
        float experience = JSONUtils.getFloat(json, "experience", 0.0F);
        int cookingTime = JSONUtils.getInt(json, "cookingtime", this.cookingTime);
        int count = JSONUtils.getInt(json, "count", 1);
        return this.iBlastRecipeFactory.create(recipeId, s, ingredient, itemstack, experience, cookingTime, count);
    }

    public T read(ResourceLocation recipeId, PacketBuffer buffer) {
        String s = buffer.readString(32767);
        Ingredient ingredient = Ingredient.read(buffer);
        ItemStack itemstack = buffer.readItemStack();
        float f = buffer.readFloat();
        int i = buffer.readVarInt();
        int count = buffer.readVarInt();
        return this.iBlastRecipeFactory.create(recipeId, s, ingredient, itemstack, f, i, count);
    }

    public void write(PacketBuffer buffer, T recipe) {
        buffer.writeString(recipe.group);
        recipe.ingredient.write(buffer);
        buffer.writeItemStack(recipe.result);
        buffer.writeFloat(recipe.experience);
        buffer.writeVarInt(recipe.cookTime);
        buffer.writeVarInt(recipe.count);
    }

    public interface IFactory<T extends BlastingRecipe> {
        T create(ResourceLocation resourceLocation, String s, Ingredient ingredient, ItemStack itemStack, float experience, int cookingTime, int count);
    }
}

 

 

I've also read through the Docs for 1.13 regarding the _factories file hoping it might be necessary in some way I haven't understood yet so if it might be linked to the issue I would love to know how, or even get a clear description on how or where it should be used.

Thanks.

Posted

Look at existing usages? ICraftingRecipe is as far back as you should really go, which returns IRecipeType.CRAFTING from getType, distinguishing it from SMELTING, BLASTING, SMOKING, CAMPFIRE_COOKING, and STONECUTTING.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
4 minutes ago, Draco18s said:

Look at existing usages?

Yeah I've looked around a lot and even tried just outright returning IRecipeType.CRAFTING from my recipe just to see if I got any errors that would feed me some information but no luck. I'll look around some more though, specifically at ICraftingRecipe, and see if anything clicks.
Thanks Draco.

Posted
2 hours ago, DiscardedMarrow said:

Yeah I've looked around a lot and even tried just outright returning IRecipeType.CRAFTING from my recipe just to see if I got any errors that would feed me some information but no luck. I'll look around some more though, specifically at ICraftingRecipe, and see if anything clicks.
Thanks Draco.

If you want it to be for the Blast Furnace you probably need to return the BLASTING type instead of the CRAFTING type.

  • Like 1

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
3 minutes ago, DiscardedMarrow said:

(or wants to yell at me for doing it wrong).

This is my time to shine lol.

 

It would make more sense for the result to be a Json Object and also contain the count tag.

 

Why does this class even exist? You can access all the fields in the BlastingRecipe vanilla provides with its getters.

 

That's all I really have to say. But i could also ask why you are using an IFactory to create your BlastingRecipes instead of just calling the constructor, but it seems Vanilla has them too.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted
4 minutes ago, Animefan8888 said:

It would make more sense for the result to be a Json Object and also contain the count tag.

Very true, I'll do this for next version.

 

4 minutes ago, Animefan8888 said:

Why does this class even exist? You can access all the fields in the BlastingRecipe vanilla provides with its getters.

I used the count in this class earlier, so I agree. It's obsolete and I'll look at it for next version.

 

6 minutes ago, Animefan8888 said:

But i could also ask why you are using an IFactory to create your BlastingRecipes instead of just calling the constructor, but it seems Vanilla has them too.

Yeah I felt safer doing it like this for now because vanilla does it and I saw another post on the forums where they used an IFactory. I agree though it would be a lot simpler if I just used the constructor.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So am trying to make a custom 1.19.2 modpack and everything works until I add Oculus. I have tried Oculus+Embedium and Oculus+Rubdium and by themselves they work but as soon as I add anything it crashes no matter what it is. The modpack works fine with just Embedium and Rubdium. Can you help me to see if this is something i can fix or do i just have to deal with not having shaders. Here is the crash log. Thank you for your time. https://paste.ee/p/WXfNZ24K
    • New users at Temureceive a 40 Off discount on orders over 40 Off Use the code [{acx318439}]] during checkout to get TemuDiscount 40 Off For New Users. You n save 40 Off off your first order with the Promo Code available for a limited time only. Extra 30% off for new and existing customers + Up to $40 Off % off & more. Temu Promo Codes for New users- [{acx318439}]] Temudiscount code for New customers- [{acx318439}]] Temu $40 Off Promo Code- [{acx318439}]] what are Temu codes- acx318439 does Temu give you $40 Off - [{acx318439}]] Yes Verified Temu Promo Code january 2025- {acx318439} TemuNew customer offer {acx318439} Temudiscount codejanuary 2025 {acx318439} 40 off Promo Code Temu {acx318439} Temu 40% off any order {acx318439} 40 dollar off Temu code {acx318439} TemuCoupon $40 Off off for New customers There are a number of discounts and deals shoppers n take advantage of with the Teemu Coupon Bundle [{acx318439}]]. TemuCoupon $40 Off off for New customers [{acx318439}]] will save you $40 Off on your order. To get a discount, click on the item to purchase and enter the code. You n think of it as a supercharged savings pack for all your shopping needs Temu Promo Code 80% off – [{acx318439}]] Free Temu codes 50% off – [{acx318439}]] TemuCoupon $40 Off off – [{acx318439}]] Temu buy to get ₱39 – [{acx318439}]] Temu 129 coupon bundle – [{acx318439}]] Temu buy 3 to get €99 – [{acx318439}]] Exclusive $40 Off Off TemuDiscount Code Temu $40 Off Off Promo Code : (acx318439) Temu Discount Code $40 Off Bundle acx318439) acx318439 Temu $40 Off off Promo Code for Exsting users : acx318439) Temu Promo Code $40 Off off Temu 40 Off coupon code (acx318439) will save you 40 Off on your order. To get a discount, click on the item to purchase and enter the code. Yes, Temu offers 40 Off Coupon Code “acx318439” for Existing Customers.  You can get a 40 Off bonus plus 30% off any purchase at Temu with the 40 Off Coupon Bundle at Temu if you sign up with the referral code [{acx318439}]] and make a first purchase of $40 Off or more. Temu Promo Code 40 off-{acx318439} Temu Promo Code -{acx318439} Temu Promo Code $40 Off off-{acx318439} kubonus code -{acx318439} Get ready to unlock a world of savings with our free Temu UK coupons! We’ve got you covered with a wide range of Temu UK coupon code options that will help you maximize your shopping experience.30% Off Temu UK Coupons, Promo Codes + 25% Cash Back [ acx318439]   Yes, Temu offers 40 off coupon code {acx318439} for first-time users. You can get a $40 bonus plus 40% off any purchase at Temu with the $40 Coupon Bundle if you sign up with the referral code [{acx318439}]] and make a first purchase of $40 or more. If you are who wish to join Temu, then you should use this exclusive TemuCoupon code 40 off (acx318439) and get 40 off on your purchase with Temu. You can get a 40% discount with TemuCoupon code {acx318439}. This exclusive offer is for existing customers and can be used for a 40 reduction on your total purchase. Enter coupon code {acx318439} at checkout to avail of the discount. You can use the code {acx318439} to get a 40 off TemuCoupon as a new customer. Apply this TemuCoupon code $40 off (acx318439) to get a $40 discount on your shopping with Temu. If you’re a first-time user and looking for a TemuCoupon code $40 first time user(acx318439) then using this code will give you a flat $40 Off and a 90% discount on your Temu shopping.     •    acx318439: Enjoy flat 40% off on your first Temu order.     •    acx318439: Download the Temu app and get an additional 40% off.     •    acx318439: Celebrate spring with up to 90% discount on selected items.     •    acx318439: Score up to 90% off on clearance items.     •    acx318439: Beat the heat with hot summer savings of up to 90% off.     •    acx318439: Temu UK Coupon Code to 40% off on Appliances at Temu. How to Apply Temu Coupon Code? Using the TemuCoupon code $40 off is a breeze. All you need to do is follow these simple steps:     1    Visit the Temu website or app and browse through the vast collection of products.     2    Once you’ve added the items you wish to purchase to your cart, proceed to the checkout page.     3    During the checkout process, you’ll be prompted to enter a coupon code or promo code.     4    Type in the coupon code: [{acx318439}]] and click “Apply.”     5    Voila! You’ll instantly see the $40 discount reflected in your total purchase amount. Temu New User Coupon: Up To 90% OFF For Existing Customers Temu Existing customer’s coupon codes are designed just for new customers, offering the biggest discounts 90% and the best deals currently available on Temu. To maximize your savings, download the Temu app and apply our Temu new user coupon during checkout.     •    acx318439: New users can get up to 80% extra off.     •    acx318439: Get a massive 40% off your first order!     •    acx318439: Get 20% off on your first order; no minimum spending required.     •    acx318439: Take an extra 15% off your first order on top of existing discounts.     •    acx318439: Temu UK Enjoy a 40% discount on your entire first purchase.  
    • What do I do now when it says "1 error"?
    • Hello everyone new here how are you all?
    • I haven't tested it but under https://minecraft.wiki/w/Items_model_definition it says now:   So I guess the resource location must have changed with 1.24.4, which means you need to move your models/item/ to the new source. But as I said I haven't tested this so it also may be that this wont work. Nevertheless give it a try      EDIT (important) So now I tested it and found out how it works   Let the model files (e.g. the .json from blockbench) within "assets/<your_mod_id>/models/item" In addition to that do the following: Every model you added will need a new file under "assets/<your_mod_id>/items" That file is also a JSON and looks like this: { "model": { "type": "minecraft:model", "model": "your_mod_id:item/custom_item" } } - "type" can be minecraft:model, minecraft:composite, minecraft:condition, minecraft:select, minecraft:range_dispatch, minecraft:empty, minecraft:bundle/selected_item or minecraft:special. (In most cases you would need minecraft:model) - "model" is the path to your actual model for this item. For example the value above would point to "assets/your_mod_id/models/item/custom_item"
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.