Luis_ST Posted February 23, 2021 Posted February 23, 2021 I have a custom container. which consists of a crafting part and a storage. when i try to shift an item into the slot i got an error and i dont know why. because my container theoretically consists of 28 chest slots and 9 crafting input slots and one crafting output. so a total of 38 slots. But if I use 38 as the size of the NonNullList in my tileentity, I get an ArrayIndexOutOfBoundsException. I tried something and found out that my inventory has a size of 74 slots, but I only use 38 in the constructor of my container. when i put an item in a slot i get an error: according to the error, the slot has the id -999 which can not be So why do I get this error and what's wrong with my container: [17:11:27] [Render thread/FATAL] [minecraft/Minecraft]: Reported exception thrown! net.minecraft.crash.ReportedException: Container click at net.minecraft.client.gui.screen.Screen.wrapScreenError(Screen.java:434) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MouseHelper.mouseButtonCallback(MouseHelper.java:96) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MouseHelper.lambda$null$4(MouseHelper.java:185) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.util.concurrent.ThreadTaskExecutor.execute(ThreadTaskExecutor.java:86) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.client.MouseHelper.lambda$registerCallbacks$5(MouseHelper.java:184) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:36) ~[lwjgl-glfw-3.2.2.jar:build 10] {} at org.lwjgl.system.JNI.invokeV(Native Method) ~[lwjgl-3.2.2.jar:build 10] {} at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3101) ~[lwjgl-glfw-3.2.2.jar:build 10] {} at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:93) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MainWindow.flipFrame(MainWindow.java:305) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1022) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:612) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[?:?] {} at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {} at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?] {} at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:52) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.0.9.jar:?] {} at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {} Caused by: java.lang.ArrayIndexOutOfBoundsException [17:11:27] [Render thread/INFO] [STDOUT/]: [net.minecraft.util.registry.Bootstrap:printToSYSOUT:130]: ---- Minecraft Crash Report ---- // You should try our sister game, Minceraft! Time: 23.02.21, 17:11 Description: Container click java.lang.ArrayIndexOutOfBoundsException: null A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Render thread Stacktrace: at net.minecraft.inventory.container.Container.slotClick(Container.java:182) ~[forge:?] {re:classloading} -- Click info -- Details: Menu Type: cave:crafting_station Menu Class: net.luis.cave.common.inventory.container.CraftingStationContainer Slot Count: 74 Slot: -999 Button: 10 Type: QUICK_CRAFT Stacktrace: at net.minecraft.inventory.container.Container.slotClick(Container.java:182) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading} at net.minecraft.client.multiplayer.PlayerController.windowClick(PlayerController.java:409) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.gui.screen.inventory.ContainerScreen.handleMouseClick(ContainerScreen.java:558) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.gui.screen.inventory.ContainerScreen.mouseReleased(ContainerScreen.java:515) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MouseHelper.lambda$mouseButtonCallback$1(MouseHelper.java:98) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.gui.screen.Screen.wrapScreenError(Screen.java:427) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MouseHelper.mouseButtonCallback(MouseHelper.java:96) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MouseHelper.lambda$null$4(MouseHelper.java:185) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.util.concurrent.ThreadTaskExecutor.execute(ThreadTaskExecutor.java:86) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B} at net.minecraft.client.MouseHelper.lambda$registerCallbacks$5(MouseHelper.java:184) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:36) ~[lwjgl-glfw-3.2.2.jar:build 10] {} at org.lwjgl.system.JNI.invokeV(Native Method) ~[lwjgl-3.2.2.jar:build 10] {} at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3101) ~[lwjgl-glfw-3.2.2.jar:build 10] {} at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:93) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.MainWindow.flipFrame(MainWindow.java:305) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1022) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.Minecraft.run(Minecraft.java:612) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A} at net.minecraft.client.main.Main.main(Main.java:184) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] {} at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[?:?] {} at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] {} at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?] {} at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:52) ~[forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:54) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:72) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.run(Launcher.java:82) [modlauncher-8.0.9.jar:?] {} at cpw.mods.modlauncher.Launcher.main(Launcher.java:66) [modlauncher-8.0.9.jar:?] {} at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:105) [forge-1.16.5-36.0.1_mapped_snapshot_20201028-1.16.3-recomp.jar:?] { Quote
Draco18s Posted February 23, 2021 Posted February 23, 2021 Post your code. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Luis_ST Posted February 23, 2021 Author Posted February 23, 2021 6 minutes ago, Draco18s said: Post your code. container: https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/common/inventory/container/CraftingStationContainer.java tileentity: https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/common/tileentity/CraftingStationTileEntity.java I think these are all relevant classes Quote
Luis_ST Posted February 24, 2021 Author Posted February 24, 2021 (edited) 13 hours ago, diesieben07 said: The index calculation here is wrong: okay thanks, i still have a problem i can't craft all items at once (with shift in the output slot). I think it's because of the TransferStackInSlot method but what do I have to change? https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/common/inventory/container/CraftingStationContainer.java general: when I shift items into an inventory, the item is always placed in the slot with the smallest index. Am I right ? Edited February 24, 2021 by Luis_ST Quote
Luis_ST Posted February 24, 2021 Author Posted February 24, 2021 (edited) 22 minutes ago, diesieben07 said: You control how shift-clicking works using the transferStackInSlot method. i am trying to combine the methods of chestcontainer and the workbenchcontainer another question about container. in which class does minecraft create the creativ inventory? (edit: because I cannot find the class in the container package) since i want to create a container with as many slots as possible i have already succeeded (the container has 200 slots). but it looks a bit strange because of the width. I would like to know how minecraft creates the creative inventory because it has the normal width and a scrollbar. and i want to do something like that for a block Edited February 24, 2021 by Luis_ST Quote
Luis_ST Posted February 24, 2021 Author Posted February 24, 2021 49 minutes ago, diesieben07 said: Add all the slots you would need. Position invisible slots off-screen (Slot#xPos = -999 or something like that). When scrolling, move the slots around so that they are in the correct position according the scroll position. okay thank you i think i should manage that somehow one more question about the scrollbar I looked into the vanilla container using a scrollbar (stonecutter container) and if I understand correctly, the scrollbar is a graphic element. I don't have to add the scrollbar to the container. if that's true how do i find out if the player moves the scrollbar? Quote
Luis_ST Posted February 24, 2021 Author Posted February 24, 2021 1 hour ago, diesieben07 said: Look at StonecutterScreen. thanks, I'll try the way you explained it Quote
Hippl Posted February 24, 2021 Posted February 24, 2021 (edited) GL Edited February 24, 2021 by Hippl Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 On 2/24/2021 at 12:13 PM, diesieben07 said: Add all the slots you would need. Position invisible slots off-screen (Slot#xPos = -999 or something like that). I have the container and the screen as you described it and it works (what I have created so far). But now I'm stuck I don't know how to reposition the slots and how to sync this between server and client. Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 14 minutes ago, diesieben07 said: Reposition the slots by changing their position. Currently I am creating a new slot in my constructor with two for loops. so it would be a good idea to save the slots in a slot array (maybe also in a two-dimensional array)?! or is there a better way? 18 minutes ago, diesieben07 said: Sync this, by sending a packet. what kind of packet? Quote
Draco18s Posted February 25, 2021 Posted February 25, 2021 2 minutes ago, Luis_ST said: what kind of packet? A custom one. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 (edited) 31 minutes ago, Draco18s said: A custom one. okay thanks, i'll try this later, i need first a solution to the problem with repositioning the slots. because I currently have no idea how to move the slots (I know how, but not how exactly, I'm thinking about how the methods should work that I want to use for this). 19 minutes ago, diesieben07 said: Container#inventorySlots already exists. would be a possibility but does not change the fact that every time the player uses the scrollbar I have to reposition 16 slots. that's why i'm thinking about creating a slot group then i would only have to reposition two groups each time. which would simplify the whole thing from my current point of view. so every time I only have to check in which direction the bar was moved and then move the slot group in the same direction 1. is this a good solution / possible solution? 2. is there A better way to move many slots at once? Edited February 25, 2021 by Luis_ST Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 1 hour ago, diesieben07 said: No, to move a number of slots you need to move all of them. There is no shortcut. Simply write a for loop. okay i found a way. one more question do I have to create my own slot because posX and poxY are final in the slot class. so i can't edit them Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 1 minute ago, diesieben07 said: Make new Slot instances and replace the existing ones. Set the fields using reflection. Use an Access Transformer i think it's easier to create my own slot Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 1 minute ago, diesieben07 said: Making your own Slot class will not magically make the fields not final. You cannot override fields. this is exactly the problem i just ran into. i try reflection Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 7 minutes ago, diesieben07 said: Making your own Slot class will not magically make the fields not final. You cannot override fields. this should be correct right? private static final Field yPos = ObfuscationReflectionHelper.findField(Slot.class, "field_75221_f"); private static void setSlotPosY(Slot slot, int newPosY) { yPos.setAccessible(true); try { yPos.setInt(slot, newPosY); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } Quote
Luis_ST Posted February 25, 2021 Author Posted February 25, 2021 3 minutes ago, diesieben07 said: That is not how you handle exceptions, ever. setAccessible is also not necessary when using ObfuscationReflectionHelper. i fixed that this is now the code I would like to take to move the slot: full code: https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/common/inventory/container/ModBarrelContainer.java public void moveSlots(ModBarrelContainer.Direction direction) { List<Slot> slots = this.inventorySlots; if (direction == ModBarrelContainer.Direction.ABOVE) { for (int i = 0; i < slots.size(); i++) { Slot slot = slots.get(i); if (this.isTopSlot(slot)) { this.setSlotPosY(slot, slot.yPos + 1000); } else { this.setSlotPosY(slot, slot.yPos + 18); } } } else if (direction == ModBarrelContainer.Direction.BELOW) { for (int i = 0; i < slots.size(); i++) { Slot slot = slots.get(i); if (this.isBottomSlot(slot)) { this.setSlotPosY(slot, slot.yPos - 1000); } else { this.setSlotPosY(slot, slot.yPos - 18); } } } else { return; } } private boolean isTopSlot(Slot slot) { if (slot.yPos == 18 || slot.yPos == -874) { return true; } return false; } private boolean isBottomSlot(Slot slot) { if (slot.yPos == 126 || slot.xPos == 1018) { return true; } return false; } private void setSlotPosY(Slot slot, int newPosY) { try { yPos.setInt(slot, newPosY); } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } public enum Direction { ABOVE, BELOW; } what is still missing is to send the packet to the server how do i create my own package? Quote
Luis_ST Posted February 26, 2021 Author Posted February 26, 2021 12 hours ago, diesieben07 said: That positioning seems super strange. You should keep track of the position of the scroll bar and then position the slots accordingly, instead of moving the slots by a given amount each time. So you mean that I take the value from the scrollbar and add this to the position of the slots I've already think about it, but how do I move the slots that I have to move over the container (+1000) or the slots that I have to move under the container (-1000). is there a way to check this without unsing the position? 12 hours ago, diesieben07 said: And no, you have not fixed the exception handling at all I should catch the errors one by one Quote
Luis_ST Posted February 26, 2021 Author Posted February 26, 2021 (edited) 1 hour ago, diesieben07 said: Have a variable that contains the current scroll position (e.g. from 0-250). yes I have this variable (it goes from 0 to 109). 1 hour ago, diesieben07 said: Whenever this variable changes, calculate the current slot positions based on it. this is what i'm trying right now. Edit: it works like this, but how do I find out when I have to move a slot outside of the visible area if I shouldn't use the slot's position 15 hours ago, diesieben07 said: https://mcforge.readthedocs.io/en/latest/networking/simpleimpl/ I've "tried" something like this before in another mod. But I am not sure whether it works that way and whether it is even right? code: PacketHandler: https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/core/ModPacketHandler.java my message interface: https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/core/IMessage.java SyncSlotPosition message (not final/ in work): https://github.com/Luis-st/Forge-1.16.5-36.0.1-mdk/blob/main/forge-1.16.5-36.0.1-mdk/src/main/java/net/luis/cave/core/SyncSlotPosition.java is there an error somewhere / does it work like that way? Edited February 26, 2021 by Luis_ST Quote
Luis_ST Posted February 26, 2021 Author Posted February 26, 2021 1 minute ago, diesieben07 said: The IMessage interface is entirely unnecessary. Other than that, yes, that is how you add packets it was once intended for something else what do I have to change that I can use it Quote
Luis_ST Posted February 28, 2021 Author Posted February 28, 2021 On 2/26/2021 at 11:43 AM, diesieben07 said: Whata? okay thanks i changed a few things and now it works Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.