-
Posts
292 -
Joined
-
Last visited
Everything posted by _Cruelar_
-
Updated Changelog.
-
Sadly we already have a good texture for the Crab Stir Fry. I made a list with the textures we need. It's currently quite long as I was busy with school and bug fixes, but together we should be able to shorten it fast. I'll update it from time to time (~every week) with the already made textures Only two things: We use 16x16 textures for the Mod. After Release you may make a 32x32 or higher texturepack Please try to not just make the pictures on the page smaller. We prefer self-made textures to avoid copyright issues. The list:
-
@johnpalladiniyt As stated above this is still Work in Progress but we try to finish version 0.4.2 to exit alpha and publish it. At the moment we're working at the Cooking_pot out of TLoZ:BotW. If you want to help you can provide textures for the Meals on this page.
-
Is there a way to say that he can take more than the Recipe request? So like slots 1 to 4 are filled with the needed items and the slot 5 has an additional item. My Current code: package com.cruelar.cruelars_triforcemod.recipes; import com.cruelar.cruelars_triforcemod.init.ModBlocks; import com.cruelar.cruelars_triforcemod.init.ModItems; import com.cruelar.cruelars_triforcemod.inventory.ICookingPot; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.util.JsonUtils; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.IRecipeFactory; import net.minecraftforge.common.crafting.JsonContext; import net.minecraftforge.fml.relauncher.ReflectionHelper; import java.lang.reflect.Field; import java.util.List; public class CookingPotRecipes extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe { /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; /** Is a List of ItemStack that composes the recipe. */ public final NonNullList<Ingredient> recipeItems; private final String group; private final boolean isSimple; public static final Field container = ReflectionHelper.findField(InventoryCrafting.class,"eventHandler","field_70465_c"); public CookingPotRecipes(String group, ItemStack output, NonNullList<Ingredient> ingredients) { this.group = group; this.recipeOutput = output; this.recipeItems = ingredients; boolean simple = true; for (Ingredient i : ingredients) simple &= i.isSimple(); this.isSimple = simple; } @Override public boolean matches(InventoryCrafting inv, World worldIn) { int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); List<ItemStack> inputs2; for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } try { if ((Container)container.get(inv) instanceof ICookingPot){ if (this.isSimple) return recipeItemHelper.canCraft(this, null); if(net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null) { return true; }else { inputs2=inputs; inputs2.remove(0); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null){ return true; }else { inputs2 = inputs; inputs2.remove(1); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; } else { inputs2 = inputs; inputs2.remove(2); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; } else { inputs2 = inputs; inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(2); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(2); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(2); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(2); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(2); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(2); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(2); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(2); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(2); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(2); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(2); inputs2.remove(3); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(2); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(1); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(0); inputs2.remove(2); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; }else { inputs2 = inputs; inputs2.remove(1); inputs2.remove(2); inputs2.remove(3); inputs2.remove(4); if (net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs2, this.recipeItems) != null) { return true; } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }else{ return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; } } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException("Fatal error occurred during recipe checking"); } return false; } public static CookingPotRecipes deserialize(JsonObject json) { String s = JsonUtils.getString(json, "group", ""); NonNullList<Ingredient> nonnulllist = deserializeIngredients(JsonUtils.getJsonArray(json, "ingredients")); if (nonnulllist.isEmpty()) { throw new JsonParseException("No ingredients for cooking_pot recipe"); } else if (nonnulllist.size() > 5) { throw new JsonParseException("Too many ingredients for cooking_pot recipe"); } else { boolean hard=false; boolean nonFood=false; ItemStack itemstack=ShapedRecipes.deserializeItem(JsonUtils.getJsonObject(json, "result"), true); String[] items=new String[5]; for (int i=0;i<nonnulllist.size();i++){ if (CookingPotDataBase.isHard(nonnulllist.get(i).getMatchingStacks()[0])){ hard=true; break; } if (CookingPotDataBase.isNoUse(nonnulllist.get(i).getMatchingStacks()[0])){ nonFood=true; break; } if (CookingPotDataBase.isFood(nonnulllist.get(i).getMatchingStacks()[0])){ if (CookingPotDataBase.isFruit(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="fruit"; } if (CookingPotDataBase.isMushroom(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="mushroom"; } if (CookingPotDataBase.isVegetable(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="vegetable"; } if (CookingPotDataBase.isRedMeat(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="red_meat"; } if (CookingPotDataBase.isPoultry(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="poultry"; } if (CookingPotDataBase.isCrap(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="crap"; } if (CookingPotDataBase.isFishOrSnail(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="fish_or_snail"; } if (CookingPotDataBase.isMisc(nonnulllist.get(i).getMatchingStacks()[0])&&nonnulllist.get(i).getMatchingStacks()[0].getItem()!=Items.MILK_BUCKET){ items[i]="misc"; } if (CookingPotDataBase.isFlowerOrHerb(nonnulllist.get(i).getMatchingStacks()[0])){ items[i]="flower_or_herb"; } } } if (hard){ itemstack=new ItemStack(ModItems.rock_hard_food); }else if (nonFood) { itemstack = new ItemStack(ModItems.dubios_food); }else if (items[0]!=null&&items[1]!=null&&items[2]!=null&&items[3]!=null&&items[4]!=null){ if (items[0].equals("misc")&&items[1].equals("misc")&&items[2].equals("misc")&&items[3].equals("misc")&&items[4].equals("misc")) { itemstack = new ItemStack(ModItems.dubios_food); } }else if (items[0]!=null&&items[1]!=null&&items[2]!=null&&items[3]!=null){ if (items[0].equals("misc")&&items[1].equals("misc")&&items[2].equals("misc")&&items[3].equals("misc")) { itemstack = new ItemStack(ModItems.dubios_food); } }else if (items[0]!=null&&items[1]!=null&&items[2]!=null){ if (items[0].equals("misc")&&items[1].equals("misc")&&items[2].equals("misc")) { itemstack = new ItemStack(ModItems.dubios_food); } }else if (items[0]!=null&&items[1]!=null){ if (items[0].equals("misc")&&items[1].equals("misc")) { itemstack = new ItemStack(ModItems.dubios_food); } }else if (items[0]!=null){ if (items[0].equals("misc")) { itemstack = new ItemStack(ModItems.dubios_food); } } else { itemstack = ShapedRecipes.deserializeItem(JsonUtils.getJsonObject(json, "result"), true); } if (itemstack.getItem() instanceof ItemCookingPotResult){ int HP=0; for (Ingredient aNonnulllist : nonnulllist) { HP += CookingPotDataBase.getHealAmount(aNonnulllist.getMatchingStacks()[0]); } ((ItemCookingPotResult)itemstack.getItem()).getTagCompoundSafe(itemstack).setInteger("cruelars_triforcemod.heal_amount",HP); } return new CookingPotRecipes(s, itemstack, nonnulllist); } } public static NonNullList<Ingredient> deserializeIngredients(JsonArray array) { NonNullList<Ingredient> nonnulllist = NonNullList.<Ingredient>create(); for (int i = 0; i < array.size(); ++i) { Ingredient ingredient = ShapedRecipes.deserializeIngredient(array.get(i)); if (ingredient != Ingredient.EMPTY) { nonnulllist.add(ingredient); } } return nonnulllist; } @Override public ItemStack getCraftingResult(InventoryCrafting inv) { return this.recipeOutput.copy(); } @Override public boolean canFit(int width, int height) { return width * height >= this.recipeItems.size(); } @Override public ItemStack getRecipeOutput() { return this.recipeOutput; } @Override public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) { NonNullList<ItemStack> nonnulllist = NonNullList.<ItemStack>withSize(inv.getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < nonnulllist.size(); ++i) { ItemStack itemstack = inv.getStackInSlot(i); nonnulllist.set(i, net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack)); } return nonnulllist; } @Override public NonNullList<Ingredient> getIngredients() { return this.recipeItems; } @Override public String getGroup() { return this.group; } /** * Example JSON recipe:<br> *  {<br> *   "result": {<br> *    "item": "minecraft:golden_apple",<br> *    "data":0<br> *   },<br> *   "type": "cruelars_triforcemod:cooking_pot",<br> *   "ingredients": [<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    }<br> *   ]<br> *  }<br> */ public static class Factory implements IRecipeFactory { @Override public IRecipe parse(JsonContext context, JsonObject json) { return deserialize(json); } } } This works but has the Problem that the recipes which start with a come before those who start with b etc.
-
More like this? package com.cruelar.cruelars_triforcemod.recipes; import com.cruelar.cruelars_triforcemod.inventory.ICookingPot; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.util.JsonUtils; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.IRecipeFactory; import net.minecraftforge.common.crafting.JsonContext; import net.minecraftforge.fml.relauncher.ReflectionHelper; import java.lang.reflect.Field; import java.util.List; public class CookingPotRecipes extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe { /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; /** Is a List of ItemStack that composes the recipe. */ public final NonNullList<Ingredient> recipeItems; private final String group; private final boolean isSimple; public static final Field container = ReflectionHelper.findField(InventoryCrafting.class,"eventHandler","field_70465_c"); public CookingPotRecipes(String group, ItemStack output, NonNullList<Ingredient> ingredients) { this.group = group; this.recipeOutput = output; this.recipeItems = ingredients; boolean simple = true; for (Ingredient i : ingredients) simple &= i.isSimple(); this.isSimple = simple; } @Override public boolean matches(InventoryCrafting inv, World worldIn) { int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } try { if ((Container)container.get(inv) instanceof ICookingPot){ if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } } catch (IllegalAccessException e) { e.printStackTrace(); throw new RuntimeException("Fatal error occurred during recipe checking"); } } public static CookingPotRecipes deserialize(JsonObject json) { String s = JsonUtils.getString(json, "group", ""); NonNullList<Ingredient> nonnulllist = deserializeIngredients(JsonUtils.getJsonArray(json, "ingredients")); if (nonnulllist.isEmpty()) { throw new JsonParseException("No ingredients for cooking_pot recipe"); } else if (nonnulllist.size() > 5) { throw new JsonParseException("Too many ingredients for cooking_pot recipe"); } else { ItemStack itemstack = ShapedRecipes.deserializeItem(JsonUtils.getJsonObject(json, "result"), true); return new CookingPotRecipes(s, itemstack, nonnulllist); } } public static NonNullList<Ingredient> deserializeIngredients(JsonArray array) { NonNullList<Ingredient> nonnulllist = NonNullList.<Ingredient>create(); for (int i = 0; i < array.size(); ++i) { Ingredient ingredient = ShapedRecipes.deserializeIngredient(array.get(i)); if (ingredient != Ingredient.EMPTY) { nonnulllist.add(ingredient); } } return nonnulllist; } @Override public ItemStack getCraftingResult(InventoryCrafting inv) { return this.recipeOutput.copy(); } @Override public boolean canFit(int width, int height) { return width * height >= this.recipeItems.size(); } @Override public ItemStack getRecipeOutput() { return this.recipeOutput; } @Override public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) { NonNullList<ItemStack> nonnulllist = NonNullList.<ItemStack>withSize(inv.getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < nonnulllist.size(); ++i) { ItemStack itemstack = inv.getStackInSlot(i); nonnulllist.set(i, net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack)); } return nonnulllist; } @Override public NonNullList<Ingredient> getIngredients() { return this.recipeItems; } @Override public String getGroup() { return this.group; } /** * Example JSON recipe:<br> *  {<br> *   "result": {<br> *    "item": "minecraft:golden_apple",<br> *    "data":0<br> *   },<br> *   "type": "cruelars_triforcemod:cooking_pot",<br> *   "ingredients": [<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    },<br> *    {<br> *     "item": "minecraft:apple"<br> *    }<br> *   ]<br> *  }<br> */ public static class Factory implements IRecipeFactory { @Override public IRecipe parse(JsonContext context, JsonObject json) { return deserialize(json); } } }
-
Fantastic it works. Thanks to all!
-
I think I found it. it's field_70465_c
-
Yes indeed should have thought of that. Got confused by the huge amount of code in there I not fully understand. I use getPrivateValue now. seems to work. I only need the source name now(I think) package com.cruelar.cruelars_triforcemod.recipes; import com.cruelar.cruelars_triforcemod.inventory.ICookingPot; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.util.JsonUtils; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.IRecipeFactory; import net.minecraftforge.common.crafting.JsonContext; import net.minecraftforge.fml.relauncher.ReflectionHelper; import java.lang.reflect.Field; import java.util.List; public class CookingPotRecipes extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe { /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; /** Is a List of ItemStack that composes the recipe. */ public final NonNullList<Ingredient> recipeItems; private final String group; private final boolean isSimple; public CookingPotRecipes(String group, ItemStack output, NonNullList<Ingredient> ingredients) { this.group = group; this.recipeOutput = output; this.recipeItems = ingredients; boolean simple = true; for (Ingredient i : ingredients) simple &= i.isSimple(); this.isSimple = simple; } @Override public boolean matches(InventoryCrafting inv, World worldIn) { Container iCookingPot=(Container) ReflectionHelper.getPrivateValue(InventoryCrafting.class, inv,"eventHandler"); int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } if (iCookingPot instanceof ICookingPot){ if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } } public static CookingPotRecipes deserialize(JsonObject json) { String s = JsonUtils.getString(json, "group", ""); NonNullList<Ingredient> nonnulllist = deserializeIngredients(JsonUtils.getJsonArray(json, "ingredients")); if (nonnulllist.isEmpty()) { throw new JsonParseException("No ingredients for cooking_pot recipe"); } else if (nonnulllist.size() > 5) { throw new JsonParseException("Too many ingredients for cooking_pot recipe"); } else { ItemStack itemstack = ShapedRecipes.deserializeItem(JsonUtils.getJsonObject(json, "result"), true); return new CookingPotRecipes(s, itemstack, nonnulllist); } } public static NonNullList<Ingredient> deserializeIngredients(JsonArray array) { NonNullList<Ingredient> nonnulllist = NonNullList.<Ingredient>create(); for (int i = 0; i < array.size(); ++i) { Ingredient ingredient = ShapedRecipes.deserializeIngredient(array.get(i)); if (ingredient != Ingredient.EMPTY) { nonnulllist.add(ingredient); } } return nonnulllist; } @Override public ItemStack getCraftingResult(InventoryCrafting inv) { return this.recipeOutput.copy(); } @Override public boolean canFit(int width, int height) { return width * height >= this.recipeItems.size(); } @Override public ItemStack getRecipeOutput() { return this.recipeOutput; } @Override public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) { NonNullList<ItemStack> nonnulllist = NonNullList.<ItemStack>withSize(inv.getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < nonnulllist.size(); ++i) { ItemStack itemstack = inv.getStackInSlot(i); nonnulllist.set(i, net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack)); } return nonnulllist; } @Override public NonNullList<Ingredient> getIngredients() { return this.recipeItems; } @Override public String getGroup() { return this.group; } public static class Factory implements IRecipeFactory { @Override public IRecipe parse(JsonContext context, JsonObject json) { return deserialize(json); } } }
-
Posted same moment as Draco. Still Except that it seems to work.
-
How do I get a Instance of InventoryCrafting and how should I make it static final? I can't assign a value to the field in my method then. Also where do I get the source names? @Override public boolean matches(InventoryCrafting inv, World worldIn) { final Field container=ReflectionHelper.findField(InventoryCrafting.class,"eventHandler",/*source name*/); container.setAccessible(true); int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } try { if (container.get(/*InventoryCrafting instance*/)instanceof ICookingPot){ if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } }catch (IllegalAccessException e){ e.printStackTrace(); throw new RuntimeException("Get Crafting Container failed!"); } } Soory if I'm an idiot but I never did something like that started modding around 3 months ago
-
@V0idWa1k3r this is a really good idea but i need some help on how to do this as I'm never used ReflectionHelper so far. What I have after reading this topic. @Override public boolean matches(InventoryCrafting inv, World worldIn) { Field container=ReflectionHelper.findField(InventoryCrafting.class,"eventHandler"); int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } try { if (container.get(InventoryCrafting.eventHandler) ){//<-Not sure what to put here. Also IntelliJ yells at me that eventHandler is private if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } }catch (IllegalAccessException e){ e.printStackTrace(); throw new RuntimeException("Get Crafting Container failed!"); } }
-
So like this? @Override public boolean matches(InventoryCrafting inv, World worldIn) { int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } if (inv.getWidth()==5&&inv.getHeight()==1){ if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } } This indeed works but would every other mods workbench with this size also be able to use it?
-
Okay maybe I'm just an idiot but could you explain that. How would I get the Class of my Workbench or Container using InventoryCrafting? Here's what I tried: @Override public boolean matches(InventoryCrafting inv, World worldIn) { int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } if (inv == Cooking_Pot_Container.INSTANCE.craftMatrix){ if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; }else{ return false; } }
-
How? I didn't find a way to check for my InventoryCrafting called craftMatrix. Isn't static and can't make it static.
-
[1.12.2] How to get multiple Hitboxes for one Entity
_Cruelar_ replied to _Cruelar_'s topic in Modder Support
I fixed the ai. I forgot to call super.onLivingUpdate. Still The Hitboxes aren't showing. My Entity code: package com.cruelar.cruelars_triforcemod.entities.boss; import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core; import net.minecraft.entity.*; import net.minecraft.entity.ai.*; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSource; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.Vec3d; import net.minecraft.world.BossInfo; import net.minecraft.world.BossInfoServer; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class Stone_Talus extends EntityMob implements IEntityMultiPart { public static final ResourceLocation LOOT = new ResourceLocation("cruelars_triforcemod:entities/stone_talus"); public static final ResourceLocation RESOURCE_LOCATION = new ResourceLocation("cruelars_triforcemod:textures/entity/stone_talus.png"); private final BossInfoServer bossInfo; public MultiPartEntityPart[] talusParts; public MultiPartEntityPart Mainbody; public MultiPartEntityPart Oredeposit; public float prevAnimTime; public float animTime; public Stone_Talus(World world) { super(world); this.setSize(2.0F, 5F); this.isNonBoss(); this.bossInfo = (BossInfoServer) (new BossInfoServer(this.getDisplayName(), BossInfo.Color.RED, BossInfo.Overlay.PROGRESS)); this.isImmuneToFire = true; this.Mainbody= new MultiPartEntityPart(this, "mainbody", 2, 2); this.Oredeposit = new MultiPartEntityPart(this, "oredeposit", 1, 1); this.talusParts=new MultiPartEntityPart[]{this.Oredeposit,this.Mainbody}; } public void readEntityFromNBT(NBTTagCompound p_readEntityFromNBT_1_) { super.readEntityFromNBT(p_readEntityFromNBT_1_); if (this.hasCustomName()) { this.bossInfo.setName(this.getDisplayName()); } } protected void updateAITasks() { super.updateAITasks(); } public void addTrackingPlayer(EntityPlayerMP p_addTrackingPlayer_1_) { float distance = p_addTrackingPlayer_1_.getDistance(this); if (distance<=10) { super.addTrackingPlayer(p_addTrackingPlayer_1_); this.bossInfo.addPlayer(p_addTrackingPlayer_1_); } } public void removeTrackingPlayer(EntityPlayerMP p_removeTrackingPlayer_1_) { super.removeTrackingPlayer(p_removeTrackingPlayer_1_); this.bossInfo.removePlayer(p_removeTrackingPlayer_1_); } public void setCustomNameTag(String p_setCustomNameTag_1_) { super.setCustomNameTag(p_setCustomNameTag_1_); this.bossInfo.setName(this.getDisplayName()); } @Override protected void entityInit() { super.entityInit(); } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(300.0D); this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.1D); this.getEntityAttribute(SharedMonsterAttributes.ARMOR).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(32.0D); this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.KNOCKBACK_RESISTANCE).setBaseValue(100.0D); } @Override protected void initEntityAI() { this.tasks.addTask(2, new EntityAIAttackMelee(this, 1.0D, true)); this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 1.0D)); this.tasks.addTask(7, new EntityAIWander(this, 1.0D)); this.tasks.addTask(8, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(8, new EntityAILookIdle(this)); this.applyEntityAI(); } private void applyEntityAI() { this.targetTasks.addTask(2, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, true)); } @Override public boolean attackEntityAsMob(Entity entity) { return super.attackEntityAsMob(entity); } @Override @Nonnull protected ResourceLocation getLootTable() { return LOOT; } @Override protected boolean isValidLightLevel() { return true; } @Override protected boolean canDropLoot() { return true; } @Override public int getMaxSpawnedInChunk() { return 1; } @Override public boolean isNonBoss() { return false; } @Override public World getWorld() { return this.world; } public boolean attackEntityFrom(DamageSource source, float amount) { if (source instanceof EntityDamageSource && ((EntityDamageSource)source).getIsThornsDamage()) { this.attackEntityFromPart(this.Oredeposit, source, amount); } this.attackEntityFromPart(this.Oredeposit, source, amount); return true; } protected boolean attackTalusFrom(DamageSource source, float amount) { return super.attackEntityFrom(source, amount); } @Override public void onLivingUpdate() { super.onLivingUpdate(); if (this.world.isRemote) { if (this.talusParts[0]==null||this.talusParts[1]==null){ this.talusParts = new MultiPartEntityPart[]{this.Mainbody= new MultiPartEntityPart(this, "mainbody", 5, 5), this.Oredeposit = new MultiPartEntityPart(this, "oredeposit", 1, 1)}; } this.setHealth(this.getHealth()); }else{ this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ); Vec3d vec3d3 = (new Vec3d(this.motionX, this.motionY, this.motionZ)).normalize(); float f10 = 0.8F + 0.15F * 0.1F; this.motionX *= (double)f10; this.motionZ *= (double)f10; this.motionY *= 0.9100000262260437D; Vec3d[] avec3d = new Vec3d[this.talusParts.length]; for (int j = 0; j < this.talusParts.length; ++j) { avec3d[j] = new Vec3d(this.talusParts[j].posX, this.talusParts[j].posY, this.talusParts[j].posZ); } this.prevAnimTime = this.animTime; if (this.getHealth() <= 0.0F) { float f12 = (this.rand.nextFloat() - 0.5F) * 8.0F; float f13 = (this.rand.nextFloat() - 0.5F) * 4.0F; float f15 = (this.rand.nextFloat() - 0.5F) * 8.0F; this.world.spawnParticle(EnumParticleTypes.SPELL_MOB_AMBIENT, this.posX + (double) f12, this.posY + 2.0D + (double) f13, this.posZ + (double) f15, 0.0D, 0.0D, 0.0D); }else { if (this.isAIDisabled()) { this.animTime = 0.5F; } else { Mainbody.onUpdate(); Mainbody.setLocationAndAngles(this.posX, this.posY, this.posZ, 0, 0); Oredeposit.onUpdate(); Oredeposit.setLocationAndAngles(this.posX + 1, this.posY + 2, this.posZ, 0, 0); for (int l = 0; l < this.talusParts.length; ++l) { this.talusParts[l].prevPosX = avec3d[l].x; this.talusParts[l].prevPosY = avec3d[l].y; this.talusParts[l].prevPosZ = avec3d[l].z; } } this.bossInfo.setPercent(this.getHealth() / this.getMaxHealth()); } } } @Override public void onKillCommand() { this.setDead(); } @Nullable @Override public IEntityLivingData onInitialSpawn(DifficultyInstance difficulty, @Nullable IEntityLivingData livingdata) { this.Mainbody= new MultiPartEntityPart(this, "mainbody", 2, 2); this.Oredeposit = new MultiPartEntityPart(this, "oredeposit", 1, 1); this.talusParts = new MultiPartEntityPart[]{this.Mainbody, this.Oredeposit}; return livingdata; } public Entity[] getParts() { return this.talusParts; } public boolean attackEntityFromPart(MultiPartEntityPart talusPart, DamageSource source, float damage) { if (damage < 0.01F) { return false; } else { if (source.getTrueSource() instanceof EntityPlayer || source.isExplosion()) { float f = this.getHealth(); this.attackTalusFrom(source, damage); } return true; } } } -
Yes because I've no idea how I should check for that.
-
Somehow I managed to make a custom Craftingstation and custom Recipes. However I'm also able to craft them with the normal workbench. As my craftingstation is more expensive as a Workbench and is limited to 5 input slots this is quite annoying. So how would I avoid that other crafting stations can use this recipe? And also I don't want my Craftingstation to craft normal recipes. How would I do that. My Code: Block: package com.cruelar.cruelars_triforcemod.blocks; import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core; import com.cruelar.cruelars_triforcemod.inventory.cruelars_triforcemod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import java.util.Random; public class BlockCookingPot extends Block { public static final int GUI_ID = 3; public static PropertyBool IS_BURNING=PropertyBool.create("is_burning"); public BlockCookingPot() { super(Material.IRON); this.setRegistryName("cooking_pot"); this.setUnlocalizedName(Cruelars_Triforcemod_Core.MODID+".cooking_pot"); this.setCreativeTab(cruelars_triforcemod.CRUELARS_TRIFORCEMOD); } @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[]{IS_BURNING}); } @Override @SuppressWarnings("deprecation") public IBlockState getStateFromMeta(int meta) { return getDefaultState() .withProperty(IS_BURNING, (meta & 2)>0); } @Override public int getMetaFromState(IBlockState blockState) { int i = 0; if ((boolean)blockState.getValue(IS_BURNING)){ i |= 2; } return i; } @Override public int quantityDropped(Random random){ return 0; } @SideOnly(Side.CLIENT) public void initModel(){ ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory")); } public boolean isBed(IBlockState state, IBlockAccess world, BlockPos pos, @Nullable Entity player) { return true; } /** * Called when the block is right clicked by a player. */ public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (worldIn.isRemote) { return true; } else { ItemStack itemStack=playerIn.getHeldItem(hand); ItemStack itemStack1=null; if (!state.getValue(IS_BURNING)) { if (playerIn.getHeldItem(hand).getItem() == Items.FLINT_AND_STEEL) { if (!playerIn.isCreative()) { playerIn.getHeldItem(hand).damageItem(1, playerIn); } worldIn.setBlockState(pos, state.cycleProperty(IS_BURNING)); } }else if (state.getValue(IS_BURNING)) { playerIn.openGui(Cruelars_Triforcemod_Core.instance, GUI_ID, worldIn, pos.getX(), pos.getY(),pos.getZ()); } return true; } } @Override @SuppressWarnings("deprecation") public int getLightValue(IBlockState state) { return state.getValue(IS_BURNING)?15:0; } @SideOnly(Side.CLIENT) @Override public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand) { if (stateIn.getValue(IS_BURNING)) { double d0 = (double)pos.getX() + 0.5D; double d1 = (double)pos.getY() + rand.nextDouble() * 6.0D / 16.0D; double d2 = (double)pos.getZ() + 0.5D; double d3 = 0.52D; double d4 = rand.nextDouble() * 0.6D - 0.3D; if (rand.nextDouble() < 0.1D) { worldIn.playSound((double)pos.getX() + 0.5D, (double)pos.getY(), (double)pos.getZ() + 0.5D, SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, SoundCategory.BLOCKS, 1.0F, 1.0F, false); } worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 - d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d3, d1, d2 + d4, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 - d3, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); worldIn.spawnParticle(EnumParticleTypes.FLAME, d0 + d4, d1, d2 + d3, 0.0D, 0.0D, 0.0D); } } @SideOnly(Side.CLIENT) @SuppressWarnings("deprecation") @Override public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos blockPos, EnumFacing side){ return false; } @SuppressWarnings("deprecation") @Override public boolean isBlockNormalCube(IBlockState blockState){ return false; } @SuppressWarnings("deprecation") @Override public boolean isOpaqueCube(IBlockState blockState){ return false; } } Gui: package com.cruelar.cruelars_triforcemod.gui; import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core; import com.cruelar.cruelars_triforcemod.inventory.Cooking_Pot_Container; import com.cruelar.cruelars_triforcemod.inventory.Pedestal_Of_Time_Container; import com.cruelar.cruelars_triforcemod.tileentity.Pedestal_Of_Time_TileEntity; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.util.ResourceLocation; public class Cooking_Pot_GUI extends GuiContainer { public static final int WIDTH = 176; public static final int HEIGHT = 166; private static final ResourceLocation background = new ResourceLocation(Cruelars_Triforcemod_Core.MODID, "textures/gui/cooking_pot_gui.png"); public Cooking_Pot_GUI(Cooking_Pot_Container container) { super(container); xSize = WIDTH; ySize = HEIGHT; } public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawDefaultBackground(); super.drawScreen(mouseX, mouseY, partialTicks); this.renderHoveredToolTip(mouseX, mouseY); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { mc.getTextureManager().bindTexture(background); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); } } Container: package com.cruelar.cruelars_triforcemod.inventory; import com.cruelar.cruelars_triforcemod.blocks.BlockCookingPot; import com.cruelar.cruelars_triforcemod.init.ModBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.*; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class Cooking_Pot_Container extends Container { /** The crafting matrix inventory (5x1). */ public InventoryCrafting craftMatrix = new InventoryCrafting(this, 5, 1); public InventoryCraftResult craftResult = new InventoryCraftResult(); private final World world; /** Position of the workbench */ private final BlockPos pos; private final EntityPlayer player; public Cooking_Pot_Container(InventoryPlayer playerInventory, World worldIn, BlockPos posIn) { this.world = worldIn; this.pos = posIn; this.player = playerInventory.player; this.addSlotToContainer(new SlotCrafting(playerInventory.player, this.craftMatrix, this.craftResult, 0, 80, 58)); for (int i = 0; i < 1; ++i) { for (int j = 0; j < 5; ++j) { this.addSlotToContainer(new Slot(this.craftMatrix, j + i * 3, 44 + j * 18, 17 + i * 18)); } } for (int k = 0; k < 3; ++k) { for (int i1 = 0; i1 < 9; ++i1) { this.addSlotToContainer(new Slot(playerInventory, i1 + k * 9 + 9, 8 + i1 * 18, 84 + k * 18)); } } for (int l = 0; l < 9; ++l) { this.addSlotToContainer(new Slot(playerInventory, l, 8 + l * 18, 142)); } } public InventoryCrafting getCraftMatrix() { return craftMatrix; } /** * Callback for when the crafting matrix is changed. */ public void onCraftMatrixChanged(IInventory inventoryIn) { this.detectAndSendChanges(); this.slotChangedCraftingGrid(this.world, this.player, this.craftMatrix, this.craftResult); } /** * Called when the container is closed. */ public void onContainerClosed(EntityPlayer playerIn) { super.onContainerClosed(playerIn); if (!this.world.isRemote) { this.clearContainer(playerIn, this.world, this.craftMatrix); } } /** * Determines whether supplied player can use this container */ public boolean canInteractWith(EntityPlayer playerIn) { if (!(this.world.getBlockState(this.pos).getBlock() instanceof BlockCookingPot)) { return false; } else { return playerIn.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D; } } /** * Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the player * inventory and the other inventory(s). */ public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack itemstack = ItemStack.EMPTY; Slot slot = this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (index == 0) { itemstack1.getItem().onCreated(itemstack1, this.world, playerIn); if (!this.mergeItemStack(itemstack1, 10, 46, true)) { return ItemStack.EMPTY; } slot.onSlotChange(itemstack1, itemstack); } else if (index >= 6 && index < 37) { if (!this.mergeItemStack(itemstack1, 37, 46, false)) { return ItemStack.EMPTY; } } else if (index >= 37 && index < 46) { if (!this.mergeItemStack(itemstack1, 10, 37, false)) { return ItemStack.EMPTY; } } else if (!this.mergeItemStack(itemstack1, 10, 46, false)) { return ItemStack.EMPTY; } if (itemstack1.isEmpty()) { slot.putStack(ItemStack.EMPTY); } else { slot.onSlotChanged(); } if (itemstack1.getCount() == itemstack.getCount()) { return ItemStack.EMPTY; } ItemStack itemstack2 = slot.onTake(playerIn, itemstack1); if (index == 0) { playerIn.dropItem(itemstack2, false); } } return itemstack; } /** * Called to determine if the current slot is valid for the stack merging (double-click) code. The stack passed in * is null for the initial slot that was double-clicked. */ public boolean canMergeSlot(ItemStack stack, Slot slotIn) { return slotIn.inventory != this.craftResult && super.canMergeSlot(stack, slotIn); } } Recipes: package com.cruelar.cruelars_triforcemod.recipes; import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.util.JsonUtils; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.common.crafting.IRecipeFactory; import net.minecraftforge.common.crafting.JsonContext; import java.util.List; public class CookingPotRecipes extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe { /** Is the ItemStack that you get when craft the recipe. */ private final ItemStack recipeOutput; /** Is a List of ItemStack that composes the recipe. */ public final NonNullList<Ingredient> recipeItems; private final String group; private final boolean isSimple; public CookingPotRecipes(String group, ItemStack output, NonNullList<Ingredient> ingredients) { this.group = group; this.recipeOutput = output; this.recipeItems = ingredients; boolean simple = true; for (Ingredient i : ingredients) simple &= i.isSimple(); this.isSimple = simple; } @Override public boolean matches(InventoryCrafting inv, World worldIn) { int ingredientCount = 0; net.minecraft.client.util.RecipeItemHelper recipeItemHelper = new net.minecraft.client.util.RecipeItemHelper(); List<ItemStack> inputs = Lists.newArrayList(); for (int i = 0; i < inv.getHeight(); ++i) { for (int j = 0; j < inv.getWidth(); ++j) { ItemStack itemstack = inv.getStackInRowAndColumn(j, i); if (!itemstack.isEmpty()) { ++ingredientCount; if (this.isSimple) recipeItemHelper.accountStack(itemstack, 1); else inputs.add(itemstack); } } } if (ingredientCount != this.recipeItems.size()) return false; if (this.isSimple) return recipeItemHelper.canCraft(this, null); return net.minecraftforge.common.util.RecipeMatcher.findMatches(inputs, this.recipeItems) != null; } public static CookingPotRecipes deserialize(JsonObject json) { String s = JsonUtils.getString(json, "group", ""); NonNullList<Ingredient> nonnulllist = deserializeIngredients(JsonUtils.getJsonArray(json, "ingredients")); if (nonnulllist.isEmpty()) { throw new JsonParseException("No ingredients for cooking_pot recipe"); } else if (nonnulllist.size() > 5) { throw new JsonParseException("Too many ingredients for cooking_pot recipe"); } else { ItemStack itemstack = ShapedRecipes.deserializeItem(JsonUtils.getJsonObject(json, "result"), true); return new CookingPotRecipes(s, itemstack, nonnulllist); } } public static NonNullList<Ingredient> deserializeIngredients(JsonArray array) { NonNullList<Ingredient> nonnulllist = NonNullList.<Ingredient>create(); for (int i = 0; i < array.size(); ++i) { Ingredient ingredient = ShapedRecipes.deserializeIngredient(array.get(i)); if (ingredient != Ingredient.EMPTY) { nonnulllist.add(ingredient); } } return nonnulllist; } @Override public ItemStack getCraftingResult(InventoryCrafting inv) { return this.recipeOutput.copy(); } @Override public boolean canFit(int width, int height) { return width * height >= this.recipeItems.size(); } @Override public ItemStack getRecipeOutput() { return this.recipeOutput; } @Override public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) { NonNullList<ItemStack> nonnulllist = NonNullList.<ItemStack>withSize(inv.getSizeInventory(), ItemStack.EMPTY); for (int i = 0; i < nonnulllist.size(); ++i) { ItemStack itemstack = inv.getStackInSlot(i); nonnulllist.set(i, net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack)); } return nonnulllist; } @Override public NonNullList<Ingredient> getIngredients() { return this.recipeItems; } @Override public String getGroup() { return this.group; } public static class Factory implements IRecipeFactory { @Override public IRecipe parse(JsonContext context, JsonObject json) { final NonNullList<Ingredient> ingredients = deserializeIngredients(json.getAsJsonArray("ingredients")); final ItemStack result = CraftingHelper.getItemStack(JsonUtils.getJsonObject(json, "result"), context); return new CookingPotRecipes(JsonUtils.getString(json, "group", "cruelars_triforcemod:cooking_pot"), result,ingredients); } } } Testrecipe(works on both workbench and my craftingstation): { "result": { "item": "minecraft:golden_apple", "data":0 }, "type": "cruelars_triforcemod:cooking_pot", "ingredients": [ { "item": "minecraft:apple" }, { "item": "minecraft:apple" }, { "item": "minecraft:apple" }, { "item": "minecraft:apple" }, { "item": "minecraft:apple" } ] } _factories.json { "recipes": { "cooking_pot":"com.cruelar.cruelars_triforcemod.recipes.CookingPotRecipes$Factory" } }
-
Yes because it isn't actually a mod that crashes. You're missing dependencies of your installed mods Try forge build 14.23.4.2749 And updating every mod which names its version as 2.5.x to any 2.6.x version of that mod
-
Here is the Changelog:
-
Hello, I want to introduce my new (and first) Mod: Cruelar's Triforcemod. The Mod is based on the "The Legend of Zelda"-games and includes cool stuff out of the games, like the Mastersword, Rupees, Ganon and much more. Some stuff is still not working but I'm working on that. I mainly worked on stuff out of the newest Zelda-game ("The Legend of Zelda: Breath of the Wild") yet, but I will add also things from other Zelda-games. There is no update link yet because we want add some new things before that, but there are some screenshots showing you it won't be long: I'm also working on a Resourcepack for the mod, because this is easier than adding all the Stuff that already is in Minecraft, so I hope you can get it soon. If you have any ideas, suggestions, or wishes just write them here. If you have bugs, even if its in an older version of the mod, report them here. If you want to help, look at my topics in the Modder Suport Forum or post textures, you think you could make better than they are in the mod. Mod is released here: https://minecraft.curseforge.com/projects/cruelars-triforcemod Updates will be announced here, the full Changelog will be posted as soon as it is written.
-
[1.12.2]Problems with changing Player Health and Healthbar
_Cruelar_ replied to _Cruelar_'s topic in Modder Support
@Oen44 Your PacketAddSkillXP is ServerSide but you use Minecraft.getMinecraft() which is annotated as Side=ClientOnly. Does this matter? Are the SkillXp in every World equall or saved per world? Do they stay the same after reload? And also I'm interested in the skills the Player gets. later I want to implement custom actions for the player so I I wondered how you made this. -
[1.12.2]Problems with changing Player Health and Healthbar
_Cruelar_ replied to _Cruelar_'s topic in Modder Support
I'll take a look at it right after the position is right. -
[1.12.2]Problems with changing Player Health and Healthbar
_Cruelar_ replied to _Cruelar_'s topic in Modder Support
It didn't change but not because the statement isn't works. I put your suggestion inside my first if-statement by mistake. So after I changed that it works... almost: I'll need to check better where it should be. Do you have any experience with capabilities? Cause I would need one and have no idea. See code above. -
I meant the task gradle build not the file.
-
[1.12.2]Problems with changing Player Health and Healthbar
_Cruelar_ replied to _Cruelar_'s topic in Modder Support
Still misplaced like in the screenshot I added this at the end of my EventHandlers method: if (event.getType()== RenderGameOverlayEvent.ElementType.ARMOR){ GuiIngameForge.left_height=ArmorPosY; }