Jump to content

[1.7.2]World.createExplosion


Hackbaellchen

Recommended Posts

Hey,

I made a projectile and wanted it to explode on impact (I extended EntityThrowable).

Code:

    protected void onImpact(MovingObjectPosition movingobjectposition)
    {
        this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 4.5F, true);
        this.setDead();
    }

But the blocks are buggy. If I fly into the crater there will be invisible blocks, which should be exploded.

Link to comment
Share on other sites

I tried to use

@SideOnly(Side.CLIENT)

, but there was the same problem.

 

I also tried

    public void onImpact(MovingObjectPosition movingobjectposition)
    {
    	if(!this.worldObj.isRemote) {
        	this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 4.5F, true);
        	this.setDead();
    	}
    }

but there was no explosion.

Link to comment
Share on other sites

 

 

 

 

Get rid of the SideOnly stuff.  From your description you are using it inproperly. 

 

Put some markers in your code for debugging so you can tell if it worked or not.

 

System.out.println("blah blah blah");

 

Put something at start of your method, at the first if, ect so you know it fired.  By watching the debug screen you will also know if it happend on server/client/both.

 

 

// Working code snipet from something I have.

 

 

 

if (!this.worldObj.isRemote) {

 

      // Create Explosion  - flag is boolean for whether you want it to damage the environment.

      this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, (float)this.explosionRadius, flag);

 

      // Set the mob to dead

      this.setDead();

 

}

 

 

 

Long time Bukkit & Forge Programmer

Happy to try and help

Link to comment
Share on other sites

@Override
    public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player)
    {
        world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));

        if (world.isRemote)
        {
            world.spawnEntityInWorld(new MyEntityProjectile(world, player));
            itemStack.damageItem(1, player);
        }

        return itemStack;
    }

Link to comment
Share on other sites

You are spawning it client side. try inverting the if world.isRemote check

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

public class MyItem extends Item
{
public MyItem() {
	super();
	this.setMaxDamage(50);
	this.setMaxStackSize(1);
	this.setFull3D();
}

@Override
    public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player)
    {
        world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));

        if (world.isRemote)
        {
            world.spawnEntityInWorld(new MyEntityProjectile(world, player));
            itemStack.damageItem(1, player);
        }

        return itemStack;
    }

 

public class MyEntityProjectile extends EntityThrowable
{
    public MyEntityProjectile(World world, EntityLivingBase entity)
    {
        super(world, entity);
    }

    public void onImpact(MovingObjectPosition movingobjectposition)
    {
        if (!this.worldObj.isRemote)
        {
            this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 4.5F, true);
        }
    }

 

As it is now, there will be NO explosion on impact. If i remove the ! in the projectile class it will explode, but the blocks will be buggy

Link to comment
Share on other sites

 

 

As they told you before, chante this to "!world.isRemote"

 

 

        if (world.isRemote)

        {

            world.spawnEntityInWorld(new MyEntityProjectile(world, player));

            itemStack.damageItem(1, player);

        }

 

 

 

 

 

You are generating your projectile on the client side only, so obviously it won't create an explosion on the server.

 

Lastly, as I said before add some log points in your code so you can see where it is derailing.

Long time Bukkit & Forge Programmer

Happy to try and help

Link to comment
Share on other sites

And as before, we stated to post your code.  You keep saying "!this.worldObj.isRemote" but there is no way to know how or where you typed it and made a mistake.

Long time Bukkit & Forge Programmer

Happy to try and help

Link to comment
Share on other sites

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        EntityRegistry.registerModEntity(MyEntityProjectile.class, "MyProjectile", entityIndex++, this, 64, 10, true);
    }

 

 

If I use

    public MyEntityProjectile(World world)
    {
        super(world);
    }

 

instead of

 

    public MyEntityProjectile(World world, EntityLivingBase player)
    {
        super(world, player);
    }

 

the entity isn't spawning.

Link to comment
Share on other sites

All works fine now.

 

public class MyEntityProjectile extends EntityThrowable
{
  public MyEntityProjectile(World par1World)
  {
    super(par1World);
  }
  
  public MyEntityProjectile(World par1World, EntityLivingBase par2EntityLivingBase)
  {
    super(par1World, par2EntityLivingBase);
  }
  
  public MyEntityProjectile(World par1World, double par2, double par4, double par6)
  {
    super(par1World, par2, par4, par6);
  }

    protected void onImpact(MovingObjectPosition movingobjectposition)
    {
        if (!this.worldObj.isRemote)
        {
            this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 4.5F, true);
        }
    }

 

public class MyItem extends Item
{
public MyItem() {
	super();
	this.setMaxDamage(50);
	this.setMaxStackSize(1);
	this.setFull3D();
}

@Override
    public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player)
    {
        world.playSoundAtEntity(player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));

        if (!world.isRemote)
        {
            world.spawnEntityInWorld(new MyEntityProjectile(world, player));
            itemStack.damageItem(1, player);
        }

        return itemStack;
    }

I've found my old code :)

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.



×
×
  • Create New...

Important Information

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