Jump to content

[1.11]Help with Packets, NBT, and Tile Entities


its_meow

Recommended Posts

Basically, I'm trying to make a block that has an adjustable light value via GUI. I have the GUI, graphics, and incrementing buttons that can output the int anytime. So far I have a packet that sends that int to the server, then I have to somehow feed it into that specific tileentity instance and write the int the that instance's NBT, which then can be read from the block of that instance, which then sets the value to that int. I have absolutely no clue what to do.

Here's the code that matters. (Yes, I have registered the block and block as a tile entity)

READ COMMENTS IN CODE PLEASE

Block Class:

Spoiler

package its_meow.spaceheater.block.spaceheater;

import java.util.Random;

import its_meow.spaceheater.SpaceHeaterMod;
import its_meow.spaceheater.gui.GUIHeater;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockSpaceHeater extends BlockContainer {

	public BlockSpaceHeater() {
		super(Material.ROCK);
		this.setCreativeTab(SpaceHeaterMod.tab_spaceheater);
		this.setUnlocalizedName("spaceheater");
		this.setRegistryName("spaceheater");
		this.setTickRandomly(true);
	}

@Override
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
    {
        if(!worldIn.isRemote){
        	
        } else {  // I know i did this oddly, I should've just done worldIn.isRemote instead of the weird else
        	TileEntity tileEntity = worldIn.getTileEntity(pos);
        	if(tileEntity instanceof SpaceHeaterTileEntity) {
        		GUIHeater heater = new GUIHeater((SpaceHeaterTileEntity) worldIn.getTileEntity(pos)); //This is how i get the specific tile entity instance fed into the GUI.
        		Minecraft.getMinecraft().displayGuiScreen(heater);//Opens GUI
        	}
        }
		return false;
    }
		
	@Override
	public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) {
		boolean isHeaterOn = true;//Going to hook this to a button later.
		TileEntity tileEntity = worldIn.getTileEntity(pos); //The tile entity of this specific instance
		//int lLevel = ;//Where it's supposed to read NBT and plug into the variable
		if(isHeaterOn){
			this.setLightLevel(/*lLevel*/20F);
		} else {
			this.setLightLevel(0F);
		}
		
		//System.out.println(lLevel);
		
		super.updateTick(worldIn, pos, state, rand);
	}
	
	@SideOnly(Side.CLIENT)
	public void initModel(){
		ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
	}
	
    @Override
    public void breakBlock(World world, BlockPos pos, IBlockState state) {
        super.breakBlock(world, pos, state);
        world.removeTileEntity(pos);

    }



	@Override
	public TileEntity createNewTileEntity(World worldIn, int meta) {
		return new SpaceHeaterTileEntity();
	}

 

GUI Class:

Spoiler

package its_meow.spaceheater.gui;

import its_meow.spaceheater.Ref;
import its_meow.spaceheater.block.spaceheater.BlockSpaceHeater;
import its_meow.spaceheater.block.spaceheater.SpaceHeaterTileEntity;
import its_meow.spaceheater.network.packets.PacketInt;
import its_meow.spaceheater.proxy.CommonProxy;

import java.io.IOException;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import static net.minecraft.client.Minecraft.getMinecraft;

public class GUIHeater extends GuiScreen {
	
	final ResourceLocation GUITexture = new ResourceLocation(Ref.MOD_ID, "textures/gui/heater.png");
	int guiWidth = 248;
	int guiHeight = 166;
	
	GuiButton buttonplus;
	GuiButton buttonminus;
	
	final int BUTTONMINUS = 0;
	final int BUTTONPLUS = 1;
	
	private SpaceHeaterTileEntity te;//Initiates tile entity's specific instance variable
	
	public GUIHeater(SpaceHeaterTileEntity te) {
		this.te = te;//Sets te to the imported tile entity
	}
	
	@Override
	public void drawScreen(int mouseX, int mouseY, float partialTicks){
		drawDefaultBackground();
		Minecraft.getMinecraft().renderEngine.bindTexture(GUITexture);
		int centerX = (width / 2) - (guiWidth / 2);
		int centerY = (height / 2) - (guiHeight / 2);
		drawTexturedModalRect(centerX, centerY, 0, 0, guiWidth, guiHeight);
		String str1 = "Heat Level";
		drawCenteredString(fontRendererObj, str1, (width / 2), centerY + 40, 0xFFFFFF);
		GL11.glPushMatrix();
		{
		GL11.glColor4f(1, 1, 1, 1);
		Minecraft.getMinecraft().renderEngine.bindTexture(GUITexture);
		GL11.glPopMatrix();
		}
		super.drawScreen(mouseX, mouseY, partialTicks);
	}
	
	@Override
	public void initGui(){
		buttonList.add(buttonminus = new GuiButton(BUTTONMINUS, (width/2)-150/2, (height)-guiHeight/2, 18, 18, "-"));
		buttonList.add(buttonplus = new GuiButton(BUTTONPLUS, (width/2)+150/2, (height)-guiHeight/2, 18, 18, "+"));

		super.initGui();
	}
	
	private int lightLevel = 11;//This is eventually going to read the NBT for the variable, it currently resets every time you re-open the GUI
	@Override
	protected void actionPerformed(GuiButton button) throws IOException {

		if(button.id == BUTTONPLUS){
			System.out.println("plus");
			lightLevel++;
			if(lightLevel - 11 < 0){
				lightLevel = 11;
			} else if(lightLevel - 11 > 10) {
				lightLevel = 21;
			}
			System.out.println("inGUI-11: " + (lightLevel - 11));
			int displayLightLevel = (lightLevel - 11);
			drawCenteredString(fontRendererObj, Integer.toString(displayLightLevel), (width/2), (height)-guiHeight/2, 0xFFFFFF);
			CommonProxy.packetHandler.INSTANCE.sendToServer(new PacketInt(lightLevel));//Sends the int to the Server, sice GUIs are clientside
		} 
		if(button.id == BUTTONMINUS){
				System.out.println("minus");
				lightLevel--;
				if(lightLevel - 11 < 0){
					lightLevel = 11;
				} else if(lightLevel - 11 > 10) {
					lightLevel = 21;
				}
				System.out.println("inGUI-11: " + (lightLevel - 11));
				int displayLightLevel = (lightLevel - 11);
              	drawCenteredString(fontRendererObj, Integer.toString(displayLightLevel), (width/2), (height)-guiHeight/2, 0xFFFFFF);
				CommonProxy.packetHandler.INSTANCE.sendToServer(new PacketInt(lightLevel));//See above comment
				
		}
		
		super.actionPerformed(button);
	}

	@Override
	protected void keyTyped(char typedChar, int keyCode) throws IOException {
		super.keyTyped(typedChar, keyCode);
	}

	@Override
	public boolean doesGuiPauseGame() {
		return true;
	}

	@Override
	public void onGuiClosed() {
		super.onGuiClosed();
	}
	
	
	
	
	
	
	
	
	
	
	
	
}

 

Tile Entity Class:

Spoiler

package its_meow.spaceheater.block.spaceheater;

import its_meow.spaceheater.gui.GUIHeater;

import javax.annotation.Nullable;

import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;

public class SpaceHeaterTileEntity extends TileEntity implements ITickable {
	  

		
	    //I have no idea how to use NBT, I tried some tutorials, they're really confusing.
	    @Override
	    public NBTTagCompound getUpdateTag() {
	        // getUpdateTag() is called whenever the chunkdata is sent to the
	        // client. In contrast getUpdatePacket() is called when the tile entity
	        // itself wants to sync to the client. In many cases you want to send
	        // over the same information in getUpdateTag() as in getUpdatePacket().
	    	return writeToNBT(new NBTTagCompound());
	    }

	    @Nullable
	    @Override
	    public SPacketUpdateTileEntity getUpdatePacket() {
	        // Prepare a packet for syncing our TE to the client. Since we only have to sync the stack
	        // and that's all we have we just write our entire NBT here. If you have a complex
	        // tile entity that doesn't need to have all information on the client you can write
	        // a more optimal NBT here.
	        NBTTagCompound nbtTag = new NBTTagCompound();
	        this.writeToNBT(nbtTag);
	        return new SPacketUpdateTileEntity(getPos(), 1, nbtTag);
	    }

	
	    @Override
	    public void readFromNBT(NBTTagCompound compound) {
	        super.readFromNBT(compound);
	    }
	    @Override
	    public NBTTagCompound writeToNBT(NBTTagCompound compound) {
	        super.writeToNBT(compound);
	        
	        
	        
	        
	        
	        
	        return compound;
	    }
	    

		@Override
		public void update() {
	    	BlockPos blockpos = this.getPos();
	    	Block block = this.getBlockType();
	    	if(block instanceof BlockSpaceHeater){
	    		this.world.scheduleBlockUpdate(blockpos, block, 5, 1);//Makes the actual block tick
	    		
	    	}
			
		}
}

 

 

PacketInt Class (w/ Handler):

Spoiler

package its_meow.spaceheater.network.packets;

import io.netty.buffer.ByteBuf;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;

public class PacketInt implements IMessage {
	
	private int theInt;
	
	public PacketInt() {}
	
	public PacketInt(int theInt){
		this.theInt = theInt;
	}
	
	@Override
	public void fromBytes(ByteBuf buf) {
		this.theInt = buf.readInt();
	}

	@Override
	public void toBytes(ByteBuf buf) {
		buf.writeInt(this.theInt);
	}
	
	public static class Handler implements IMessageHandler<PacketInt, IMessage> {

		@Override
		public IMessage onMessage(PacketInt message, MessageContext ctx) {
			
			System.out.println("printed packet: " + message.theInt);
			//This is where I want to write the the specific instance's NBT, but I don't have access to that instance here, how would I get it here? Could I make like a PacketIntTileEntity that sends both? but ByteBuf doesn't have a tileentity type thing. I'm new to packets and all this serverside stuff, I'm used to making mobs and items... I've never made a tile entity, GUI, or advanced block like this one I'm making.
			return null;
		}
		
	
		
	}
	
}

 

 

I have no clue what I want answered but.. SOMETHING?

 

I'm desperate lol

Edited by its_meow
Version for title
Link to comment
Share on other sites

Spoiler
6 minutes ago, diesieben07 said:
  • Don't extend BlockContainer. Override hasTileEntity and createTileEntity.
  • You cannot reference client-only classes such as Minecraft in common code.
  • You must not call setLightLevel after the block was registered. If you need a dynamic light value, override getLightValue(IBlockState, IBlockAccess, BlockPos).
  • The code you have in breakBlock is not needed.
  • Why is your packet called PacketInt?
  • 
    
    
    @Override
    public void update() {
    	BlockPos blockpos = this.getPos();
    	Block block = this.getBlockType();
    	if(block instanceof BlockSpaceHeater){
    		this.world.scheduleBlockUpdate(blockpos, block, 5, 1);//Makes the actual block tick
    	}
    }

     

  • This is a terrible idea. Why are you doing this?

As for the question in the packet handler comment: You need to track which TileEntity the player is looking at on the server, the easiest way is to use Container and GuiContainer with IGuiHandler, as if you wanted to display an inventory. Then the server can track which TE the player is looking at via the Container.

 

1. So the other thing I can do is make it implement ITileEntityProvider, and Override hasTileEntity and return true?

2. It's no longer common code when I do the if !isRemote

3. I don't understand

4. Okay, removed

5. I dunno, it's an int, isn't it?

6. I don't know how I would make the light value set from the tile entity other than that, is there a better way?

 

And where would I use Container and GuiContainer with IGuiHandler?

 

Also, I'm sorry for being a clueless, horrible programmer. This entire area makes no sense to me, I'm doing a mod request because I needed something to do, so... I don't know.

Link to comment
Share on other sites

6 minutes ago, its_meow said:
  Reveal hidden contents

 

1. So the other thing I can do is make it implement ITileEntityProvider, and Override hasTileEntity and return true?

You don't need to implement ITileEntityProvider, those methods are in Block so you just need to override them.

6 minutes ago, its_meow said:

2. It's no longer common code when I do the if !isRemote

Actually it is. Minecraft is a client-only class, which means it only exists on the client. Even if it's only referenced inside an if-statement, it will cause a crash on the server because the code contains a reference to something that doesn't exist at all.

6 minutes ago, its_meow said:

6. I don't know how I would make the light value set from the tile entity other than that, is there a better way?

Override the method getLightValue(IBlockState, IBlockAccess, BlockPos). In there, get the TileEntity and get the light level from it, then return that value. No need for block updates, you just need your TE to store its current light level.

6 minutes ago, its_meow said:

And where would I use Container and GuiContainer with IGuiHandler?

Container is for server-side, GUI is for client-side.

6 minutes ago, its_meow said:

Also, I'm sorry for being a clueless, horrible programmer. This entire area makes no sense to me, I'm doing a mod request because I needed something to do, so... I don't know.

That seems like kind of an unhealthy justification for this? If you don't enjoy it then just... go for a walk or something instead. :P It's supposed to be fun y'know?

Link to comment
Share on other sites

12 minutes ago, Jay Avery said:

You don't need to implement ITileEntityProvider, those methods are in Block so you just need to override them.

Actually it is. Minecraft is a client-only class, which means it only exists on the client. Even if it's only referenced inside an if-statement, it will cause a crash on the server because the code contains a reference to something that doesn't exist at all.

Override the method getLightValue(IBlockState, IBlockAccess, BlockPos). In there, get the TileEntity and get the light level from it, then return that value. No need for block updates, you just need your TE to store its current light level.

Container is for server-side, GUI is for client-side.

That seems like kind of an unhealthy justification for this? If you don't enjoy it then just... go for a walk or something instead. :P It's supposed to be fun y'know?

1. Okay, I figured it out. I was confusing createNewTileEntity with createTileEnity.

2. Then how would I open the GUI?

3. so if I override it, what would the return statement be? would I leave it as super(state, world pos) or make a variable in the tile entity and return that?

4. So I made GUIHeater extend GuiContainer and implement IGuiHandler and it made me add a bunch of methods including drawGuiContainerBackgroundLayer, getServerGuiElement, and getClientGuiElement. Is there something I'm supposed to do with these? I also don't know where to put Container

5. I very much am enjoying this, it just gets frusturating at times when it won't do what you want. GRRR.

I'm having fun though :D

 

Link to comment
Share on other sites

The following is the packet code i use. Note that i have only tested on 1.10.2 but its likely to work with 1.11. Also note its slightly modified to work outside of my mod. You shouldn't need an int for what you want to do, short should work.

 

The Packet Manager thingy, basically the same as SimpleNetworkWrapper except you don't need to specify packet id numbers. Replace "YOURMODSNAME" with a unique name:

package stucuk.square.packets;

import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.relauncher.Side;

public class MCPacketSystem {
	private int count = 0;
	private SimpleNetworkWrapper INSTANCE = new MCPacketSystem("YOURMODSNAME");

	public MCPacketSystem(String name)
	{
		INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel(name);
	}	
	
	public <REQ extends IMessage, REPLY extends IMessage> void registerPacket(Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, Class<REQ> requestMessageType, Side side)
	{
		INSTANCE.registerMessage(messageHandler, requestMessageType, count, side);
		count++;
	}
	
	public SimpleNetworkWrapper instance()
	{
		return INSTANCE;
	}

	public void inc()
	{
		count++;
	}
}

 

Basic Packet Class (Its used as a base for the actual packets):

package stucuk.square.packets;

import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraftforge.fml.client.FMLClientHandler;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class MCBasicPacket implements IMessage {
	
	public void handlePacket(EntityPlayer player, Side side)
	{
		//
	}
	
	@Override
	public void fromBytes(ByteBuf buffer) {
		//
	}

	@Override
	public void toBytes(ByteBuf buffer) {
		//
	}
	
	@SideOnly(Side.CLIENT)
	public void hpc(MessageContext ctx)
	{
		handlePacket(FMLClientHandler.instance().getClient().thePlayer,ctx.side);
	}
	
	public void onMessage(MessageContext ctx) {
		
    	switch (ctx.side)
    	{
        	case CLIENT:
        		hpc(ctx);
        		break;

        	case SERVER:
        		handlePacket(ctx.getServerHandler().playerEntity,ctx.side);
        		break;

        	default:
    	}
	}
    
    public static void sendToServer(IMessage packet)
    {
    	MCPacketSystem.instance().sendToServer(packet);
    }
    
    public static void sendToPlayer(IMessage packet, EntityPlayerMP player)
    {
    	MCPacketSystem.instance().sendTo(packet, player);
    }
}

 

The actual packet class:

package stucuk.square.packets;

import java.io.IOException;

import stucuk.square.interfaces.IGUIPacketHandler;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketBuffer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;

public class PacketGUI_ClientToServer extends MCBasicPacket implements IMessage, IMessageHandler<PacketGUI_ClientToServer, IMessage> {

	private int x,y,z;
	private short value;
	private long value64;
	private float valueF;
	private ItemStack valueStack;
	private byte extra;
	private byte datatype;
	
	@Override
	public IMessage onMessage(PacketGUI_ClientToServer message, MessageContext ctx) {
		message.onMessage(ctx);
		return null;
	}
	
	public PacketGUI_ClientToServer(){
		
	}
	
    public PacketGUI_ClientToServer(int x, int y, int z, short value, byte extra){
		this.x     = x;
		this.y     = y;
		this.z     = z;
		this.value = value;
		this.extra = extra;
		this.datatype = 0;
	}
    
    public PacketGUI_ClientToServer(int x, int y, int z, long value64, byte extra){
		this.x     = x;
		this.y     = y;
		this.z     = z;
		this.value64 = value64;
		this.extra = extra;
		this.datatype = 1;
	}
    
    public PacketGUI_ClientToServer(int x, int y, int z, float valueF, byte extra){
		this.x     = x;
		this.y     = y;
		this.z     = z;
		this.valueF = valueF;
		this.extra = extra;
		this.datatype = 2;
	}
    
    public PacketGUI_ClientToServer(int x, int y, int z, ItemStack valueStack, byte extra){
		this.x     = x;
		this.y     = y;
		this.z     = z;
		this.valueStack = valueStack;
		this.extra = extra;
		this.datatype = 3;
	}
	
	@Override
	public void toBytes(ByteBuf buffer) {
		buffer.writeInt(x);
		buffer.writeInt(y);
		buffer.writeInt(z);
		buffer.writeByte(extra);
		
		buffer.writeByte(datatype);
		
		if (this.datatype == 0)
			buffer.writeShort(value);
		else
		if (this.datatype == 1)
			buffer.writeLong(value64);
		else
		if (this.datatype == 2)
			buffer.writeFloat(valueF);
		else
		if (this.datatype == 3)
		{
			PacketBuffer pb = new PacketBuffer(buffer);
			pb.writeItemStackToBuffer(valueStack);
		}
	}
	@Override
	public void fromBytes(ByteBuf buffer) {
		x     = buffer.readInt();
		y     = buffer.readInt();
		z     = buffer.readInt();
		extra = buffer.readByte();
		
		datatype = buffer.readByte();
		
		if (datatype == 0)
			value = buffer.readShort();
		else
		if (datatype == 1)
			value64 = buffer.readLong();
		else
		if (datatype == 2)
			valueF = buffer.readFloat();
		else
		if (datatype == 3)
		{
			PacketBuffer pb = new PacketBuffer(buffer);
			try {
				valueStack = pb.readItemStackFromBuffer();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void blockHandlePacket(TileEntity te, EntityPlayer player, BlockPos pos, long value, byte extra)
	{
        	((IGUIPacketHandler)te).HandleGUIPacket(player,pos,value,extra);
	}
	
	public void blockHandlePacket(TileEntity te, EntityPlayer player, BlockPos pos, float value, byte extra)
	{
        	((IGUIPacketHandler)te).HandleGUIPacket_Float(player,pos,value,extra);
	}
	
	public void blockHandlePacket(TileEntity te, EntityPlayer player, BlockPos pos, ItemStack value, byte extra)
	{
        	((IGUIPacketHandler)te).HandleGUIPacket_ItemStack(player,pos,value,extra);
	}
	
	@Override
	public void handlePacket(EntityPlayer player, Side side)
	{
		BlockPos pos = new BlockPos(x,y,z);		
		TileEntity te = player.worldObj.getTileEntity(pos);
		
		if (!(te instanceof IGUIPacketHandler))
			return;
        
		switch (this.datatype)
		{
			case (0):
				blockHandlePacket(te, player, pos, value, extra);
				break;
			case (1):
				blockHandlePacket(te, player, pos, value64, extra);
				break;
			case (2):
				blockHandlePacket(te, player, pos, valueF, extra);
				break;
			case (3):
				blockHandlePacket(te, player, pos, valueStack, extra);
				break;
		}
	}
	
	public static void sendShort(int x, int y, int z, short value, byte extra)
	{
		sendToServer(new PacketGUI_ClientToServer(x,y,z,value,extra));
	}
	
	public static void sendShort(int x, int y, int z, short value)
	{
		sendShort(x,y,z,value,(byte)0);
	}
	
	public static void sendLong(int x, int y, int z, long value, byte extra)
	{
		sendToServer(new PacketGUI_ClientToServer(x,y,z,value,extra));
	}
	
	public static void sendLong(int x, int y, int z, long value)
	{
		sendLong(x,y,z,value,(byte)0);
	}
	
	public static void sendFloat(int x, int y, int z, float value, byte extra)
	{
		sendToServer(new PacketGUI_ClientToServer(x,y,z,value,extra));
	}
	
	public static void sendFloat(int x, int y, int z, float value)
	{
		sendFloat(x,y,z,value,(byte)0);
	}
	
	public static void sendItemStack(int x, int y, int z, ItemStack value, byte extra)
	{
		sendToServer(new PacketGUI_ClientToServer(x,y,z,value,extra));
	}
	
	public static void sendItemStack(int x, int y, int z, ItemStack value)
	{
		sendItemStack(x,y,z,value,(byte)0);
	}
}

 

The IGUIPacketHandler needs to be implemented in the TileEntity:

package stucuk.square.interfaces;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;

public interface IGUIPacketHandler {
	public void HandleGUIPacket(EntityPlayer player, BlockPos pos, long value, byte extra);
	public void HandleGUIPacket_Float(EntityPlayer player, BlockPos pos, float value, byte extra);
	public void HandleGUIPacket_ItemStack(EntityPlayer player, BlockPos pos, ItemStack value, byte extra);
}

 

Example code for TileEntity:

public class BaseTileRedstone extends BaseTile implements IGUIPacketHandler {

@Override
	public void HandleGUIPacket(EntityPlayer player, BlockPos pos, long value, byte extra)
	{
		//Do Something! Short and Long values go here!
	}

	@Override
	public void HandleGUIPacket_Float(EntityPlayer player, BlockPos pos, float value, byte extra)
	{

	}

	@Override
	public void HandleGUIPacket_ItemStack(EntityPlayer player, BlockPos pos, ItemStack value, byte extra)
	{
		
	}

}

 

Registering packets:

MCPacketSystem.instance().registerPacket(PacketGUI_ClientToServer.class, PacketGUI_ClientToServer.class, Side.SERVER);

 

Usage in a GUIContainer (x,y,z needs to be the coordinates of the TileEntity):

PacketGUI_ClientToServer.sendShort(x, y, z, value, extra);

 

note that the extra value doesn't need to be passed (defaults to 0), its basically an id which is useful if you need to send more than 1 value to a TileEntity as you can identify what each number sent is for.

Link to comment
Share on other sites

1 minute ago, diesieben07 said:

 

@stucuk Sorry, but I am not sure how your post is supposed to be helpful. Just presenting a solution (and a not-great one at that) and saying "here use this" is not very useful in my opinion. If you want I will elaborate as to why your solution is not great.

People can learn from others code. I know from experience looking at actual code rather than being told the name of certain things is alot easier to understand when you can see the "Big Picture". Everything i posted is self contained clean code.

 

Who wouldn't want to know why their solution isn't good?

Link to comment
Share on other sites

4 hours ago, diesieben07 said:

True. But without explanation using someone else's code very quickly turns into cargo-culting.

 

Exactly. And that is why it invites people who are new to just copy-paste it and run with it. The aforementioned cargo-culting.

I don't think any of what i posted really needed an explanation, everything uses descriptive function/variable names which should mean self-explanatory code(People can always ask questions if they don't understand something). Cargo-cutting behaviour happens because people are impatient or lazy which will also happen when you tell them about a tutorial, which they will ignore all the descriptive text and go to the code at the bottom of it. So its a catch 22.

 

4 hours ago, diesieben07 said:

Your packet is trying to be "universal", but this leads to very clunky code. You should have one packet dedicated to each purpose, don't try to make a "one size fits all" packet, we have packet types for a reason.

 

I don't see how its bad to group it into a single packet when its just related to a single task. Overall the code is smaller with less duplication than a single packet for each. You would never want a single packet for everything but optimising code is generally a good idea when its applicable to the situation.

 

P.S I won't post further about this as this post is technically off topic and i don't want to derail further (This is a notification of intent rather than a "Please don't post after me").

Edited by stucuk
Link to comment
Share on other sites

Okay everyone. I've managed to get my problems down to two singular problems. First:

How do i get the BlockPos or specific tile entity instance into the GUI class?

Second: how does EntityPlayer::openGui work? also, double semicolons don't seem to work, so I have the statement as playerIn.openGui(SpaceHeaterMod.mod, ? what do i do with this "guiID", worldIn, pos.getX(), pos.getY(), pos.getZ());

 

how do i get a guiID? it says in the comment that it uses Forge's IGuiHandler system. Where can I apply an ID to my GUI? Or have I got the entirely wrong thing?

Link to comment
Share on other sites

48 minutes ago, its_meow said:

how do i get a guiID?

You make it up. Each Mod handles its own guiID's, which is why you provide the mods instance. Your IGuiHandler basically selects the appropriate Container/GUIContainer based on the guiID you specified.

 

If it makes it any easier you could think of loordgek's code with numbers instead of enums:

public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        TileEntity tile = world.getTileEntity(new BlockPos(x, y, z)); // Get the Tile Entity!
        switch (ID) { //Which GUI do we want?
            case 0:
                return new ContainerUpgrade(player, (TileGenBase) tile); //We want GUI 0
            case 1:
                return new ContainerFurnaceGen(player, (TileFurnaceGen) tile); //We want GUI 1
        }
        return null; // ID was invalid... return null.
}

 

If you wanted the FurnaceGen GUI you would do:

playerIn.openGui(SpaceHeaterMod.mod, 1 , worldIn, pos.getX(), pos.getY(), pos.getZ());

 

Since your passing the TileEntity to the container, you can use it to get the X/Y/Z coordinates when sending packets from the client to the server. Loordgek's GuiFurnaceGen stores the passed TileEntity in its self.

Edited by stucuk
Link to comment
Share on other sites

Okay. New main problem. The code works, up until the GuiHandler tries to define the tileEntity.

It picks up the x y z, turns it into a blockpos, and runs

world.getTileEntity(blockpos);

the problem is, by printing that, I see that it returns NULL.. It makes NO sense.

I'm sure it has the right coordinates and blockpos, they both print and I check the coord and it's exactly where my block is, but it won't find it.

 

EDIT: I now notice this may have something to do with the fact that the client is executing this. But, HOW is the server supposed to execute a GUI? I'm lost.

Edited by its_meow
Link to comment
Share on other sites

Are you sure the tile entity is actually being created? If there is no TileEntity being created it will return null when you try and get it.

 

 

The onBlockActivated is called on both client and server, though as diesieben07 sais you want to call it on the server side.

 

public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
{
	if(!world.isRemote)
		player.openGui(SpaceHeaterMod.mod, 1 , world, pos.getX(), pos.getY(), pos.getZ());
    	
	return true;
}

 

If we look at a trimmed down IGuiHandler you can see it specifies a bit for server and client. Forge does all the work at deciding which is called. You just tell it what to open and it then calls getServerGuiElement or getClientElement when needed:

 

public class GuiHander implements IGuiHandler {

    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        return null; // We return a Server GUI Here (one that extends Container)
    }

    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        return null; // We return a Client GUI Here (one that extends GUIContainer)
    }
}

 

Link to comment
Share on other sites

I Figured it out.

deisie, my block has to extend BlockContainer, those methods weren't making the tileEntity for some reason

 

EDIT: I also know each GUI and GUI value are unique now  because when it prints the tilentity it has an @ (randomid)

I just need to adjust some math in my GUI and it should be almost ready

 

I may have just one more issue though if the light value isn't working right

Edited by its_meow
Link to comment
Share on other sites

6 minutes ago, stucuk said:

im guessing that the following is still the way to do things:


public class SomeClassName extends Block implements ITileEntityProvider {
@Override
	public TileEntity createNewTileEntity(World worldIn, int meta)
	{
		return new SomeTileEntityClass(someparameters);
	}
}

 

Yeah.

Also, I have a similar thing to your packet system, but do I have to register IGuiPacketHandler somewhere? because the packet isn't being recieved by the handler in the tileenity

EDIT:

Okay, it is registered in the Packet file, which is registered as the Handler in the manager, but it's not working... hm

Edited by its_meow
Link to comment
Share on other sites

Just now, diesieben07 said:

No, it is not. Do not implement ITileEntityProvider. Override hasTileEntity and createTileEntity.

I had it like that, and the tile entity was just null.

It looked like this :

@Override
	public boolean hasTileEntity() {
		return true;
	}
	
	@Override
	public TileEntity createTileEntity(World world, IBlockState state) {
		return new TileEntitySpaceHeater();
	}

 

Link to comment
Share on other sites

Just now, diesieben07 said:

So you completely ignored the deprecation warning on hasTileEntity(). Good for you, don't expect things to work then. Seriously, why do people just not pay attention? There is a giant fucking line through it, does that scream "Please use me, this is the method you want!" to you? Or what? Seriously, I am trying to figure this out.

 

8tBm8nv.png

Yup, checks out. This looks totally fine and totally not like it could cause problems.

That's what it looks like in my block.

you're the one that told me to override it?

Edited by its_meow
Link to comment
Share on other sites

10 minutes ago, its_meow said:

Yeah.

Also, I have a similar thing to your packet system, but do I have to register IGuiPacketHandler somewhere? because the packet isn't being recieved by the handler in the tileenity

Assuming you have the same basic code as i posted for my packets handlepacket bit, In your TileEntity you need to implement it in the implements bit.

 

I.E:

public class BaseTileRedstone extends BaseTile implements IGUIPacketHandler {

	@Override
	public void HandleGUIPacket(EntityPlayer player, BlockPos pos, long value, byte extra)
	{
		//Do Something! Short and Long values go here!
	}

	@Override
	public void HandleGUIPacket_Float(EntityPlayer player, BlockPos pos, float value, byte extra)
	{

	}

	@Override
	public void HandleGUIPacket_ItemStack(EntityPlayer player, BlockPos pos, ItemStack value, byte extra)
	{
		
	}

}

 

Interfaces which the IGUIPacketHandler is, basically lay out stuff a thing should have. When you use the implements bit your stating what interfaces that class supports (Well implements). You can then treat that class as if it was that interface.

 

Basically it allows you to do:

TileEntity te = new MyTileEntity();


if (te instanceof IGUIPacketHandler) //Check its actually implemented the interface
{
	((IGUIPacketHandler)te).HandleGUIPacket(player,pos,1,0); //we can now treat the TileEntity as if it was a IGUIPacketHandler
}

 

 

Link to comment
Share on other sites

3 minutes ago, diesieben07 said:

Yes, I told you to override hasTileEntity. But that assumed that you apply some common sense and choose the obviously right one, the one that does not have a giant "do not use me" line through it:

 

cwFnSZu.png

I don't have a thing that tells me which one to choose when I override, I just have to type it in, so I had no idea

 

EDIT: Plus, eclipse override/implement method doesn't tell you if it's deprecated. At all.

 

Edited by its_meow
Link to comment
Share on other sites

Just now, stucuk said:

In the guys defensive i never even knew you could get the IDE to generate an override method using the AutoComplete feature. Iv been playing with it since 2014 (And other languages for alot longer).

You have to go in eclipse keybinds and search for Override/Implement and set a shortcut. IDEA i think already has it as a shortcut.

Link to comment
Share on other sites

3 minutes ago, diesieben07 said:

Or at least look at the parent class

Quite.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

1 minute ago, its_meow said:

You have to go in eclipse keybinds and search for Override/Implement and set a shortcut. IDEA i think already has it as a shortcut.

I use eclipse and never have touched the keybindings. By Autocomplete i mean the CTRL+SPACE thing. I just didn't know you could do it for actual method overrides.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hello, I'm trying to modify the effects of native enchantments for bows and arrows in Minecraft. After using a decompilation tool, I found that the specific implementations of native bow and arrow enchantments (including `ArrowDamageEnchantment`, `ArrowKnockbackEnchantment`, `ArrowFireEnchantment`, `ArrowInfiniteEnchantment`, `ArrowPiercingEnchantment`) do not contain any information about the enchantment effects (such as the `getDamageProtection` function for `ProtectionEnchantment`, `getDamageBonus` function for `DamageEnchantment`, etc.). Upon searching for the base class of arrows, `AbstractArrow`, I found a function named setEnchantmentEffectsFromEntity`, which seems to be used to retrieve the enchantment levels of the tool held by a `LivingEntity` and calculate the specific values of the enchantment effects. However, after testing with the following code, I found that this function is not being called:   @Mixin(AbstractArrow.class) public class ModifyArrowEnchantmentEffects {     private static final Logger LOGGER = LogUtils.getLogger();     @Inject(         method = "setEnchantmentEffectsFromEntity",         at = @At("HEAD")     )     private void logArrowEnchantmentEffectsFromEntity(CallbackInfo ci) {         LOGGER.info("Arrow enchantment effects from entity");     } }   Upon further investigation, I found that within the onHitEntity method, there are several lines of code:               if (!this.level().isClientSide &amp;&amp; entity1 instanceof LivingEntity) {                EnchantmentHelper.doPostHurtEffects(livingentity, entity1);                EnchantmentHelper.doPostDamageEffects((LivingEntity)entity1, livingentity);             }   These lines of code actually call the doPostHurt and doPostAttack methods of each enchantment in the enchantment list. However, this leads back to the issue because native bow and arrow enchantments do not implement these functions. Although their base class defines the functions, they are empty. At this point, I'm completely stumped and seeking assistance. Thank you.
    • I have been trying to make a server with forge but I keep running into an issue. I have jdk 22 installed as well as Java 8. here is the debug file  
    • it crashed again     What the console says : [00:02:03] [Server thread/INFO] [Easy NPC/]: [EntityManager] Server started! [00:02:03] [Server thread/INFO] [co.gi.al.ic.IceAndFire/]: {iceandfire:fire_dragon_roost=true, iceandfire:fire_lily=true, iceandfire:spawn_dragon_skeleton_fire=true, iceandfire:lightning_dragon_roost=true, iceandfire:spawn_dragon_skeleton_lightning=true, iceandfire:ice_dragon_roost=true, iceandfire:ice_dragon_cave=true, iceandfire:lightning_dragon_cave=true, iceandfire:cyclops_cave=true, iceandfire:spawn_wandering_cyclops=true, iceandfire:spawn_sea_serpent=true, iceandfire:frost_lily=true, iceandfire:hydra_cave=true, iceandfire:lightning_lily=true, iceandfireixie_village=true, iceandfire:myrmex_hive_jungle=true, iceandfire:myrmex_hive_desert=true, iceandfire:silver_ore=true, iceandfire:siren_island=true, iceandfire:spawn_dragon_skeleton_ice=true, iceandfire:spawn_stymphalian_bird=true, iceandfire:fire_dragon_cave=true, iceandfire:sapphire_ore=true, iceandfire:spawn_hippocampus=true, iceandfire:spawn_death_worm=true} [00:02:03] [Server thread/INFO] [co.gi.al.ic.IceAndFire/]: {TROLL_S=true, HIPPOGRYPH=true, AMPHITHERE=true, COCKATRICE=true, TROLL_M=true, DREAD_LICH=true, TROLL_F=true} [00:02:03] [Server thread/INFO] [ne.be.lo.WeaponRegistry/]: Encoded Weapon Attribute registry size (with package overhead): 41976 bytes (in 5 string chunks with the size of 10000) [00:02:03] [Server thread/INFO] [patchouli/]: Sending reload packet to clients [00:02:03] [Server thread/WARN] [voicechat/]: [voicechat] Running in offline mode - Voice chat encryption is not secure! [00:02:03] [VoiceChatServerThread/INFO] [voicechat/]: [voicechat] Using server-ip as bind address: 0.0.0.0 [00:02:03] [Server thread/WARN] [ModernFix/]: Dedicated server took 22.521 seconds to load [00:02:03] [VoiceChatServerThread/INFO] [voicechat/]: [voicechat] Voice chat server started at 0.0.0.0:25565 [00:02:03] [Server thread/WARN] [minecraft/SynchedEntityData]: defineId called for: class net.minecraft.world.entity.player.Player from class tschipp.carryon.common.carry.CarryOnDataManager [00:02:03] [Server thread/INFO] [ne.mi.co.AdvancementLoadFix/]: Using new advancement loading for net.minecraft.server.PlayerAdvancements@2941ffd5 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 0 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 1 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 2 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 3 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 4 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 5 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 6 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 7 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 8 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 9 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 10 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 11 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 12 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 13 [00:02:10] [Netty Epoll Server IO #2/INFO] [Calio/]: Received acknowledgment for login packet with id 14 [00:02:19] [Server thread/INFO] [ne.mi.co.AdvancementLoadFix/]: Using new advancement loading for net.minecraft.server.PlayerAdvancements@ebc7ef2 [00:02:19] [Server thread/INFO] [minecraft/PlayerList]: ZacAdos[/90.2.17.162:49242] logged in with entity id 1062 at (-1848.6727005281205, 221.0, -3054.2468255848935) [00:02:19] [Server thread/ERROR] [ModernFix/]: Skipping entity ID sync for com.talhanation.smallships.world.entity.ship.Ship: java.lang.NoClassDefFoundError: net/minecraft/client/CameraType [00:02:19] [Server thread/INFO] [minecraft/MinecraftServer]: - Gloop - ZacAdos joined the game [00:02:19] [Server thread/INFO] [xa.pa.OpenPartiesAndClaims/]: Updating all forceload tickets for cc56befd-d376-3526-a760-340713c478bd [00:02:19] [Server thread/INFO] [se.mi.te.da.DataManager/]: Sending data to client: ZacAdos [00:02:19] [Server thread/INFO] [voicechat/]: [voicechat] Received secret request of - Gloop - ZacAdos (17) [00:02:19] [Server thread/INFO] [voicechat/]: [voicechat] Sent secret to - Gloop - ZacAdos [00:02:21] [VoiceChatPacketProcessingThread/INFO] [voicechat/]: [voicechat] Successfully authenticated player cc56befd-d376-3526-a760-340713c478bd [00:02:22] [VoiceChatPacketProcessingThread/INFO] [voicechat/]: [voicechat] Successfully validated connection of player cc56befd-d376-3526-a760-340713c478bd [00:02:22] [VoiceChatPacketProcessingThread/INFO] [voicechat/]: [voicechat] Player - Gloop - ZacAdos (cc56befd-d376-3526-a760-340713c478bd) successfully connected to voice chat stop [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping the server [00:02:34] [Server thread/INFO] [mo.pl.ar.ArmourersWorkshop/]: stop local service [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping server [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Saving players [00:02:34] [Server thread/INFO] [minecraft/ServerGamePacketListenerImpl]: ZacAdos lost connection: Server closed [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: - Gloop - ZacAdos left the game [00:02:34] [Server thread/INFO] [xa.pa.OpenPartiesAndClaims/]: Updating all forceload tickets for cc56befd-d376-3526-a760-340713c478bd [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Saving worlds [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:overworld [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_end [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_nether [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (world): All chunks are saved [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved [00:02:34] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage: All dimensions are saved [00:02:34] [Server thread/INFO] [xa.pa.OpenPartiesAndClaims/]: Stopping IO worker... [00:02:34] [Server thread/INFO] [xa.pa.OpenPartiesAndClaims/]: Stopped IO worker! [00:02:34] [Server thread/INFO] [Calio/]: Removing Dynamic Registries for: net.minecraft.server.dedicated.DedicatedServer@7dc879e1 [MineStrator Daemon]: Checking server disk space usage, this could take a few seconds... [MineStrator Daemon]: Updating process configuration files... [MineStrator Daemon]: Ensuring file permissions are set correctly, this could take a few seconds... [MineStrator Daemon]: Pulling Docker container image, this could take a few minutes to complete... [MineStrator Daemon]: Finished pulling Docker container image container@pterodactyl~ java -version openjdk version "17.0.10" 2024-01-16 OpenJDK Runtime Environment Temurin-17.0.10+7 (build 17.0.10+7) OpenJDK 64-Bit Server VM Temurin-17.0.10+7 (build 17.0.10+7, mixed mode, sharing) container@pterodactyl~ java -Xms128M -Xmx6302M -Dterminal.jline=false -Dterminal.ansi=true -Djline.terminal=jline.UnsupportedTerminal -p libraries/cpw/mods/bootstraplauncher/1.1.2/bootstraplauncher-1.1.2.jar:libraries/cpw/mods/securejarhandler/2.1.4/securejarhandler-2.1.4.jar:libraries/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar:libraries/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar:libraries/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar:libraries/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar:libraries/org/ow2/asm/asm/9.5/asm-9.5.jar:libraries/net/minecraftforge/JarJarFileSystems/0.3.16/JarJarFileSystems-0.3.16.jar --add-modules ALL-MODULE-PATH --add-opens java.base/java.util.jar=cpw.mods.securejarhandler --add-opens java.base/java.lang.invoke=cpw.mods.securejarhandler --add-exports java.base/sun.security.util=cpw.mods.securejarhandler --add-exports jdk.naming.dns/com.sun.jndi.dns=java.naming -Djava.net.preferIPv6Addresses=system -DignoreList=bootstraplauncher-1.1.2.jar,securejarhandler-2.1.4.jar,asm-commons-9.5.jar,asm-util-9.5.jar,asm-analysis-9.5.jar,asm-tree-9.5.jar,asm-9.5.jar,JarJarFileSystems-0.3.16.jar -DlibraryDirectory=libraries -DlegacyClassPath=libraries/cpw/mods/securejarhandler/2.1.4/securejarhandler-2.1.4.jar:libraries/org/ow2/asm/asm/9.5/asm-9.5.jar:libraries/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar:libraries/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar:libraries/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar:libraries/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar:libraries/net/minecraftforge/accesstransformers/8.0.4/accesstransformers-8.0.4.jar:libraries/org/antlr/antlr4-runtime/4.9.1/antlr4-runtime-4.9.1.jar:libraries/net/minecraftforge/eventbus/6.0.3/eventbus-6.0.3.jar:libraries/net/minecraftforge/forgespi/6.0.0/forgespi-6.0.0.jar:libraries/net/minecraftforge/coremods/5.0.1/coremods-5.0.1.jar:libraries/cpw/mods/modlauncher/10.0.8/modlauncher-10.0.8.jar:libraries/net/minecraftforge/unsafe/0.2.0/unsafe-0.2.0.jar:libraries/com/electronwill/night-config/core/3.6.4/core-3.6.4.jar:libraries/com/electronwill/night-config/toml/3.6.4/toml-3.6.4.jar:libraries/org/apache/maven/maven-artifact/3.8.5/maven-artifact-3.8.5.jar:libraries/net/jodah/typetools/0.8.3/typetools-0.8.3.jar:libraries/net/minecrell/terminalconsoleappender/1.2.0/terminalconsoleappender-1.2.0.jar:libraries/org/jline/jline-reader/3.12.1/jline-reader-3.12.1.jar:libraries/org/jline/jline-terminal/3.12.1/jline-terminal-3.12.1.jar:libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar:libraries/org/openjdk/nashorn/nashorn-core/15.3/nashorn-core-15.3.jar:libraries/net/minecraftforge/JarJarSelector/0.3.16/JarJarSelector-0.3.16.jar:libraries/net/minecraftforge/JarJarMetadata/0.3.16/JarJarMetadata-0.3.16.jar:libraries/net/minecraftforge/fmlloader/1.19.2-43.3.0/fmlloader-1.19.2-43.3.0.jar:libraries/net/minecraft/server/1.19.2-20220805.130853/server-1.19.2-20220805.130853-extra.jar:libraries/com/github/oshi/oshi-core/5.8.5/oshi-core-5.8.5.jar:libraries/com/google/code/gson/gson/2.8.9/gson-2.8.9.jar:libraries/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar:libraries/com/google/guava/guava/31.0.1-jre/guava-31.0.1-jre.jar:libraries/com/mojang/authlib/3.11.49/authlib-3.11.49.jar:libraries/com/mojang/brigadier/1.0.18/brigadier-1.0.18.jar:libraries/com/mojang/datafixerupper/5.0.28/datafixerupper-5.0.28.jar:libraries/com/mojang/javabridge/1.2.24/javabridge-1.2.24.jar:libraries/com/mojang/logging/1.0.0/logging-1.0.0.jar:libraries/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar:libraries/io/netty/netty-buffer/4.1.77.Final/netty-buffer-4.1.77.Final.jar:libraries/io/netty/netty-codec/4.1.77.Final/netty-codec-4.1.77.Final.jar:libraries/io/netty/netty-common/4.1.77.Final/netty-common-4.1.77.Final.jar:libraries/io/netty/netty-handler/4.1.77.Final/netty-handler-4.1.77.Final.jar:libraries/io/netty/netty-resolver/4.1.77.Final/netty-resolver-4.1.77.Final.jar:libraries/io/netty/netty-transport/4.1.77.Final/netty-transport-4.1.77.Final.jar:libraries/io/netty/netty-transport-classes-epoll/4.1.77.Final/netty-transport-classes-epoll-4.1.77.Final.jar:libraries/io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-x86_64.jar:libraries/io/netty/netty-transport-native-epoll/4.1.77.Final/netty-transport-native-epoll-4.1.77.Final-linux-aarch_64.jar:libraries/io/netty/netty-transport-native-unix-common/4.1.77.Final/netty-transport-native-unix-common-4.1.77.Final.jar:libraries/it/unimi/dsi/fastutil/8.5.6/fastutil-8.5.6.jar:libraries/net/java/dev/jna/jna/5.10.0/jna-5.10.0.jar:libraries/net/java/dev/jna/jna-platform/5.10.0/jna-platform-5.10.0.jar:libraries/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar:libraries/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar:libraries/org/apache/logging/log4j/log4j-api/2.17.0/log4j-api-2.17.0.jar:libraries/org/apache/logging/log4j/log4j-core/2.17.0/log4j-core-2.17.0.jar:libraries/org/apache/logging/log4j/log4j-slf4j18-impl/2.17.0/log4j-slf4j18-impl-2.17.0.jar:libraries/org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar cpw.mods.bootstraplauncher.BootstrapLauncher --launchTarget forgeserver --fml.forgeVersion 43.3.0 --fml.mcVersion 1.19.2 --fml.forgeGroup net.minecraftforge --fml.mcpVersion 20220805.130853 [00:02:42] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, forgeserver, --fml.forgeVersion, 43.3.0, --fml.mcVersion, 1.19.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220805.130853] [00:02:42] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 10.0.8+10.0.8+main.0ef7e830 starting: java version 17.0.10 by Eclipse Adoptium; OS Linux arch amd64 version 6.1.0-12-amd64 [00:02:43] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/home/container/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2363!/ Service=ModLauncher Env=SERVER [00:02:43] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/fmlcore/1.19.2-43.3.0/fmlcore-1.19.2-43.3.0.jar is missing mods.toml file [00:02:43] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/javafmllanguage/1.19.2-43.3.0/javafmllanguage-1.19.2-43.3.0.jar is missing mods.toml file [00:02:43] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/lowcodelanguage/1.19.2-43.3.0/lowcodelanguage-1.19.2-43.3.0.jar is missing mods.toml file [00:02:43] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/mclanguage/1.19.2-43.3.0/mclanguage-1.19.2-43.3.0.jar is missing mods.toml file [00:02:44] [main/WARN] [ne.mi.ja.se.JarSelector/]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [00:02:44] [main/WARN] [ne.mi.ja.se.JarSelector/]: Attempted to select a dependency jar for JarJar which was passed in as source: resourcefullib. Using Mod File: /home/container/mods/resourcefullib-forge-1.19.2-1.1.24.jar [00:02:44] [main/INFO] [ne.mi.fm.lo.mo.JarInJarDependencyLocator/]: Found 13 dependencies adding them to mods collection Latest log [29Mar2024 00:02:42.803] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, forgeserver, --fml.forgeVersion, 43.3.0, --fml.mcVersion, 1.19.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220805.130853] [29Mar2024 00:02:42.805] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher 10.0.8+10.0.8+main.0ef7e830 starting: java version 17.0.10 by Eclipse Adoptium; OS Linux arch amd64 version 6.1.0-12-amd64 [29Mar2024 00:02:43.548] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/home/container/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2363!/ Service=ModLauncher Env=SERVER [29Mar2024 00:02:43.876] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/fmlcore/1.19.2-43.3.0/fmlcore-1.19.2-43.3.0.jar is missing mods.toml file [29Mar2024 00:02:43.877] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/javafmllanguage/1.19.2-43.3.0/javafmllanguage-1.19.2-43.3.0.jar is missing mods.toml file [29Mar2024 00:02:43.877] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/lowcodelanguage/1.19.2-43.3.0/lowcodelanguage-1.19.2-43.3.0.jar is missing mods.toml file [29Mar2024 00:02:43.878] [main/WARN] [net.minecraftforge.fml.loading.moddiscovery.ModFileParser/LOADING]: Mod file /home/container/libraries/net/minecraftforge/mclanguage/1.19.2-43.3.0/mclanguage-1.19.2-43.3.0.jar is missing mods.toml file [29Mar2024 00:02:44.033] [main/WARN] [net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select two dependency jars from JarJar which have the same identification: Mod File: and Mod File: . Using Mod File: [29Mar2024 00:02:44.034] [main/WARN] [net.minecraftforge.jarjar.selection.JarSelector/]: Attempted to select a dependency jar for JarJar which was passed in as source: resourcefullib. Using Mod File: /home/container/mods/resourcefullib-forge-1.19.2-1.1.24.jar [29Mar2024 00:02:44.034] [main/INFO] [net.minecraftforge.fml.loading.moddiscovery.JarInJarDependencyLocator/]: Found 13 dependencies adding them to mods collection
    • I am unable to do that. Brigadier is a mojang library that parses commands.
  • Topics

×
×
  • Create New...

Important Information

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