Posted July 23, 201411 yr 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() { super(); setUnlocalizedName("dustRainbow"); setTextureName(Reference.MODID + ":" + getUnlocalizedName().substring(5)); setCreativeTab(CreativeTabsAwesom.tabAwesom); } @Override 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.
July 23, 201411 yr 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); } }
July 23, 201411 yr Author I already rerouted this through a proxy because spawnParticle() requires the particle to be registered with a String name, but thanks for the info about when to use Minecraft.xxxxx
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.