Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

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

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.