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

I've got an item that writes to NBT while held on each Item update tick, but I only want it to update if no gui screens are open.

 

player.openContainer is never null; in normal gameplay ContainerPlayer is constantly open, which also happens to be open when the player's normal inventory is open.

 

FMLClientHandler.instance().getClient().inGameHasFocus would seem like a good choice, and it works when only running the regular client, but this crashes if run on the server (obviously) and I can't just run the Item update on the client side. So it would seem this option is not SMP compatible.

 

Am I just failing to see how to use these to solve my problem, or are there any other options that are SMP compatible?

Check for gui on client side, then send a packet with enough data to perform the item NBT update on server side.

You'll have to build a IPacketHandler for this.

  • Author

That's what my plan is, I was just hoping that I may have overlooked something that would obviate the need for an extra packet. It just seems like something that should be easily detectable with an instance of the player, even the server side version, but I have combed through the available methods and fields multiple times and come up with nada. Thanks, though.

Just switch it. Just make the oposite is happen when a gui is open^^"

And ask Draco's how he did that (and i know he did that) his runes give special abilities and if you open a gui they disable the effects.

 

I hope it helps

  • Author

Thanks for the idea, but I just ended up using a packet:

// this is in the Item's onUpdate method:
if (isHeld) {
		if (entity instanceof EntityPlayer) {
			if (world.isRemote && Minecraft.getMinecraft().currentScreen == null) {
				PacketDispatcher.sendPacketToServer(new BombTickPacket().makePacket());
			}
		} else {
			tickBomb(stack, world, entity);
		}
	} else {
		stack.getTagCompound().setInteger("time", 0);
	}

As you can see, when held by a player, it does nothing if on the server side; instead, it checks for an open screen on the client side and if there isn't one, sends a packet telling the server to 'tick' the bomb, which is a method that has the same stuff that used to be in the onUpdate method.

 

It's a simple solution to a simple problem; I was just wondering if there wasn't another way to do it is all.

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.