Jump to content

[1.8] How to manipulate textures for entities?


Warix

Recommended Posts

Hello, i need to change look of texture ( change its color ) , eg. when i right click with some item on mob it will make it blue. Any clue how to do this? Besides making custom entity with different texture and replacing it with existing entity.

Something like this ( i done it with replacing and custom textures , but i need it other way)

width=800 height=423http://s18.postimg.org/95r39k115/2015_08_25_19_53_17.png[/img]

:D
Link to comment
Share on other sites

I think you should register custom renderer for the entity.

You can process some GL calls in the Render#doRender(...), and call the original renderer's Render#doRender there.

 

And to change color, you can call GL11.glColor(r, g, b, alpha) or GL11.glColor(r, g, b).

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

IEEP:

 

package ga.warixmods.akamegakillmod.events.extendedproperties;

 

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLiving;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraft.world.World;

import net.minecraftforge.common.IExtendedEntityProperties;

 

public class EntityExtendedProperties implements IExtendedEntityProperties {

protected EntityLiving theEntity;

protected World theWorld;

protected boolean isFrozen;

public final static String extendedPropertiesName = "AGKM:EPEntity";

 

@Override

public void saveNBTData(NBTTagCompound parCompound) {

NBTTagCompound compound = new NBTTagCompound();

compound.setBoolean("AGKM:isFrozen", false);

 

}

 

public static EntityExtendedProperties get(EntityLiving living)

{

return (EntityExtendedProperties) living.getExtendedProperties(extendedPropertiesName);

}

@Override

public void loadNBTData(NBTTagCompound compound) {

        this.isFrozen = compound.getBoolean("AGKM:isFrozen");

 

 

}

 

@Override

public void init(Entity entity, World world) {

theEntity = (EntityLiving) entity;

theWorld = world;

 

}

public void setFrozen(boolean state)

{

this.isFrozen = state;

}

public boolean getFrozen()

{

return this.isFrozen;

}

}

 

 

Rendering:

 

package ga.warixmods.akamegakillmod.events;

 

import org.lwjgl.opengl.GL11;

 

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import net.minecraft.client.renderer.GlStateManager;

import net.minecraft.client.renderer.OpenGlHelper;

import net.minecraft.entity.EntityLiving;

import net.minecraft.util.ResourceLocation;

import net.minecraftforge.client.event.RenderLivingEvent;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class OnRenderEntityLiving {

 

private boolean isFrozen;

 

public OnRenderEntityLiving()

{

MinecraftForge.EVENT_BUS.register(this);

}

@SubscribeEvent

public void RenderLivingEvent(RenderLivingEvent.Pre event)

{

 

EntityExtendedProperties props = EntityExtendedProperties.get((EntityLiving) event.entity);

isFrozen = props.getFrozen();

if(isFrozen)

{

GlStateManager.pushMatrix();

GL11.glColor3f(1.2f, 1.0f, 0.8f);

GlStateManager.popMatrix();

 

}

 

}

}

 

 

Entity constructing:

 

package ga.warixmods.akamegakillmod.events;

 

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import net.minecraft.entity.EntityLiving;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class OnEntityConstructing {

public OnEntityConstructing()

{

MinecraftForge.EVENT_BUS.register(this);

}

 

@SubscribeEvent

public void onEntityConstructing(EntityConstructing event) {

 

if(event.entity instanceof EntityLiving)

{

 

event.entity.registerExtendedProperties("AGKM:EPEntity", new EntityExtendedProperties());

 

 

}

 

}

}

 

 

Setting data:

 

package ga.warixmods.akamegakillmod.events;

import java.util.Random;

 

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozen;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenBat;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenBlaze;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenCaveSpider;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenChicken;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenCreeper;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenDragon;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenEnderMite;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenEnderman;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenGhast;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenGolem;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenGuardian;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenHorse;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenMagmaCube;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenMooshroom;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenOcelot;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenPig;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenPigZombie;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenRabbit;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSheep;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSilverfish;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSkeleton;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSlime;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSpider;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenSquid;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenVillager;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenWitch;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenWither;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenWolf;

import ga.warixmods.akamegakillmod.entity.frozen.EntityFrozenZombie;

import ga.warixmods.akamegakillmod.entity.special.EntityRocketLauncher;

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import ga.warixmods.akamegakillmod.init.AkameItems;

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLiving;

import net.minecraft.entity.boss.EntityDragon;

import net.minecraft.entity.boss.EntityWither;

import net.minecraft.entity.monster.EntityBlaze;

import net.minecraft.entity.monster.EntityCaveSpider;

import net.minecraft.entity.monster.EntityCreeper;

import net.minecraft.entity.monster.EntityEnderman;

import net.minecraft.entity.monster.EntityEndermite;

import net.minecraft.entity.monster.EntityGhast;

import net.minecraft.entity.monster.EntityGolem;

import net.minecraft.entity.monster.EntityGuardian;

import net.minecraft.entity.monster.EntityMagmaCube;

import net.minecraft.entity.monster.EntityPigZombie;

import net.minecraft.entity.monster.EntitySilverfish;

import net.minecraft.entity.monster.EntitySkeleton;

import net.minecraft.entity.monster.EntitySlime;

import net.minecraft.entity.monster.EntitySpider;

import net.minecraft.entity.monster.EntityWitch;

import net.minecraft.entity.monster.EntityZombie;

import net.minecraft.entity.passive.EntityBat;

import net.minecraft.entity.passive.EntityChicken;

import net.minecraft.entity.passive.EntityCow;

import net.minecraft.entity.passive.EntityHorse;

import net.minecraft.entity.passive.EntityMooshroom;

import net.minecraft.entity.passive.EntityOcelot;

import net.minecraft.entity.passive.EntityPig;

import net.minecraft.entity.passive.EntityRabbit;

import net.minecraft.entity.passive.EntitySheep;

import net.minecraft.entity.passive.EntitySquid;

import net.minecraft.entity.passive.EntityVillager;

import net.minecraft.entity.passive.EntityWolf;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraft.potion.PotionEffect;

import net.minecraft.world.World;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.event.entity.player.EntityInteractEvent;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class FreezeEntity {

 

 

public FreezeEntity()

{

MinecraftForge.EVENT_BUS.register(this);

}

@SubscribeEvent

    public void EntityInteractEvent(EntityInteractEvent event) {

World worldIn = event.entityPlayer.worldObj;

EntityPlayer playerIn = event.entityPlayer;

Entity target = event.target;

Random rand = new Random();

 

if(playerIn.getHeldItem() != null)

{

 

 

 

//freeze wand

if(playerIn.getHeldItem().hasTagCompound() && event.entityPlayer.getHeldItem().getItem() == AkameItems.demons_extract_wand)

{

if( event.entityPlayer.getHeldItem().getTagCompound().hasKey("id") && event.entityPlayer.getHeldItem().getTagCompound().getInteger("id") == 3)

{

EntityFrozenChicken e = new EntityFrozenChicken(worldIn);

 

boolean is = false;

boolean is2 = true;

boolean isFrozen = false;

if(target instanceof EntityLiving)

{

EntityExtendedProperties props = EntityExtendedProperties.get((EntityLiving) target);

props.setFrozen(true);

 

}

 

 

//lands of closed braces

 

 

}

}

}

 

}

 

 

}

 

   

 

 

 

:D
Link to comment
Share on other sites

public class EntityExtendedProperties implements IExtendedEntityProperties
{
protected EntityLivingBase theEntity;
protected boolean isFrozen;
public final static String IEEP_NAME = "AGKMEPEntity";

public static EntityExtendedProperties get(EntityLivingBase entity)
{
	return (EntityExtendedProperties) entity.getExtendedProperties(IEEP_NAME);
}

@Override
public void saveNBTData(NBTTagCompound nbt)
{
	NBTTagCompound data = new NBTTagCompound();
	data.setBoolean("isFrozen", this.isFrozen());
	nbt.setTag(IEEP_NAME, data);
}

@Override
public void loadNBTData(NBTTagCompound nbt)
{   
	NBTTagCompound data = nbt.getCompoundTag(IEEP_NAME);
	this.isFrozen = data.getBoolean("isFrozen");
}

@Override
public void init(Entity entity, World world)
{
	this.theEntity = (EntityLivingBase) entity;
}

public boolean isFrozen()
{
	return this.isFrozen;
}

public void setFrozen(boolean state)
{
	this.isFrozen = state;
}
}

 

* Don't use colons, bro, jsut don't.

* You don't need world field - its alredy inside entity.

* Use EntityLivingBase, not EntityLiving.

* That's how you use NBT.

* Learn Java conventions (static = capitals)

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

I just changed what you said:

IEEP:

 

package ga.warixmods.akamegakillmod.events.extendedproperties;

 

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLivingBase;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraft.world.World;

import net.minecraftforge.common.IExtendedEntityProperties;

 

public class EntityExtendedProperties implements IExtendedEntityProperties {

protected EntityLivingBase theEntity;

protected boolean isFrozen;

public final static String IEEP_NAME = "AGKMEPEntity";

 

public static EntityExtendedProperties get(EntityLivingBase entity)

{

return (EntityExtendedProperties) entity.getExtendedProperties(IEEP_NAME);

}

 

@Override

public void saveNBTData(NBTTagCompound nbt)

{

NBTTagCompound data = new NBTTagCompound();

data.setBoolean("isFrozen", this.isFrozen());

nbt.setTag(IEEP_NAME, data);

}

 

@Override

public void loadNBTData(NBTTagCompound nbt)

NBTTagCompound data = nbt.getCompoundTag(IEEP_NAME);

this.isFrozen = data.getBoolean("isFrozen");

}

 

@Override

public void init(Entity entity, World world)

{

this.theEntity = (EntityLivingBase) entity;

}

 

public boolean isFrozen()

{

return this.isFrozen;

}

 

public void setFrozen(boolean state)

{

this.isFrozen = state;

}

}

 

Rendering:

 

package ga.warixmods.akamegakillmod.events;

 

import org.lwjgl.opengl.GL11;

 

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import net.minecraft.client.renderer.GlStateManager;

import net.minecraft.entity.EntityLivingBase;

import net.minecraftforge.client.event.RenderLivingEvent;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class OnRenderEntityLiving {

 

private boolean isFrozen;

 

public OnRenderEntityLiving()

{

MinecraftForge.EVENT_BUS.register(this);

}

@SubscribeEvent

public void RenderLivingEvent(RenderLivingEvent.Pre event)

{

 

EntityExtendedProperties props = EntityExtendedProperties.get((EntityLivingBase) event.entity);

isFrozen = props.isFrozen();

if(isFrozen)

{

GlStateManager.pushMatrix();

GL11.glColor3f(1.2f, 1.0f, 0.8f);

GlStateManager.popMatrix();

 

}

 

}

}

 

 

 

Setting data:

 

package ga.warixmods.akamegakillmod.events;

import ga.warixmods.akamegakillmod.entity.special.EntityRocketLauncher;

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import ga.warixmods.akamegakillmod.init.AkameItems;

import net.minecraft.entity.Entity;

import net.minecraft.entity.EntityLiving;

import net.minecraft.entity.EntityLivingBase;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.potion.PotionEffect;

import net.minecraft.world.World;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.event.entity.player.EntityInteractEvent;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class FreezeEntity {

 

 

public FreezeEntity()

{

MinecraftForge.EVENT_BUS.register(this);

}

@SubscribeEvent

    public void EntityInteractEvent(EntityInteractEvent event) {

World worldIn = event.entityPlayer.worldObj;

 

EntityPlayer playerIn = event.entityPlayer;

Entity target = event.target;

 

 

if(playerIn.getHeldItem() != null)

{

 

 

 

//freeze wand

if(playerIn.getHeldItem().hasTagCompound() && event.entityPlayer.getHeldItem().getItem() == AkameItems.demons_extract_wand)

{

if( event.entityPlayer.getHeldItem().getTagCompound().hasKey("id") && event.entityPlayer.getHeldItem().getTagCompound().getInteger("id") == 3)

{

 

 

boolean is = false;

boolean is2 = true;

boolean isFrozen = false;

if(target instanceof EntityLivingBase)

{

EntityExtendedProperties props = EntityExtendedProperties.get((EntityLivingBase) target);

props.setFrozen(true);

 

}

 

 

 

 

 

}

}

}

 

}

 

 

}

 

   

 

 

 

 

Registering on entity construction:

 

package ga.warixmods.akamegakillmod.events;

 

import ga.warixmods.akamegakillmod.events.extendedproperties.EntityExtendedProperties;

import net.minecraft.entity.EntityLivingBase;

import net.minecraftforge.common.MinecraftForge;

import net.minecraftforge.event.entity.EntityEvent.EntityConstructing;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

 

public class OnEntityConstructing {

public OnEntityConstructing()

{

MinecraftForge.EVENT_BUS.register(this);

}

 

@SubscribeEvent

public void onEntityConstructing(EntityConstructing event) {

 

if(event.entity instanceof EntityLivingBase)

{

 

event.entity.registerExtendedProperties("AGKMEPEntity", new EntityExtendedProperties());

 

 

}

 

}

}

 

 

 

:D
Link to comment
Share on other sites

It does save, you need packets to synch cows after they load (loading is server side).

 

Also, I've cleaned up your code:

public class EntityExtendedProperties implements IExtendedEntityProperties
{
protected EntityLivingBase theEntity;
protected boolean isFrozen;
public final static String IEEP_NAME = "AGKMEPEntity";

public EntityExtendedProperties(EntityLivingBase entity)
{
	this.theEntity = entity;
}

public static void register(EntityLivingBase entity)
{
	entity.registerExtendedProperties(IEEP_NAME, new EntityExtendedProperties(entity));
}

public static EntityExtendedProperties get(EntityLivingBase entity)
{
	return (EntityExtendedProperties) entity.getExtendedProperties(IEEP_NAME);
}

@Override
public void saveNBTData(NBTTagCompound nbt)
{
	NBTTagCompound data = new NBTTagCompound();
	data.setBoolean("isFrozen", this.isFrozen());
	nbt.setTag(IEEP_NAME, data);
	System.out.println(nbt);
}

@Override
public void loadNBTData(NBTTagCompound nbt)
{
	NBTTagCompound data = nbt.getCompoundTag(IEEP_NAME);
	this.isFrozen = data.getBoolean("isFrozen");
	System.out.println(nbt);
}

@Override
public void init(Entity entity, World world)
{}

public boolean isFrozen()
{
	return this.isFrozen;
}

public void setFrozen(boolean state)
{
	this.isFrozen = state;
}
}

public class ForgeEvents
{
@SubscribeEvent
public void onEntityConstructing(EntityConstructing event)
{
	if (event.entity instanceof EntityLivingBase)
	{
		EntityExtendedProperties.register((EntityLivingBase) event.entity);
	}
}

@SubscribeEvent
public void EntityInteractEvent(EntityInteractEvent event)
{
	if (event.entityPlayer.getHeldItem() != null)
	{
		if (event.entityPlayer.getHeldItem().getItem() == Items.apple)
		{
			if (event.target instanceof EntityLivingBase)
			{
				EntityExtendedProperties.get((EntityLivingBase) event.target).setFrozen(true);
			}
		}
	}
}
}

public class ForgeEventsClient
{
@SubscribeEvent
public void RenderLivingEvent(RenderLivingEvent.Pre event)
{
	if (EntityExtendedProperties.get(event.entity).isFrozen())
	{
		GlStateManager.pushMatrix();
		GL11.glColor3f(0.5f, 2.0f, 10.0f);
		GlStateManager.popMatrix();
	}
}
}

 

* Have 2 classes for Forge events - common and client. Same goes if you ever use FML events.

* Don't register event class in its own constructor - it is not safe (bad practice to pass "this" from constructor).

* Register ForgeEventsClient in ClientProxy, logically ForgeEvents go to CommonProxy.

* Packets tutorials:

Long: http://www.minecraftforum.net/forums/mapping-and-modding/mapping-and-modding-tutorials/2137055-1-7-2-customizing-packet-handling-with

Cut and dried: http://www.minecraftforge.net/forum/index.php/topic,20135.0.html

 

You will be sending packet from PlayerEvent.StartTracking - occuring whenever player loads some entity on client. Event fires ONLY on server and should handle sending packets to players.

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

I'm still new to modding, so i don't really understand how world and client side work.How do i know which code run on which side ? Also from what i understood i have to send nbt data of entity that player start tracking to its client? I tried that and i don't know how to access that entity on client side.

my packet code:

 

package ga.warixmods.akamegakillmod;

 

import io.netty.buffer.ByteBuf;

import net.minecraft.client.Minecraft;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraft.util.IThreadListener;

import net.minecraft.world.WorldServer;

import net.minecraftforge.fml.common.network.ByteBufUtils;

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 SendPacket implements IMessage {

 

private String text;

private int num,recieved,id = 0;

private NBTTagCompound nbt;

public SendPacket() {}

 

public SendPacket(String text)

{

this.text = text;

this.recieved = 0;

}

 

public SendPacket(int num)

{

this.num = num;

this.recieved = 1;

}

 

public SendPacket(NBTTagCompound nbt,int id) {

this.nbt = nbt;

this.id = id;

 

 

}

 

@Override

public void fromBytes(ByteBuf buf) {

switch(this.recieved)

{

    case 0:

   

this.text = ByteBufUtils.readUTF8String(buf);

break;

    case 1:

   

this.num = ByteBufUtils.readVarInt(buf, Integer.MAX_VALUE);

    break;

    case 2:

    this.nbt = ByteBufUtils.readTag(buf);

    this.id = ByteBufUtils.readVarInt(buf, Integer.MAX_VALUE);

}

}

 

@Override

public void toBytes(ByteBuf buf) {

switch(this.recieved)

{

    case 0:

   

ByteBufUtils.writeUTF8String(buf, this.text);

break;

    case 1:

   

ByteBufUtils.writeVarInt(buf,this.num, Integer.MAX_VALUE);

    break;

    case 2:

    ByteBufUtils.writeTag(buf, this.nbt);

    ByteBufUtils.writeVarInt(buf, this.id, Integer.MAX_VALUE);

}

}

public static class Handler implements IMessageHandler<SendPacket, IMessage>{

 

@Override

public IMessage onMessage(final SendPacket message, final MessageContext ctx)

{

IThreadListener mainThread = (WorldServer) ctx.getServerHandler().playerEntity.worldObj;

IThreadListener mainThreadClient = Minecraft.getMinecraft();

if(ctx.side.isServer())

{

        mainThread.addScheduledTask(new Runnable()

        {

      @Override

      public void run()

        {

        //this is from other parts of mod

        switch(message.recieved)

        {

       

        case 0:

        String text = message.text;

        int num = message.num;

       

        String idS = text.substring(3, 4);

        int idI = Integer.parseInt(idS);

       

        text = text.substring(4);

        switch(idI)

        {

        case 0:

       

        ctx.getServerHandler().playerEntity.getHeldItem().getTagCompound().setInteger("id",Integer.parseInt(text));

        break;

        case 1:

       

        ctx.getServerHandler().playerEntity.getHeldItem().getTagCompound().setInteger("id", Integer.parseInt(text));

        break;

        case 2:

       

        ctx.getServerHandler().playerEntity.getHeldItem().getTagCompound().setInteger("idU",Integer.parseInt(text));

        break;

        case 3:

       

        ctx.getServerHandler().playerEntity.getHeldItem().getTagCompound().setInteger("id"+Integer.parseInt(text),0);

        break;

       

        }

        break;

        case 1:

        break;

        }

        }});

}

//and i guess i have to sync it here?

                        else

{

mainThreadClient.addScheduledTask(new Runnable()

        {

      @Override

      public void run()

        {

    EntityLivingBase target =

       

                }

        });}

return null;

}

 

 

 

 

}

}

 

 

:D
Link to comment
Share on other sites

Minecraft cosists of 2 "code" sides and 4 "logical" sides (read: threads).

 

1. Looking as MC from logical side:

There are 4 threads:

Server

Client

Server-Netty

Client-Netty

 

1.1. When running Client.jar:

* SP: You have all 4 threads (4) (server is being ran in background)

* MP: You only have client threads (2), server threads are ran by server you connected to (meaning you don't have any access to it, only communication are packets)

Note that you also use packets when on SP - they are being sent "interanlly".

 

1.2. When running Dedicated.jar:

* Dedicated server has always ONLY 2 threads - server ones. Clients connect to it and server threads operate on data (save/load) while clients only display them.

 

2. Looking at MC from source view:

There is common code - used by both server and client threads, no matter if Client.jar or Dedicated.jar.

There is code reserved for client and for server.

Whenever you see/use:

@SideOnly(Side.SERVER)
@SideOnly(Side.CLIENT)

It means that given class/method/filed is present ONLY when run on either Client.jar or Dedicated.jar.

E.g: Minecraft.class is @SideOnly(Side.CLIENT), that means that class is NOT present (not loaded to VM) when you are running Dedicated.jar.

 

That is why you use proxies when you need some client/server specific getters/setters.

 

3. What thread use what code?

General rule is:

Netty threads should NEVER access game threads:

http://greyminecraftcoder.blogspot.com.au/2015/01/thread-safety-with-network-messages.html

 

Now to actual question:

Most of common code will be used by both threads (server/client). Whenever something gets calles you can perform "logical-check" with:

world.isRemote

true = this code is being ran by client thread

false = this code is being ran by server

 

Same code can and will often be used by both threads, that's why you can see those checks everywhere.

 

Rule is:

Manipulating data happens on server (!world.isRemote).

 

4. Synchronization:

Let's talk about events - most of Forge ones are being called on both logical sides.

Since you are here about IEEP interface:

EntityConstructing event is called on both sides.

Both client and server logical thread will assign new IEEP to given entity whenever it's being constructed.

Since most calculations should/will happen on server, only server updates given entity's IEEP values. Client needs to be notified.

That's where packets kick in. You send them, on client you handle them - generate new Runnable and put it into maing client thread.

 

Example of working with IEEP sync:

// in IEEP
public void setExp(long exp, boolean notify)
{
if (exp < 0) exp = 0;
this.exp = exp;
if (notify) // notify will be true only on server side (it's my method).
{
	Dispatcher.sendPacketTo(new PacketSendExp(this.player, this.getExp()), this.player);
}
}

public class PacketSendExp implements IMessage
{
private int playerId;
private long exp;

public PacketSendExp()
{}

public PacketSendExp(EntityPlayer player, long exp)
{
	this.playerId = player.getEntityId();
	this.exp = exp;
}

@Override
public void toBytes(ByteBuf buffer)
{
	buffer.writeInt(this.playerId);
	buffer.writeLong(this.exp);
}

@Override
public void fromBytes(ByteBuf buffer)
{
	this.playerId = buffer.readInt();
	this.exp = buffer.readLong();
}

public static class HandlerExp extends AbstractClientMessageHandler<PacketSendExp>
{
	@Override
	public void run(EntityPlayerSP player, PacketSendExp message)
	{
		Entity e = player.worldObj.getEntityByID(message.playerId);
		if (e instanceof EntityPlayer)
		{
			IEEP.get((EntityPlayer) e).setExp(message.exp, false);
		}
	}
}
}

 

Above will update (by sending packet) owner of given IEEP whenever server changes exp value.

 

Note to code above:

I have quite background abstraction there. the run() method is actually wrapped Runnable.

 

5. Just call me: Skype: ernio333

If you want more useful info (really useful).

1.7.10 is no longer supported by forge, you are on your own.

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

    • 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.
    • Hi, i appreciate the answer. I would love to do that, but we have active players with all their belongings in SSN. Also this mod is really handy and they would be mad if we removed it. Are you really certain that SSN is causing this? It would require lots of work to test it and SSN was not really an issue before we removed Fast Suite. Can it be related somehow? I will provide you with log before removing FS. PasteBin: https://pastebin.com/Y5EpLpNe (crash before removing Fast Suite, which I suspected to be a problem from some crash before)
    • Backup the world and make a test without storagenetwork
  • Topics

×
×
  • Create New...

Important Information

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