Jump to content

Recommended Posts

Posted (edited)

Hi,

So I'm trying to figure out how to make my item do something unique whenever it is swapped from offhand to mainhand. Specifically, I want it to turn into another item. I tried looking, and it doesn't seem that there is a way to detect when a keybind is initially pressed? MC does it (or is at least supposed to do it) internally, but I can't seem to find a way of accessing that information. Does anyone know a method of doing so?

 

Also, unless I'm reading the code wrong, it doesn't look like MC keybind functions are working correctly. Within the game loop (Minecraft#processKeyBinds), its made to seem like you should only be able to swap item hands when the key is initially pressed (and in fact, the comment on the method being used states that it is supposed to return true for initial key presses only). However, I can just hold down the key and the item I'm on will just rapidly switch between the left and right hands.

 

Edit: It looks like there is an empty event called KeyInputEvent that gets fired whenever the keyboard it used. I presume I can do the initial check manually, but from the code it looks like KeyBinding#isPressed is already supposed to perform that logic?

 

Another Edit: So I've realized it's kind of pointless to detect when the key is pressed, as it results in a packet being sent server-side to perform the logic. As I don't want my item to actually switch hands, I need to effectively cancel the hand swap. Any idea on how this would be done? Perhaps something to do with intercepting the packet between client and server and replacing it with my own packet?

Edited by TheMasterGabriel
Posted (edited)

The act of checking KeyBinding#isPressed changes its state to be no longer pressed. So all you need to do is use the event to check for keyBindSwapHands, and then you are essentially overriding the vanilla logic for that key. 

Edited by Jay Avery
Posted (edited)

It does not look like there's an event for that. And it may be nice to have one. So you can (if you know where to put the event) clone forge repo, create the event and PR it into forge. This is forge github repo BTW - https://github.com/MinecraftForge/MinecraftForge.

 

And you could also try to use key-listening. Subscribe to the KeyInputEvent, it is fired after key bindings are updated and before they are read (& reset). Then use #isKeyDown() rather than #isPressed() to retrieve it's state without resetting it. If you want to then cancel the swap, call #unpressKey().

Remember though that this method only works for swapping by pressing F. User can still swap in the inventory GUI. Or a mod can programatically do that.

 

If you want to detect your item suddenly being in the off-hand (whatever the way it got there), override Item#onUpdate(). It is called every tick your item is in player inventory. Now just check that passed stack is the same as the stack in the player's offhand and that's it. Now you just have to think of some logic to prevent detecting it every tick it is in the offhand.

Edited by Elix_x
Fixed formatting

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • It is a rendering issue with embeddium/oculus
    • So, I have a minecraft world hosted with essential on forge 1.20.1, there's 149 mods, and the forge version is 47.3.0, and it's been like that for a good 2-3 weeks, and all of a sudden, it stopped loading, and I have 0 clue as to why, and this world means A LOT to me, so if anyone out there is able to help, I would GLADLY appreciate it. here's the link if ya wanna help:   [04Dec2024 22:42:24.552] [Worker-ResourceReload-3/ERROR][net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener/]: Couldn't parse data file slabsexpanded:snow_blockblocktoslab from slabsexpanded:recipes/snow_blockblocktoslab.json com.google.gson.JsonParseException: com.google.gson.stream.MalformedJsonException: Expected name at line 16 column 4 path $.result.item at net.minecraft.util.GsonHelper.m_13780_(GsonHelper.java:526) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.util.GsonHelper.m_263475_(GsonHelper.java:531) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.util.GsonHelper.m_13776_(GsonHelper.java:581) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener.m_278771_(SimpleJsonResourceReloadListener.java:41) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener.m_5944_(SimpleJsonResourceReloadListener.java:29) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener.m_5944_(SimpleJsonResourceReloadListener.java:17) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at net.minecraft.server.packs.resources.SimplePreparableReloadListener.m_10786_(SimplePreparableReloadListener.java:11) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?] at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?] at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760) ~[?:?] at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373) ~[?:?] at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182) ~[?:?] at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655) ~[?:?] at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622) ~[?:?] at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165) ~[?:?] Caused by: com.google.gson.stream.MalformedJsonException: Expected name at line 16 column 4 path $.result.item at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1657) ~[gson-2.10.jar%23107!/:?] at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:514) ~[gson-2.10.jar%23107!/:?] at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:422) ~[gson-2.10.jar%23107!/:?] at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:779) ~[gson-2.10.jar%23107!/:?] at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:725) ~[gson-2.10.jar%23107!/:?] at com.google.gson.internal.bind.TypeAdapters$34$1.read(TypeAdapters.java:1007) ~[gson-2.10.jar%23107!/:?] at net.minecraft.util.GsonHelper.m_13780_(GsonHelper.java:524) ~[client-1.20.1-20230612.114412-srg.jar%23490!/:?]
    • Hello! I have been having a problem with Forgematica, Embeddium, Oculus, and create. I wanted to download litematica so I could see which blocks are in my creative mode build, so that I could collect them all in survival. However, litematica is a fabric mod. I found a port called forgematica, which I added (along with it's dependency) to my mods folder. I loaded into a new world, and built a structure. Then, I added a part from the create mod, and the game crashed instantly, with exit code -1. Thanks for any help! Crash Report and mods list: https://pastebin.com/rtzh6LAi
  • Topics

×
×
  • Create New...

Important Information

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