Jump to content

[SOLVED] [1.12.2] GUI Problem: "Listener already listening"


Mine_Stone

Recommended Posts

Hi everyone! I'm currently implementing a custom TE with a gui in my mod. He is how I open the GUI from my onBlockActivatedMethod. 

if (!worldIn.isRemote) {
			playerIn.openGui(MainClass.getInstance(), ModRegistry.getMachineGuiID(machine), worldIn, pos.getX(), pos.getY(), pos.getZ());		
} // ModRegistry.getMachineGuiID(machine) returns the correct gui ID, do not worry about that.

The code works fine, but I always get the following error when I open the GUI more than once:

[14:08:43] [Server thread/FATAL] [minecraft/MinecraftServer]: Error executing task
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Listener already listening
	at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_211]
	at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_211]
	at net.minecraft.util.Util.runTask(Util.java:54) [Util.class:?]
	at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:798) [MinecraftServer.class:?]
	at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) [MinecraftServer.class:?]
	at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192) [IntegratedServer.class:?]
	at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_211]
Caused by: java.lang.IllegalArgumentException: Listener already listening
	at net.minecraft.inventory.Container.addListener(Container.java:56) ~[Container.class:?]
	at net.minecraftforge.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:101) ~[FMLNetworkHandler.class:?]
	at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2809) ~[EntityPlayer.class:?]
	at com.minestone.fluxified.blocks.BlockMachine.onBlockActivated(BlockMachine.java:63) ~[BlockMachine.class:?]
	at net.minecraft.server.management.PlayerInteractionManager.processRightClickBlock(PlayerInteractionManager.java:475) ~[PlayerInteractionManager.class:?]
	at net.minecraft.network.NetHandlerPlayServer.processTryUseItemOnBlock(NetHandlerPlayServer.java:769) ~[NetHandlerPlayServer.class:?]
	at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:68) ~[CPacketPlayerTryUseItemOnBlock.class:?]
	at net.minecraft.network.play.client.CPacketPlayerTryUseItemOnBlock.processPacket(CPacketPlayerTryUseItemOnBlock.java:13) ~[CPacketPlayerTryUseItemOnBlock.class:?]
	at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) ~[PacketThreadUtil$1.class:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_211]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_211]
	at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
	... 5 more

How can I fix this issue? Please let me know if you need any other part of my code.

Thank you.

 

Edited by Mine_Stone
Added solved tag
Link to comment
Share on other sites

4 hours ago, diesieben07 said:

Show your IGuiHandler, Container and GuiContainer.

Thank you for the answer.

IGuiHandler:

public class MachineGUIHandler implements IGuiHandler {

	@Override
	public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
		for (Machine machine : ModRegistry.getMachines()) {
			if (ModRegistry.getMachineGuiID(machine) == ID)
				return ((TileEntityMachine) world.getTileEntity(new BlockPos(x,y,z))).getContainer();
		}
		return null;
	}

	@Override
	public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
		for (Machine machine : ModRegistry.getMachines()) {
			if (ModRegistry.getMachineGuiID(machine) == ID)
				return machine.createGui((TileEntityMachine) world.getTileEntity(new BlockPos(x,y,z)), player.inventory);
		}
		return null;
	}

}

Container:

public class MachineContainer extends Container {
	private TileEntityMachine machineTE;
	
	public MachineContainer(TileEntityMachine machineTE) {
		this.machineTE = machineTE;
	}
	
	@Override
	public boolean canInteractWith(EntityPlayer playerIn) {
		return true;
	}

}

GuiContainer:

public class GuiMachine extends GuiContainer {
	private TileEntityMachine machineTE;
	private Machine machine;
	private ResourceLocation background;
	
	public GuiMachine(TileEntityMachine machineTE, InventoryPlayer playerInventory) {
		super(new MachineContainer(machineTE));
		this.machineTE = machineTE;
		this.machine = machineTE.getMachine();
	}
	
	@Override
	protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
		
	}
	
	@Override
	protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
		fontRenderer.drawString(machine.getDisplayName(), xSize / 2 - fontRenderer.getStringWidth(machine.getDisplayName()) / 2, ySize / 3, 0x000);
		
	}
	
	protected void bindTexture(ResourceLocation texture) {
		Minecraft.getMinecraft().renderEngine.bindTexture(texture);
	}
}

Machine:

public abstract class Machine {
	private Block block;
	private ItemBlock item;
	private String name;
	
	public Machine(String name) {
		this.name = name;
	}
	
	public Block getBlock() {
		if (block == null)
			block = new BlockMachine(this);
		return block;
	}
	
	public ItemBlock getItem() {
		if (item == null) {
			item = new ItemBlock(getBlock());
			item.setRegistryName(name);
			
		}
		return item;
	}
	
	public String getName() {
		return name;
	}
	
	public String getDisplayName() {
		return name;
	}
	
	public abstract TileEntity createTileEntity(World world, IBlockState state);
	
	public abstract GuiMachine createGui(TileEntityMachine te, InventoryPlayer playerInventory);
	
	public abstract MachineContainer createContainer(TileEntityMachine te);
}

MachineFluidCombiner: (The Machine associated to my block)

public class MachineFluidCombiner extends Machine {

	public MachineFluidCombiner() {
		super("test_machine");
	}
	
	@Override
	public TileEntity createTileEntity(World world, IBlockState state) {
		return new TileEntityMachine(this);
	}

	@Override
	public GuiMachine createGui(TileEntityMachine te, InventoryPlayer playerInventory) {
		return new GuiFluidCombiner(te, playerInventory); // GuiFluidCombiner extends GuiMachine
	}

	@Override
	public MachineContainer createContainer(TileEntityMachine te) {
		return new MachineContainer(te);
	}

}

 

As you can see im trying to make this modular (with the Machine class).

I hope this helps you to understand what I'm doing

Link to comment
Share on other sites

Thanks again for the reply.

Here is the code from my TileEntity, which contains getContainer

public class TileEntityMachine extends TileEntity {
	private Machine machine;
	private MachineContainer container;
	public TileEntityMachine(Machine machine, MachineContainer container) {
		this.machine = machine;
		this.container = container;
	}
	
	public TileEntityMachine() {
		this.container = new MachineContainer(this);
	}
	
	@Override
	public void readFromNBT(NBTTagCompound nbt) {
		super.readFromNBT(nbt);
		
		this.machine = ModRegistry.getMachine(nbt.getString("machine_name"));
	}
	
	public TileEntityMachine(Machine machine) {
		this.machine = machine;
		this.container = new MachineContainer(this);
		
		NBTTagCompound nbt = new NBTTagCompound();
		readFromNBT(nbt);
		nbt.setString("machine_name", machine.getName());
		this.writeToNBT(nbt);
	}
	
	public Machine getMachine() {
		return machine;
	}
	
	public MachineContainer getContainer() {
		return container;
	}
}

And here is the code from MachineContainer: (it is very empty at the moment because I haven't yet implemented any behaviour.

public class MachineContainer extends Container {
	private TileEntityMachine machineTE;
	
	public MachineContainer(TileEntityMachine machineTE) {
		this.machineTE = machineTE;
	}
	
	@Override
	public boolean canInteractWith(EntityPlayer playerIn) {
		return true;
	}

}

 

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