Posted May 31, 20196 yr Hello. I have a tile entity that looks for json crafting recipes like the furnace does, but it won't work. The function in my tile entity IRecipe irecipe = this.world.getRecipeManager().getRecipe(new RecipeWrapper(this.inv, 0, 0), this.world, SoulMagic.SOUL_INFUSING_TYPE); is returning null no matter what the items in the inventory are. I found the method in TileEntityFurnace.java, and I am using an item capability. (I need the RecipeWrapper to "wrap" it from capabilities to IInventory). TileEntitySoulInfuser: Spoiler @Override public void tick() { if(!this.world.isRemote) { if(!this.inv.getStackInSlot(9).isEmpty() && this.inv.getStackInSlot(9).getCapability(SoulManager.SOUL_CAPABILITY).isPresent()) { if(!this.inv.getStackInSlot(8).isEmpty()) { IRecipe irecipe = this.world.getRecipeManager().getRecipe(new RecipeWrapper(this.inv, 0, 0), this.world, SoulMagic.SOUL_INFUSING_TYPE); SoulMagic.LOGGER.info(irecipe); //OTHER STUFFFFFF LATER } } I have all the conditionals met and it spams "null" in my terminal. SoulMagic: (My main mod java class) Spoiler public static final IRecipeSerializer<SoulInfuserRecipe> SOUL_INFUSING = RecipeSerializers.register(new SoulInfuserRecipe.Serializer()); public static final RecipeType<SoulInfuserRecipe> SOUL_INFUSING_TYPE = RecipeType.get(new ResourceLocation(Reference.MOD_ID, "soul_infusing"), SoulInfuserRecipe.class); I don't know where else to put it, I couldn't find an event for it easily. SoulInfuserRecipe and SoulInfuserRecipe.Serializer: Spoiler public class SoulInfuserRecipe implements IRecipe { private ResourceLocation id; private NonNullList<Ingredient> inputs; private Spell spell; public SoulInfuserRecipe(ResourceLocation id, NonNullList<Ingredient> inputs, Spell spell) { this.id = id; this.inputs = inputs; this.spell = spell; } @Override public boolean matches(IInventory inv, World worldIn) { //It's just true atm to see if there's anyway to make it work somewhat, but it still doesn't with true return true; } @Override public ItemStack getCraftingResult(IInventory inv) { //Making it return something random just to see if does do something return new ItemStack(Items.ACACIA_BOAT); } @Override public boolean canFit(int width, int height) { return true; } @Override public ItemStack getRecipeOutput() { //Making it return something random just to see if does do something return new ItemStack(Items.ACACIA_BOAT); } @Override public NonNullList<Ingredient> getIngredients() { return this.inputs; } @Override public boolean isDynamic() { return true; } @Override public ResourceLocation getId() { return this.id; } @Override public IRecipeSerializer<?> getSerializer() { return SoulMagic.SOUL_INFUSING; } //THE JSON FILE IS BEING INTREPTED CORRECTLY public static class Serializer implements IRecipeSerializer<SoulInfuserRecipe> { private static final ResourceLocation NAME = new ResourceLocation(Reference.MOD_ID, "soul_infusing"); @Override //After debugging I know this method works for a fact public SoulInfuserRecipe read(ResourceLocation recipeId, JsonObject json) { String spellS = JsonUtils.getString(json, "spell"); IForgeRegistry<Spell> registry = GameRegistry.findRegistry(Spell.class); Spell s = registry.getValue(new ResourceLocation(spellS)); NonNullList<Ingredient> inputs = readIngredients(JsonUtils.getJsonArray(json, "ingredients")); return new SoulInfuserRecipe(recipeId, inputs, s); } private static NonNullList<Ingredient> readIngredients(JsonArray array) { NonNullList<Ingredient> nonnulllist = NonNullList.create(); for(int i = 0; i < array.size(); ++i) { Ingredient ingredient = Ingredient.fromJson(array.get(i)); if (!ingredient.hasNoMatchingItems()) { nonnulllist.add(ingredient); } } return nonnulllist; } //I don't know when this gets called @Override public SoulInfuserRecipe read(ResourceLocation recipeId, PacketBuffer buffer) { int i = buffer.readVarInt(); NonNullList<Ingredient> inputs = NonNullList.withSize(i, Ingredient.EMPTY); for(int j = 0; j < inputs.size(); j++) { inputs.set(j, Ingredient.fromBuffer(buffer)); } IForgeRegistry<Spell> registry = GameRegistry.findRegistry(Spell.class); Spell s = registry.getValue(buffer.readResourceLocation()); return new SoulInfuserRecipe(recipeId, inputs, s); } //Same here @Override public void write(PacketBuffer buffer, SoulInfuserRecipe recipe) { buffer.writeVarInt(recipe.getIngredients().size()); for(Ingredient i : recipe.getIngredients()) { i.writeToBuffer(buffer); } buffer.writeResourceLocation(recipe.spell.getRegistryName()); } @Override public ResourceLocation getName() { return NAME; } } } As stated, the json is being imported correctly. flaming_touch.json Spoiler { "type": "soulmagic:soul_infusing", "spell": "soulmagic:flaming_touch", "ingredients": [ { "item": "minecraft:magma_block" }, { "item": "minecraft:stone" }, { "item": "minecraft:flint_and_steel" }, { "item": "minecraft:stone" }, { "item": "minecraft:magma_block" }, { "item": "minecraft:stone" }, { "item": "minecraft:flint_and_steel" }, { "item": "minecraft:stone" } ] } What the tileentity does is it adds something (a "spell") to another item's capability in the tileentity. That's why there's going to be no real "output". the "output" is the spell that the tileentity will add if there is a "recipe". I want json support with my mod. I don't know if my logic here is good or not. I have forge 1.13.2-25.0.215. I don't have github quite yet. Edit: I have tried to make the recipe wrapper an instance variable only created once, but that still doesn't work. Edited May 31, 20196 yr by RainbowLuigi281
June 1, 20196 yr Author I'm still having a bit of trouble with this, if anyone knows anything that would be great! If not that's fine as well.
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.