Jump to content

Solved: [1.16]Open custom inventory instead of vanilla player inventory


Recommended Posts

Posted

I'm currently working on a backpack item. I can equip it to my chest and when the equipped player opens the inventory I want to open a custom inventory instead, but that doesn't work. What should I do?

 

public class BackpackItem extends DyeableArmorItem implements INamedContainerProvider {
	public BackpackItem(IArmorMaterial material, EquipmentSlotType slot, Properties properties) {
		super(material, slot, properties);
	}

	@Nullable
	@Override
	public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundNBT nbt) {
		return new BackpackInventory();
	}

	@Nullable
	@Override
	public Container createMenu(int p_createMenu_1_, PlayerInventory p_createMenu_2_, PlayerEntity p_createMenu_3_) {
		return new BackpackContainer(p_createMenu_1_, p_createMenu_2_.player);
	}

	@Override
	public ITextComponent getDisplayName() {
		return null;
	}

	public void onOpenGui(GuiOpenEvent event) {
		PlayerEntity player = Minecraft.getInstance().player;
		if (player == null || event.getGui().getClass() != InventoryScreen.class) return;

		ItemStack chest = player.getItemStackFromSlot(EquipmentSlotType.CHEST);
		if (!(chest.getItem() instanceof BackpackItem)) return;

		NetworkHooks.openGui((ServerPlayerEntity) player, this);
	}

 

Posted

I organized it a little. I found in GuiOpenEvent#getGui that I need to check that it is an InventoryScreen and cancel it. However, there are some questions here.

1: Is it correct to recognize that the server player PlayerContainer and the client player are opening the InventoryScreen when the player opens the inventory with the E key?

2: At 1, Is the InventoryScreen returned by GuiOpenEvent#getGui?

3: How can I open another screen after canceling with event.setCanceled(true)? event.setGui(new CustomScreen(...))?

4. Is the method of processing the client side (screen) with GuiOpenEvent correct in 1-3? Also, how can I perform server side (container) processing?

Posted

Thanks, GuiOpenEvent#setGui was able to open another screen. However, since the container is probably still PlayerContainer on that screen, moving ItemStack etc. will be different from AnvilScreen. How can I change the container? (Because it's a test, don't worry about the clutter of the code right now)

 

@SubscribeEvent
	public void onOpenGui(GuiOpenEvent event) {
		if (Minecraft.getInstance().world == null) return;
		if (!Minecraft.getInstance().world.isRemote) return;
		PlayerEntity player = Minecraft.getInstance().player;
		if (player == null || !(event.getGui() instanceof InventoryScreen)) return;

		ItemStack chest = player.getItemStackFromSlot(EquipmentSlotType.CHEST);
		if (!(chest.getItem() instanceof BackpackItem)) return;
		event.setGui(new AnvilScreen(ContainerType.ANVIL.create(0, player.inventory), player.inventory, new StringTextComponent("test")));
	}

 

Posted

Thank you. I haven't touched on packets very much, so is there a good tutorial (or sample code) for it? What should I send as a packet?

 

@SubscribeEvent
	public void onOpenGui(GuiOpenEvent event) {
		World world = Minecraft.getInstance().world;
		if (Minecraft.getInstance().world == null) return;
		
		PlayerEntity player = Minecraft.getInstance().player;
		if (player == null) return;

		ItemStack chest = player.getItemStackFromSlot(EquipmentSlotType.CHEST);
		if (!(chest.getItem() instanceof BackpackItem)) return;
		
		if (!(event.getGui() instanceof InventoryScreen)) return;
		
		if (world.isRemote()) {
			event.setGui(new AnvilScreen(ContainerType.ANVIL.create(0, player.inventory), player.inventory, new StringTextComponent("text")));
			// send a packet to server?
		} else {
			NetworkHooks.openGui((ServerPlayerEntity) player, new SimpleNamedContainerProvider((id, playerInventory, unused) -> {
				return new RepairContainer(id, playerInventory, IWorldPosCallable.of(world, player.getPosition()));
			}, new StringTextComponent("test")));
		}
	}

 

Posted (edited)
  On 5/31/2021 at 7:32 AM, Zemelua said:

Thank you. I haven't touched on packets very much, so is there a good tutorial (or sample code) for it? What should I send as a packet?

Expand  

your message/packet needs three methods encode, decode and handle.
the most important method for you is the handle method in it you handle to open your gui, the other two are only necessary if you want to send data (but are required for registration)

after reading the doc, here is a practical example

Edited by Luis_ST
Posted (edited)

Very helpful. I think I was able to send the packet, but when I press the E key this time, the GUI is displayed for a moment and it closes without permission. What is the cause?

Network Handler:

  Reveal hidden contents

Message:

  Reveal hidden contents

Register message:

  Reveal hidden contents

 

	@SubscribeEvent
	public void onOpenGui(GuiOpenEvent event) {
		World world = Minecraft.getInstance().world;
		if (Minecraft.getInstance().world == null) return;

		PlayerEntity player = Minecraft.getInstance().player;
		if (player == null) return;

		ItemStack chest = player.getItemStackFromSlot(EquipmentSlotType.CHEST);
		if (!(chest.getItem() instanceof BackpackItem)) return;

		if (!(event.getGui() instanceof InventoryScreen)) return;

		event.setGui(new AnvilScreen(ContainerType.ANVIL.create(0, player.inventory), player.inventory, new StringTextComponent("text")));
		UMUNetwork.sendToServer(new BackpackOpenMessage());
	}
Edited by Zemelua
  • Zemelua changed the title to Solved: [1.16]Open custom inventory instead of vanilla player inventory

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

    • I am running a modded forge server and am trying to install better end on it using sinytra connector. I have the same exact mods on my client side, and it works fine and allows me to use the better end mod. However, when I try to start the server with the same version of better end and bclib installed onto it, it comes up with this. The server starts fine without better end, but i'd like to try and keep it if it's possible. Any help is appreciated. https://mcpaste.io/340f573a8a524453  
    • Ghjkvcfzukjvv
    • Machen Sie sich bereit für unglaubliche Ersparnisse im Juli 2025 mit unserem exklusiven Temu Gutscheincode 30% Rabatt. Wir geben Ihnen den Schlüssel zu den besten Angeboten auf der Plattform mit dem Code (ACW867474), der Ihr Einkaufserlebnis verändern wird. Der Temu Gutscheincode ACW867474 wurde entwickelt, um Ihnen maximale Vorteile zu bieten, insbesondere für unsere Nutzer in Deutschland, Österreich und der gesamten Europäischen Union. Erleben Sie Shopping ohne Grenzen mit Rabatten, die wirklich einen Unterschied machen. Mit unserem Temu Gutschein 30% Rabatt schalten Sie sofortige Einsparungen frei. Nutzen Sie einfach unseren Temu 30% Rabatt Gutscheincode, um Ihr Einkaufserlebnis zu revolutionieren und bei den angesagtesten Produkten zu sparen. Was ist der Gutscheincode für Temu 30% Rabatt? Sie fragen sich vielleicht, wie Sie diesen fantastischen Rabatt erhalten können. Wir haben es Ihnen leicht gemacht! Sowohl neue als auch bestehende Kunden können erstaunliche Vorteile genießen, wenn sie unseren exklusiven 30%-Rabatt-Gutscheincode auf der Temu-App oder Website verwenden. Mit diesem Code erhalten Sie nicht nur einen einmaligen Rabatt, sondern schalten ein ganzes Paket an Sparmöglichkeiten frei. Der Temu Gutschein 30% Rabatt ist Ihr Ticket zu intelligenterem Einkaufen, und der 30% Rabatt Temu Gutschein stellt sicher, dass Sie immer den besten Preis bekommen. Hier sind die Hauptvorteile, die Sie mit unserem Code erhalten: •    ACW867474: Ein pauschaler Rabatt von 30% auf Ihre gesamte Bestellung. •    ACW867474: Ein 30% Gutschein-Paket für mehrere zukünftige Einkäufe. •    ACW867474: Ein garantierter 30% Pauschalrabatt für alle Neukunden. •    ACW867474: Ein zusätzlicher 30% Promo-Code für treue Bestandskunden. •    ACW867474: Ein spezieller 30% Gutschein für Nutzer in Deutschland/Österreich. Temu Gutscheincode 30% Rabatt für Neukunden in 2025 Wenn Sie neu bei Temu sind, erwartet Sie eine besondere Freude! Als Neukunde können Sie die höchsten Vorteile erzielen, wenn Sie unseren Temu Gutschein 30% Rabatt verwenden. Temu begrüßt neue Käufer mit offenen Armen und noch offeneren Rabatten, und unser Temu Gutscheincode 30% Rabatt ist der beste Weg, um Ihre Shopping-Reise zu beginnen. Stellen Sie sich vor, Sie erhalten die trendigsten Artikel aus Mode, Elektronik, Haushaltswaren und mehr mit einem massiven Preisnachlass direkt bei Ihrer ersten Bestellung. Nutzen Sie diese Vorteile als Neukunde: •    ACW867474: Ein sofortiger Pauschalrabatt von 30% für Neukunden. •    ACW867474: Ein 30% Gutschein-Paket für Ihre zukünftigen Bestellungen. •    ACW867474: Bis zu 30% Rabatt auf mehrere Einkäufe. •    ACW867474: Kostenloser Versand in 86 Länder, einschließlich ganz Deutschland. •    ACW867474: Extra 30% Rabatt auf jeden Einkauf als Erstnutzer.  
    • thank you for the help, i deleted yungscavebiomes and now it works   
  • Topics

×
×
  • Create New...

Important Information

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