Jump to content

[1.7.10][SOLVED]Server crashing without a client-only call


Recommended Posts

Excuse me for starting so many threads here, but one's gotta learn somehow. One of my items crashes the server when I try to run it. It renders particles on use, but the particle rendering is never called on server side, and it crashes anyway, so I have to ask. Here's the error log: https://gist.github.com/anonymous/12336aa0745323f1d4cc from line 87. This is where it crashes:

dustRainbow = new ItemRainbowDust();

And here's the ItemRainbowDust class:

public class ItemRainbowDust extends Item {
private Vector3d target = new Vector3d(0.0d, 0.0d, 0.0d);

protected ItemRainbowDust() {
	setTextureName(Reference.MODID + ":" + getUnlocalizedName().substring(5));

public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float offsetX, float offsetY, float offsetZ){
	if (world.isRemote) {
		if (player.isSneaking()) {
			this.target = new Vector3d(x+0.5d, y+1.5d, z+0.5d);
			player.addChatMessage(new ChatComponentTranslation("Target set to X: " + target.x + " Y: " + target.y + " Z: "+target.z));
		} else {
			double x1 = (double) (x + offsetX);
			double y1 = (double) (y + offsetY);
			double z1 = (double) (z + offsetZ);
			Minecraft.getMinecraft().effectRenderer.addEffect(new EntityRainbowFX(world, x1, y1, z1));
			//Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFXTargettingParticle(world, x1, y1, z1, target.x, target.y, target.z, 1F));

	return false;


As you can see, in onItemUse, everything is only called on isRemote worlds, meaning the client. And the stack trace tells me it crashed at ItemRainbowDust constructor. Thanks in advance



When I comment out these lines:

Minecraft.getMinecraft().effectRenderer.addEffect(new EntityRainbowFX(world, x1, y1, z1));
Minecraft.getMinecraft().effectRenderer.addEffect(new EntityFXTargettingParticle(world, x1, y1, z1, target.x, target.y, target.z, 1F));

it works.

Link to comment
Share on other sites

Simply put, you cannot call Minecraft.XXXXX on server side, or any code that is even seen on the server -- you need to route it through a proxy class.  The only safe place to use Minecraft.XXXXX functions are in purely client-side code (mostly just GUIs as far as I know...can't even use it in containers).


This happens because ALL imports/etc are resolved when a class is loaded, not 'just the ones that would be used in that code path'. (i.e. even though the if(remote) stuff would never execute, the imports are still in the class definition)  (Others might be able to clear this up a bit better.....)




However, there is an easy solution -- the real method to spawn particles is safe, as it is located in the World class, and should be callable on any world object.


Excerpt from EntityArrow code (the part that handles crit hit particles)

          if (this.getIsCritical())
                for (i = 0; i < 4; ++i)
                    this.worldObj.spawnParticle("crit", this.posX + this.motionX * (double)i / 4.0D, this.posY + this.motionY * (double)i / 4.0D, this.posZ + this.motionZ * (double)i / 4.0D, -this.motionX, -this.motionY + 0.2D, -this.motionZ);

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.

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.


  • Create New...

Important Information

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