Jump to content

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


Vtec234

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() {
	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.

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.

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

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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