Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Metal-Only Ingot Tag


DoctorC
 Share

Recommended Posts

I have been trying to use the forge:ingots tag (as an Ingredient) in a custom recipe to create a 'sheet metal' item.

Unfortunately, I found that this tag includes brick and nether brick as well as the metal ingots.

I could just use the individual forge:ingots/gold, forge:ingots/iron, etc. tags - but this means that new ingots added to the forge:ingots tag won't automatically work with my recipe.

As a workaround, I tried to create a forge:ingots/metals tag, using the following code:

List<Item> metalIngots = Tags.Items.INGOTS.getValues();
metalIngots.removeAll(Tags.Items.INGOTS_BRICK.getValues());
metalIngots.removeAll(Tags.Items.INGOTS_NETHER_BRICK.getValues());
tag(ModTags.Items.INGOTS_METAL).add(metalIngots.toArray(new Item[0]));

Where ModTags.Items.INGOTS_METAL is the tag I created.

Unfortunately, it comes up with this error on runData:
java.lang.IllegalStateException: Tag forge:ingots used before it was bound

The error seems to arise from the first line (Tags.Items.INGOTS.getValues())

Here is the stack trace:

Spoiler

Caused by: java.lang.IllegalStateException: Tag forge:ingots used before it was bound
   at net.minecraft.tags.TagRegistry$NamedTag.resolve(TagRegistry.java:131)
   at net.minecraft.tags.TagRegistry$NamedTag.getValues(TagRegistry.java:146)
   at my.mod.data.ModItemTagsProvider.addTags(ModItemTagsProvider.java:31)
   at net.minecraft.data.TagsProvider.run(TagsProvider.java:59)
   at net.minecraft.data.DataGenerator.run(DataGenerator.java:44)
   at net.minecraftforge.fml.event.lifecycle.GatherDataEvent$DataGeneratorConfig.lambda$runAll$0(GatherDataEvent.java:111)
   at cpw.mods.modlauncher.api.LamdbaExceptionUtils.lambda$rethrowConsumer$0(LamdbaExceptionUtils.java:34)
   at java.util.HashMap$Values.forEach(HashMap.java:981)
   at net.minecraftforge.fml.event.lifecycle.GatherDataEvent$DataGeneratorConfig.runAll(GatherDataEvent.java:107)
   at net.minecraftforge.fml.DatagenModLoader.begin(DatagenModLoader.java:61)
   at net.minecraft.data.Main.main(Main.java:43)
   ... 11 more

I also tried a similar approach directly in my RecipeProvider class to generate an Ingredient there - but the same issue arose.

Is there any way of creating an in Ingredient that includes all metal (non-brick) ingots?

Link to comment
Share on other sites

Create your own tag.

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.

Link to comment
Share on other sites

40 minutes ago, Draco18s said:

Create your own tag.

Sorry, that's what I was doing?

If you mean create my own complete tag, I tried mod:metal_ingots, but this raised the exact same error.

Or, if you mean just putting iron, gold, and netherite in the same tag - other mods won't automatically integrate if they add their ingots to the forge:ingots tag.

Link to comment
Share on other sites

4 hours ago, DoctorC said:

java.lang.IllegalStateException: Tag forge:ingots used before it was bound

Show more of your code.

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.

Link to comment
Share on other sites

1 hour ago, Draco18s said:

Show more of your code.

I think this is what you mean?

ModItemTagsProvider.java

package my.mod.data;

import my.mod.Main;
import my.mod.setup.ModTags;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.data.ExistingFileHelper;

import java.util.List;

public class ModItemTagsProvider extends ItemTagsProvider {
    public ModItemTagsProvider(DataGenerator dataGenerator, BlockTagsProvider blockTagsProvider, ExistingFileHelper existingFileHelper) {
        super(dataGenerator, blockTagsProvider, Main.MOD_ID, existingFileHelper);
    }

    @Override
    protected void addTags() {
        List<Item> metalIngots = Tags.Items.INGOTS.getValues();
        metalIngots.removeAll(Tags.Items.INGOTS_BRICK.getValues());
        metalIngots.removeAll(Tags.Items.INGOTS_NETHER_BRICK.getValues());
        tag(ModTags.Items.INGOTS_METAL).add(metalIngots.toArray(new Item[0]));
    }
}

DataGenerators.java

package my.mod.data;

import my.mod.Main;
import my.mod.data.ModBlockTagsProvider;
import my.mod.data.ModItemTagsProvider;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;

@EventBusSubscriber(modid = Main.MOD_ID, bus = EventBusSubscriber.Bus.MOD)
public class DataGenerators {
    @SubscribeEvent
    public static void gatherData(GatherDataEvent event) {
        DataGenerator gen = event.getGenerator();
        ExistingFileHelper fileHelper = event.getExistingFileHelper();

        ModBlockTagsProvider blockTags = new ModBlockTagsProvider(gen, fileHelper);
        gen.addProvider(blockTags);
        gen.addProvider(new ModItemTagsProvider(gen, blockTags, fileHelper));
    }
}

ModTags.java

package my.mod.setup;

import my.mod.Main;
import net.minecraft.tags.ITag;
import net.minecraft.util.ResourceLocation;
import net.minecraft.item.Item;

public class ModTags {
  public static final class Items {
    public static final ITag.INamedTag<Item> INGOTS_METAL = mod("metal_ingots");
    
    private static ITag.INamedTag<Item> mod(String path) {
      return ItemTags.createOptional(new ResourceLocation(Main.MOD_ID, path));
    }
  }
}

 

Link to comment
Share on other sites

2 hours ago, diesieben07 said:

I don't think you can use tags like that in data generation. I would just check at runtime if the item is in the ingots tag but not in the brick or nether brick tags. This way it is dynamic as well, should mods add to these tags.

Okay, I guess that's the only option.

I'd like to have multiple recipes, so is there a good way to remove the bricks for the specific recipe instead of completely removing any support for them as an input Ingredient?

Link to comment
Share on other sites

11 hours ago, diesieben07 said:

I am not sure I understand your question.

Sorry.

You said that 'I would just check at runtime if the item is in the ingots tag but not in the brick or nether brick tags'.

How would I go about doing this?

Link to comment
Share on other sites

18 minutes ago, InspectorCaracal said:

What does your custom recipe look like?

It uses a custom recipe builder, but it's pretty similar to the furnace builders:

PressingRecipeBuilder.builder(Ingredient.of(ModTags.Items.INGOTS_METAL), ModItems.SHEET_METAL.get())
  .unlockedBy("has_item", has(ModTags.Items.INGOTS_METAL))
  .save(consumer, mod("sheet_metal_pressing"))

 

Link to comment
Share on other sites

8 hours ago, DoctorC said:

You said that 'I would just check at runtime if the item is in the ingots tag but not in the brick or nether brick tags'.

How would I go about doing this?

Write a custom Ingredient. You can register a custom serializer using CraftingHelper.register in FMLCommonSetupEvent#enqueueWork.

  • Like 1
Link to comment
Share on other sites

1 hour ago, diesieben07 said:

Write a custom Ingredient. You can register a custom serializer using CraftingHelper.register in FMLCommonSetupEvent#enqueueWork.

Sorry, I'm still not sure what you mean?

I have a RegistryObject<IRecipeSerializer<PressingRecipe>> which is used for my custom recipe type.

I have tried creating an Ingredient from a list of ItemStacks, generated using Tags.Items.INGOTS and removing the brick and nether brick tags (similar to as seen above) - but this produced the same error as in my original post.

Link to comment
Share on other sites

You need to create a class that extends Ingredient. You could call it "this but not the other" or something like this. In this Ingredient you take in two other ingredients and you test that the first one matches, but not the other one. Then you use this Ingredient in your recipe JSON with "ingot tag" as the ingredient that should match and "brick or nether brick" (you can use "forge:compound" for this) as the ingredient that should not match.

  • Like 1
Link to comment
Share on other sites

38 minutes ago, diesieben07 said:

You need to create a class that extends Ingredient. You could call it "this but not the other" or something like this. In this Ingredient you take in two other ingredients and you test that the first one matches, but not the other one. Then you use this Ingredient in your recipe JSON with "ingot tag" as the ingredient that should match and "brick or nether brick" (you can use "forge:compound" for this) as the ingredient that should not match.

Okay, I implemented this (without the forge:compound, no idea how to do this):

package my.mod.crafting;

import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;

import java.util.Arrays;
import java.util.stream.Stream;

public class IngredientWithout extends Ingredient {
    protected IngredientWithout(Stream<? extends IItemList> p_i49381_1_) {
        super(p_i49381_1_);
    }

    public static IngredientWithout of(Ingredient of, Ingredient without) {
        Stream<ItemStack> withoutItems = Arrays.stream(of.getItems()).filter(without);
        IngredientWithout ing = new IngredientWithout(withoutItems.filter((item) -> !item.isEmpty()).map(SingleItemList::new));

        return ing.getItems().length == 0 ? new IngredientWithout(Stream.empty()) : ing;
    }
}

But it produced the same issue:

Spoiler

Caused by: java.lang.IllegalStateException: Tag forge:ingots used before it was bound
	at net.minecraft.tags.TagRegistry$NamedTag.resolve(TagRegistry.java:131)
	at net.minecraft.tags.TagRegistry$NamedTag.getValues(TagRegistry.java:146)
	at net.minecraft.item.crafting.Ingredient$TagList.getItems(Ingredient.java:272)
	at net.minecraft.item.crafting.Ingredient.lambda$dissolve$5(Ingredient.java:59)
 	at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:269)
 	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
 	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
 	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
 	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:546)
	at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
 	at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:505)
 	at net.minecraft.item.crafting.Ingredient.dissolve(Ingredient.java:60)
	at net.minecraft.item.crafting.Ingredient.getItems(Ingredient.java:52)
 	at my.mod.crafting.IngredientWithout.of(IngredientWithout.java:15)
	at my.mod.data.ModRecipeProvider.buildShapelessRecipes(ModRecipeProvider.java:52)
	at net.minecraft.data.RecipeProvider.run(RecipeProvider.java:50)
 	at net.minecraft.data.DataGenerator.run(DataGenerator.java:44)
 	at net.minecraftforge.fml.event.lifecycle.GatherDataEvent$DataGeneratorConfig.lambda$runAll$0(GatherDataEvent.java:111)
	at cpw.mods.modlauncher.api.LamdbaExceptionUtils.lambda$rethrowConsumer$0(LamdbaExceptionUtils.java:34)
 	at java.util.HashMap$Values.forEach(HashMap.java:981)
	at net.minecraftforge.fml.event.lifecycle.GatherDataEvent$DataGeneratorConfig.runAll(GatherDataEvent.java:107)
 	at net.minecraftforge.fml.DatagenModLoader.begin(DatagenModLoader.java:61)
	at net.minecraft.data.Main.main(Main.java:43)
 	... 11 more

 

 

Edited by DoctorC
Link to comment
Share on other sites

Okay, so I've tried to implement this:

IngredientWithout.java

package my.mod.crafting;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tags.ITag;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class IngredientWithout extends Ingredient {
    private final Ingredient of;
    private final Ingredient without;

    protected IngredientWithout(@Nonnull ITag<Item> of, ITag<Item> without) {
        super(Stream.of(new Ingredient.TagList(of)));
        this.of = Ingredient.of(of);
        this.without = Ingredient.of(without);
    }

    protected IngredientWithout(@Nonnull Ingredient of, Ingredient without) {
        super(Arrays.stream(of.getItems()).filter((item) -> !item.isEmpty()).map(SingleItemList::new));
        this.of = of;
        this.without = without;
    }

    public static IngredientWithout of(ITag<Item> of, ITag<Item> without) {
        return new IngredientWithout(of, without);
    }

    public static IngredientWithout of(Ingredient of, Ingredient without) {
        return new IngredientWithout(of, without);
    }

    public static IngredientWithout fromJson(JsonElement jsonElement) {
        return new IngredientWithout(Ingredient.fromJson(jsonElement.getAsJsonObject().get("of")),
                Ingredient.fromJson(jsonElement.getAsJsonObject().get("without")));
    }

    public Ingredient of() {
        return this.of;
    }

    public Ingredient without() {
        return this.without;
    }

    @Override
    public ItemStack[] getItems() {
        return Arrays.stream(this.of.getItems()).filter(
                item -> Arrays.asList(this.without.getItems()).contains(item))
                .toArray(ItemStack[]::new);
    }

    @Override
    public boolean test(@Nullable ItemStack p_test_1_) {
        if (super.test(p_test_1_)) {
            for (ItemStack itemStack : this.of.getItems()) {
                if (!this.without.test(itemStack))
                    return true;
            }
        }
        return false;
    }

    @Override
    public JsonElement toJson() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.add("of", this.of.toJson());
        jsonObject.add("without", this.without.toJson());
        return jsonObject;
    }
}

I already have a Serialiser (as the recipe is for a custom Tile Entity), and have successfully implemented fromJson, but I'm not sure how to do fromNetwork and toNetwork as there are two ingredients:

PressingRecipe.java

package my.mod.crafting.recipe;

import com.google.gson.JsonObject;
import my.mod.crafting.IngredientWithout;
import my.mod.setup.ModRecipes;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.SingleItemRecipe;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistryEntry;

import javax.annotation.Nullable;

public class PressingRecipe extends SingleItemRecipe {
    public PressingRecipe(ResourceLocation recipeId,
                          Ingredient ingredient,
                          ItemStack result) {
        super(ModRecipes.Types.PRESSING, ModRecipes.Serialisers.PRESSING.get(), recipeId, "", ingredient, result);
    }

    @Override
    public boolean matches(IInventory inv, World world) {
        return this.ingredient.test(inv.getItem(0));
    }

    public static class Serialiser extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<PressingRecipe> {

        @Override
        public PressingRecipe fromJson(ResourceLocation recipeId, JsonObject json) {
            ResourceLocation itemId = new ResourceLocation(JSONUtils.getAsString(json, "result"));
            int count = JSONUtils.getAsInt(json, "count", 1);
            ItemStack result = new ItemStack(ForgeRegistries.ITEMS.getValue(itemId), count);

            if (json.has("ingredientWithout")) {
                IngredientWithout ingredient = IngredientWithout.fromJson(json.get("ingredientWithout"));
                return new PressingRecipe(recipeId, ingredient, result);
            } else {
                Ingredient ingredient = Ingredient.fromJson(json.get("ingredient"));
                return new PressingRecipe(recipeId, ingredient, result);
            }
        }

        @Nullable
        @Override
        public PressingRecipe fromNetwork(ResourceLocation recipeId, PacketBuffer buffer) {
            Ingredient of = Ingredient.fromNetwork(buffer);
            Ingredient without = Ingredient.fromNetwork(buffer);
            ItemStack result = buffer.readItem();
            return new PressingRecipe(recipeId, IngredientWithout.of(of, without), result);
        }

        @Override
        public void toNetwork(PacketBuffer buffer, PressingRecipe recipe) {
            if (recipe.ingredient instanceof IngredientWithout) {
                ((IngredientWithout) recipe.ingredient).of().toNetwork(buffer);
                ((IngredientWithout) recipe.ingredient).without().toNetwork(buffer);
            } else {
                recipe.ingredient.toNetwork(buffer);
            }
            buffer.writeItem(recipe.result);
        }
    }
}

And this is how I implemented the recipe:

PressingRecipeBuilder.builder(IngredientWithout.of(Tags.Items.INGOTS, Tags.Items.INGOTS_BRICK), ModItems.SHEET_METAL.get())
	.unlockedBy("has_item", has(Tags.Items.INGOTS))
	.save(consumer, mod("sheet_metal_pressing"));

 

Unfortunately, anything from the forge:ingots tag seems to still work. This has also messed up my JEI integration (the input is blank in the JEI screen).

Link to comment
Share on other sites

Might be wrong, but I think in here you should be comparing items instead of itemstacks.

3 hours ago, DoctorC said:

 



    @Override
    public ItemStack[] getItems() {
        return Arrays.stream(this.of.getItems()).filter(
                item -> Arrays.asList(this.without.getItems()).contains(item))
                .toArray(ItemStack[]::new);
    }

 

And in fact this returns an array that contains all of the "without" items, which I think it's the opposite of your target?

Because you then

    @Override
    public boolean test(@Nullable ItemStack p_test_1_) {
        if (super.test(p_test_1_)) {
            for (ItemStack itemStack : this.of.getItems()) {
                if (!this.without.test(itemStack))
                    return true;
            }
        }
        return false;
    }

check if the stack is not in "without", where does not make much sense.

Link to comment
Share on other sites

6 hours ago, DoctorC said:

This has also messed up my JEI integration (the input is blank in the JEI screen).

You probably need to teach JEI about your custom ingredient.

6 hours ago, DoctorC said:

but I'm not sure how to do fromNetwork and toNetwork as there are two ingredients:

Your recipe shouldn't have to care about your special ingredient at all. Just treat it as a regular ingredient...

Link to comment
Share on other sites

3 hours ago, poopoodice said:

Might be wrong, but I think in here you should be comparing items instead of itemstacks.

And in fact this returns an array that contains all of the "without" items, which I think it's the opposite of your target?

Because you then


    @Override
    public boolean test(@Nullable ItemStack p_test_1_) {
        if (super.test(p_test_1_)) {
            for (ItemStack itemStack : this.of.getItems()) {
                if (!this.without.test(itemStack))
                    return true;
            }
        }
        return false;
    }

check if the stack is not in "without", where does not make much sense.

Yep, thanks - I've fixed this.

44 minutes ago, diesieben07 said:

You probably need to teach JEI about your custom ingredient.

Now that I have fixed up the getItems() method, JEI has all the ingots except brick - so that respect is working great!

46 minutes ago, diesieben07 said:

Your recipe shouldn't have to care about your special ingredient at all. Just treat it as a regular ingredient...

I've done this - but unfortunately the recipe still works with brick.

 

Here are my new files:

IngredientWithout.java:

package my.mod.crafting;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tags.ITag;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class IngredientWithout extends Ingredient {
    private final Ingredient of;
    private final Ingredient without;

    protected IngredientWithout(@Nonnull ITag<Item> of, ITag<Item> without) {
        super(Stream.of(new Ingredient.TagList(of)));
        this.of = Ingredient.of(of);
        this.without = Ingredient.of(without);
    }

    protected IngredientWithout(@Nonnull Ingredient of, Ingredient without) {
        super(Arrays.stream(of.getItems()).filter((item) -> !item.isEmpty()).map(SingleItemList::new));
        this.of = of;
        this.without = without;
    }

    public static IngredientWithout of(ITag<Item> of, ITag<Item> without) {
        return new IngredientWithout(of, without);
    }

    public static IngredientWithout fromJson(JsonElement jsonElement) {
        return new IngredientWithout(Ingredient.fromJson(jsonElement.getAsJsonObject().get("of")),
                Ingredient.fromJson(jsonElement.getAsJsonObject().get("without")));
    }

    @Override
    public ItemStack[] getItems() {
        return Arrays.stream(this.of.getItems()).filter(
                ofItemStack -> !Arrays.stream(this.without.getItems())
                        .map(ItemStack::getItem)
                        .collect(Collectors.toList()).contains(ofItemStack.getItem()))
                .toArray(ItemStack[]::new);
    }

    @Override
    public boolean test(@Nullable ItemStack p_test_1_) {
        if (super.test(p_test_1_)) {
            for (ItemStack itemStack : this.of.getItems()) {
                if (!this.without.test(itemStack))
                    return true;
            }
        }
        return false;
    }

    @Override
    public JsonElement toJson() {
        JsonObject jsonObject = new JsonObject();
        jsonObject.add("of", this.of.toJson());
        jsonObject.add("without", this.without.toJson());
        return jsonObject;
    }
}

 

PressingRecipe.java:

package my.mod.crafting.recipe;

import com.google.gson.JsonObject;
import my.mod.crafting.IngredientWithout;
import my.mod.setup.ModRecipes;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.SingleItemRecipe;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.JSONUtils;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.ForgeRegistryEntry;

import javax.annotation.Nullable;

public class PressingRecipe extends SingleItemRecipe {
    public PressingRecipe(ResourceLocation recipeId,
                          Ingredient ingredient,
                          ItemStack result) {
        super(ModRecipes.Types.PRESSING, ModRecipes.Serialisers.PRESSING.get(), recipeId, "", ingredient, result);
    }

    @Override
    public boolean matches(IInventory inv, World world) {
        return this.ingredient.test(inv.getItem(0));
    }

    public static class Serialiser extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<PressingRecipe> {

        @Override
        public PressingRecipe fromJson(ResourceLocation recipeId, JsonObject json) {
            ResourceLocation itemId = new ResourceLocation(JSONUtils.getAsString(json, "result"));
            int count = JSONUtils.getAsInt(json, "count", 1);
            ItemStack result = new ItemStack(ForgeRegistries.ITEMS.getValue(itemId), count);

            if (json.has("ingredientWithout")) {
                IngredientWithout ingredient = IngredientWithout.fromJson(json.get("ingredientWithout"));
                return new PressingRecipe(recipeId, ingredient, result);
            } else {
                Ingredient ingredient = Ingredient.fromJson(json.get("ingredient"));
                return new PressingRecipe(recipeId, ingredient, result);
            }
        }

        @Nullable
        @Override
        public PressingRecipe fromNetwork(ResourceLocation recipeId, PacketBuffer buffer) {
            Ingredient ingredient = Ingredient.fromNetwork(buffer);
            ItemStack result = buffer.readItem();
            return new PressingRecipe(recipeId, ingredient, result);
        }

        @Override
        public void toNetwork(PacketBuffer buffer, PressingRecipe recipe) {
            recipe.ingredient.toNetwork(buffer);
            buffer.writeItem(recipe.result);
        }
    }
}

 

Link to comment
Share on other sites

  • Your getItems implementation is wrong, because ItemStack does not implement equals, as such the contains call will never work. You need to use ItemStack.matches.
  • Your test implementation is just... strange. What is wrong with just
    return of.test(stack) && !without.test(stack)

    ?

  • Your recipe serializer still has special checks for your custom ingredient. You do not need to do this. Ingredient.fromJson handles custom ingredients already.
  • Like 1
Link to comment
Share on other sites

37 minutes ago, diesieben07 said:
  • Your getItems implementation is wrong, because ItemStack does not implement equals, as such the contains call will never work. You need to use ItemStack.matches.
  • Your test implementation is just... strange. What is wrong with just
    
    return of.test(stack) && !without.test(stack)

    ?

  • Your recipe serializer still has special checks for your custom ingredient. You do not need to do this. Ingredient.fromJson handles custom ingredients already.

It works!
I'm not sure about your final point about Ingredient.fromJson working already, as I used a different JSON key ('ingredientWithout' instead of 'ingredient') - so I didn't change this.

Sorry to bother you again but what did you mean by 'forge:compound' earlier as a method of removing both bricks and nether bricks. I can easily do this with a custom tag, just wondering if that would be an easier way?

Thanks!

Link to comment
Share on other sites

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Hello there, i have an issue. I want to add custom 3d model to armor(I want to create addon that replace armor with samurai armor in Gobber mod). Here is the code: package com.kwpugh.gobber2.items.armor; import java.util.List; import javax.annotation.Nullable; import com.kwpugh.gobber2.config.GobberConfigBuilder; import com.kwpugh.gobber2.init.ItemInit; import com.kwpugh.gobber2.items.armor.models.GobberSamurai; import com.kwpugh.gobber2.util.PlayerSpecialAbilities; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; import net.minecraft.world.effect.MobEffects; import net.minecraft.network.chat.Component; import net.minecraft.ChatFormatting; import net.minecraft.client.model.HumanoidModel; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.IItemRenderProperties; import net.minecraft.world.item.Item.Properties; public class ItemCustomArmorNether extends ArmorItem { public ItemCustomArmorNether(ArmorMaterial materialIn, EquipmentSlot slots, Properties builder) { super(materialIn, slots, builder); } boolean enablePerks = GobberConfigBuilder.ENABLE_GOBBER_NETHER_ARMOR_HEALTH_PERKS.get(); int hunger = GobberConfigBuilder.GOBBER_NETHER_ARMOR_HUNGER.get(); double saturation = GobberConfigBuilder.GOBBER_NETHER_ARMOR_SATURATION.get(); @Override public void onArmorTick(final ItemStack stack, final Level world, final Player player) { if(!enablePerks) return; ItemStack head = player.getItemBySlot(EquipmentSlot.HEAD); ItemStack chest = player.getItemBySlot(EquipmentSlot.CHEST); ItemStack legs = player.getItemBySlot(EquipmentSlot.LEGS); ItemStack feet = player.getItemBySlot(EquipmentSlot.FEET); //Full Set if(head.getItem() == ItemInit.GOBBER2_HELMET_NETHER.get() && chest.getItem() == ItemInit.GOBBER2_CHESTPLATE_NETHER.get() && legs.getItem() == ItemInit.GOBBER2_LEGGINGS_NETHER.get() && feet.getItem() == ItemInit.GOBBER2_BOOTS_NETHER.get()) { if(player.getEffect(MobEffects.POISON) != null) { player.removeEffect(MobEffects.POISON); } if(player.getEffect(MobEffects.WITHER) != null) { player.removeEffect(MobEffects.WITHER); } } //Check ArmorUtil for additional perks applied to armor //Helmet if(head.getItem() == ItemInit.GOBBER2_HELMET_NETHER.get()) { PlayerSpecialAbilities.giveYellowHearts(world, player, stack, 4, 0.33F); PlayerSpecialAbilities.giveRegenEffect(world, player, stack, hunger, (float) saturation); } //Chestplate if(chest.getItem() == ItemInit.GOBBER2_CHESTPLATE_NETHER.get()) { // TBD } //Leggings if(legs.getItem() == ItemInit.GOBBER2_LEGGINGS_NETHER.get()) { } else { } //Boots if(feet.getItem() == ItemInit.GOBBER2_BOOTS_NETHER.get()) { } else { } } @Override public boolean isBookEnchantable(ItemStack stack, ItemStack book) { return true; } @Override public boolean isValidRepairItem(ItemStack toRepair, ItemStack repair) { return repair.getItem() == ItemInit.GOBBER2_INGOT_NETHER.get(); } @OnlyIn(Dist.CLIENT) public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List<Component> tooltip, TooltipFlag flagIn) { super.appendHoverText(stack, worldIn, tooltip, flagIn); if(enablePerks) { tooltip.add((new TranslatableComponent("item.gobber2.gobber2_armor_nether.line2").withStyle(ChatFormatting.LIGHT_PURPLE))); tooltip.add((new TranslatableComponent("item.gobber2.gobber2_armor_nether.line3").withStyle(ChatFormatting.LIGHT_PURPLE))); tooltip.add((new TranslatableComponent("item.gobber2.gobber2_armor_nether.line4").withStyle(ChatFormatting.LIGHT_PURPLE))); tooltip.add((new TranslatableComponent("item.gobber2.gobber2_armor_nether.line5").withStyle(ChatFormatting.LIGHT_PURPLE))); tooltip.add((new TranslatableComponent("item.gobber2.gobber2_armor_nether.line6").withStyle(ChatFormatting.GOLD))); } } @Override public void initializeClient(java.util.function.Consumer<net.minecraftforge.client.IItemRenderProperties> consumer) { consumer.accept(new IItemRenderProperties() { @Override public <A extends HumanoidModel<?>> A getArmorModel(LivingEntity entityLiving, ItemStack itemStack, EquipmentSlot armorSlot, A _default) { if(armorSlot == EquipmentSlot.CHEST) { return (A) new GobberSamurai(); } return null; } }); } @Override public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) { return "gobber2.models.armor.GobberSamurai" + (slot == EquipmentSlot.HEAD ? "2" : "1") + ".png"; } } The problem is in getArmorModel method and in return (A) new GobberSamurai(); It says "The constructor GobberSamurai() is undefined".  Here is my model class:   package com.kwpugh.gobber2.items.armor.models; import java.util.List; import javax.annotation.Nullable; import com.kwpugh.gobber2.config.GobberConfigBuilder; import com.kwpugh.gobber2.init.ItemInit; import com.kwpugh.gobber2.util.PlayerSpecialAbilities; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ItemStack; import net.minecraft.world.effect.MobEffects; import net.minecraft.network.chat.Component; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraft.client.model.EntityModel; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.LayerDefinition; import net.minecraft.client.model.geom.builders.MeshDefinition; import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.world.item.Item.Properties; public class GobberSamurai<T extends Entity> extends EntityModel<T> { // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "gobbersamurai"), "main"); private final ModelPart Head; private final ModelPart Body; private final ModelPart RightArm; private final ModelPart LeftArm; private final ModelPart RightLeg; private final ModelPart LeftLeg; public GobberSamurai(ModelPart root) { this.Head = root.getChild("Head"); this.Body = root.getChild("Body"); this.RightArm = root.getChild("RightArm"); this.LeftArm = root.getChild("LeftArm"); this.RightLeg = root.getChild("RightLeg"); this.LeftLeg = root.getChild("LeftLeg"); } public static LayerDefinition createBodyLayer() { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); PartDefinition Head = partdefinition.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(1, 34).addBox(-5.0F, -9.0F, -5.0F, 10.0F, 4.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); PartDefinition cube_r1 = Head.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(1, 34).addBox(-3.2F, -0.225F, -5.0F, 5.0F, 1.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(5.8435F, -2.8805F, 0.0F, 0.0F, 0.0F, 1.1345F)); PartDefinition cube_r2 = Head.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(1, 34).addBox(-3.225F, -6.625F, -5.0F, 5.0F, 1.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -0.1594F, 0.0523F, -1.5708F, -0.4363F, 1.5708F)); PartDefinition cube_r3 = Head.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(1, 34).addBox(-6.0F, 5.0F, -5.0F, 1.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -1.5708F, 0.0F, 1.5708F)); PartDefinition cube_r4 = Head.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(42, 36).addBox(-1.2F, -0.5F, -1.5F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-6.3F, -4.3F, -5.6F, -2.313F, 0.0322F, 2.0649F)); PartDefinition cube_r5 = Head.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(1, 34).mirror().addBox(-1.8F, -0.225F, -5.0F, 5.0F, 1.0F, 10.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-5.8435F, -2.8805F, 0.0F, 0.0F, 0.0F, -1.1345F)); PartDefinition cube_r6 = Head.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(42, 36).mirror().addBox(-1.8F, -0.5F, -1.5F, 3.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(6.3F, -4.3F, -5.6F, -2.313F, -0.0322F, -2.0649F)); PartDefinition Body = partdefinition.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(11, 35).addBox(4.0F, 3.0F, -3.0F, 1.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(-5.0F, 8.0F, -3.0F, 1.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(4.0F, 8.0F, -3.0F, 1.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(-5.0F, 3.0F, -3.0F, 1.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(-4.0F, 1.0F, -4.0F, 8.0F, 7.0F, 2.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(-4.0F, 8.0F, -3.0F, 8.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) .texOffs(11, 35).addBox(-4.0F, 11.0F, -2.5F, 8.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)) .texOffs(0, 32).addBox(-4.0F, 1.0F, 2.0F, 8.0F, 11.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); PartDefinition RightArm = partdefinition.addOrReplaceChild("RightArm", CubeListBuilder.create().texOffs(39, 2).addBox(-3.5F, -2.5F, -2.5F, 5.0F, 5.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(39, 2).mirror().addBox(-1.5F, 3.5F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(39, 2).mirror().addBox(-3.5F, 3.5F, -2.5F, 2.0F, 6.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(39, 2).mirror().addBox(-1.5F, 6.5F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-5.0F, 2.0F, 0.0F)); PartDefinition cube_r7 = RightArm.addOrReplaceChild("cube_r7", CubeListBuilder.create().texOffs(10, 37).mirror().addBox(1.5F, -1.0F, -3.5F, 1.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-2.5F, 0.0F, -3.5F, 5.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-4.5F, 1.0F, -3.5F, 3.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-6.5F, 1.5F, -3.5F, 3.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-4.0588F, -1.8378F, 0.0F, 0.0F, 0.0F, -1.1345F)); PartDefinition LeftArm = partdefinition.addOrReplaceChild("LeftArm", CubeListBuilder.create().texOffs(39, 2).addBox(-1.5F, -2.5F, -2.5F, 5.0F, 5.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(39, 2).addBox(1.5F, 3.5F, -2.5F, 2.0F, 6.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(39, 2).addBox(-1.5F, 3.5F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(39, 2).addBox(-1.5F, 6.5F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offset(5.0F, 2.0F, 0.0F)); PartDefinition cube_r8 = LeftArm.addOrReplaceChild("cube_r8", CubeListBuilder.create().texOffs(10, 37).addBox(3.5F, 1.5F, -3.5F, 3.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(1.5F, 1.0F, -3.5F, 3.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-2.5F, -1.0F, -3.5F, 1.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-2.5F, 0.0F, -3.5F, 5.0F, 1.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(4.0588F, -1.8378F, 0.0F, 0.0F, 0.0F, 1.1345F)); PartDefinition RightLeg = partdefinition.addOrReplaceChild("RightLeg", CubeListBuilder.create(), PartPose.offset(-1.9F, 12.0F, 0.0F)); PartDefinition cube_r9 = RightLeg.addOrReplaceChild("cube_r9", CubeListBuilder.create().texOffs(10, 37).mirror().addBox(-4.9F, 10.65F, 9.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-4.9F, 11.65F, 11.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-4.9F, 9.65F, 7.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(1.9F, -11.8378F, 9.0588F, -1.1345F, 0.0F, 0.0F)); PartDefinition cube_r10 = RightLeg.addOrReplaceChild("cube_r10", CubeListBuilder.create().texOffs(10, 37).mirror().addBox(-4.9F, 10.65F, -12.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-4.9F, 11.65F, -14.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-2.9F, 10.65F, -15.3F, 3.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-2.9F, 11.65F, -17.3F, 3.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-2.9F, 9.65F, -12.3F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-4.9F, 9.65F, -10.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(1.9F, -11.8378F, -9.0588F, 1.1345F, 0.0F, 0.0F)); PartDefinition cube_r11 = RightLeg.addOrReplaceChild("cube_r11", CubeListBuilder.create().texOffs(10, 37).mirror().addBox(-16.0F, 11.0F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-14.0F, 10.0F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false) .texOffs(10, 37).mirror().addBox(-12.0F, 9.0F, -2.5F, 4.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-7.1588F, -11.8378F, 0.0F, 0.0F, 0.0F, -1.1345F)); PartDefinition LeftLeg = partdefinition.addOrReplaceChild("LeftLeg", CubeListBuilder.create(), PartPose.offset(1.9F, 12.0F, 0.0F)); PartDefinition cube_r12 = LeftLeg.addOrReplaceChild("cube_r12", CubeListBuilder.create().texOffs(10, 37).addBox(13.0F, 11.0F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(11.0F, 10.0F, -2.5F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(8.0F, 9.0F, -2.5F, 4.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(7.1588F, -11.8378F, 0.0F, 0.0F, 0.0F, 1.1345F)); PartDefinition cube_r13 = LeftLeg.addOrReplaceChild("cube_r13", CubeListBuilder.create().texOffs(10, 37).addBox(-0.1F, 9.65F, -12.3F, 3.0F, 1.0F, 5.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(2.9F, 11.65F, -14.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-0.1F, 11.65F, -17.3F, 3.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(2.9F, 10.65F, -12.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-0.1F, 10.65F, -15.3F, 3.0F, 1.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(2.9F, 9.65F, -10.3F, 2.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.9F, -11.8378F, -9.0588F, 1.1345F, 0.0F, 0.0F)); PartDefinition cube_r14 = LeftLeg.addOrReplaceChild("cube_r14", CubeListBuilder.create().texOffs(10, 37).addBox(-0.1F, 9.65F, 7.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-0.1F, 11.65F, 11.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)) .texOffs(10, 37).addBox(-0.1F, 10.65F, 9.5F, 5.0F, 1.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-1.9F, -11.8378F, 9.0588F, -1.1345F, 0.0F, 0.0F)); return LayerDefinition.create(meshdefinition, 64, 64); } @Override public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { } @Override public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { Head.render(poseStack, buffer, packedLight, packedOverlay); Body.render(poseStack, buffer, packedLight, packedOverlay); RightArm.render(poseStack, buffer, packedLight, packedOverlay); LeftArm.render(poseStack, buffer, packedLight, packedOverlay); RightLeg.render(poseStack, buffer, packedLight, packedOverlay); LeftLeg.render(poseStack, buffer, packedLight, packedOverlay); } } I just don't know what to do now, I have searched everywhere but I have found nothing for 1.18.1 version.
    • I've been trying for the past hour to get one of these Modpacks to work, and after running the Serverrun.bat it gets all the way through the process on both Modpacks before it gives me the following Error Message. Error: Could not find or load main class @libraries.net.minecraftforge.forge.1.18.1-39.0.22.win_args.txt Any help would be great!  
    • The game crashed while playing. please help I don't know how to. ---- Minecraft Crash Report ---- // Shall we play a game? Time: 1/29/22, 1:08 AM Description: Exception in server tick loop java.lang.NoSuchMethodError: 'net.minecraft.nbt.CompoundTag net.minecraft.world.level.block.entity.BlockEntity.save(net.minecraft.nbt.CompoundTag)'     at ht.treechop.common.block.ChoppedLogBlock$Entity.save(ChoppedLogBlock.java:291) ~[TreeChop-Mod-1.18.1.jar%2367!/:0.15.3] {re:classloading}     at ht.treechop.common.block.ChoppedLogBlock$Entity.m_5995_(ChoppedLogBlock.java:335) ~[TreeChop-Mod-1.18.1.jar%2367!/:0.15.3] {re:classloading}     at net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket.m_195642_(ClientboundBlockEntityDataPacket.java:21) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket.m_195640_(ClientboundBlockEntityDataPacket.java:25) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at ht.treechop.common.block.ChoppedLogBlock$Entity.getUpdatePacket(ChoppedLogBlock.java:328) ~[TreeChop-Mod-1.18.1.jar%2367!/:0.15.3] {re:classloading}     at ht.treechop.common.block.ChoppedLogBlock$Entity.m_183216_(ChoppedLogBlock.java:260) ~[TreeChop-Mod-1.18.1.jar%2367!/:0.15.3] {re:classloading}     at net.minecraftforge.common.ForgeHooks.onBlockBreakEvent(ForgeHooks.java:562) ~[forge-1.18.1-39.0.62-universal.jar%2374!/:?] {re:classloading}     at net.minecraft.server.level.ServerPlayerGameMode.m_9280_(ServerPlayerGameMode.java:227) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:computing_frames,re:classloading}     at net.minecraft.server.level.ServerPlayerGameMode.m_9286_(ServerPlayerGameMode.java:217) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:computing_frames,re:classloading}     at net.minecraft.server.level.ServerPlayerGameMode.m_7391_(ServerPlayerGameMode.java:187) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:computing_frames,re:classloading}     at net.minecraft.server.network.ServerGamePacketListenerImpl.m_7502_(ServerGamePacketListenerImpl.java:945) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.network.protocol.game.ServerboundPlayerActionPacket.m_5797_(ServerboundPlayerActionPacket.java:34) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.network.protocol.game.ServerboundPlayerActionPacket.m_5797_(ServerboundPlayerActionPacket.java:8) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.network.protocol.PacketUtils.m_131356_(PacketUtils.java:21) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.server.TickTask.run(TickTask.java:18) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:classloading}     at net.minecraft.util.thread.BlockableEventLoop.m_6367_(BlockableEventLoop.java:151) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.util.thread.ReentrantBlockableEventLoop.m_6367_(ReentrantBlockableEventLoop.java:23) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,re:computing_frames,re:classloading}     at net.minecraft.server.MinecraftServer.m_6367_(MinecraftServer.java:765) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_6367_(MinecraftServer.java:161) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.util.thread.BlockableEventLoop.m_7245_(BlockableEventLoop.java:125) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.server.MinecraftServer.m_129961_(MinecraftServer.java:748) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_7245_(MinecraftServer.java:742) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.util.thread.BlockableEventLoop.m_18699_(BlockableEventLoop.java:110) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}     at net.minecraft.server.MinecraftServer.m_130012_(MinecraftServer.java:727) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:672) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:258) ~[client-1.18.1-20211210.034407-srg.jar%2370!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:byg.mixins.json:server.MixinMinecraftServer,pl:mixin:A}     at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details:     Minecraft Version: 1.18.1     Minecraft Version ID: 1.18.1     Operating System: Windows 10 (amd64) version 10.0     Java Version: 17.0.1, Microsoft     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Microsoft     Memory: 2163132464 bytes (2062 MiB) / 6643777536 bytes (6336 MiB) up to 8589934592 bytes (8192 MiB)     CPUs: 8     Processor Vendor: GenuineIntel     Processor Name: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz     Identifier: Intel64 Family 6 Model 142 Stepping 11     Microarchitecture: whiskey Lake     Frequency (GHz): 1.99     Number of physical packages: 1     Number of physical CPUs: 4     Number of logical CPUs: 8     Graphics card #0 name: Intel(R) UHD Graphics 620     Graphics card #0 vendor: Intel Corporation (0x8086)     Graphics card #0 VRAM (MB): 1024.00     Graphics card #0 deviceId: 0x3ea0     Graphics card #0 versionInfo: DriverVersion=26.20.100.7926     Memory slot #0 capacity (MB): 8192.00     Memory slot #0 clockSpeed (GHz): 2.40     Memory slot #0 type: DDR4     Memory slot #1 capacity (MB): 8192.00     Memory slot #1 clockSpeed (GHz): 2.40     Memory slot #1 type: DDR4     Virtual memory max (MB): 20670.30     Virtual memory used (MB): 17701.50     Swap memory total (MB): 4496.57     Swap memory used (MB): 717.27     JVM Flags: 9 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xss1M -Xmx8G -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M     Server Running: true     Player Count: 1 / 8; [ServerPlayer['rocio12barcenas'/187, l='ServerLevel[New World]', x=82.38, y=75.00, z=-249.35]]     Data Packs: vanilla, mod:forge, mod:sereneseasons (incompatible), mod:mna (incompatible), mod:treechop (incompatible), mod:terrablender, mod:apotheosis (incompatible), mod:cfm, mod:jei, mod:bumblecore, mod:byg (incompatible), mod:torohealth (incompatible), mod:curios, mod:xaerominimap, mod:geckolib3 (incompatible), mod:xaeroworldmap, mod:placebo (incompatible), mod:dramaticdoors, mod:travelersbackpack, mod:foodsicles     Type: Integrated Server (map_client.txt)     Is Modded: Definitely; Client brand changed to 'forge'; Server brand changed to 'forge'     ModLauncher: 9.1.0+9.1.0+main.6690ee51     ModLauncher launch target: forgeclient     ModLauncher naming: srg     ModLauncher services:           mixin PLUGINSERVICE           eventbus PLUGINSERVICE           object_holder_definalize PLUGINSERVICE           runtime_enum_extender PLUGINSERVICE           capability_token_subclass PLUGINSERVICE           accesstransformer PLUGINSERVICE           runtimedistcleaner PLUGINSERVICE           mixin TRANSFORMATIONSERVICE           fml TRANSFORMATIONSERVICE      FML Language Providers:          minecraft@1.0         javafml@null     Mod List:          client-1.18.1-20211210.034407-srg.jar             |Minecraft                     |minecraft                     |1.18.1              |DONE      |Manifest: a1:d4:5e:04:4f:d3:d6:e0:7b:37:97:cf:77:b0:de:ad:4a:47:ce:8c:96:49:5f:0a:cf:8c:ae:b2:6d:4b:8a:3f         Serene-Seasons-Mod-1.18.1.jar                     |Serene Seasons                |sereneseasons                 |1.18.1-6.0.0.11     |DONE      |Manifest: NOSIGNATURE         Mana-and-Artifice-Mod-1.18.1.jar                  |Mana and Artifice             |mna                           |1.7.0.2             |DONE      |Manifest: NOSIGNATURE         TreeChop-Mod-1.18.1.jar                           |HT's TreeChop                 |treechop                      |0.15.3              |DONE      |Manifest: NOSIGNATURE         TerraBlender-forge-1.18.1-1.1.0.73.jar            |TerraBlender                  |terrablender                  |1.18.1-1.1.0.73     |DONE      |Manifest: NOSIGNATURE         Apotheosis-Mod-1.18.1.jar                         |Apotheosis                    |apotheosis                    |5.2.0               |DONE      |Manifest: NOSIGNATURE         MrCrayfishs-Furniture-Mod-1.18.1.jar              |MrCrayfish's Furniture Mod    |cfm                           |7.0.0-pre28         |DONE      |Manifest: NOSIGNATURE         jei-1.18.1-9.2.3.82.jar                           |Just Enough Items             |jei                           |9.2.3.82            |DONE      |Manifest: NOSIGNATURE         bumblecore-1.18.1-1.0.4.jar                       |Bumblecore                    |bumblecore                    |1.18.1-1.0.4        |DONE      |Manifest: NOSIGNATURE         Oh+The+Biomes+You'll+Go-forge-1.18.1-1.3.5.8.jar  |Oh The Biomes You'll Go       |byg                           |1.3.5.8             |DONE      |Manifest: NOSIGNATURE         forge-1.18.1-39.0.62-universal.jar                |Forge                         |forge                         |39.0.62             |DONE      |Manifest: 84:ce:76:e8:45:35:e4:0e:63:86:df:47:59:80:0f:67:6c:c1:5f:6e:5f:4d:b3:54:47:1a:9f:7f:ed:5e:f2:90         torohealth-1.18-forge-2.jar                       |ToroHealth                    |torohealth                    |1.18-forge-2        |DONE      |Manifest: NOSIGNATURE         Curios-API-1.18.1.jar                             |Curios API                    |curios                        |1.18.1-5.0.6.0      |DONE      |Manifest: NOSIGNATURE         Xaeros_Minimap_22.1.0_Forge_1.18.jar              |Xaero's Minimap               |xaerominimap                  |22.1.0              |DONE      |Manifest: NOSIGNATURE         geckolib-1.18-forge-3.0.9.jar                     |GeckoLib                      |geckolib3                     |3.0.9               |DONE      |Manifest: NOSIGNATURE         XaerosWorldMap_1.20.0_Forge_1.18.jar              |Xaero's World Map             |xaeroworldmap                 |1.20.0              |DONE      |Manifest: NOSIGNATURE         Place2bo-1.18.1-6.0.5.jar                          |Placebo                       |placebo                       |6.0.5               |DONE      |Manifest: NOSIGNATURE         Dramatic-Doors-Mod-1.18.1.jar                     |Dramatic Doors                |dramaticdoors                 |1.18.1-1.5.0        |DONE      |Manifest: NOSIGNATURE         TravelersBackpack-1.18.1-7.0.1.jar                |Traveler's Backpack           |travelersbackpack             |7.0.1               |DONE      |Manifest: NOSIGNATURE         foodsicles-1.18.1-1.0.4.jar                       |Foodsicles                    |foodsicles                    |1.18.1-1.0.4        |DONE      |Manifest: NOSIGNATURE     Crash Report UUID: d060c158-744d-48bd-ba52-bf8d49f5f8d2     FML: 39.0     Forge: net.minecraftforge:39.0.6
    • Hi guys! I currently have a project that I've been developing in a 'vanilla' environment that I'm actually looking to transfer over to Forge, simply because of how much better the experience would be using Forge. Before starting on this Forge mod, I was planning ahead and was looking at options for proxies, of which I would greatly like to use Velocity. In their docs and by asking around their Discord, they don't support support versions of Forge of 1.13 or later because of changes in the "handshake protocol". But I also really don't want to use an unsupported version of Forge, such as 1.12.2, to be able to use a proxy. I was pointed in the direction of potentially making my own client-side mod to allow Forge to be compatible with an updated proxy, such as Velocity. When asking for a direction for achieving this, I was told to have a look at how the Forge server implements logins and that the discrepancy might be with how modified the handshake protocol is. This sounds like quite the challenge to me and I'm completely up for trying to accomplish it. So for the sake of planning ahead and having a rough idea of how I could accomplish that when the time comes to work on it, has anyone else had experience with trying to achieve this? I appreciate any help or direction offered! Thanks! 
    • Been trying to set up a server for myself and a few friends through BisectHosting. I ended up replicating the server on my own computer to see if the issue persisted (if it was on bisect's end) and it was still there. Every time a player tries to connect to the server they start connecting but after only around 2 seconds the player is disconnected with the error message Payload size exceeds 1048576 bytes.  Upon inspection of the server debug file, the player always disconnects while fmlhandshake ticking packet info is being sent, and I have repeatedly made sure the mods and their configs are identical. I tried to get RandomPatches to increase the max allowed byte size, as the default seems to be 32767, but either something is wrong with it or some other mod is limiting the packet size limit.     Server Debug: https://pastebin.com/xZLbtdQB (only includes portions from after the server launched as I couldn't upload the whole file) Server Log: https://pastebin.com/yrJ3tNaW (similarly only after server launched (hence the weird say commands) Client Log: https://pastebin.com/inSzZV96 (whole thing for once) Modlist: https://pastebin.com/Qvurg45j (All but Optifine and BetterFoliage are present on the server as they have caused issues during startup)   Honestly stumped on how to fix this, been working on it for 10 hours across two days to no avail.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.