Jump to content

Recommended Posts

Posted

I'm trying to make an item that creates and explosion on the block you right click on.  This works perfectly in single player and in multiplayer it creates an "explosion" at the correct location but for some reason the explosion is tiny, doesn't hurt anything, and doesn't make noise.  My guess is it has something to do with the world.createExplosion line but I'm not sure.  Any ideas or suggestions?

 

package me.thetrooble.film.items;

import java.util.List;

import me.thetrooble.film.LudicFilms;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;

public class BoomStick extends Item{
private final String name = "BoomStick";
public BoomStick() 
{
	maxStackSize = 1;
	setCreativeTab(LudicFilms.filmTab);
	setUnlocalizedName("ludicfilms" + "_" + name);
}
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
{
	if(getMouseOver(player,250).entityHit!=null){
		Entity mob = getMouseOver(player,250).entityHit;
		world.createExplosion((Entity)null,mob.posX,mob.posY,mob.posZ,5, false);
		return stack;
	}
	BlockPos blk = getMouseOver(player,250).getBlockPos();
	world.createExplosion((Entity)null,blk.getX(),blk.getY(),blk.getZ(),5, false);
    return stack;
}
public String getName()
{
	return name;
}

public static MovingObjectPosition getMouseOver(Entity theRenderViewEntity, float dist) {

	AxisAlignedBB theViewBoundingBox = new AxisAlignedBB(
			theRenderViewEntity.posX - 0.5D,
			theRenderViewEntity.posY - 0.0D,
			theRenderViewEntity.posZ - 0.5D,
			theRenderViewEntity.posX + 0.5D,
			theRenderViewEntity.posY + 1.5D,
			theRenderViewEntity.posZ + 0.5D
			);

	MovingObjectPosition returnMOP = null;
	if (theRenderViewEntity.worldObj != null)
	{
		double var2 = dist;
		returnMOP = theRenderViewEntity.rayTrace( var2, 0 );
		double calcdist = var2;
		Vec3 pos = theRenderViewEntity.getPositionEyes(0);
		var2 = calcdist;
		if (returnMOP != null)
		{
			calcdist = returnMOP.hitVec.distanceTo( pos );
		}

		Vec3 lookvec = theRenderViewEntity.getLook( 0 );
		Vec3 var8 = pos.addVector( lookvec.xCoord * var2,

				lookvec.yCoord * var2,

				lookvec.zCoord * var2 );
		Entity pointedEntity = null;
		float var9 = 1.0F;
		@SuppressWarnings("unchecked")
		List<Entity> list = theRenderViewEntity.worldObj
		.getEntitiesWithinAABBExcludingEntity(

				theRenderViewEntity,

				theViewBoundingBox.addCoord(

						lookvec.xCoord * var2,

						lookvec.yCoord * var2,

						lookvec.zCoord * var2 ).expand( var9, var9,
								var9 ) );
		double d = calcdist;

		for (Entity entity : list)
		{
			if (entity.canBeCollidedWith())
			{
				float bordersize = entity.getCollisionBorderSize();
				AxisAlignedBB aabb = new AxisAlignedBB(

						entity.posX - entity.width / 2,

						entity.posY,

						entity.posZ - entity.width / 2,

						entity.posX + entity.width / 2,

						entity.posY + entity.height,

						entity.posZ + entity.width / 2 );
				aabb.expand( bordersize, bordersize, bordersize );
				MovingObjectPosition mop0 = aabb.calculateIntercept( pos,
						var8 );

				if (aabb.isVecInside( pos ))
				{
					if (0.0D < d || d == 0.0D)
					{
						pointedEntity = entity;
						d = 0.0D;
					}
				} else if (mop0 != null)
				{
					double d1 = pos.distanceTo( mop0.hitVec );

					if (d1 < d || d == 0.0D)
					{
						pointedEntity = entity;
						d = d1;
					}
				}
			}
		}

		if (pointedEntity != null && (d < calcdist || returnMOP == null))
		{
			returnMOP = new MovingObjectPosition( pointedEntity );
		}

	}
	return returnMOP;
}
}

Posted

I tried this, now no explosions are made ever in multiplayer but it still works in single player.

That's usually a sign that you are using something that only works on the client; since your code isn't crashing on the server, clearly it's not an @SideOnly(Side.CLIENT) method, but it could be something as innocuous as a discrepancy in eye position (very common pre-1.8).

 

As Failender mentioned, explosions should only be created server-side, as they automatically notify the client of affected block positions and such; otherwise, you can end up with 'ghost' blocks, and that's never good. :P

 

To find out what's going on, I suggest you use a Logger (automatically adds Side information to each message) and start spamming the console with information about the state of every single variable you have while in multiplayer vs. single player, then try to find the difference.

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.

×
×
  • Create New...

Important Information

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