Jump to content

SirJoseph

Members
  • Posts

    14
  • Joined

  • Last visited

Everything posted by SirJoseph

  1. The MDK seems to run my mod just fine, but after running the Forge installer, I cannot load Minecraft, with or without mods in the mods folder. At least I can start working on converting some of my mods to the new version.
  2. Hey! I know this is old, but it looks like you never got help and I think all you needed was a colon in this line, private static final ResourceLocation DREK_TEXTURES = new ResourceLocation(References.MOD_ID, "textures/entity/entitydrek.png"); You needed it before textures, so it should look like ":textures/entity/entitydrek.png"
  3. I may just be going about this all wrong, but I am trying to get a reference to the name of the world so that I can write a text file that loads with each world. I can get the coordinates.txt file to appear in the directory above the 'saves' folder, but I need it to be different for each world. Each new map I make loads the same coordinates file created from the last world. Here is the java file im using the code in. package com.exline.dbzmod; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; import java.util.List; import com.exline.dbzmod.block.ModWorldGen; import com.exline.dbzmod.block.ModWorldGenAgain; import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.PlayerList; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; import net.minecraft.world.WorldSavedDataCallableSave; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.ModClassLoader; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.server.FMLServerHandler; //find nearest dragonball //this just updates the radar coordinates when called //called in DragonBallEventHandler when corresponding block is destroyed public class FindNearest { public static int xto; public static int zto; public static void init() throws Exception { xto = ModWorldGen.x0; zto = ModWorldGen.z0; String dir; MinecraftServer mc = FMLCommonHandler.instance().getMinecraftServerInstance(); if (mc != null) { dir = mc.getFolderName(); } else { dir = null; } if (dir != null) { File varTmpDir = new File("/saves/"+dir+"/coordinates.txt"); boolean exists = varTmpDir.exists(); if(exists != true) { saveCoordinates(); } else { loadCoordinates(); } } } public static void findOne() throws Exception { xto = ModWorldGen.x1; zto = ModWorldGen.z1; saveCoordinates(); } public static void findTwo() throws Exception { xto = ModWorldGen.x2; zto = ModWorldGen.z2; saveCoordinates(); } public static void findThree() throws Exception { xto = ModWorldGen.x3; zto = ModWorldGen.z3; saveCoordinates(); } public static void findFour() throws Exception { xto = ModWorldGen.x4; zto = ModWorldGen.z4; saveCoordinates(); } public static void findFive() throws Exception { xto = ModWorldGen.x5; zto = ModWorldGen.z5; saveCoordinates(); } public static void findSix() throws Exception { xto = ModWorldGen.x6; zto = ModWorldGen.z6; saveCoordinates(); } public static void findSeven() throws Exception { //this method resets the dragon balls positions and re-spawns them in the world ModWorldGen.x0 += 120; ModWorldGen.z0 += 120; ModWorldGen.x1 -= 120; ModWorldGen.z1 -= 120; ModWorldGen.x2 += 120; ModWorldGen.z2 -= 120; ModWorldGen.x3 -= 120; ModWorldGen.z3 += 120; ModWorldGen.x4 += 120; ModWorldGen.z4 -= 120; ModWorldGen.x5 -= 120; ModWorldGen.z5 += 120; ModWorldGen.x6 -= 300; ModWorldGen.z6 += 300; xto = ModWorldGen.x0; zto = ModWorldGen.z0; saveCoordinates(); GameRegistry.registerWorldGenerator(new ModWorldGenAgain(), 1); } public static void saveCoordinates() throws Exception { String dir; MinecraftServer mc = FMLCommonHandler.instance().getMinecraftServerInstance(); if (mc != null) { dir = mc.getFolderName(); } else { dir = null; } if (dir != null) { FileWriter saveFile = new FileWriter("/saves/"+dir+"/coordinates.txt"); //write data to file now!!! saveFile.write("\n"); saveFile.write(xto + "\n"); saveFile.write(zto + "\n"); saveFile.write("\n"); //close filewriter saveFile.close(); } } public static void loadCoordinates() throws Exception { String dir; MinecraftServer mc = FMLCommonHandler.instance().getMinecraftServerInstance(); if (mc != null) { dir = mc.getFolderName(); } else { dir = null; } if (dir != null) { BufferedReader saveFile = new BufferedReader(new FileReader("/saves/"+dir+"/coordinates.txt")); // Throw away the blank line at the top. saveFile.readLine(); // Get the integer value from the String. xto = Integer.parseInt(saveFile.readLine()); zto = Integer.parseInt(saveFile.readLine()); saveFile.close(); } } }
  4. Thank you. I am try to get the blocks to generate in the world right now, so I will add the coordinates to each one and make another file to keep track of the ones I've found. I'll use a simple distance formula to find the nearest one. I'll share my results when I'm finished or if I run into a problem. Thanks again Draco!
  5. Well, i wanted a certain number of blocks to pop up in certain locations. Maybe I can find a way to set all the spawn locations for the blocks in the beginning and point towards the nearest of them until I've destroyed all of the blocks. Does this sound do-able?
  6. So I have a custom compass in my mod and have got it working and pointing to x=0, z=0, but I wanted to have it point to a custom block's coordinates from my mod, if it exists in the world, if not point to x=0, z=0, or better yet the players location. Here is the class file, I took out the lines with the package and imports because its not needed. Everything works fine as far as it points to x = 0, z = 0, and the custom images are working. What I don't know is, how to do I change the x and z coordinates to the nearest block of a certain type if it exists. I figure if I can get it to point to one of the vanilla blocks I could make it point to a mod block. If anyone knows how to do this I would appreciate the help. Thank you guys!
  7. Hey! Thanks for the help, sorry i didnt reply earlier. I updated forge and all is well! Also thanks again for the advice. I dont know why i was using all those references to FoodBase instead of just Item. I simplified my code a bit and it works perfect now. I was also thinking of posting the complete source code somewhere on the forum sometime. Thanks again! Oh, and I got rid of the setCreativeTabs for the food items. I should have figured it would be there since it expands the FoodItem anyway, I was just used to setting it for other items. I was following a few different tutorials and they both had different ways of doing things so I definitely have some code that I could go without.
  8. Thank you for the help! I will work on my code and see what happens.
  9. here is my ModItems class package com.exline.sushimod; import com.exline.sushimod.items.FoodBase; import com.exline.sushimod.items.ItemBase; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraftforge.fml.common.registry.GameRegistry; public class ModItems { //declare item here public static FoodBase cucumber; public static FoodBase rice; public static FoodBase riceball; public static FoodBase nori; public static FoodBase fishroll; public static FoodBase salmonroll; public static FoodBase pufferfishroll; public static FoodBase cucumberroll; public static FoodBase mushroomroll; public static FoodBase clownfishroll; public static FoodBase rainbowroll; public static FoodBase sashimi; public static FoodBase salmonsashimi; public static FoodBase clownfishsashimi; public static void init() { cucumber = register(new FoodBase("cucumber", 1).setCreativeTab(CreativeTabs.FOOD)); rice = register(new FoodBase("rice", 1).setCreativeTab(CreativeTabs.FOOD)); riceball = register(new FoodBase("riceball", 4).setCreativeTab(CreativeTabs.FOOD)); nori = register(new FoodBase("nori", 1).setCreativeTab(CreativeTabs.FOOD)); fishroll = register(new FoodBase("fishroll", 10).setCreativeTab(CreativeTabs.FOOD)); salmonroll = register(new FoodBase("salmonroll", 10).setCreativeTab(CreativeTabs.FOOD)); pufferfishroll = register(new FoodBase("pufferfishroll", 14).setCreativeTab(CreativeTabs.FOOD)); cucumberroll = register(new FoodBase("cucumberroll", 6).setCreativeTab(CreativeTabs.FOOD)); mushroomroll = register(new FoodBase("mushroomroll", .setCreativeTab(CreativeTabs.FOOD)); clownfishroll = register(new FoodBase("clownfishroll", 10).setCreativeTab(CreativeTabs.FOOD)); rainbowroll = register(new FoodBase("rainbowroll", 18).setCreativeTab(CreativeTabs.FOOD)); sashimi = register(new FoodBase("sashimi", 6).setCreativeTab(CreativeTabs.FOOD)); clownfishsashimi = register(new FoodBase("clownfishsashimi", .setCreativeTab(CreativeTabs.FOOD)); salmonsashimi = register(new FoodBase("salmonsashimi", 6).setCreativeTab(CreativeTabs.FOOD)); } private static <T extends Item> T register(T item) { GameRegistry.register(item); if (item instanceof ItemModelProvider) { ((FoodBase)item).registerItemModel(item); } return item; } } and in case you need it here is FoodBase as well package com.exline.sushimod.items; import com.exline.sushimod.ItemModelProvider; import com.exline.sushimod.SushiMod; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; public class FoodBase extends ItemFood implements ItemModelProvider { protected String name; public FoodBase(String name, int hunger) { super(hunger, 0.6f, false); this.name = name; setUnlocalizedName(name); setRegistryName(name); } @Override public void registerItemModel(Item item) { SushiMod.proxy.registerItemRenderer(this, 0, name); } @Override public FoodBase setCreativeTab(CreativeTabs tab) { super.setCreativeTab(tab); return this; } }
  10. I think i might just stick to 1.10.2 for now, but if i can get this to work ill post how i did it!
  11. Also here is the new class for the ItemStack class, i was thinking this may help solve the problem. Im looking at it now. package net.minecraft.item; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import java.text.DecimalFormat; import java.util.List; import java.util.Random; import java.util.Map.Entry; import javax.annotation.Nullable; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentDurability; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureAttribute; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Enchantments; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.stats.StatList; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.datafix.FixTypes; import net.minecraft.util.datafix.walkers.BlockEntityTag; import net.minecraft.util.datafix.walkers.EntityTag; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.event.HoverEvent; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public final class ItemStack implements net.minecraftforge.common.capabilities.ICapabilitySerializable<NBTTagCompound> { public static final ItemStack field_190927_a = new ItemStack((Item)null); public static final DecimalFormat DECIMALFORMAT = new DecimalFormat("#.##"); /** Size of the stack. */ private int stackSize; /** Number of animation frames to go when receiving an item (by walking into it, for example). */ private int animationsToGo; private final Item item; /** A NBTTagMap containing data about an ItemStack. Can only be used for non stackable items */ private NBTTagCompound stackTagCompound; private boolean field_190928_g; int itemDamage; /** Item frame this stack is on, or null if not on an item frame. */ private EntityItemFrame itemFrame; private Block canDestroyCacheBlock; private boolean canDestroyCacheResult; private Block canPlaceOnCacheBlock; private boolean canPlaceOnCacheResult; private net.minecraftforge.fml.common.registry.RegistryDelegate<Item> delegate; private net.minecraftforge.common.capabilities.CapabilityDispatcher capabilities; private NBTTagCompound capNBT; public ItemStack(Block blockIn) { this((Block)blockIn, 1); } public ItemStack(Block blockIn, int amount) { this((Block)blockIn, amount, 0); } public ItemStack(Block blockIn, int amount, int meta) { this(Item.getItemFromBlock(blockIn), amount, meta); } public ItemStack(Item itemIn) { this((Item)itemIn, 1); } public ItemStack(Item itemIn, int amount) { this((Item)itemIn, amount, 0); } public ItemStack(Item itemIn, int amount, int meta){ this(itemIn, amount, meta, null); } public ItemStack(Item itemIn, int amount, int meta, NBTTagCompound capNBT) { this.capNBT = capNBT; this.item = itemIn; this.itemDamage = meta; this.stackSize = amount; if (this.itemDamage < 0) { this.itemDamage = 0; } this.func_190923_F(); } private void func_190923_F() { this.field_190928_g = this.func_190926_b(); this.delegate = this.item != null ? this.item.delegate : null; } public ItemStack(NBTTagCompound p_i47263_1_) { this.capNBT = p_i47263_1_.hasKey("ForgeCaps") ? p_i47263_1_.getCompoundTag("ForgeCaps") : null; this.item = Item.getByNameOrId(p_i47263_1_.getString("id")); this.stackSize = p_i47263_1_.getByte("Count"); this.itemDamage = Math.max(0, p_i47263_1_.getShort("Damage")); if (p_i47263_1_.hasKey("tag", 10)) { this.stackTagCompound = p_i47263_1_.getCompoundTag("tag"); if (this.item != null) { this.item.updateItemStackNBT(p_i47263_1_); } } this.func_190923_F(); } public boolean func_190926_b() { return this == field_190927_a ? true : (this.item != null && this.item != Item.getItemFromBlock(Blocks.AIR) ? (this.stackSize <= 0 ? true : this.itemDamage < -32768 || this.itemDamage > 65535) : true); } public static void registerFixes(DataFixer fixer) { fixer.registerWalker(FixTypes.ITEM_INSTANCE, new BlockEntityTag()); fixer.registerWalker(FixTypes.ITEM_INSTANCE, new EntityTag()); } /** * Splits off a stack of the given amount of this stack and reduces this stack by the amount. */ public ItemStack splitStack(int amount) { int i = Math.min(amount, this.stackSize); ItemStack itemstack = this.copy(); itemstack.func_190920_e(i); this.func_190918_g(i); return itemstack; } /** * Returns the object corresponding to the stack. */ public Item getItem() { return this.field_190928_g || this.delegate == null ? Item.getItemFromBlock(Blocks.AIR) : this.delegate.get(); } /** * Called when the player uses this ItemStack on a Block (right-click). Places blocks, etc. (Legacy name: * tryPlaceItemIntoWorld) */ public EnumActionResult onItemUse(EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!worldIn.isRemote) return net.minecraftforge.common.ForgeHooks.onPlaceItemIntoWorld(this, playerIn, worldIn, pos, side, hitX, hitY, hitZ, hand); EnumActionResult enumactionresult = this.getItem().onItemUse(playerIn, worldIn, pos, hand, side, hitX, hitY, hitZ); if (enumactionresult == EnumActionResult.SUCCESS) { playerIn.addStat(StatList.getObjectUseStats(this.item)); } return enumactionresult; } public EnumActionResult onItemUseFirst(EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { // copy of onitemuse but for onitemusefirst EnumActionResult enumactionresult = this.getItem().onItemUseFirst(playerIn, worldIn, pos, side, hitX, hitY, hitZ, hand); if (enumactionresult == EnumActionResult.SUCCESS) { playerIn.addStat(StatList.getObjectUseStats(this.item)); } return enumactionresult; } public float getStrVsBlock(IBlockState blockIn) { return this.getItem().getStrVsBlock(this, blockIn); } public ActionResult<ItemStack> useItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) { return this.getItem().onItemRightClick(worldIn, playerIn, hand); } /** * Called when the item in use count reach 0, e.g. item food eaten. Return the new ItemStack. Args : world, entity */ public ItemStack onItemUseFinish(World worldIn, EntityLivingBase entityLiving) { return this.getItem().onItemUseFinish(this, worldIn, entityLiving); } /** * Write the stack fields to a NBT object. Return the new NBT object. */ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { ResourceLocation resourcelocation = (ResourceLocation)Item.REGISTRY.getNameForObject(this.item); nbt.setString("id", resourcelocation == null ? "minecraft:air" : resourcelocation.toString()); nbt.setByte("Count", (byte)this.stackSize); nbt.setShort("Damage", (short)this.itemDamage); if (this.stackTagCompound != null) { nbt.setTag("tag", this.stackTagCompound); } if (this.capabilities != null) { NBTTagCompound cnbt = this.capabilities.serializeNBT(); if (!cnbt.hasNoTags()) nbt.setTag("ForgeCaps", cnbt); } return nbt; } /** * Returns maximum size of the stack. */ public int getMaxStackSize() { return this.getItem().getItemStackLimit(this); } /** * Returns true if the ItemStack can hold 2 or more units of the item. */ public boolean isStackable() { return this.getMaxStackSize() > 1 && (!this.isItemStackDamageable() || !this.isItemDamaged()); } /** * true if this itemStack is damageable */ public boolean isItemStackDamageable() { return this.field_190928_g ? false : (this.item.getMaxDamage(this) <= 0 ? false : !this.hasTagCompound() || !this.getTagCompound().getBoolean("Unbreakable")); } public boolean getHasSubtypes() { return this.getItem().getHasSubtypes(); } /** * returns true when a damageable item is damaged */ public boolean isItemDamaged() { return this.isItemStackDamageable() && getItem().isDamaged(this); } public int getItemDamage() { /** * Returns the object corresponding to the stack. */ return getItem().getDamage(this); } public int getMetadata() { /** * Returns the object corresponding to the stack. */ return getItem().getMetadata(this); } public void setItemDamage(int meta) { getItem().setDamage(this, meta); } /** * Returns the max damage an item in the stack can take. */ public int getMaxDamage() { return this.getItem().getMaxDamage(this); } /** * Attempts to damage the ItemStack with par1 amount of damage, If the ItemStack has the Unbreaking enchantment * there is a chance for each point of damage to be negated. Returns true if it takes more damage than * getMaxDamage(). Returns false otherwise or if the ItemStack can't be damaged or if all points of damage are * negated. */ public boolean attemptDamageItem(int amount, Random rand) { if (!this.isItemStackDamageable()) { return false; } else { if (amount > 0) { int i = EnchantmentHelper.getEnchantmentLevel(Enchantments.UNBREAKING, this); int j = 0; for (int k = 0; i > 0 && k < amount; ++k) { if (EnchantmentDurability.negateDamage(this, i, rand)) { ++j; } } amount -= j; if (amount <= 0) { return false; } } setItemDamage(getItemDamage() + amount); //Redirect through Item's callback if applicable. return getItemDamage() > getMaxDamage(); } } /** * Damages the item in the ItemStack */ public void damageItem(int amount, EntityLivingBase entityIn) { if (!(entityIn instanceof EntityPlayer) || !((EntityPlayer)entityIn).capabilities.isCreativeMode) { if (this.isItemStackDamageable()) { if (this.attemptDamageItem(amount, entityIn.getRNG())) { entityIn.renderBrokenItemStack(this); this.func_190918_g(1); if (entityIn instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer)entityIn; entityplayer.addStat(StatList.getObjectBreakStats(this.item)); } this.itemDamage = 0; } } } } /** * Calls the delegated method to the Item to damage the incoming Entity, and if necessary, triggers a stats * increase. */ public void hitEntity(EntityLivingBase entityIn, EntityPlayer playerIn) { boolean flag = this.item.hitEntity(this, entityIn, playerIn); if (flag) { playerIn.addStat(StatList.getObjectUseStats(this.item)); } } /** * Called when a Block is destroyed using this ItemStack */ public void onBlockDestroyed(World worldIn, IBlockState blockIn, BlockPos pos, EntityPlayer playerIn) { boolean flag = this.getItem().onBlockDestroyed(this, worldIn, blockIn, pos, playerIn); if (flag) { playerIn.addStat(StatList.getObjectUseStats(this.item)); } } /** * Check whether the given Block can be harvested using this ItemStack. */ public boolean canHarvestBlock(IBlockState blockIn) { return this.getItem().canHarvestBlock(blockIn, this); } public boolean interactWithEntity(EntityPlayer playerIn, EntityLivingBase entityIn, EnumHand hand) { return this.getItem().itemInteractionForEntity(this, playerIn, entityIn, hand); } /** * Returns a new stack with the same properties. */ public ItemStack copy() { ItemStack itemstack = new ItemStack(this.item, this.stackSize, this.itemDamage, this.capabilities != null ? this.capabilities.serializeNBT() : null); if (this.stackTagCompound != null) { itemstack.stackTagCompound = this.stackTagCompound.copy(); } return itemstack; } public static boolean areItemStackTagsEqual(ItemStack stackA, ItemStack stackB) { return stackA.func_190926_b() && stackB.func_190926_b() ? true : (!stackA.func_190926_b() && !stackB.func_190926_b() ? (stackA.stackTagCompound == null && stackB.stackTagCompound != null ? false : stackA.stackTagCompound == null || stackA.stackTagCompound.equals(stackB.stackTagCompound)) : false); } /** * compares ItemStack argument1 with ItemStack argument2; returns true if both ItemStacks are equal */ public static boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB) { return stackA.func_190926_b() && stackB.func_190926_b() ? true : (!stackA.func_190926_b() && !stackB.func_190926_b() ? stackA.isItemStackEqual(stackB) : false); } /** * compares ItemStack argument to the instance ItemStack; returns true if both ItemStacks are equal */ private boolean isItemStackEqual(ItemStack other) { return this.stackSize != other.stackSize ? false : (this.getItem() != other.getItem() ? false : (this.itemDamage != other.itemDamage ? false : (this.stackTagCompound == null && other.stackTagCompound != null ? false : this.stackTagCompound == null || this.stackTagCompound.equals(other.stackTagCompound)))); } /** * Compares Item and damage value of the two stacks */ public static boolean areItemsEqual(ItemStack stackA, ItemStack stackB) { return stackA == stackB ? true : (!stackA.func_190926_b() && !stackB.func_190926_b() ? stackA.isItemEqual(stackB) : false); } public static boolean areItemsEqualIgnoreDurability(ItemStack stackA, ItemStack stackB) { return stackA == stackB ? true : (!stackA.func_190926_b() && !stackB.func_190926_b() ? stackA.isItemEqualIgnoreDurability(stackB) : false); } /** * compares ItemStack argument to the instance ItemStack; returns true if the Items contained in both ItemStacks are * equal */ public boolean isItemEqual(ItemStack other) { return !other.func_190926_b() && this.item == other.item && this.itemDamage == other.itemDamage; } public boolean isItemEqualIgnoreDurability(ItemStack stack) { return !this.isItemStackDamageable() ? this.isItemEqual(stack) : !stack.func_190926_b() && this.item == stack.item; } public String getUnlocalizedName() { return this.getItem().getUnlocalizedName(this); } public String toString() { return this.stackSize + "x" + this.getItem().getUnlocalizedName() + "@" + this.itemDamage; } /** * Called each tick as long the ItemStack in on player inventory. Used to progress the pickup animation and update * maps. */ public void updateAnimation(World worldIn, Entity entityIn, int inventorySlot, boolean isCurrentItem) { if (this.animationsToGo > 0) { --this.animationsToGo; } if (this.item != null) { this.item.onUpdate(this, worldIn, entityIn, inventorySlot, isCurrentItem); } } public void onCrafting(World worldIn, EntityPlayer playerIn, int amount) { playerIn.addStat(StatList.getCraftStats(this.item), amount); this.getItem().onCreated(this, worldIn, playerIn); } public int getMaxItemUseDuration() { return this.getItem().getMaxItemUseDuration(this); } public EnumAction getItemUseAction() { return this.getItem().getItemUseAction(this); } /** * Called when the player releases the use item button. */ public void onPlayerStoppedUsing(World worldIn, EntityLivingBase entityLiving, int timeLeft) { this.getItem().onPlayerStoppedUsing(this, worldIn, entityLiving, timeLeft); } /** * Returns true if the ItemStack has an NBTTagCompound. Currently used to store enchantments. */ public boolean hasTagCompound() { return !this.field_190928_g && this.stackTagCompound != null; } /** * Returns the NBTTagCompound of the ItemStack. */ @Nullable public NBTTagCompound getTagCompound() { return this.stackTagCompound; } public NBTTagCompound func_190925_c(String p_190925_1_) { if (this.stackTagCompound != null && this.stackTagCompound.hasKey(p_190925_1_, 10)) { return this.stackTagCompound.getCompoundTag(p_190925_1_); } else { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.setTagInfo(p_190925_1_, nbttagcompound); return nbttagcompound; } } /** * Get an NBTTagCompound from this stack's NBT data. */ @Nullable public NBTTagCompound getSubCompound(String key) { return this.stackTagCompound != null && this.stackTagCompound.hasKey(key, 10) ? this.stackTagCompound.getCompoundTag(key) : null; } public void func_190919_e(String p_190919_1_) { if (this.stackTagCompound != null && this.stackTagCompound.hasKey(p_190919_1_, 10)) { this.stackTagCompound.removeTag(p_190919_1_); } } @Nullable public NBTTagList getEnchantmentTagList() { return this.stackTagCompound == null ? null : this.stackTagCompound.getTagList("ench", 10); } /** * Assigns a NBTTagCompound to the ItemStack, minecraft validates that only non-stackable items can have it. */ public void setTagCompound(@Nullable NBTTagCompound nbt) { this.stackTagCompound = nbt; } /** * returns the display name of the itemstack */ public String getDisplayName() { NBTTagCompound nbttagcompound = this.getSubCompound("display"); if (nbttagcompound != null) { if (nbttagcompound.hasKey("Name", ) { return nbttagcompound.getString("Name"); } if (nbttagcompound.hasKey("LocName", ) { return I18n.translateToLocal(nbttagcompound.getString("LocName")); } } return this.getItem().getItemStackDisplayName(this); } public ItemStack func_190924_f(String p_190924_1_) { this.func_190925_c("display").setString("LocName", p_190924_1_); return this; } public ItemStack setStackDisplayName(String displayName) { this.func_190925_c("display").setString("Name", displayName); return this; } /** * Clear any custom name set for this ItemStack */ public void clearCustomName() { NBTTagCompound nbttagcompound = this.getSubCompound("display"); if (nbttagcompound != null) { nbttagcompound.removeTag("Name"); if (nbttagcompound.hasNoTags()) { this.func_190919_e("display"); } } if (this.stackTagCompound != null && this.stackTagCompound.hasNoTags()) { this.stackTagCompound = null; } } /** * Returns true if the itemstack has a display name */ public boolean hasDisplayName() { NBTTagCompound nbttagcompound = this.getSubCompound("display"); return nbttagcompound != null && nbttagcompound.hasKey("Name", ; } @SideOnly(Side.CLIENT) public List<String> getTooltip(EntityPlayer playerIn, boolean advanced) { List<String> list = Lists.<String>newArrayList(); String s = this.getDisplayName(); if (this.hasDisplayName()) { s = TextFormatting.ITALIC + s; } s = s + TextFormatting.RESET; if (advanced) { String s1 = ""; if (!s.isEmpty()) { s = s + " ("; s1 = ")"; } int i = Item.getIdFromItem(this.item); if (this.getHasSubtypes()) { s = s + String.format("#%04d/%d%s", new Object[] {Integer.valueOf(i), Integer.valueOf(this.itemDamage), s1}); } else { s = s + String.format("#%04d%s", new Object[] {Integer.valueOf(i), s1}); } } else if (!this.hasDisplayName() && this.item == Items.FILLED_MAP) { s = s + " #" + this.itemDamage; } list.add(s); int i1 = 0; if (this.hasTagCompound() && this.stackTagCompound.hasKey("HideFlags", 99)) { i1 = this.stackTagCompound.getInteger("HideFlags"); } if ((i1 & 32) == 0) { this.getItem().addInformation(this, playerIn, list, advanced); } if (this.hasTagCompound()) { if ((i1 & 1) == 0) { NBTTagList nbttaglist = this.getEnchantmentTagList(); if (nbttaglist != null && !nbttaglist.hasNoTags()) { for (int j = 0; j < nbttaglist.tagCount(); ++j) { int k = nbttaglist.getCompoundTagAt(j).getShort("id"); int l = nbttaglist.getCompoundTagAt(j).getShort("lvl"); if (Enchantment.getEnchantmentByID(k) != null) { list.add(Enchantment.getEnchantmentByID(k).getTranslatedName(l)); } } } } if (this.stackTagCompound.hasKey("display", 10)) { NBTTagCompound nbttagcompound = this.stackTagCompound.getCompoundTag("display"); if (nbttagcompound.hasKey("color", 3)) { if (advanced) { list.add(I18n.translateToLocalFormatted("item.color", new Object[] {String.format("#%06X", new Object[]{Integer.valueOf(nbttagcompound.getInteger("color"))})})); } else { list.add(TextFormatting.ITALIC + I18n.translateToLocal("item.dyed")); } } if (nbttagcompound.getTagId("Lore") == 9) { NBTTagList nbttaglist3 = nbttagcompound.getTagList("Lore", ; if (!nbttaglist3.hasNoTags()) { for (int l1 = 0; l1 < nbttaglist3.tagCount(); ++l1) { list.add(TextFormatting.DARK_PURPLE + "" + TextFormatting.ITALIC + nbttaglist3.getStringTagAt(l1)); } } } } } for (EntityEquipmentSlot entityequipmentslot : EntityEquipmentSlot.values()) { Multimap<String, AttributeModifier> multimap = this.getAttributeModifiers(entityequipmentslot); if (!multimap.isEmpty() && (i1 & 2) == 0) { list.add(""); list.add(I18n.translateToLocal("item.modifiers." + entityequipmentslot.getName())); for (Entry<String, AttributeModifier> entry : multimap.entries()) { AttributeModifier attributemodifier = (AttributeModifier)entry.getValue(); double d0 = attributemodifier.getAmount(); boolean flag = false; if (attributemodifier.getID() == Item.ATTACK_DAMAGE_MODIFIER) { d0 = d0 + playerIn.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).getBaseValue(); d0 = d0 + (double)EnchantmentHelper.getModifierForCreature(this, EnumCreatureAttribute.UNDEFINED); flag = true; } else if (attributemodifier.getID() == Item.ATTACK_SPEED_MODIFIER) { d0 += playerIn.getEntityAttribute(SharedMonsterAttributes.ATTACK_SPEED).getBaseValue(); flag = true; } double d1; if (attributemodifier.getOperation() != 1 && attributemodifier.getOperation() != 2) { d1 = d0; } else { d1 = d0 * 100.0D; } if (flag) { list.add(" " + I18n.translateToLocalFormatted("attribute.modifier.equals." + attributemodifier.getOperation(), new Object[] {DECIMALFORMAT.format(d1), I18n.translateToLocal("attribute.name." + (String)entry.getKey())})); } else if (d0 > 0.0D) { list.add(TextFormatting.BLUE + " " + I18n.translateToLocalFormatted("attribute.modifier.plus." + attributemodifier.getOperation(), new Object[] {DECIMALFORMAT.format(d1), I18n.translateToLocal("attribute.name." + (String)entry.getKey())})); } else if (d0 < 0.0D) { d1 = d1 * -1.0D; list.add(TextFormatting.RED + " " + I18n.translateToLocalFormatted("attribute.modifier.take." + attributemodifier.getOperation(), new Object[] {DECIMALFORMAT.format(d1), I18n.translateToLocal("attribute.name." + (String)entry.getKey())})); } } } } if (this.hasTagCompound() && this.getTagCompound().getBoolean("Unbreakable") && (i1 & 4) == 0) { list.add(TextFormatting.BLUE + I18n.translateToLocal("item.unbreakable")); } if (this.hasTagCompound() && this.stackTagCompound.hasKey("CanDestroy", 9) && (i1 & == 0) { NBTTagList nbttaglist1 = this.stackTagCompound.getTagList("CanDestroy", ; if (!nbttaglist1.hasNoTags()) { list.add(""); list.add(TextFormatting.GRAY + I18n.translateToLocal("item.canBreak")); for (int j1 = 0; j1 < nbttaglist1.tagCount(); ++j1) { Block block = Block.getBlockFromName(nbttaglist1.getStringTagAt(j1)); if (block != null) { list.add(TextFormatting.DARK_GRAY + block.getLocalizedName()); } else { list.add(TextFormatting.DARK_GRAY + "missingno"); } } } } if (this.hasTagCompound() && this.stackTagCompound.hasKey("CanPlaceOn", 9) && (i1 & 16) == 0) { NBTTagList nbttaglist2 = this.stackTagCompound.getTagList("CanPlaceOn", ; if (!nbttaglist2.hasNoTags()) { list.add(""); list.add(TextFormatting.GRAY + I18n.translateToLocal("item.canPlace")); for (int k1 = 0; k1 < nbttaglist2.tagCount(); ++k1) { Block block1 = Block.getBlockFromName(nbttaglist2.getStringTagAt(k1)); if (block1 != null) { list.add(TextFormatting.DARK_GRAY + block1.getLocalizedName()); } else { list.add(TextFormatting.DARK_GRAY + "missingno"); } } } } if (advanced) { if (this.isItemDamaged()) { list.add(I18n.translateToLocalFormatted("item.durability", new Object[] {Integer.valueOf(this.getMaxDamage() - this.getItemDamage()), Integer.valueOf(this.getMaxDamage())})); } list.add(TextFormatting.DARK_GRAY + ((ResourceLocation)Item.REGISTRY.getNameForObject(this.item)).toString()); if (this.hasTagCompound()) { list.add(TextFormatting.DARK_GRAY + I18n.translateToLocalFormatted("item.nbt_tags", new Object[] {Integer.valueOf(this.getTagCompound().getKeySet().size())})); } } net.minecraftforge.event.ForgeEventFactory.onItemTooltip(this, playerIn, list, advanced); return list; } @SideOnly(Side.CLIENT) public boolean hasEffect() { return this.getItem().hasEffect(this); } public EnumRarity getRarity() { return this.getItem().getRarity(this); } /** * True if it is a tool and has no enchantments to begin with */ public boolean isItemEnchantable() { return !this.getItem().isItemTool(this) ? false : !this.isItemEnchanted(); } /** * Adds an enchantment with a desired level on the ItemStack. */ public void addEnchantment(Enchantment ench, int level) { if (this.stackTagCompound == null) { this.setTagCompound(new NBTTagCompound()); } if (!this.stackTagCompound.hasKey("ench", 9)) { this.stackTagCompound.setTag("ench", new NBTTagList()); } NBTTagList nbttaglist = this.stackTagCompound.getTagList("ench", 10); NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.setShort("id", (short)Enchantment.getEnchantmentID(ench)); nbttagcompound.setShort("lvl", (short)((byte)level)); nbttaglist.appendTag(nbttagcompound); } /** * True if the item has enchantment data */ public boolean isItemEnchanted() { return this.stackTagCompound != null && this.stackTagCompound.hasKey("ench", 9) ? !this.stackTagCompound.getTagList("ench", 10).hasNoTags() : false; } public void setTagInfo(String key, NBTBase value) { if (this.stackTagCompound == null) { this.setTagCompound(new NBTTagCompound()); } this.stackTagCompound.setTag(key, value); } public boolean canEditBlocks() { return this.getItem().canItemEditBlocks(); } /** * Return whether this stack is on an item frame. */ public boolean isOnItemFrame() { return this.itemFrame != null; } /** * Set the item frame this stack is on. */ public void setItemFrame(EntityItemFrame frame) { this.itemFrame = frame; } /** * Return the item frame this stack is on. Returns null if not on an item frame. */ @Nullable public EntityItemFrame getItemFrame() { return this.field_190928_g ? null : this.itemFrame; } /** * Get this stack's repair cost, or 0 if no repair cost is defined. */ public int getRepairCost() { return this.hasTagCompound() && this.stackTagCompound.hasKey("RepairCost", 3) ? this.stackTagCompound.getInteger("RepairCost") : 0; } /** * Set this stack's repair cost. */ public void setRepairCost(int cost) { if (!this.hasTagCompound()) { this.stackTagCompound = new NBTTagCompound(); } this.stackTagCompound.setInteger("RepairCost", cost); } public Multimap<String, AttributeModifier> getAttributeModifiers(EntityEquipmentSlot equipmentSlot) { Multimap<String, AttributeModifier> multimap; if (this.hasTagCompound() && this.stackTagCompound.hasKey("AttributeModifiers", 9)) { multimap = HashMultimap.<String, AttributeModifier>create(); NBTTagList nbttaglist = this.stackTagCompound.getTagList("AttributeModifiers", 10); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound = nbttaglist.getCompoundTagAt(i); AttributeModifier attributemodifier = SharedMonsterAttributes.readAttributeModifierFromNBT(nbttagcompound); if (attributemodifier != null && (!nbttagcompound.hasKey("Slot", || nbttagcompound.getString("Slot").equals(equipmentSlot.getName())) && attributemodifier.getID().getLeastSignificantBits() != 0L && attributemodifier.getID().getMostSignificantBits() != 0L) { multimap.put(nbttagcompound.getString("AttributeName"), attributemodifier); } } } else { multimap = this.getItem().getAttributeModifiers(equipmentSlot, this); } return multimap; } public void addAttributeModifier(String attributeName, AttributeModifier modifier, @Nullable EntityEquipmentSlot equipmentSlot) { if (this.stackTagCompound == null) { this.stackTagCompound = new NBTTagCompound(); } if (!this.stackTagCompound.hasKey("AttributeModifiers", 9)) { this.stackTagCompound.setTag("AttributeModifiers", new NBTTagList()); } NBTTagList nbttaglist = this.stackTagCompound.getTagList("AttributeModifiers", 10); NBTTagCompound nbttagcompound = SharedMonsterAttributes.writeAttributeModifierToNBT(modifier); nbttagcompound.setString("AttributeName", attributeName); if (equipmentSlot != null) { nbttagcompound.setString("Slot", equipmentSlot.getName()); } nbttaglist.appendTag(nbttagcompound); } /** * Get a ChatComponent for this Item's display name that shows this Item on hover */ public ITextComponent getTextComponent() { TextComponentString textcomponentstring = new TextComponentString(this.getDisplayName()); if (this.hasDisplayName()) { textcomponentstring.getStyle().setItalic(Boolean.valueOf(true)); } ITextComponent itextcomponent = (new TextComponentString("[")).appendSibling(textcomponentstring).appendText("]"); if (!this.field_190928_g) { NBTTagCompound nbttagcompound = this.writeToNBT(new NBTTagCompound()); itextcomponent.getStyle().setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new TextComponentString(nbttagcompound.toString()))); itextcomponent.getStyle().setColor(this.getRarity().rarityColor); } return itextcomponent; } public boolean canDestroy(Block blockIn) { if (blockIn == this.canDestroyCacheBlock) { return this.canDestroyCacheResult; } else { this.canDestroyCacheBlock = blockIn; if (this.hasTagCompound() && this.stackTagCompound.hasKey("CanDestroy", 9)) { NBTTagList nbttaglist = this.stackTagCompound.getTagList("CanDestroy", ; for (int i = 0; i < nbttaglist.tagCount(); ++i) { Block block = Block.getBlockFromName(nbttaglist.getStringTagAt(i)); if (block == blockIn) { this.canDestroyCacheResult = true; return true; } } } this.canDestroyCacheResult = false; return false; } } public boolean canPlaceOn(Block blockIn) { if (blockIn == this.canPlaceOnCacheBlock) { return this.canPlaceOnCacheResult; } else { this.canPlaceOnCacheBlock = blockIn; if (this.hasTagCompound() && this.stackTagCompound.hasKey("CanPlaceOn", 9)) { NBTTagList nbttaglist = this.stackTagCompound.getTagList("CanPlaceOn", ; for (int i = 0; i < nbttaglist.tagCount(); ++i) { Block block = Block.getBlockFromName(nbttaglist.getStringTagAt(i)); if (block == blockIn) { this.canPlaceOnCacheResult = true; return true; } } } this.canPlaceOnCacheResult = false; return false; } } public boolean hasCapability(net.minecraftforge.common.capabilities.Capability<?> capability, net.minecraft.util.EnumFacing facing) { return this.capabilities == null ? false : this.capabilities.hasCapability(capability, facing); } public <T> T getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, net.minecraft.util.EnumFacing facing) { return this.capabilities == null ? null : this.capabilities.getCapability(capability, facing); } public void deserializeNBT(NBTTagCompound nbt) { // TODO do this better while respecting new rules final ItemStack itemStack = new ItemStack(nbt); this.stackTagCompound = itemStack.stackTagCompound; this.capNBT = itemStack.capNBT; } public NBTTagCompound serializeNBT() { NBTTagCompound ret = new NBTTagCompound(); this.writeToNBT(ret); return ret; } public boolean areCapsCompatible(ItemStack other) { if (this.capabilities == null) { if (other.capabilities == null) { return true; } else { return other.capabilities.areCompatible(null); } } else { return this.capabilities.areCompatible(other.capabilities); } } @SideOnly(Side.CLIENT) public int func_190921_D() { return this.animationsToGo; } public void func_190915_d(int p_190915_1_) { this.animationsToGo = p_190915_1_; } public int func_190916_E() { return this.field_190928_g ? 0 : this.stackSize; } public void func_190920_e(int p_190920_1_) { this.stackSize = p_190920_1_; this.func_190923_F(); } public void func_190917_f(int p_190917_1_) { this.func_190920_e(this.stackSize + p_190917_1_); } public void func_190918_g(int p_190918_1_) { this.func_190917_f(-p_190918_1_); } } Here is the constructor method of ItemStack that is called public ItemStack(Item itemIn, int amount) { this((Item)itemIn, amount, 0); }
  12. here is the main class, package com.exline.sushimod; import com.exline.sushimod.block.ModBlocks; import com.exline.sushimod.proxy.CommonProxy; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; @Mod(modid = SushiMod.MODID, version = SushiMod.VERSION) public class SushiMod { public static final String MODID = "sushimod"; public static final String VERSION = "1.0"; @Mod.Instance(MODID) public static SushiMod instance; @SidedProxy(serverSide = "com.exline.sushimod.proxy.CommonProxy", clientSide = "com.exline.sushimod.proxy.ClientProxy") public static CommonProxy proxy; @EventHandler public void preInit(FMLPreInitializationEvent event) { ModBlocks.init(); ModSeeds.init(); ModCucumberSeeds.init(); ModItems.init(); } @EventHandler public void init(FMLInitializationEvent event) { // recipes here GameRegistry.addShapelessRecipe(new ItemStack(ModItems.fishroll ,1), Items.CARROT, ModItems.cucumber, Items.FISH, ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.salmonroll ,1), Items.CARROT, ModItems.cucumber, (new ItemStack(Items.FISH, 1, 1)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.pufferfishroll ,1), Items.CARROT, ModItems.cucumber, (new ItemStack(Items.FISH, 1, 3)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.cucumberroll ,1), ModItems.cucumber, ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.mushroomroll ,1), Blocks.BROWN_MUSHROOM, Blocks.BROWN_MUSHROOM, Blocks.BROWN_MUSHROOM, ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.clownfishroll ,1), Items.CARROT, ModItems.cucumber, (new ItemStack(Items.FISH, 1, 2)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.rainbowroll ,1),(new ItemStack(Items.FISH, 1, 3)),(new ItemStack(Items.FISH, 1, 0)),(new ItemStack(Items.FISH, 1, 1)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.rainbowroll ,1),(new ItemStack(Items.FISH, 1, 3)),(new ItemStack(Items.FISH, 1, 0)),(new ItemStack(Items.FISH, 1, 2)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.rainbowroll ,1),(new ItemStack(Items.FISH, 1, 3)),(new ItemStack(Items.FISH, 1, 1)),(new ItemStack(Items.FISH, 1, 2)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.sashimi ,1), (new ItemStack(Items.FISH, 1, 0)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.clownfishsashimi ,1), (new ItemStack(Items.FISH, 1, 2)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.salmonsashimi ,1),(new ItemStack(Items.FISH, 1, 1)), ModItems.rice, ModItems.rice, ModItems.rice, ModItems.nori); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.riceball, 1), ModItems.nori, ModItems.rice, ModItems.rice, ModItems.rice); GameRegistry.addShapelessRecipe(new ItemStack(ModCucumberSeeds.cucumberseeds ,2), ModItems.cucumber); GameRegistry.addShapelessRecipe(new ItemStack(ModItems.nori ,3), Blocks.WATERLILY); GameRegistry.addSmelting(ModSeeds.riceseeds, new ItemStack(ModItems.rice), 0.0f); MinecraftForge.EVENT_BUS.register(new TallGrassEventHandler()); } }
  13. Hey guys! I just updated my mod and realized that whenever I craft an item the game crashes. It happens to all my 1.11 mods and it was all working on 1.10.2. If anyone else has this problem I hope we can figure out whats wrong. Here is the crash report, I tried this with all my custom recipes and it doesn't even work for vanilla items. It crashes every time I try to make an item with a custom recipe. It crashes with shaped recipes and shapeless recipes. Here is one of my recipes, it is in the init() method of my main mod class. GameRegistry.addShapelessRecipe(new ItemStack(ModItems.riceball ,1), ModItems.nori, ModItems.rice, ModItems.rice, ModItems.rice); Everything else in my mod works, i can eat the riceball and i can put the items on the crafting table and it appears on the crafting result slot, but as soon as i click on it the game crashes. sorry if this ends up being something stupid
×
×
  • Create New...

Important Information

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