Jump to content

[Solved] [1.7.4] Item positioning and Particle Questions???~~


Recommended Posts

Posted

Hi again,

 

2 questions-

 

1. I found code for creating my own particle effects, and i tried it out. Whenever it's supposed to spawn, it instead crashes. It may be out of date, idk.

 

this is what i have:

 

 

public class BreakingBadParticleEffects {
    private static Minecraft mc = Minecraft.getMinecraft();
    private static World theWorld = mc.theWorld;

    public static EntityFX spawnParticle(String particleName, double par2, double par4, double par6, double par8, double par10, double par12) {
        if (mc != null && mc.renderViewEntity != null && mc.effectRenderer != null) {
            int var14 = mc.gameSettings.particleSetting;

            if (var14 == 1 && theWorld.rand.nextInt(3) == 0) {
                var14 = 2;
            }

            double var15 = mc.renderViewEntity.posX - par2;
            double var17 = mc.renderViewEntity.posY - par4;
            double var19 = mc.renderViewEntity.posZ - par6;
            EntityFX var21 = null;
            double var22 = 16.0D;

            if (var15 * var15 + var17 * var17 + var19 * var19 > var22 * var22) {
                return null;
            }
            else if (var14 > 1) {
                return null;
            }
            else {
                if (particleName.equals("Red Phosphorus")) {
                    var21 = new RedPhosphorousFX(theWorld, par2, par4, par6, (float) par8, (float) par10, (float) par12, 2F);
                }


                mc.effectRenderer.addEffect((EntityFX) var21);
                return (EntityFX) var21;
            }
        }
        return null;
    }
}

 

 

 

@SideOnly(Side.CLIENT)
public class RedPhosphorousFX extends EntityFX {
    float smokeParticleScale;
    private static final String __OBFID = "CL_00000924";

    public RedPhosphorousFX(World world, double x, double y, double z, double motionX, double motionY, double motionZ) {
        this(world, x, y, z, motionX, motionY, motionZ, 1.0F);
    }

    public RedPhosphorousFX(World par1World, double par2, double par4, double par6, double par8, double par10, double par12, float par14) {
        super(par1World, par2, par4, par6, 0.0D, 0.0D, 0.0D);
        this.motionX *= 0.10000000149011612D;
        this.motionY *= 0.10000000149011612D;
        this.motionZ *= 0.10000000149011612D;
        this.motionX += par8;
        this.motionY += par10;
        this.motionZ += par12;
        this.particleRed = 169F;
        this.particleGreen = 0F;
        this.particleBlue = 0F;
        this.particleScale *= 0.75F;
        this.particleScale *= par14;
        this.smokeParticleScale = this.particleScale;
        this.particleMaxAge = (int) (8.0D / (Math.random() * 0.8D + 0.2D));
        this.particleMaxAge = (int) ((float) this.particleMaxAge * par14);
        this.noClip = false;
    }

    public void renderParticle(Tessellator par1Tessellator, float par2, float par3, float par4, float par5, float par6, float par7) {
        float f6 = ((float) this.particleAge + par2) / (float) this.particleMaxAge * 32.0F;

        if (f6 < 0.0F) {
            f6 = 0.0F;
        }

        if (f6 > 1.0F) {
            f6 = 1.0F;
        }

        this.particleScale = this.smokeParticleScale * f6;
        super.renderParticle(par1Tessellator, par2, par3, par4, par5, par6, par7);
    }

    /**
     * Called to update the entity's position/logic.
     */
    public void onUpdate() {
        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;

        if (this.particleAge++ >= this.particleMaxAge) {
            this.setDead();
        }

        this.setParticleTextureIndex(7 - this.particleAge * 8 / this.particleMaxAge);
        this.motionY += 0.004D;
        this.moveEntity(this.motionX, this.motionY, this.motionZ);

        if (this.posY == this.prevPosY) {
            this.motionX *= 1.1D;
            this.motionZ *= 1.1D;
        }

        this.motionX *= 0.9599999785423279D;
        this.motionY *= 0.9599999785423279D;
        this.motionZ *= 0.9599999785423279D;

        if (this.onGround) {
            this.motionX *= 0.699999988079071D;
            this.motionZ *= 0.699999988079071D;
        }
    }
}

 

 

and my code for spawning it in:

BreakingBadParticleEffects.spawnParticle("Red Phosphorous", x, y, z, 1, 1, 1);

(i'm not sure what the 1, 1, 1 does, btw)

 

 

2. Also, would there be a way to track the position of an item so that, in this case, releases particles when dropped into fire by the player?

 

(On a side note, any good tutorials for structure generation?)

Thanks!

-Pandassaurus

Posted

Crash report / logs?

Also make sure you call the spawnParticle method client-side only

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

Hi,

I made the code client side only (by adding @SideOnly(Side.CLIENT) to the top of the method)

 

java.lang.NullPointerException: Ticking player
at net.minecraft.client.particle.EffectRenderer.addEffect(EffectRenderer.java:59)
at com.pandassaurus.breakingbad.BreakingBadParticleEffects.spawnParticle(BreakingBadParticleEffects.java:45)
at com.pandassaurus.breakingbad.item.other.RedPhosphorous.onUpdate(RedPhosphorous.java:25)
at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:468)
at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:357)
at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:643)
at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1856)
at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:360)
at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:363)
at net.minecraft.network.NetHandlerPlayServer.processPlayer(NetHandlerPlayServer.java:334)
at net.minecraft.network.play.client.C03PacketPlayer.processPacket(C03PacketPlayer.java:37)
at net.minecraft.network.play.client.C03PacketPlayer$C06PacketPlayerPosLook.processPacket(C03PacketPlayer.java:218)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242)
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:762)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:650)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:528)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:787)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at net.minecraft.client.particle.EffectRenderer.addEffect(EffectRenderer.java:59)
at com.pandassaurus.breakingbad.BreakingBadParticleEffects.spawnParticle(BreakingBadParticleEffects.java:45)
at com.pandassaurus.breakingbad.item.other.RedPhosphorous.onUpdate(RedPhosphorous.java:25)
at net.minecraft.item.ItemStack.updateAnimation(ItemStack.java:468)
at net.minecraft.entity.player.InventoryPlayer.decrementAnimations(InventoryPlayer.java:357)
at net.minecraft.entity.player.EntityPlayer.onLivingUpdate(EntityPlayer.java:643)
at net.minecraft.entity.EntityLivingBase.onUpdate(EntityLivingBase.java:1856)
at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:360)

-- Player being ticked --
Details:
Entity Type: null (net.minecraft.entity.player.EntityPlayerMP)
Entity ID: 392
Entity Name: ForgeDevName
Entity's Exact location: -1029.60, 9.00, 234.70
Entity's Block location: World: (-1030,9,234), Chunk: (at 10,0,10 in -65,14; contains blocks -1040,0,224 to -1025,255,239), Region: (-3,0; contains chunks -96,0 to -65,31, blocks -1536,0,0 to -1025,255,511)
Entity's Momentum: 0.00, -0.08, 0.00
Stacktrace:
at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:363)
at net.minecraft.network.NetHandlerPlayServer.processPlayer(NetHandlerPlayServer.java:334)
at net.minecraft.network.play.client.C03PacketPlayer.processPacket(C03PacketPlayer.java:37)
at net.minecraft.network.play.client.C03PacketPlayer$C06PacketPlayerPosLook.processPacket(C03PacketPlayer.java:218)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242)

-- Ticking connection --
Details:
Connection: net.minecraft.network.NetworkManager@36fb39f6
Stacktrace:
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:762)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:650)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:528)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:787)

 

 

 

two of the error lines are pointing to this code:

mc.effectRenderer.addEffect((EntityFX) var21);

BreakingBadParticleEffects.spawnParticle("Red Phosphorous", x, y + 0.5, z, 1, 1, 1);

 

 

 

thanks,

-Pandassaurus

Posted

I'm very interested in tracking items position in your hand.  I've tried to do this and could figure it out.

Long time Bukkit & Forge Programmer

Happy to try and help

Posted

All items turn into EntityItems when dropped; you can have your special item return a custom EntityItem (read "SomeClass extends EntityItem"). Just like every other entity, EntityItem has its onUpdate method called every tick, so you can then use to check for fire and spawn particles based on its current position and motion.

 

Method in Item class:

/**
     * This function should return a new entity to replace the dropped item.
     * Returning null here will not kill the EntityItem and will leave it to function normally.
     * Called when the item it placed in a world.
     *
     * @param world The world object
     * @param location The EntityItem object, useful for getting the position of the entity
     * @param itemstack The current item stack
     * @return A new Entity object to spawn or null
     */
    public Entity createEntity(World world, Entity location, ItemStack itemstack)
    {
        return null;
    }

 

Basically you spawn your custom EntityItem class at the same location and with the same ItemStack as the original EntityItem (somewhat poorly named as "location"), making sure to kill the original EntityItem so you don't end up spawning two.

Posted

@coolAlias that won't work, because custom EntityItems only spawn on the server if I remember correctly. But there is onEntityItemUpdate in the Item class which get's called on both sides when the EntityItem gets ticked.

I haven't personally tried it with EntityItem, but I thought every subclass of Entity has a client-side version that spawns and gets updates client-side - this is how arrows and such spawn particles when critical; are EntityItems an exception to this?

 

Though the method you mentioned will do the trick without creating a new class, so that's a better solution anyway :P

Posted

You are totally right. What I meant though was that if you have a custom EntityItem class as you suggested, that class will only be used on the server, the client still uses the vanilla EntityItem class.

This is really interesting. So why is it that other custom entities then have the correct class on the client side? Would it work if the custom EntityItem was registered as a mod entity, like custom mobs, projectiles, etc? Or is there something else at work here?

Posted

Not sure exactly. It's probably related to how custom EntityItems are handled (look at ForgeInternalHandler). I just noticed it while I was working on an Item of mine and wondered, why I wouldn't get particles :D

 

I don't know about you, but I tested that for my custom EntityItem (put a println inside the onUpdate method and let it print out if the world is remote) and the console got spammed with both, true and false lines

2014-04-10 18:07:22 [information] [sTDOUT] true
2014-04-10 18:07:22 [information] [sTDOUT] true
2014-04-10 18:07:22 [information] [sTDOUT] false
2014-04-10 18:07:22 [information] [sTDOUT] true
2014-04-10 18:07:22 [information] [sTDOUT] false
2014-04-10 18:07:22 [information] [sTDOUT] true
2014-04-10 18:07:22 [information] [sTDOUT] false
... and so on

 

How do you spawn / register your EntityItems?

I register them the way all other regular entities are registered (w/o the renderer)

Here, have a look:

 

EntityItem class

https://github.com/SanAndreasP/EnderStuffPlus/blob/code-cleanup/java/sanandreasp/mods/EnderStuffPlus/entity/item/EntityItemTantal.java

 

Entity Registry class

https://github.com/SanAndreasP/EnderStuffPlus/blob/code-cleanup/java/sanandreasp/mods/EnderStuffPlus/registry/ModEntityRegistry.java#L56

 

Event class (where it gets spawned)

https://github.com/SanAndreasP/EnderStuffPlus/blob/code-cleanup/java/sanandreasp/mods/EnderStuffPlus/registry/event/EntityJoinWorldEventInst.java

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

I've done the custom entity item and made it work client side before.

 

Any idea on how to find position of a part of your custom item while still in your hand?

Long time Bukkit & Forge Programmer

Happy to try and help

Posted

I've done the custom entity item and made it work client side before.

 

Any idea on how to find position of a part of your custom item while still in your hand?

 

You mean with "holding in your hand" that the item is held by the player / held by a mob?

If so, the EntityItem is not responsible for this

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

Exactly.  I made a custom weapon and I wanted to have particle effects in it.  Essentially, a flame in the middle of a sceptre.  However, I couldn't figure out how to find its coordinates. 

 

I ended up doing something cheesy and putting a few colored blocks in the middle of the sceptre and moving them around to sorta look like fire.

 

I would much rather have it drip flames particles though.  In order to do that, I need to know where the head of the sceptre is at.

 

Sorry, if this is slightly off topic, but it was one of the original questions he asked in this thread (or at least I thought it was when I joined in).

Long time Bukkit & Forge Programmer

Happy to try and help

Posted

I don't know about you, but I tested that for my custom EntityItem (put a println inside the onUpdate method and let it print out if the world is remote) and the console got spammed with both, true and false lines

Excellent report there, SanAndreasP. Seems like registering the entity is required for it to spawn correctly on the client side, then, like all other entities. Thanks for sharing!

 

Exactly.  I made a custom weapon and I wanted to have particle effects in it.  Essentially, a flame in the middle of a sceptre.  However, I couldn't figure out how to find its coordinates. 

 

I ended up doing something cheesy and putting a few colored blocks in the middle of the sceptre and moving them around to sorta look like fire.

 

I would much rather have it drip flames particles though.  In order to do that, I need to know where the head of the sceptre is at.

 

Sorry, if this is slightly off topic, but it was one of the original questions he asked in this thread (or at least I thought it was when I joined in).

Ah, I thought the OP meant when the item was dropped, not while held in the player's hand. While held in the player's hand, you can spawn particles using the Item onUpdate method; the last parameter is true when the item is held.

 

Since you know that the item is in the player's hand, you can use the player's position as the base for spawning whatever particles you want, and play around with the position and motion until it looks right; if it's important to have the particles trail the item's swing motion, you can get the swing progress from the player as well (note this stuff should all be client-side only).

 

If you want other players to be able to see the particles, too, you will have to figure out a way of sending a packet to nearby players with the appropriate information. One way I did this was to create an interface for Items that can spawn particles, and a custom packet that calls that method with the information provided:

 

Interface:

https://github.com/coolAlias/ZeldaSwordSkills-1.6.4/blob/master/src/main/java/zeldaswordskills/item/ISpawnParticles.java

 

Packet:

https://github.com/coolAlias/ZeldaSwordSkills-1.6.4/blob/master/src/main/java/zeldaswordskills/network/PacketISpawnParticles.java

 

You could easily adapt that to include swing progress or other information you may need.

Posted

Hi,

Sorry I was gone recently so i couldn't respond, but I ended up using the onEntityItemUpdate() method. It worked perfectly for my needs. Just have one question. Is there a way to make it spawn multiple particles at different times and places over a short period of time?(kind of like a cloud of smoke or even  a constant flow of particles for a short period of time) Keep in mind that the item falls into fire, burning the item, so as far as i know, you can't really spawn particles on the item.

 

thanks to everyone for all the help!

-Pandassaurus

 

Posted

Yes just make an iterator around the particle spawn and have it cover a range of x,y,z either systematically or with a random number generator inside certain bounds.  I use this to make a large fireball move through the air.

Long time Bukkit & Forge Programmer

Happy to try and help

  • 2 weeks later...
Posted

This isn't exact code as I'm on my phone, but you should be able to get it.

 

Double radius = 2.0d.  Specify how far out

 

for loop for as many particles per iteration you want.  I it's per tick, Ild keep it low

 

double x_shift = random.nextfloat() * 2 * radius + ( posX - radius)

 

Do same for y and z.  Except for y need to add Hal the height if your entity as well or it won't be centered

 

The spawn an entityfx of flame at your new shift coords

 

 

Play with it until it looks right.

 

 

Long time Bukkit & Forge Programmer

Happy to try and help

Posted

Hi,

Thanks! That seemed to work.

 

For anyone who wanted to see how I did it:

 

@Override
    public boolean onEntityItemUpdate(EntityItem entityItem) {
        if (entityItem.worldObj.getBlock((int) entityItem.posX, (int) entityItem.posY, (int) entityItem.posZ) == Blocks.lava ||
                entityItem.worldObj.getBlock((int) entityItem.posX, (int) entityItem.posY - 1, (int) entityItem.posZ) == Blocks.lava) {

            double radius = 1;
            for (int i = 0; i < 100; i++) {
                double x_shift = random.nextFloat() * 2 * radius + (entityItem.posX - radius);
                double y_shift = random.nextFloat() * 2 * radius + (entityItem.posY - radius) + .5;
                double z_shift = random.nextFloat() * 2 * radius + (entityItem.posZ - radius);
                BreakingBadParticleEffects.spawnParticle("Red Phosphorous", x_shift, y_shift, z_shift, 0, 0.1, 0);
            }
        }
        return super.onEntityItemUpdate(entityItem);
    }

 

 

 

thanks a lot for the help!

-Pandassaurus

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.