Jump to content

Recommended Posts

Posted

Okay so I've been trying to do some inventory work; I ended up just working backwards from vanilla code trying my best, and I actually got items to appear! However they appear because I'm literally just copying the vanilla inventory and rendering it again in a new GUI. The reasoning for this is to add in my own additional slots to go with the vanilla slots.

 

So right now I can get the inventory to render, based on you placing blocks in the vanilla menu, and then opening the new menu. However when you click them it super fast picks the item up and places it right back down. There are plenty of other bugs too, but right now I need the inventory to be interactable first.

 

I don't mean to just dump code and ask "whats wrong" but I honestly no absolutely nothing about inventories/containers except the relationship between the two. I've tried looking at tutorials but the only ones I found were outdated and not the best quality.

 

package ca.grm.rot.gui;

import ca.grm.rot.inventory.RotTrinketInventory;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ContainerPseudoPlayer extends Container{
private IInventory pseudoPlayerInventory;
    
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
	return true;
}

public ContainerPseudoPlayer(final InventoryPlayer realPlayerInventory, EntityPlayer player)
{
	int i;
        int j;
        
        // Inventory
	for (i = 0; i < 3; ++i)
        {
            for (j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(realPlayerInventory, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18));
            }
        }

	// Hotbar
	for (i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(realPlayerInventory, i, 8 + i * 18, 142));
        }

	// Trinkets
	for (i = 0; i < 4; i++)
	{
		this.addSlotToContainer(new Slot(new RotTrinketInventory(), i, 26, 8 + i * 18));
	}

	// Armor, literally copy-pasted from container-player
	 for (i = 0; i < 4; ++i)
        {
            final int k = i;
            this.addSlotToContainer(new Slot(realPlayerInventory, realPlayerInventory.getSizeInventory() - 1 - i, 8, 8 + i * 18)
            {
                public int getSlotStackLimit()
                {
                    return 1;
                }
                public boolean isItemValid(ItemStack stack)
                {
                    if (stack == null) return false;
                    return stack.getItem().isValidArmor(stack, k, player);
                }
                @SideOnly(Side.CLIENT)
                public String getSlotTexture()
                {
                    return ItemArmor.EMPTY_SLOT_NAMES[k];
                }
            });
        }
}
}

 

Any help is appreciated, because right now this code is garbage. I'm just super lost.

Posted

Ur container looks fine to me. I can imagine that The Problem is that you are only opening The gui in client side. Show gui handler and where you open The gui pls

Posted

Show gui handler and where you open The gui pls

oh.

public class GuiHandler implements IGuiHandler {
@Override
public Object getClientGuiElement(int guiId, EntityPlayer player, World world, int x,
		int y, int z) {
	TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));
	switch (guiId) {
		case 0 :
			if (entity instanceof TileEntityBaseBuilder) {
				return new GuiBaseNode((TileEntityBaseBuilder) entity, player);
			} else {
				return null;
			}
		case 1 : {
			return new GuiPseudoPlayer(player);
		}
		default :
			return null;
	}
}

// 0 is base builder
// 1 is class Menu
@Override
public Object getServerGuiElement(int guiId, EntityPlayer player, World world, int x,
		int y, int z) {
	TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));

	switch (guiId) {
		case 0 :
			if (entity instanceof TileEntityBaseBuilder) {
				return null;
			} else {
				return null;
			}
		default :
			return null;
	}
}

}

 

There's code for another GUI, ignore that. :P

 

You might be looking specifically for the line:

return new GuiPseudoPlayer(player);

Idk though

Posted

Also:

super(new ContainerPseudoPlayer(Minecraft.getMinecraft().thePlayer.inventory, player));

You already have an EntityPlayer available, why not use that inventory instead of client-side inventory?

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

jfc. Sorry.

EntityPlayer player = FMLClientHandler.instance().getClient().thePlayer;
	if (ClientProxy.classKey.isPressed())
	{
		FMLNetworkHandler.openGui(player, Rot.instance, 1, player.worldObj, (int) player.posX,
				(int) player.posY, (int) player.posZ);
	}

This is where I call the gui.

 

Also:

super(new ContainerPseudoPlayer(Minecraft.getMinecraft().thePlayer.inventory, player));

You already have an EntityPlayer available, why not use that inventory instead of client-side inventory?

I'm not sure actually... I'll switch that.

Posted

That is client-only indeed. You will need a packet that you send to the server to make a GUI open from a key.

Okay that makes sense, I can do packets, but are you saying I need the open the gui on the server side?

If thats what you mean, I can figure it out from here.

 

Either way, thank you!

Yes, every GuiContainer has to be openen server-side.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • logs too big for one pastebin https://pastebin.com/ZjUGHu3u  https://pastebin.com/RqCUZf3X  https://pastebin.com/6ZPS99nD
    • You probably used jd-gui to open it, didn't you? Nothing wrong with that, I also made that mistake, except that Notch was a smart guy and he obfuscated the code. That's why you only see files called "a", "b", "c" and then a file that combines them all. As I said, use RetroMCP to deobfuscate the code so that you will 100% understand it and be able to navigate it.
    • Decompiling minecraft indev, infdev, alpha, beta or whichever legacy version is really easy. I'm not a plug, I just also got interested in modding legacy versions (Infdev to be specific). Use https://github.com/MCPHackers/RetroMCP-Java Once you install their client and the Zulu Architecture that they say they recommend (or use your own Java). I encountered some problems, so I run it with: "java -jar RetroMCP-Java-CLI.jar". You should run it in a seperate folder (not in downloads), otherwise the files and folders will go all over the place. How to use RetroMCP: Type setup (every time you want change version), copy-paste the version number from their list (they support indev), write "decompile" and done! The code will now be deobfuscated and filenames will be normal, instead of "a", "b" and "c"! Hope I helped you, but I don't expect you to reply, as this discussion is 9 years old! What a piece of history!  
    • I know that this may be a basic question, but I am very new to modding. I am trying to have it so that I can create modified Vanilla loot tables that use a custom enchantment as a condition (i.e. enchantment present = item). However, I am having trouble trying to implement this; the LootItemRandomChanceWithEnchantedBonusCondition constructor needs a Holder<Enchantment> and I am unable to use the getOrThrow() method on the custom enchantment declared in my mod's enchantments class. Here is what I have so far in the GLM:   protected void start(HolderLookup.Provider registries) { HolderLookup.RegistryLookup<Enchantment> registrylookup = registries.lookupOrThrow(Registries.ENCHANTMENT); LootItemRandomChanceWithEnchantedBonusCondition lootItemRandomChanceWithEnchantedBonusCondition = new LootItemRandomChanceWithEnchantedBonusCondition(0.0f, LevelBasedValue.perLevel(0.07f), registrylookup.getOrThrow(*enchantment here*)); this.add("nebu_from_deepslate", new AddItemModifier(new LootItemCondition[]{ LootItemBlockStatePropertyCondition.hasBlockStateProperties(Blocks.DEEPSLATE).build(), LootItemRandomChanceCondition.randomChance(0.25f).build(), lootItemRandomChanceWithEnchantedBonusCondition }, OrichalcumItems.NEBU.get())); }   Inserting Enchantments.[vanilla enchantment here] actually works but trying to declare an enchantment from my custom enchantments class as [mod enchantment class].[custom enchantment] does not work even though they are both a ResourceKey and are registered in Registries.ENCHANTMENT. Basically, how would I go about making it so that a custom enchantment declared as a ResourceKey<Enchantment> of value ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath([modid], [name])), declared in a seperate enchantments class, can be used in the LootItemRandomChanceWithEnchantedBonusCondition constructor as a Holder? I can't use getOrThrow() because there is no level or block entity/entity in the start() method and it is running as datagen. It's driving me nuts.
  • Topics

×
×
  • Create New...

Important Information

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