Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

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;
}
}

  • Author

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

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.