Posted January 7, 20169 yr I'm trying to make when you have my item and you press a key it opens the Gui, but it doesn't work. I also don't know how to make an item have a slot and can't find tutorials on it. Main: @Mod(modid = RefStrings.MODID, name = RefStrings.NAME, version = RefStrings.VERSION) public class Main { @SidedProxy(clientSide = RefStrings.CLIENT, serverSide = RefStrings.SERVER) public static CommonProxy proxy; @Mod.Instance(RefStrings.MODID) public static Main instance; public static final PacketPipeline packetPipeLine = new PacketPipeline(); @EventHandler public void PreLoad(FMLPreInitializationEvent PreEvent) { MBlocks.mainRegistry(); MItems.mainRegistry(); MWorld.mainRegistry(); CraftingManager.mainRegistry(); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); packetPipeLine.initialize(); proxy.registerRenderInfo(); MinecraftForge.addGrassSeed(new ItemStack(MItems.tomatoSeed), ; } @EventHandler public static void Load(FMLInitializationEvent PreEvent) { } @EventHandler public static void PostLoad(FMLPostInitializationEvent PreEvent) { packetPipeLine.postInitialize(); } } KeyHandler: public class KeyHandler { public static final int STAFF_KEY = 0; private static final String[] keyDesc = {"key.elementstaff.desc"}; private static final int[] keyValues = {Keyboard.KEY_F}; private final KeyBinding[] keys; public KeyHandler() { keys = new KeyBinding[keyDesc.length]; for(int i = 0; i < keyDesc.length; i++) { keys = new KeyBinding(keyDesc, keyValues, "key.tutmod.category"); ClientRegistry.registerKeyBinding(keys); } } @SubscribeEvent public void onKeyInput(InputEvent.KeyInputEvent event) { if(!FMLClientHandler.instance().isGUIOpen(GuiChat.class)) { if(keys[sTAFF_KEY].isPressed()) { Main.packetPipeLine.sendToServer(new OpenGuiPacket(RefStrings.GUI_STAFF)); } } } } PacketPipeline: @ChannelHandler.Sharable public class PacketPipeline extends MessageToMessageCodec<FMLProxyPacket, AbstractPacket> { private EnumMap<Side, FMLEmbeddedChannel> channels; private LinkedList<Class<? extends AbstractPacket>> packets = new LinkedList<Class<? extends AbstractPacket>>(); private boolean isPostInitialized = false; public boolean registerPacket(Class<? extends AbstractPacket> clazz) { if(this.packets.size() > 256) { System.err.println("Maximum ammount of packets reached!"); return false; } if(this.packets.contains(clazz)) { System.err.println("This packet has already been registered!"); return false; } if(this.isPostInitialized) { System.err.println("Packet registered too late!"); return false; } this.packets.add(clazz); return true; } public void initialize() { this.channels = NetworkRegistry.INSTANCE.newChannel(RefStrings.PACKET_CHANNEL, this); registerPackets(); } public void postInitialize() { if(isPostInitialized) return; isPostInitialized = true; Collections.sort(this.packets, new Comparator<Class<? extends AbstractPacket>>() { @Override public int compare(Class<? extends AbstractPacket> o1, Class<? extends AbstractPacket> o2) { int com = String.CASE_INSENSITIVE_ORDER.compare(o1.getCanonicalName(), o2.getCanonicalName()); if(com == 0) com = o1.getCanonicalName().compareTo(o2.getCanonicalName()); return com; } }); } public void registerPackets() { registerPacket(OpenGuiPacket.class); } @Override protected void encode(ChannelHandlerContext ctx, AbstractPacket msg, List<Object> out) throws Exception { ByteBuf buffer = Unpooled.buffer(); Class<? extends AbstractPacket> clazz = msg.getClass(); if(!this.packets.contains(clazz)) throw new NullPointerException("This packet has never been registered: " + clazz.getCanonicalName()); byte discriminator = (byte) this.packets.indexOf(clazz); buffer.writeByte(discriminator); msg.encodeInto(ctx, buffer); FMLProxyPacket proxyPacket = new FMLProxyPacket(buffer.copy(), ctx.channel().attr(NetworkRegistry.FML_CHANNEL).get()); out.add(proxyPacket); } @SuppressWarnings("null") @Override protected void decode(ChannelHandlerContext ctx, FMLProxyPacket msg, List<Object> out) throws Exception { ByteBuf payload = msg.payload(); byte discriminator = payload.readByte(); Class<? extends AbstractPacket> clazz = this.packets.get(discriminator); if(clazz == null) throw new NullPointerException("This packet has never been registered: " + clazz.getCanonicalName()); AbstractPacket abstractPacket = clazz.newInstance(); abstractPacket.decodeInto(ctx, payload.slice()); EntityPlayer player; switch (FMLCommonHandler.instance().getEffectiveSide()) { case CLIENT: player = Minecraft.getMinecraft().thePlayer; abstractPacket.handleClientSide(player); break; case SERVER: INetHandler iNetHandler = ctx.channel().attr(NetworkRegistry.NET_HANDLER).get(); player = ((NetHandlerPlayServer) iNetHandler).playerEntity; abstractPacket.handleServerSide(player); break; default: } out.add(abstractPacket); } public void sendToServer(AbstractPacket message) { this.channels.get(Side.CLIENT).attr(FMLOutboundHandler.FML_MESSAGETARGET).set(FMLOutboundHandler.OutboundTarget.TOSERVER); this.channels.get(Side.CLIENT).writeAndFlush(message); } } AbstractPacket: public abstract class AbstractPacket { public abstract void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer); public abstract void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer); public abstract void handleClientSide(EntityPlayer player); public abstract void handleServerSide(EntityPlayer player); } OpenGuiPacket: public class OpenGuiPacket extends AbstractPacket { private byte id; public OpenGuiPacket() { } public OpenGuiPacket(byte id) { this.id = id; } @Override public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { buffer.writeByte(id); } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) { id = buffer.readByte(); } @Override public void handleClientSide(EntityPlayer player) { } @Override public void handleServerSide(EntityPlayer player) { System.out.println("You opened the staff on server"); FMLNetworkHandler.openGui(player, Main.instance, 0, player.worldObj, (int)player.posX, (int)player.posY, (int)player.posZ); } } GuiHandler: public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { /*switch(ID) { case RefStrings.GUI_STAFF: break; } return null; */ switch(ID) { default: return null; case 0: return new StaffContainer(player); } } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { /*switch(ID) { case RefStrings.GUI_STAFF: break; } return null; */ switch(ID) { default: return null; case 0: return new StaffGui(player); } } } StaffGui: public class StaffGui extends GuiScreen { public static final int GUI_ID = 20; ResourceLocation texture = new ResourceLocation(RefStrings.MODID, "textures/gui/staffGui.png"); public final int xSizeOfTexture = 175; public final int ySizeOfTexture = 132; public StaffGui(EntityPlayer player) { super(); } @Override public void drawScreen(int x, int y, float f) { drawDefaultBackground(); GL11.glColor4f(1F, 1F, 1F, 1F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); int posX = (this.width - xSizeOfTexture) / 2; int posY = (this.height - ySizeOfTexture) / 2; drawTexturedModalRect(posX, posY, 0, 0, xSizeOfTexture, ySizeOfTexture); super.drawScreen(x, y, f); } @Override public boolean doesGuiPauseGame() { return false; } } StaffContainer: public class StaffContainer extends Container { public StaffContainer(EntityPlayer player) { } @Override public boolean canInteractWith(EntityPlayer player) { return false; } } ElementStaff: public class ElementStaff extends Item { public ElementStaff() { super(); } } RefStrings: public class RefStrings { public static final String MODID = "tutmod"; public static final String NAME = "tutMod"; public static final String VERSION = "1.0 Alpha"; public static final String CLIENT = "com.shmcrae.Main.ClientProxy"; public static final String SERVER = "com.shmcrae.Main.CommonProxy"; public static final String PACKET_CHANNEL = "shmcrae"; public static final byte GUI_STAFF = 0; } ClientProxy: public class ClientProxy extends CommonProxy { public void registerRenderInfo() { KeyBindings.init(); FMLCommonHandler.instance().bus().register(new KeyHandler()); } }
January 7, 20169 yr This is a good tutorial that will point you in the right direction: http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/1571597-forge-1-6-4-1-8-custom-inventories-in-items-and
January 7, 20169 yr https://github.com/coolAlias/Forge_Tutorials/blob/master/InventoryItemTutorial.java This tutorial is by CoolAlias. In that tutorial he explains how to make an item that has an inventory or as you call it item with slots.
January 8, 20169 yr Author How do i fix this StaffGui: public class StaffGui extends GuiContainer { private float xSizeTex; private float ySizeTex; //public final int xSizeTex = 175; //public final int ySizeTex = 132; ResourceLocation texture = new ResourceLocation(RefStrings.MODID, "textures/gui/staffGui.png"); private final StaffInventory inventory; public StaffGui(StaffContainer containerItem) { super(containerItem); this.inventory = containerItem.inventory; } public void drawScreen(int par1, int par2, float par3) { super.drawScreen(par1, par2, par3); this.xSizeTex = (float)par1; this.ySizeTex = (float)par2; } /** * Draw the foreground layer for the GuiContainer (everything in front of the items) */ protected void drawGuiContainerForegroundLayer(int par1, int par2) { String s = this.inventory.hasCustomInventoryName() ? this.inventory.getInventoryName() : I18n.format(this.inventory.getInventoryName()); this.fontRendererObj.drawString(s, this.xSize / 2 - this.fontRendererObj.getStringWidth(s) / 2, 4, 4210752); this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 129 + 1, 4210752); } /** * Draw the background layer for the GuiContainer (everything behind the items) */ protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(texture); int k = (this.width - this.xSize) / 2; int l = (this.height - this.ySize) / 2; this.drawTexturedModalRect(k, l, 1, 0, this.xSize, this.ySize); int i1; } }
January 8, 20169 yr Author I think the Gui is fine, it's just the slot positions are messed up and I followed a tutorial so I'm not sure how to fix it. I know it's probably in here but I'm not sure what numbers to use to fix it StaffContainer: public class StaffContainer extends Container { final StaffInventory inventory; private static final int INV_START = StaffInventory.INV_SIZE, INV_END = INV_START+26, HOTBAR_START = INV_END+1, HOTBAR_END = HOTBAR_START+8; public StaffContainer(EntityPlayer player, InventoryPlayer invPlayer, StaffInventory invItem) { this.inventory = invItem; int i; for(i = 0; i < StaffInventory.INV_SIZE; ++i) { this.addSlotToContainer(new SlotItemInv(this.inventory, i, 80 + (18 * (int)(i/4)), 8 + (18*(1%4)))); } for(i = 0; i < 3; ++i) { for(int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 +i * 18)); } } for(i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); } }
January 8, 20169 yr This may give you a hint: net.aeronica.mods.mcjammer.common.inventory.SlotInstrument.SlotInstrument(IInventory inventory, int slotIndex, int xPos, int yPos)
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.