Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.11 - ~Solved] Using GuiListExtended


Franckyi
 Share

Recommended Posts

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 ?

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • public ManaHealthOverlay() { this.minecraft = Minecraft.getInstance(); OverlayRegistry.registerOverlayBelow(ForgeIngameGui.FOOD_LEVEL_ELEMENT , "Mana", this); } Does this solve the problem with OverlayRegistry? I thought I had implemented Mana based on the player's stats. But nothing shows up. Is it still not enough?   The second half is equivalent to playerhealth, only the values have been changed. public class ManaOverlay extends GuiComponent implements IIngameOverlay { protected int screenWidth; protected int screenHeight; protected int tickCount; protected int lastMana; protected int displayMana; protected long lastManaTime; protected long manaBlinkTime; private final Minecraft minecraft; protected final Random random = new Random(); private static final ResourceLocation GUI_MANA_LOCATION = new ResourceLocation("textures/gui/bars.png"); final Map<UUID, LerpingBossEvent> events = Maps.newLinkedHashMap(); private static final ManaOverlay INSTANCE = new ManaOverlay(); public static void init() { MinecraftForge.EVENT_BUS.register(INSTANCE); } public ManaOverlay() { this.minecraft = Minecraft.getInstance(); OverlayRegistry.registerOverlayBelow(ForgeIngameGui.FOOD_LEVEL_ELEMENT , "Mana", this); } private Player getCameraPlayer() { return !(this.minecraft.getCameraEntity() instanceof Player) ? null : (Player)this.minecraft.getCameraEntity(); } ....
    • I'm new to modding and I want to do this. What class would I put that in?
    • That is a different crash report. Please post the debug.log file from the logs folder.
    • [22Jan.2022 18:41:22.485] [Server thread/ERROR] [net.minecraftforge.eventbus.EventBus/EVENTBUS]: Exception caught during firing event: 'net.minecraft.nbt.CompoundTag net.minecraft.world.level.block.entity.SignBlockEntity.save(net.minecraft.nbt.CompoundTag)'     Index: 4     Listeners:         0: HIGH         1: ASM: class dev.architectury.event.forge.EventHandlerImplCommon event(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         2: NORMAL         3: ASM: cyclopscore onServerStarting(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         4: ASM: chanceCubes.CCubesCore@5b77fda6 serverStart(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         5: ASM: mods.waterstrainer.event.EventServerStarting@2dc1913f onServerStarting(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         6: ASM: com.song.castle_in_the_sky.CastleInTheSky@1f8c253d onServerStarting(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         7: ASM: se.mickelus.tetra.TetraMod@203a3089 serverStarting(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         8: net.minecraftforge.eventbus.EventBus$$Lambda$4325/0x0000000800c57770@71737087         9: ASM: de.teamlapen.vampirism.VampirismMod@1213b1b onServerStart(Lnet/minecraftforge/event/server/ServerStartingEvent;)V         10: net.minecraftforge.eventbus.EventBus$$Lambda$4325/0x0000000800c57770@1a894d2d         11: net.minecraftforge.eventbus.EventBus$$Lambda$4325/0x0000000800c57770@3deb329 java.lang.NoSuchMethodError: 'net.minecraft.nbt.CompoundTag net.minecraft.world.level.block.entity.SignBlockEntity.save(net.minecraft.nbt.CompoundTag)'     at TRANSFORMER/chancecubes@1.18.1-5.0.2.444/chanceCubes.rewards.DefaultRewards.loadDefaultRewards(DefaultRewards.java:124)     at TRANSFORMER/chancecubes@1.18.1-5.0.2.444/chanceCubes.CCubesCore.serverStart(CCubesCore.java:123)     at net.minecraftforge.eventbus.ASMEventHandler_101_CCubesCore_serverStart_ServerStartingEvent.invoke(.dynamic)     at MC-BOOTSTRAP/eventbus@5.0.3/net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85)     at MC-BOOTSTRAP/eventbus@5.0.3/net.minecraftforge.eventbus.EventBus.post(EventBus.java:302)     at MC-BOOTSTRAP/eventbus@5.0.3/net.minecraftforge.eventbus.EventBus.post(EventBus.java:283)     at TRANSFORMER/forge@39.0.56/net.minecraftforge.server.ServerLifecycleHooks.handleServerStarting(ServerLifecycleHooks.java:102)     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.base/java.lang.reflect.Method.invoke(Method.java:568)     at TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.callBoolean(Reflector.java:702)     at TRANSFORMER/minecraft@1.18.1/net.minecraft.client.server.IntegratedServer.m_7038_(IntegratedServer.java:90)     at TRANSFORMER/minecraft@1.18.1/net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:644)     at TRANSFORMER/minecraft@1.18.1/net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:258)     at java.base/java.lang.Thread.run(Thread.java:833) [22Jan.2022 18:41:22.509] [Server thread/DEBUG] [mixin/]: Mixing MixinChunkSerializer from architectury.mixins.json into net.minecraft.world.level.chunk.storage.ChunkSerializer [22Jan.2022 18:41:28.076] [Server thread/DEBUG] [net.minecraftforge.fml.loading.FileUtils/CORE]: Found existing serverconfig directory : C:\Users\UTW\AppData\Roaming\.minecraft\saves\New World\serverconfig [22Jan.2022 18:41:28.076] [Server thread/DEBUG] [net.minecraftforge.fml.config.ConfigTracker/CONFIG]: Unloading configs type SERVER Sry if its not the right one, im pretty new at Forge
    • I have a modded server that worked before I changed the config for SereneSeasons (made the seasons longer and turned off offline season progression). Now it just gives said error message, even after reverting the changes.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.