Posted October 9, 20159 yr 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; } }
October 10, 20159 yr Author I tried this, now no explosions are made ever in multiplayer but it still works in single player.
October 10, 20159 yr 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.. 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. 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. http://i.imgur.com/NdrFdld.png[/img]
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.