Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

I want to make my block spawn 3D little cube particles that look similar to this:

(craftland.org custom minecraft client with custom aether mod, multiplayer only).

 

I use a tessellator to draw.

 

here's my FX class:

 

package com.fancyparticles.mod;
import static org.lwjgl.opengl.GL11.GL_BLEND;
import static org.lwjgl.opengl.GL11.GL_GREATER;
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
import static org.lwjgl.opengl.GL11.glAlphaFunc;
import static org.lwjgl.opengl.GL11.glBlendFunc;
import static org.lwjgl.opengl.GL11.glDepthMask;
import static org.lwjgl.opengl.GL11.glDisable;

import java.util.Random;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class EntityBreakFX extends EntityFX{

Random r = new Random();

static final ResourceLocation texture = new ResourceLocation(Main.MODID, "textures/particle/texture.png");

protected EntityBreakFX(World world, double x, double y, double z) 
{
	super(world, x, y, z);
	setGravity(1);
	setScale(1);
	setMaxAge(100);
}

@Override
public void renderParticle(Tessellator tess, float partialTicks, float par3, float par4, float par5, float par6, float par7)
{
	Minecraft.getMinecraft().renderEngine.bindTexture(texture);
	GL11.glDepthMask(false);
	GL11.glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glAlphaFunc(GL_GREATER, 0.003921569F);
	tess.startDrawingQuads();
	tess.setBrightness(getBrightnessForRender(partialTicks));
	float scale = 0.0125F * particleScale;
	float x = (float) (prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
	float y = (float) (prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
	float z = (float) (prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);

                //here used to be the part where it was drawing vertexes with UVs. that's 2D. How can I make it 3D?

                //here's my first attempt to render a cube (I was too lazy to keep trying to invert the inverted normal maps...... so they're not translucent...):
                /*
                //Front
	tess.addVertex(x + 1, y + 1, z + 1);
	tess.addVertex(x, y + 1, z + 1);
	tess.addVertex(x, y, z + 1);
	tess.addVertex(x + 1, y, z + 1);

	//Back
	tess.addVertex(x + 1, y + 1, z + 1);
	tess.addVertex(x, y + 1, z + 1);
	tess.addVertex(x, y, z + 1);
	tess.addVertex(x + 1, y, z + 1);

	//Bottom
	tess.addVertex(x + 1, y, z);
	tess.addVertex(x, y, z);
	tess.addVertex(x, y, z + 1);
	tess.addVertex(x + 1, y, z + 1);

	//Top
	tess.addVertex(x, y + 1, z);
	tess.addVertex(x, y + 1, z + 1);
	tess.addVertex(x + 1, y + 1, z + 1);
	tess.addVertex(x + 1, y + 1, z);

	//Left
	tess.addVertex(x, y + 1, z + 1);
	tess.addVertex(x, y, z + 1);
	tess.addVertex(x, y, z);
	tess.addVertex(x, y + 1, z);

	//Right
	tess.addVertex(x + 1, y + 1, z + 1);
	tess.addVertex(x + 1, y + 1, z);
	tess.addVertex(x + 1, y, z);
	tess.addVertex(x + 1, y, z + 1);
                */

	tess.draw();
	glDisable(GL_BLEND);
	glDepthMask(true);
	glAlphaFunc(GL_GREATER, 0.1F);
}

public int getFXLayer()
{
	return 3;
}

public EntityBreakFX setMaxAge (int maxAge)
{
	particleMaxAge = maxAge;
	return this;
}

public EntityBreakFX setGravity (int gravity)
{
	particleGravity = gravity;
	return this;
}

public EntityBreakFX setScale (int scale)
{
	particleScale = scale;
	return this;
}
}

 

Is it possible?

1.7.10 is no longer supported, but since you gave an example it is obviously possible as it has been done before.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

  • Author

Ok.. one more question.. Is it possible to override the original minecraft's block breaking particle class using a core mod or something? I'd actually like to render every particle 3D instead of 2D..

Yeah, but you should look into it using any other means possible, because creating a core mod could cause some errors with other mods.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

  • Author

well since I don't really play any modpacks, I think it'll be ok with just block particles(breaking, and sprinting particles of the block you sprint on) :D

And another thing is that I don't know how to register the class with the effects and make it a core mod......

Also about that video.. that modpack runs on a minecraft client, that is customized including it'd LWJGL libraries....

 

I looked into the source code of the minecraft.jar file (the menu says  it's MC1.8 though) and they use Vector3 and such.. which I don't know how to use here.... one of my friends actually did make 3D particles but not using a core mod(they didn't replace the original ones..). I asked him for the code so I'm still waiting for response..

  • Author

Well. He said it's too complicated with the OpenGL.. here:

you can see our conversation in the comments..

also.. if as you say, 1.7.10 is not suported anymore... am I able to make it work for 1.8 then?

  • Author

Ok.. I did a little bit of research and learned how the vertexes with UV work nad played with it in MCP for a while(not forge, an internal mod - modified base class). This is the result: https://www.youtube.com/watch?v=6osH9bUVpsU

Now all I need is to make this work with forge. And that is by making this a core mod. Just like the NotEnoughItems mod.. But I just couldn't figure out how.

 

thanks  to this method I changed in EntityDiggingFX.class[MCP]:

public void renderParticle(Tessellator p_70539_1_, float p_70539_2_, float p_70539_3_, float p_70539_4_, float p_70539_5_, float p_70539_6_, float p_70539_7_)
    {
        float var8 = ((float)this.particleTextureIndexX + this.particleTextureJitterX / 4.0F) / 16.0F;
        float var9 = var8 + 0.015609375F;
        float var10 = ((float)this.particleTextureIndexY + this.particleTextureJitterY / 4.0F) / 16.0F;
        float var11 = var10 + 0.015609375F;
        float var12 = 0.1F * this.particleScale;

        if (this.particleIcon != null)
        {
        	var8 = this.particleIcon.getInterpolatedU((double)(this.particleTextureJitterX / 4.0F * 16.0F));
            var9 = this.particleIcon.getInterpolatedU((double)((this.particleTextureJitterX + 1.0F) / 4.0F * 16.0F));
            var10 = this.particleIcon.getInterpolatedV((double)(this.particleTextureJitterY / 4.0F * 16.0F));
            var11 = this.particleIcon.getInterpolatedV((double)((this.particleTextureJitterY + 1.0F) / 4.0F * 16.0F));
        }

        float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)p_70539_2_ - interpPosX);
        float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)p_70539_2_ - interpPosY) - var12 / 2;
        float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)p_70539_2_ - interpPosZ);
        p_70539_1_.setColorOpaque_F(1F, 1F, 1F); 
        //TODO
        
        //var8, var9 - X U
        //var 10, var 11 - Y V
        
        //front face
        p_70539_1_.addVertexWithUV(var13,         var14,         var15, (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13,         var14 + var12, var15, (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15, (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14,         var15, (double)var9, (double)var10);
      
        //back face
        p_70539_1_.addVertexWithUV(var13 + var12, var14,         var15 + var12, (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15 + var12, (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13,         var14 + var12, var15 + var12, (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13,         var14,         var15 + var12, (double)var9, (double)var10);
        
        //left face
        p_70539_1_.addVertexWithUV(var13, var14,         var15 + var12, (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13, var14 + var12, var15 + var12, (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13, var14 + var12, var15,         (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13, var14,         var15,         (double)var9, (double)var10);
        
        //right face
        p_70539_1_.addVertexWithUV(var13 + var12, var14,         var15,         (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15,         (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15 + var12, (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14,         var15 + var12, (double)var9, (double)var10);
        
        //top face
        p_70539_1_.addVertexWithUV(var13,         var14 + var12, var15,         (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13,         var14 + var12, var15 + var12, (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15 + var12, (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14 + var12, var15,         (double)var9, (double)var10);
        
        //bottom face
        p_70539_1_.addVertexWithUV(var13,         var14, var15 + var12, (double)var8, (double)var10);
        p_70539_1_.addVertexWithUV(var13,         var14, var15,         (double)var8, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14, var15,         (double)var9, (double)var11);
        p_70539_1_.addVertexWithUV(var13 + var12, var14, var15 + var12, (double)var9, (double)var10);

    }

 

For forge, you add this piece of code to a new class extending EntityFX or EntityDiggingFX...

Spawn it with Minecraft.getMinecraft().addEffect.effectRenderer(new [your Particle Class]([params]))

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.