Jump to content

Recommended Posts

Posted

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 ?

Posted

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 :P

 

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



×
×
  • Create New...

Important Information

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