Jump to content

xandayn

Members
  • Posts

    19
  • Joined

  • Last visited

Everything posted by xandayn

  1. Looks like right here https://github.com/SgtPunishment/Soul-Shards-Reborn/blob/master/src/main/java/moze_intel/ssr/utils/Utils.java#L74 is where the shards tier levels up, it also looks like it can return the same tier as it was before, so you'd need to do a check to see if the previous tier is higher than the current route.
  2. Thank you very much, I didn't realize it was something so simple, like I said I don't have a lot of experience with netty but I have done a bit in the past and i used get and set int with no problems so i assumed that was the correct way to do things.
  3. Hey everyone, I have a question about an issue I'm having with netty, I've used it before and this is the first time I've ever encountered a bug quite like this. io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more [00:27:35] [server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more [00:27:35] [server thread/ERROR] [FML]: SimpleChannelHandlerWrapper exception io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) [DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) [DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more [00:27:35] [server thread/ERROR] [FML]: There was a critical exception handling a packet on channel xan_prChannel io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:99) ~[MessageToMessageDecoder.class:?] at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) ~[MessageToMessageCodec.class:?] at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323) ~[DefaultChannelHandlerContext.class:?] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) ~[DefaultChannelPipeline.class:?] at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) ~[EmbeddedChannel.class:?] at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:86) [FMLProxyPacket.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) [NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) [NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:349) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException: Undefined message for discriminator 21 in channel xan_prChannel at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:73) ~[FMLIndexedMessageToMessageCodec.class:?] at cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec.decode(FMLIndexedMessageToMessageCodec.java:17) ~[FMLIndexedMessageToMessageCodec.class:?] at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81) ~[MessageToMessageCodec$2.class:?] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89) ~[MessageToMessageDecoder.class:?] ... 13 more Clearly it has an issue with discriminator 21, which makes sense, because I have no discriminator 21 registered, here's my packet registration (and yes it is being called) public static void initialize() { NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel(References.MOD_CHANNEL_ID); NETWORK.registerMessage(ServerReceiveNewRecipe.Handler.class, ServerReceiveNewRecipe.class, 0, Side.SERVER); NETWORK.registerMessage(ServerRemoveOldRecipe.Handler.class, ServerRemoveOldRecipe.class, 1, Side.SERVER); NETWORK.registerMessage(ClientReceiveAllRecipesFromServer.Handler.class, ClientReceiveAllRecipesFromServer.class, 2, Side.CLIENT); NETWORK.registerMessage(ClientReceiveNewRecipeFromServer.Handler.class, ClientReceiveNewRecipeFromServer.class, 3, Side.CLIENT); NETWORK.registerMessage(ClientReceiveRecipeRemovalFromServer.Handler.class, ClientReceiveRecipeRemovalFromServer.class, 4, Side.CLIENT); } All of the packets seem to work fine minus the ServerRemoveOldRecipe packet //Imports removed to save space public class ServerRemoveOldRecipe implements IMessage { private int handlerID = 0; private int recipeID = 0; public ServerRemoveOldRecipe() {} public ServerRemoveOldRecipe(int handlerID, int recipeID){ this.handlerID = handlerID; this.recipeID = recipeID; } @Override public void fromBytes(ByteBuf byteBuf) { handlerID = byteBuf.getInt(0); recipeID = byteBuf.getInt(1); } @Override public void toBytes(ByteBuf byteBuf) { byteBuf.setInt(0, handlerID); byteBuf.setInt(1, recipeID); } public static class Handler implements IMessageHandler<ServerRemoveOldRecipe, IMessage> { @Override public IMessage onMessage(ServerRemoveOldRecipe message, MessageContext ctx) { if(ctx.side.isServer()) { RecipeRegistry.INSTANCE.removeRecipe(message.handlerID, message.recipeID); NetworkHandler.NETWORK.sendToAll(new ClientReceiveRecipeRemovalFromServer(message.handlerID, message.recipeID)); } return null; } } } Here is the ClientReceiveRecipeRemovalFromServer class, although we never get this far as the crash happens before it, but for the sake of completeness. //imports and package info removed to save space public class ClientReceiveRecipeRemovalFromServer implements IMessage { private int handlerID = 0, position = 0; public ClientReceiveRecipeRemovalFromServer() {} public ClientReceiveRecipeRemovalFromServer(int handlerID, int position) { this.handlerID = handlerID; this.position = position; } @Override public void fromBytes(ByteBuf byteBuf) { handlerID = byteBuf.getInt(0); position = byteBuf.getInt(1); } @Override public void toBytes(ByteBuf byteBuf) { byteBuf.setInt(0, handlerID); byteBuf.setInt(1, position); } public static class Handler implements IMessageHandler<ClientReceiveRecipeRemovalFromServer, IMessage> { @Override public IMessage onMessage(ClientReceiveRecipeRemovalFromServer message, MessageContext ctx) { if(ctx.side.isClient()) { RecipeRegistry.INSTANCE.removeRecipe(message.handlerID, message.position); } return null; } } } And finally here's the code that actually sends the packet to the server //Some context for this code: It's within a GUI screen under actionPerformed(GuiButton) so this code is called from a client telling the server to remove a recipe, the server then tells all the clients to remove the same recipe. if(FMLCommonHandler.instance().getMinecraftServerInstance() == null) { //getMinecraftServerInstance() is null only if you're a client connected to a remote server I've found, which is when I want to send the packet, if theres a better way to detect that please let me know. NetworkHandler.NETWORK.sendToServer(new ServerRemoveOldRecipe(RecipeRegistry.INSTANCE.getAliasIntID(handler.getID()), selected)); } else { handler.deleteRecipe(selected); } I really have absolutely no idea why this is happening and I've spent probably 5 hours trying to figure it out now. Some help would be greatly appreciated, and if I've made a dumb mistake that I'm just blind to then I apologize but I really can't see one.
  4. This is an issue with the newest version of java (1.8.0_20) I've confirmed that it's the update as Forge works with Java 8 update 11.
  5. This seems to be an issue with Java 1.8.0_20, I suggest uninstalling it and downgrading to 1.8.0_11, you can find older versions of java here: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html
  6. One idea I had was to hash the players names (I dont remember if 1.7.2 and/or 1.7.10 use hash values for players or if thats 1.8+, if it's in 1.7.2 then use minecrafts hash value) and somehow translate that into a set of coordinates or like a grid location and rather than having separate instances entirely give each player a portion of a dimension. I don't know if this is exactly what OP needed but in my case this would work as I'd only need a small area for my dimensions anyways, but it has to be a separate dimension as it fits my mod thematically. EDIT: When I say hash I don't really mean like the String.hash function (that isn't the exact name but close enough, I can't remember off the top of my head) but rather like an MD5 sum or something along those lines because it makes life a lot easier if all the "hashes" are the same length which isn't always the case with the hash function. The downside with using something like an MD5 is that is returns I believe a 128 bit number. Which is two longs worth of integer data, AKA very large. So it'd need to be truncated a lot and it becomes a mess. So that wouldn't really work either, hence me not getting any further with the idea EDIT 2: I just reread the post and realized the OP already had this idea, I didn't see the post before though haha, oh well.
  7. I'm pretty sure Vswe (author of Steve's Carts) has a tutorial explaining what you're looking for, he did a sort of modding course a while back and I remember watching it. https://www.youtube.com/user/VsweGoesMinecraft/videos they're really useful tutorials as well.
  8. I've gone ahead and written the recipe class you need, you're free to use it if you want. It will only allow the exact recipe to work and not the mirrored version. To add the recipe using this class you just need to call CraftingManager.getInstance().getRecipeList().add(mirrorlessShapedRecipeInstance); import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; public class MirrorlessShapedRecipe implements IRecipe { private final ItemStack[] recipe; private final ItemStack output; public MirrorlessShapedRecipe(ItemStack output, ItemStack[] recipe){ this.recipe = recipe; this.output = output; } @Override public boolean matches(InventoryCrafting p_77569_1_, World p_77569_2_) { for(int y = 0; y < 3; ++y){ for(int x = 0; x < 3; ++x){ ItemStack itemInSlot = p_77569_1_.getStackInRowAndColumn(x, y); ItemStack recipeSlot = recipe[y * 3 + x]; if(itemInSlot != null || recipeSlot != null) { if ((itemInSlot == null && recipeSlot != null) || (itemInSlot != null && recipeSlot == null)) { return false; } if (itemInSlot.getItem() != recipeSlot.getItem()) { return false; } if(recipeSlot.getItemDamage() != Short.MAX_VALUE && recipeSlot.getItemDamage() != itemInSlot.getItemDamage()){ return false; } } } } return true; } @Override public ItemStack getCraftingResult(InventoryCrafting p_77572_1_) { return output; } @Override public int getRecipeSize() { return 9; } @Override public ItemStack getRecipeOutput() { return output; } }
  9. You'll need to make a class similar to vanilla's ShapedRecipes, I can't post the code here as it's not legal to post vanilla minecraft code but I believe function at line 61 is where the mirror checking happens, all you need to do is loop through the itemstacks in the inventoryCrafting provided by the matches function and make sure that all the slots are equal to the itemstacks in the recipe and if they are the recipe matches, if not then the recipe is different.
  10. It looks like you need to offset your models render positions by +1 in y and either +1 or -1 in x or z (I can't tell from the image) You can do this in your GL11.glTranslated or GL11.glTranslatef call.
  11. It isn't necessary to make your own IRecipe class, just instantiate a ShapedRecipes with the parameters (3, 3, new ItemStack[]{new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.planks), new ItemStack(Blocks.planks), null, , new ItemStack(Items.stick), null, , new ItemStack(Items.stick), null}, new ItemStack(ModTools.SWWPickaxe, 1)) The array to crafting table looks like this: 012 345 678 Where the index represents the slot in a crafting table. Then to register your recipes do CraftingManager.getInstance().getRecipeList().add(theShapedRecipesInstance); I wrote my own mod to add custom recipes to minecraft and this is how i register the recipes. https://github.com/xandayn/Personalized-Recipes/blob/master/java/common/xandayn/personalrecipes/recipe/handlers/ShapedRecipeHandler.java#L38 ShapedRecipes is in the net.minecraft.item.crafting package. Sorry I actually was incorrect, you do need to make a custom IRecipe, I misunderstood the question when I reread it I realized what you were asking.
  12. I'd like to mention in advance that I don't have a solution to your issue, I'm actually looking for this solution as well and have been unable to find it, I thought it'd be wasteful to create a new thread. Did you ever find a solution or are you still searching?
  13. I spent several hours trying to figure it out to no avail so I've kinda given up on it. As for Novas comment, I dont really know what you mean by that, on windows you just run the batch file and if youre on linux/mac you open terminal and you run the command ./gradlew and it will install everything for you. That's a reply I received about the same issue, so if you're wanting to develop you just need to use 964. I don't really like the new setup as I cant access vanilla source or forge source, but oh well. It was really nice to see how things worked.
  14. I also have the same exact issue. The way I had to get around it is by using the new ForgeGradle thing following this http://www.minecraftforge.net/forum/index.php/topic,14048.0.html guide. The download for Gradle is the latest build.
  15. This isn't the right area to be posting this, but the issue is that you have conflicting item IDs, id 500 is being used by two mods, LotsOMobsMobHeads and The furniture mod, to fix this go into your configs, %AppData%/Roaming/.minecraft/config and there should be a file for those mods, change one of the mod's block ids from 500 to something else.
  16. I dont know if I should start a new post or not, but I am actually having a problem on linux installing the src for mod development, here is the terminal output, Im a noob with linux and cant figure out the issue. I guess I should mention I'm trying to use Forge 9.11.1.953 and I'm on Linux Mint 16 ================ Forge ModLoader Setup Start =================== Checking MCP zip (may take time to download) Downloaded mcp8.11.zip Extracting MCP to '/home/matthew/Development/forge/mcp' Setting up MCP Patching commands.py patching file commands.py Commands patch applied successfully Copying FML conf Creating Repackaged data Creating re-packaged srg Creating re-packaged exc Creating re-packaged MCP patches Fixing MCP Workspace Traceback (most recent call last): File "install.py", line 76, in <module> decompile=options.decompile, gen_conf=False) File "install.py", line 17, in fml_main disable_assets=disable_assets) File "/home/matthew/Development/forge/fml/fml.py", line 1013, in decompile_minecraft pre_decompile(mcp_dir, fml_dir, disable_assets=disable_assets) File "/home/matthew/Development/forge/fml/fml.py", line 1061, in pre_decompile download_minecraft(mcp_dir, fml_dir) File "/home/matthew/Development/forge/fml/fml.py", line 1125, in download_minecraft failed = download_libraries(mcp_dir, version_json['libraries'], mc_info['natives_dir']) or failed File "/home/matthew/Development/forge/fml/fml.py", line 1181, in download_libraries headers = get_headers(url) File "/home/matthew/Development/forge/fml/fml.py", line 173, in get_headers response = urllib2.urlopen(HeadRequest(url)) File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen return _opener.open(url, data, timeout) File "/usr/lib/python2.7/urllib2.py", line 410, in open response = meth(req, response) File "/usr/lib/python2.7/urllib2.py", line 523, in http_response 'http', request, response, code, msg, hdrs) File "/usr/lib/python2.7/urllib2.py", line 448, in error return self._call_chain(*args) File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain result = func(*args) File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 403: Forbidden
  17. This also has been happening to me, I think there's a bug with forge somewhere, minecraft recently updated and changed a lot of the assets and I think that forge may trying to download them. That said I've no idea if this is the case, just a possibility.
  18. Thanks for the reply, so I did what you suggested and put a break in to check what we'd see, and the ItemStack array is the correct size.
  19. Hey, I've been stuck on a bug for a few days here and was wondering if anyone had any ideas. EDIT: I've made a Git for my project, if that's easier to see https://github.com/xandayn/StorageCraft EDIT2: I ended up just rewriting all the code for the diamond chest and now it works, never found out the exact issue of the bug though. EDIT3: So looking through my old code and comparing to my new code I realized my mistake, in the GuiHandler class I'm checking for a TileEntityGoldChest where I should be checking for a TileEntityDiamondChest, just thought I'd make that note incase anyone was having a similar issue. Crash Report Exception in world tick java.lang.IndexOutOfBoundsException: Index: 45, Size: 45 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at net.minecraft.inventory.Container.getSlot(Container.java:133) at net.minecraft.inventory.Container.putStacksInSlots(Container.java:562) at net.minecraft.client.multiplayer.NetClientHandler.handleWindowItems(NetClientHandler.java:1284) at net.minecraft.network.packet.Packet104WindowItems.processPacket(Packet104WindowItems.java:67) at net.minecraft.network.MemoryConnection.processReadPackets(MemoryConnection.java:89) at net.minecraft.client.multiplayer.NetClientHandler.processReadPackets(NetClientHandler.java:281) at net.minecraft.client.multiplayer.WorldClient.tick(WorldClient.java:99) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1930) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:910) at net.minecraft.client.Minecraft.run(Minecraft.java:838) at net.minecraft.client.main.Main.main(Main.java:93) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:131) at net.minecraft.launchwrapper.Launch.main(Launch.java:27) My block code: package xan.storagecraft.block; import static net.minecraftforge.common.ForgeDirection.DOWN; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import xan.storagecraft.StorageCraft; import xan.storagecraft.tileentity.TileEntityDiamondChest; import xan.storagecraft.tileentity.TileEntityGoldChest; import xan.storagecraft.tileentity.TileEntityIronChest; import xan.storagecraft.tileentity.TileEntitySC; import cpw.mods.fml.common.network.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockChestMulti extends Block{ public BlockChestMulti(int par1) { super(par1, Material.iron); this.setCreativeTab(CreativeTabs.tabDecorations); this.setBlockBounds(0.0625F, 0.0F, 0.0625F, 0.9375F, 0.875F, 0.9375F); } @Override public boolean isOpaqueCube(){ return false; } @Override public boolean renderAsNormalBlock(){ return false; } @Override public int getRenderType() { return -1; } @Override public boolean hasTileEntity(int meta) { return true; } @Override public TileEntity createTileEntity(World world, int metadata) { switch(metadata % 4){ case 0: return new TileEntityIronChest(); case 1: return new TileEntityGoldChest(); case 2: return new TileEntityDiamondChest(); default: return new TileEntitySC(); } } @Override public int damageDropped(int par1) { return par1 % 4; } @SideOnly(Side.CLIENT) private Icon[] icons; @Override @SideOnly(Side.CLIENT) public void registerIcons(IconRegister iconReg){ icons = new Icon[4]; icons[0] = iconReg.registerIcon("iron_block"); icons[1] = iconReg.registerIcon("gold_block"); icons[2] = iconReg.registerIcon("diamond_block"); icons[3] = iconReg.registerIcon("quartz_block_top"); } @Override @SideOnly(Side.CLIENT) public Icon getIcon(int par1, int meta){ return icons[meta % 4]; } @Override @SideOnly(Side.CLIENT) public void getSubBlocks(int par1, CreativeTabs tab, List list){ for(int i = 0; i < 4; i++){ list.add(new ItemStack(par1, 1, i)); } } /** * Called upon block activation (right click on the block.) */ @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { if(!world.isRemote){ if(world.getBlockMetadata(x, y, z) % 4 == 0 && !world.isBlockSolidOnSide(x, y + 1, z, DOWN)) FMLNetworkHandler.openGui(player, StorageCraft.instance, 0, world, x, y, z); else if(world.getBlockMetadata(x, y, z) % 4 == 1 && !world.isBlockSolidOnSide(x, y + 1, z, DOWN)) FMLNetworkHandler.openGui(player, StorageCraft.instance, 1, world, x, y, z); else if(world.getBlockMetadata(x, y, z) % 4 == 2 && !world.isBlockSolidOnSide(x, y + 1, z, DOWN)) FMLNetworkHandler.openGui(player, StorageCraft.instance, 2, world, x, y, z); } return true; } @Override public void breakBlock(World world, int x, int y, int z, int id, int meta) { TileEntity te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof IInventory){ IInventory inventory = (IInventory)te; for(int i = 0; i < inventory.getSizeInventory(); i++){ ItemStack stack = inventory.getStackInSlotOnClosing(i); if(stack != null){ float spawnX = x + world.rand.nextFloat(); float spawnY = y + world.rand.nextFloat(); float spawnZ = z + world.rand.nextFloat(); EntityItem droppedItem = new EntityItem(world, spawnX, spawnY, spawnZ, stack); float mult = 0.05f; droppedItem.motionX = (-0.5 + world.rand.nextFloat()) * mult; droppedItem.motionY = (4 + world.rand.nextFloat()) * mult; droppedItem.motionZ = (-0.5 + world.rand.nextFloat()) * mult; world.spawnEntityInWorld(droppedItem); } } } super.breakBlock(world, x, y, z, id, meta); } @Override public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack) { super.onBlockPlacedBy(par1World, par2, par3, par4, par5EntityLivingBase, par6ItemStack); int rotate = ((MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4; par1World.setBlockMetadataWithNotify(par2, par3, par4, (rotate * 4) + par1World.getBlockMetadata(par2, par3, par4), 3); } } My Container class package xan.storagecraft.client.interfaces.container; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import xan.storagecraft.tileentity.TileEntityDiamondChest; import xan.storagecraft.tileentity.TileEntityGoldChest; import xan.storagecraft.tileentity.TileEntityIronChest; import xan.storagecraft.tileentity.TileEntitySC; public class ContainerSC extends Container{ private TileEntitySC chest; private InventoryPlayer invPlayer; public ContainerSC(InventoryPlayer invPlayer, TileEntitySC chest){ this.chest = chest; this.invPlayer = invPlayer; //chest.openChest(); if(chest instanceof TileEntityIronChest){ for (int x = 0; x < 9; x++){ addSlotToContainer(new Slot(invPlayer, x, 8 + 18 * x, 198)); } for (int y = 0; y < 3; y++){ for (int x = 0; x < 9; x++){ addSlotToContainer(new Slot(invPlayer, x + y * 9 + 9, 8 + 18 * x, 140 + y * 18)); } } for (int y = 0; y < 6; y++){ for(int x = 0; x < 9; x++){ addSlotToContainer(new Slot(chest, x + (y * 9), 8 + 18 * x, 18 + y * 18)); } } } else if(chest instanceof TileEntityGoldChest){ for (int x = 0; x < 9; x++){ addSlotToContainer(new Slot(invPlayer, x, 35 + 18 * x, 198)); } for (int y = 0; y < 3; y++){ for (int x = 0; x < 9; x++){ addSlotToContainer(new Slot(invPlayer, x + y * 9 + 9, 35 + 18 * x, 140 + y * 18)); } } for (int y = 0; y < 6; y++){ for(int x = 0; x < 12; x++){ addSlotToContainer(new Slot(chest, x + (y * 12), 8 + 18 * x, 18 + y * 18)); } } } else if(chest instanceof TileEntityDiamondChest){ for (int y = 0; y < 9; y++){ for(int x = 0; x < 12; x++){ addSlotToContainer(new Slot(chest, x + (y * 12), 8 + 18 * x, 18 + y * 18)); } } } chest.openChest(); } @Override public boolean canInteractWith(EntityPlayer entityplayer) { return chest.isUseableByPlayer(entityplayer); } @Override public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { return null; } public IInventory getInv(){ return (IInventory)chest; } @Override public void onContainerClosed(EntityPlayer par1EntityPlayer) { super.onContainerClosed(par1EntityPlayer); chest.closeChest(); } } My TileEntities package xan.storagecraft.tileentity; import java.util.Iterator; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import xan.storagecraft.block.BlockChestMulti; import xan.storagecraft.client.interfaces.container.ContainerSC; public class TileEntitySC extends TileEntity implements IInventory{ public float prevLidAngle; public float lidAngle; public int numUsingPlayers; private int ticksSinceSync; private int cachedChestType; public ItemStack[] items; @Override public int getSizeInventory() { return items.length; } @Override public ItemStack getStackInSlot(int i) { if(i <= items.length) return items[i]; else return null; } @Override public ItemStack decrStackSize(int i, int count) { ItemStack itemstack = getStackInSlot(i); if(itemstack != null){ if(itemstack.stackSize <= count){ setInventorySlotContents(i, null); }else{ itemstack = itemstack.splitStack(count); onInventoryChanged(); } } return itemstack; } @Override public ItemStack getStackInSlotOnClosing(int i) { ItemStack item = getStackInSlot(i); setInventorySlotContents(i, null); return item; } @Override public void setInventorySlotContents(int i, ItemStack itemstack) { items[i] = itemstack; if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) { itemstack.stackSize = getInventoryStackLimit(); } onInventoryChanged(); } @Override public String getInvName() { return "InventoryIronChest"; } @Override public boolean isInvNameLocalized() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) { return entityplayer.getDistanceSq(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f) <= 64; } @Override public boolean receiveClientEvent(int par1, int par2) { if (par1 == 1) { this.numUsingPlayers = par2; return true; } else { return super.receiveClientEvent(par1, par2); } } @Override public void openChest() { if (this.numUsingPlayers < 0) { this.numUsingPlayers = 0; } ++this.numUsingPlayers; this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID, 1, this.numUsingPlayers); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType().blockID); } @Override public void closeChest() { if (this.getBlockType() != null && this.getBlockType() instanceof BlockChestMulti) { --this.numUsingPlayers; this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID, 1, this.numUsingPlayers); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID); this.worldObj.notifyBlocksOfNeighborChange(this.xCoord, this.yCoord - 1, this.zCoord, this.getBlockType().blockID); } } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } @Override public void updateEntity() { super.updateEntity(); ++this.ticksSinceSync; float f; if (!this.worldObj.isRemote && this.numUsingPlayers != 0 && (this.ticksSinceSync + this.xCoord + this.yCoord + this.zCoord) % 200 == 0) { this.numUsingPlayers = 0; f = 5.0F; List list = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getAABBPool().getAABB((double)((float)this.xCoord - f), (double)((float)this.yCoord - f), (double)((float)this.zCoord - f), (double)((float)(this.xCoord + 1) + f), (double)((float)(this.yCoord + 1) + f), (double)((float)(this.zCoord + 1) + f))); Iterator iterator = list.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer)iterator.next(); if (entityplayer.openContainer instanceof ContainerSC) { IInventory iinventory = ((ContainerSC)entityplayer.openContainer).getInv(); if (iinventory == this) { ++this.numUsingPlayers; } } } } this.prevLidAngle = this.lidAngle; f = 0.1F; double d0; if (this.numUsingPlayers > 0 && this.lidAngle == 0.0F) { this.worldObj.playSoundEffect((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D, "random.chestopen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if ((this.numUsingPlayers == 0 && this.lidAngle > 0.0F) || (this.numUsingPlayers > 0 && this.lidAngle < 1.0F)) { float f1 = this.lidAngle; if (this.numUsingPlayers > 0) { this.lidAngle += f; } else { this.lidAngle -= f; } if (this.lidAngle > 1.0F) { this.lidAngle = 1.0F; } float f2 = 0.5F; if (this.lidAngle < f2) { this.worldObj.playSoundEffect((double)this.xCoord + 0.05D, (double)this.yCoord + 0.5D, (double)this.zCoord, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); } if (this.lidAngle < 0.0F) { this.lidAngle = 0.0F; } } } @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); NBTTagList items = new NBTTagList(); for (int i = 0; i < getSizeInventory(); i++){ ItemStack stack = getStackInSlot(i); if (stack != null){ NBTTagCompound item = new NBTTagCompound(); item.setByte("Slot", (byte)i); stack.writeToNBT(item); items.appendTag(item); } } compound.setTag("Items", items); } @Override public void readFromNBT(NBTTagCompound compound) { super.readFromNBT(compound); NBTTagList items = compound.getTagList("Items"); for (int i = 0; i < items.tagCount(); i++){ NBTTagCompound item = (NBTTagCompound)items.tagAt(i); int slot = item.getByte("Slot"); if(slot >= 0 && slot < getSizeInventory()){ setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item)); } } } } package xan.storagecraft.tileentity; import net.minecraft.item.ItemStack; public class TileEntityDiamondChest extends TileEntitySC { public TileEntityDiamondChest(){ items = new ItemStack[108]; } } My GUIHandler class package xan.storagecraft.client.interfaces.gui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import xan.storagecraft.StorageCraft; import xan.storagecraft.client.interfaces.container.ContainerSC; import xan.storagecraft.tileentity.TileEntityDiamondChest; import xan.storagecraft.tileentity.TileEntityGoldChest; import xan.storagecraft.tileentity.TileEntityIronChest; import xan.storagecraft.tileentity.TileEntitySC; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class GuiHandler implements IGuiHandler{ public GuiHandler() { NetworkRegistry.instance().registerGuiHandler(StorageCraft.instance, this); } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te; switch(ID){ case 0: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntityIronChest){ return new ContainerSC(player.inventory, (TileEntitySC)te); } break; case 1: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntityGoldChest){ return new ContainerSC(player.inventory, (TileEntitySC)te); } break; case 2: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntityDiamondChest){ return new ContainerSC(player.inventory, (TileEntitySC)te); } break; } return null; } @Override @SideOnly(Side.CLIENT) public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity te; switch(ID){ case 0: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntitySC){ return new GuiIronChest(player.inventory, (TileEntitySC)te); } break; case 1: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntitySC){ return new GuiGoldChest(player.inventory, (TileEntitySC)te); } break; case 2: te = world.getBlockTileEntity(x, y, z); if(te != null && te instanceof TileEntityGoldChest){ return new GuiDiamondChest(player.inventory, (TileEntitySC)te); } break; } return null; } } My Chest GUI package xan.storagecraft.client.interfaces.gui; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import xan.storagecraft.client.interfaces.container.ContainerSC; import xan.storagecraft.lib.Reference; import xan.storagecraft.tileentity.TileEntitySC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GuiDiamondChest extends GuiContainer{ public GuiDiamondChest(InventoryPlayer invPlayer, TileEntitySC chest) { super(new ContainerSC(invPlayer, chest)); xSize = 246; ySize = 254; } private static final ResourceLocation texture = new ResourceLocation(Reference.MOD_ID, "textures/gui/DiamondChestGUI.png"); @Override protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { GL11.glColor4f(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); } } I'm really baffled by this issue, basically I have a four(two complete and two still in progress) chests sharing the same block id and using metadata to determine which chest it is and which tileentity to use for it only the diamond chest is having issues, the two other chests that I've programmed have all worked perfectly, only the diamond one I've made is having an issue, but it's literally exactly the same as my other previous chests. I'm not sending any custom packets currently, I think I must be overlooking something but I can't find the issue to save my life, I'd really appreciate a little bit of help.
×
×
  • Create New...

Important Information

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