Pandassaurus Posted April 10, 2014 Posted April 10, 2014 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 Quote
SanAndreaP Posted April 10, 2014 Posted April 10, 2014 Crash report / logs? Also make sure you call the spawnParticle method client-side only Quote 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.
Pandassaurus Posted April 10, 2014 Author Posted April 10, 2014 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 Quote
delpi Posted April 10, 2014 Posted April 10, 2014 I'm very interested in tracking items position in your hand. I've tried to do this and could figure it out. Quote Long time Bukkit & Forge Programmer Happy to try and help
coolAlias Posted April 10, 2014 Posted April 10, 2014 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. Quote http://i.imgur.com/NdrFdld.png[/img]
coolAlias Posted April 10, 2014 Posted April 10, 2014 @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 Quote http://i.imgur.com/NdrFdld.png[/img]
coolAlias Posted April 10, 2014 Posted April 10, 2014 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? Quote http://i.imgur.com/NdrFdld.png[/img]
SanAndreaP Posted April 10, 2014 Posted April 10, 2014 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 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 Quote 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.
delpi Posted April 10, 2014 Posted April 10, 2014 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? Quote Long time Bukkit & Forge Programmer Happy to try and help
SanAndreaP Posted April 10, 2014 Posted April 10, 2014 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 Quote 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.
delpi Posted April 10, 2014 Posted April 10, 2014 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). Quote Long time Bukkit & Forge Programmer Happy to try and help
coolAlias Posted April 11, 2014 Posted April 11, 2014 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. Quote http://i.imgur.com/NdrFdld.png[/img]
Pandassaurus Posted April 16, 2014 Author Posted April 16, 2014 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 Quote
delpi Posted April 16, 2014 Posted April 16, 2014 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. Quote Long time Bukkit & Forge Programmer Happy to try and help
Pandassaurus Posted April 24, 2014 Author Posted April 24, 2014 Hi, Sorry to be such a noob, but how would you do that? thanks, -Pandassaurus Quote
delpi Posted April 24, 2014 Posted April 24, 2014 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. Quote Long time Bukkit & Forge Programmer Happy to try and help
Pandassaurus Posted April 25, 2014 Author Posted April 25, 2014 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 Quote
Recommended Posts
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.