Posted January 8, 20178 yr Hi ! I'm still working on my "Item Editor" mod for mapmakers. I'm working on a simple way to add enchantments to an item, so I created a list of all enchantments in Vanilla Minecraft. I created my enchant list by extending GuiListExtended and my list items by implementing IGuiListEntry . Everything seems to be working well, except the scroll bar. I did nothing about it and I don't know how it works. I can't find any tutorials on Internet. I can give you source codes if you need. Can someone help me ?
January 8, 20178 yr Author Ok then, there you have the source code : My GuiScreen : package com.franckyi.itemeditor.gui; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.franckyi.itemeditor.ItemEditorMod; import com.franckyi.itemeditor.gui.components.GuiItemEditorEnchantList; import com.franckyi.itemeditor.misc.ModEnchantmentHelper.ItemEnchantment; import com.franckyi.itemeditor.packet.EditItemEnchantMessage; import com.franckyi.itemeditor.packet.EditItemLoreMessage; import com.franckyi.itemeditor.packet.ItemEditorPacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; public class GuiItemEditorEnchant extends GuiScreen { private GuiItemEditorEnchantList enchList; private GuiTextField[] enchLevels; private GuiButton cancelButton; private GuiButton doneButton; @Override protected void actionPerformed(GuiButton button) throws IOException { enchList.actionPerformed(button); if (button == doneButton){ List<ItemEnchantment> msg = createMessage(); updateServer(msg); updateClient(msg); } if (button == this.cancelButton || button == this.doneButton) switchGui(ItemEditorGuiHandler.ITEM_EDITOR_MENU); } @Override public boolean doesGuiPauseGame() { return true; } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { drawDefaultBackground(); enchList.drawScreen(mouseX, mouseY, partialTicks); drawString(fontRendererObj, "Edit Item Enchantments", this.width / 2 - 50, (int) (this.height / 2 - this.height / 2.5), 0xffffff); super.drawScreen(mouseX, mouseY, partialTicks); } @Override public void initGui() { enchList = new GuiItemEditorEnchantList(mc, width, height, 50, height-50, 25); for(ItemEnchantment ench : enchList.getEnchantmentList()) ench.getTextField().setText(EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByID(ench.getEnch().getId()), Minecraft.getMinecraft().thePlayer.getHeldItemMainhand()) + ""); buttonList.add(doneButton = new GuiButton(0, this.width / 2 - 100, (int) (this.height / 2 + this.height / 2.6), 90, 20, "Done")); buttonList.add(cancelButton = new GuiButton(0, this.width / 2 + 10, (int) (this.height / 2 + this.height / 2.6), 90, 20, "Cancel")); } @Override protected void keyTyped(char typedChar, int keyCode) throws IOException { for(ItemEnchantment ench : enchList.getEnchantmentList()) if(Character.isDigit(typedChar) || keyCode == 14 || keyCode == 211) ench.getTextField().textboxKeyTyped(typedChar, keyCode); super.keyTyped(typedChar, keyCode); } @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { for(ItemEnchantment ench : enchList.getEnchantmentList()) ench.getTextField().mouseClicked(mouseX, mouseY, mouseButton); super.mouseClicked(mouseX, mouseY, mouseButton); } @Override public void updateScreen() { for(ItemEnchantment ench : enchList.getEnchantmentList()) ench.getTextField().updateCursorCounter(); super.updateScreen(); } private List<ItemEnchantment> createMessage() { List<ItemEnchantment> msgList = new ArrayList<ItemEnchantment>(); for(ItemEnchantment ench : enchList.getEnchantmentList()){ if(ench.getTextField().getText().equals("")) ench.getTextField().setText("0"); msgList.add(new ItemEnchantment(ench.getEnch().getId(), Integer.parseInt(ench.getTextField().getText()))); } return msgList; } private void updateServer(List<ItemEnchantment> msg) { ItemEditorPacketHandler.INSTANCE.sendToServer(new EditItemEnchantMessage(createMessage())); } private void updateClient(List<ItemEnchantment> msg) { if(Minecraft.getMinecraft().thePlayer.getHeldItemMainhand().getTagCompound() != null) Minecraft.getMinecraft().thePlayer.getHeldItemMainhand().getTagCompound().removeTag("ench"); for (ItemEnchantment ench : msg) if (ench.getLevel() != 0) Minecraft.getMinecraft().thePlayer.getHeldItemMainhand().addEnchantment( Enchantment.getEnchantmentByID(ench.getEnch().getId()), ench.getLevel()); } private void switchGui(int id){ Minecraft.getMinecraft().thePlayer.openGui(ItemEditorMod.instance, id, Minecraft.getMinecraft().theWorld, (int) Minecraft.getMinecraft().thePlayer.posX, (int) Minecraft.getMinecraft().thePlayer.posY, (int) Minecraft.getMinecraft().thePlayer.posZ); } } My GuiListExtended : package com.franckyi.itemeditor.gui.components; import java.util.ArrayList; import java.util.List; import com.franckyi.itemeditor.misc.ModEnchantmentHelper.EnumEnchantmentList; import com.franckyi.itemeditor.misc.ModEnchantmentHelper.ItemEnchantment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiListExtended; import net.minecraft.client.gui.GuiScreen; public class GuiItemEditorEnchantList extends GuiListExtended{ private List<ItemEnchantment> enchList; public GuiItemEditorEnchantList(Minecraft mcIn, int widthIn, int heightIn, int topIn, int bottomIn, int slotHeightIn) { super(mcIn, widthIn, heightIn, topIn, bottomIn, slotHeightIn); enchList = new ArrayList<ItemEnchantment>(); enchList.addAll(EnumEnchantmentList.getDefaults(widthIn, heightIn)); } @Override public IGuiListEntry getListEntry(int index) { return enchList.get(index); } @Override protected int getSize() { return 30; } public List<ItemEnchantment> getEnchantmentList() { return enchList; } } My IGuiListEntry (with other stuff I use) : package com.franckyi.itemeditor.misc; import java.util.ArrayList; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiListExtended.IGuiListEntry; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiTextField; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnumEnchantmentType; public class ModEnchantmentHelper { public static class ItemEnchantment implements IGuiListEntry { private int index; private EnumEnchantmentList ench; private int level; private GuiTextField tf; public ItemEnchantment(int index, EnumEnchantmentList ench, int level, int widthIn, int heightIn) { this.index = index; this.ench = ench; this.level = level; tf = new GuiTextField(index, Minecraft.getMinecraft().fontRendererObj, widthIn / 2 + 50, 0, 50, 15); } public ItemEnchantment(int id, int level) { this.ench = EnumEnchantmentList.getTypeFromID(id); this.level = level; } public int getIndex() { return index; } public EnumEnchantmentList getEnch() { return ench; } public int getLevel() { return level; } public GuiTextField getTextField() { return tf; } @Override public void setSelected(int p_178011_1_, int p_178011_2_, int p_178011_3_) { } @Override public void drawEntry(int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected) { tf.yPosition = y; tf.drawTextBox(); Minecraft.getMinecraft().ingameGUI.drawString(Minecraft.getMinecraft().fontRendererObj, ench.getName(), x, y + 5, (ench.type.canEnchantItem(Minecraft.getMinecraft().thePlayer.getHeldItemMainhand().getItem())) ? 0x00aa00 : 0xffffff); } @Override public boolean mousePressed(int slotIndex, int mouseX, int mouseY, int mouseEvent, int relativeX, int relativeY) { return false; } @Override public void mouseReleased(int slotIndex, int x, int y, int mouseEvent, int relativeX, int relativeY) { } } public static enum EnumEnchantmentList { PROTECTION_ALL("Protection", 0, EnumEnchantmentType.ARMOR), PROTECTION_FIRE("Fire Protection", 1, EnumEnchantmentType.ARMOR), PROTECTION_FALL("Feather Falling", 2, EnumEnchantmentType.ARMOR_FEET), PROTECTION_EXPLOSION("Blast Protection", 3, EnumEnchantmentType.ARMOR), PROTECTION_PROJECTILE("Projectile Protection", 4, EnumEnchantmentType.ARMOR), OXYGEN("Respiration", 5, EnumEnchantmentType.ARMOR_HEAD), WATER_WORKER("Aqua Affinity", 6, EnumEnchantmentType.ARMOR_HEAD), THORNS("Thorns", 7, EnumEnchantmentType.ARMOR), WATER_WALKER( "Depth Strider", 8, EnumEnchantmentType.ARMOR_FEET), FROST_WALKER( "Frost Walker", 9, EnumEnchantmentType.ARMOR_FEET), BINDING_CURSE( "Curse of Binding", 10, EnumEnchantmentType.WEARABLE), DAMAGE_ALL("Sharpness", 16, EnumEnchantmentType.WEAPON), DAMAGE_UNDEAD("Smite", 17, EnumEnchantmentType.WEAPON), DAMAGE_ARTHROPODS("Bane of Arthropods", 18, EnumEnchantmentType.WEAPON), KNOCKBACK("Knockback", 19, EnumEnchantmentType.WEAPON), FIRE_ASPECT("Fire Aspect", 20, EnumEnchantmentType.WEAPON), LOOT_BONUS("Looting", 21, EnumEnchantmentType.WEAPON), SWEEPING_EDGE("Sweeping Edge", 22, EnumEnchantmentType.WEAPON), DIGGING("Efficiency", 32, EnumEnchantmentType.DIGGER), UNTOUCHING("Silk Touch", 33, EnumEnchantmentType.DIGGER), DURABILITY("Unbreaking", 34, EnumEnchantmentType.BREAKABLE), LOOT_BONUS_DIGGER("Fortune", 35, EnumEnchantmentType.DIGGER), ARROW_DAMAGE("Power", 48, EnumEnchantmentType.BOW), ARROW_KNOCKBACK("Punch", 49, EnumEnchantmentType.BOW), ARROW_FIRE("Flame", 50, EnumEnchantmentType.BOW), ARROW_INFINITE("Infinity", 51, EnumEnchantmentType.BOW), LOOT_BONUS_FISHING("Luck of the Sea", 61, EnumEnchantmentType.FISHING_ROD), FISHING_SPEED("Lure", 62, EnumEnchantmentType.FISHING_ROD), MENDING("Mending", 70, EnumEnchantmentType.BREAKABLE), VANISHING_CURSE("Curse of Vanishing", 71, EnumEnchantmentType.BREAKABLE); private String name; private int id; private EnumEnchantmentType type; private EnumEnchantmentList(String name, int id, EnumEnchantmentType type) { this.name = name; this.id = id; this.type = type; } public String getName() { return name; } public int getId() { return id; } public EnumEnchantmentType getType() { return type; } public static List<ItemEnchantment> getDefaults(int widthIn, int heightIn) { List<ItemEnchantment> enchList = new ArrayList<ItemEnchantment>(); for (EnumEnchantmentList ench : values()) { enchList.add(new ItemEnchantment(ench.ordinal(), ench, 0, widthIn, heightIn)); } return enchList; } public static EnumEnchantmentList getTypeFromID(int id){ for(EnumEnchantmentList type : values()) if(id == type.getId()) return type; return null; } } } Edit : Lol, when I posted the code I saw I always used 'Minecraft.getMinecraft()' instead of 'mc' in my GUIs ^^ Let's fix that
January 8, 20178 yr Author Ok, I found how to register scroll buttons. But I want to scroll the list using the scroll bar or the mouse wheel. Does someone know how to do that?
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.