Thank you for the help. I got it to work with packets. I'll put the code below for any future googlers
@Override
public void onUpdate()
{
setFuse(--this.fuse);
if (getFuse() <= 0)
{
this.setDead();
if (!this.world.isRemote)
{
world.setBlockState(pos, Blocks.AIR.getDefaultState());
world.createExplosion(null, this.posX + 0.5D, this.posY + 0.5D, this.posZ + 0.5D, 4.f, true);
}
}
else
{
ParticlePacket particlePacket = new ParticlePacket(this.posX, this.posY, this.posZ);
NetworkRegistry.TargetPoint target = new TargetPoint(world.provider.getDimension(), this.posX + 0.5D, this.posY + 1.0D, this.posZ + 0.5D, 20.d);
CommonProxy.simpleNetworkWrapper.sendToAllAround(particlePacket, target);
}
if(world.getBlockState(pos).getBlock() instanceof BlockAir)
{
this.setDead();
}
}
//Message and client handler
public class ParticlePacket implements IMessage
{
private boolean messageValid;
private double x, y, z;
public ParticlePacket()
{
this.messageValid = false;
}
public ParticlePacket(double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
this.messageValid = true;
}
@Override
public void fromBytes(ByteBuf buf)
{
try
{
this.x = buf.readDouble();
this.y = buf.readDouble();
this.z = buf.readDouble();
}
catch(IndexOutOfBoundsException ioe)
{
return;
}
}
@Override
public void toBytes(ByteBuf buf)
{
if(!this.messageValid)
return;
buf.writeDouble(x);
buf.writeDouble(y);
buf.writeDouble(z);
}
public static class Handler implements IMessageHandler<ParticlePacket, IMessage>
{
@Override
public IMessage onMessage(ParticlePacket message, MessageContext ctx)
{
if(!message.messageValid && ctx.side != Side.CLIENT)
{
return null;
}
Minecraft minecraft = Minecraft.getMinecraft();
final WorldClient worldClient = minecraft.world;
minecraft.addScheduledTask(() -> processMessage(message, worldClient));
return null;
}
void processMessage(ParticlePacket message, WorldClient worldClient)
{
worldClient.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, message.x + 0.5D, message.y + 1.0D, message.z + 0.5D, 0.0D, 0.0D, 0.0D);
}
}
}
//ClientProxy
public static void preInitClientOnly()
{
CommonProxy.simpleNetworkWrapper.registerMessage(ParticlePacket.Handler.class, ParticlePacket.class, CommonProxy.FUSE_SMOKE, Side.CLIENT);
}
//CommonProxy
public static final byte FUSE_SMOKE = 88;
public static SimpleNetworkWrapper simpleNetworkWrapper;
public static void preInitCommon()
{
simpleNetworkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("TestChannel");
simpleNetworkWrapper.registerMessage(ServerHandlerDummy.class, ParticlePacket.class, FUSE_SMOKE, Side.SERVER);
}
//Server handler
public class ServerHandlerDummy implements IMessageHandler<ParticlePacket, IMessage>
{
@Override
public IMessage onMessage(ParticlePacket message, MessageContext ctx)
{
return null;
}
}