Jump to content

Recommended Posts

Posted

Hello

 

Is there a way to create a block which has a texture composed of multiple layers and color overlays?

 

i.e for items, I have a background and a foreground texture, both white, which are rendered with a different color (see below). I would like to do the same with a block. is that possible?

in the Item class

@Override
    public IIcon getIconFromDamageForRenderPass(int meta, int pass){
    	if(hasCustomIcon)return this.itemIcon;
        if(pass == 0){
            return icon_foreground;
        }else {
            return icon_background;
        }
    }
@Override
    public boolean requiresMultipleRenderPasses()
    {
        return true;
    }
    /** sets the item's color based on the itemstack
     * 
     */
    @Override
    @SideOnly(Side.CLIENT)
    public int getColorFromItemStack(ItemStack stack, int pass)
    {
        //if there is a custom icon registered, return the same thing as Item
        if(hasCustomIcon)return 16777215;
        //otherwise, return the colors of the dust
        IDust dust = DustRegistry.getDustFromItemStack(stack);
        return pass == 0 ? dust.getPrimaryColor(stack) : dust.getSecondaryColor(stack);
       
    }
    /** sets the icon of the dust.
     * default is based on the primary and secondary colors. 
     * override for custom icon
     * 
     * @param ireg 
     */
    @SideOnly(Side.CLIENT)
    @Override
    public void registerIcons(IIconRegister ireg){
    	hasCustomIcon=false;
        //just the plain one for now
        icon_foreground = ireg.registerIcon(References.texture_path + "dust_item_fore");
        icon_background = ireg.registerIcon(References.texture_path + "dust_item_sub");
    }

thaks.

 

also, sorry for the undescriptive title, I find this problem hard to explain for some reason.

Posted

Its probably possible, but I don't know how to do it. Just try looking at the vanilla class files. Vanilla Minecraft does that with various items like potions and spawn eggs.

Posted
  On 12/2/2014 at 11:47 PM, Awesome_Spider said:

Its probably possible, but I don't know how to do it. Just try looking at the vanilla class files. Vanilla Minecraft does that with various items like potions and spawn eggs.

 

I think he's trying to do it for blocks :P

 

I would take a look at the BlockGrass file, seeing as how the actual "grassy" part of the texture is layered onto a dirt texture and then color-changed depending on its biome.

Kain

Posted

thanks, although I don't see where to set the textures/colors in that. also, will i need one renderer per block?

 

the goal is to simplify adding "dusts" to my mod, making it so the dusts are created by specifying background and foreground colors, and the item and storage block are automatically created.

Posted

Hi

 

In your ISimpleBlockRenderingHandler, use the Tessellator to render your first layer, then the second layer, then the third, etc.

You can use the same ISimpleBlockRenderingHandler for multiple blocks, just register it for each one and check for the block type in your renderer.

 

You can use two passes for blocks, but they are handled differently to "passes" in items.  pass 0 is for fully opaque, pass1 is for translucent (partially opaque).  That might not be what you want...

 

-TGG

 

Posted

Hi

 

There's a bit about the Tessellator here

http://greyminecraftcoder.blogspot.com.au/2013/08/the-tessellator.html

 

Here's an old example from 1.6.4 which should give you the idea of how an ISBRH works

https://github.com/TheGreyGhost/ItemRendering/blob/master/src/TestItemRendering/blocks/BlockPyramidRenderer.java

and

https://github.com/TheGreyGhost/ItemRendering/blob/master/src/TestItemRendering/blocks/BlockPyramid.java

 

register it with

    RenderingRegistry.registerBlockHandler(new BlockPyramidRenderer());

 

I think it still works in 1.7.10... but I haven't tried it.  It should get you most of the way there at least.

 

-TGG

Posted

Thanks. things look like they should work in 1.7, although I am still unsure of how to render the texture in layers (I should be able to figure it out eventually). I did hope I could create the final texture directly in the block class, but it does not look possible without using "regular" Java image modification (which can be painful/slow) unless there are methods to modify/create IIcons directly

 

EDIT: also, is block metadata passed to renderWorldBlock ? I need it to get the right colors forget that, I got it (world.getBlockMetadata).

Posted

I think I figured part of it out, but the results I get are not what I'd expect, and I can't find what I'm doing wrong. probably related to vertex position and normals though.

 

ISimpleBlockRenderingHandler: (look at the last method. I also commented most faces out to try to get it right one face at a time)

package com.zpig333.runesofwizardry.client.render;

import com.zpig333.runesofwizardry.api.IDust;
import com.zpig333.runesofwizardry.api.IDustStorageBlock;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;

import org.lwjgl.opengl.GL11;


public class DustStorageRenderer implements ISimpleBlockRenderingHandler{
    private static int dustStorageRenderID;
    //following a "singleton" pattern since I don't like having a public constructor changing a static variable (could mess stuff up)
    private static DustStorageRenderer instance = null;
    private DustStorageRenderer(){
        dustStorageRenderID = RenderingRegistry.getNextAvailableRenderId();
    }
    public static int getRenderID(){
        return dustStorageRenderID;
    }
    public static DustStorageRenderer getInstance(){
        if(instance==null){
            instance=new DustStorageRenderer();
        }
        return instance;
    }
    @Override
    public void renderInventoryBlock(Block ablock, int metadata, int modelId, RenderBlocks renderer) {
        if (ablock instanceof IDustStorageBlock) {
            IDustStorageBlock block = (IDustStorageBlock) ablock;

            //thanks to TheGreyGhost for this https://github.com/TheGreyGhost/ItemRendering/blob/master/src/TestItemRendering/blocks/BlockPyramidRenderer.java
            Tessellator tes = Tessellator.instance;
            // if you don't perform this translation, the item won't sit in the player's hand properly in 3rd person view
            GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
            // for "inventory" blocks (actually for items which are equipped, dropped, or in inventory), should render in [0,0,0] to [1,1,1]
            tes.startDrawingQuads();
            renderDustBlock(tes, 0.0, 0.0, 0.0, metadata, block);
            tes.draw();
            // don't forget to undo the translation you made at the start
            GL11.glTranslatef(0.5F, 0.5F, 0.5F);
        }
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block ablock, int modelId, RenderBlocks renderer) {
        if (ablock instanceof IDustStorageBlock) {
            IDustStorageBlock block = (IDustStorageBlock) ablock;
            Tessellator tessellator = Tessellator.instance;
            // world blocks should render in [x,y,z] to [x+1, y+1, z+1]
            // tessellator.startDrawingQuads() has already been called by the caller
            int lightValue = block.getMixedBrightnessForBlock(world, x, y, z);
            tessellator.setBrightness(lightValue);
            tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
            renderDustBlock(tessellator, (double)x, (double)y, (double) z, world.getBlockMetadata(x, y, z), block);
            // tessellator.draw() will be called by the caller after return
            return true;
        }
        return false;
    }
    

    @Override
    public boolean shouldRender3DInInventory(int modelId) {
        return true;
    }

    @Override
    public int getRenderId() {
        return dustStorageRenderID;
    }

    private void renderDustBlock(Tessellator tessellator, double x, double y, double z, int meta, IDustStorageBlock block) {
        //TODO most of the work: renderDustBlock
        IDust dust = block.getIDust();
        ItemStack dustStack = new ItemStack(dust,1);
        IIcon bgIcon = block.getBackgroundIcon();
        IIcon fgIcon = block.getForegroundIcon();
        bgIcon = Blocks.lapis_block.getIcon(0, 0);
        fgIcon = Blocks.bedrock.getIcon(0, 0);
        double minUBG = (double) bgIcon.getMinU();
        double minVBG = (double) bgIcon.getMinV();
        double maxUBG = (double) bgIcon.getMaxU();
        double maxVBG = (double) bgIcon.getMaxV();
        //foreground texture
        double minUFG = (double) fgIcon.getMinU();
        double minVFG = (double) fgIcon.getMinV();
        double maxUFG = (double) fgIcon.getMaxU();
        double maxVFG = (double) fgIcon.getMaxV();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        // east face
        //background color
        tessellator.setNormal(1F, 0F, 0.0F);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0, z + 0, minUBG, maxVBG);
        /*
        //fg color
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0, z + 0, minUBG, maxVBG);
        tessellator.draw();
        // west face
        tessellator.startDrawingQuads();
        tessellator.setNormal(-1, 0, 0.0F);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 1.0, minUBG, maxVBG);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 1.0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUFG, maxVFG);
        tessellator.draw();
        // north face
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUBG, maxVBG);
        //fg color
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUFG, maxVFG);
        tessellator.draw();
        // south face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUBG, maxVBG);
        //fg color
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUFG, maxVFG);
        tessellator.draw();
        // bottom face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, -1F, 0.0F);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUBG, maxVBG);
        //fg color
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUFG, maxVFG);
        tessellator.draw();
        // UP face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, 1F, 0.0F);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUBG, maxVBG);
        //fg color
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1.0, minUFG, maxVFG);
*/
    }
}

 

result (notice how the north/south face is rendering when I'm trying to render the east face)

http://prntscr.com/5ff8xe

(couldn't figure out how to post the image properly)

Posted

Hi

 

Your code is a bit mixed up on which face points in which direction.  The Tessellator is hard to get right, when I was first getting used to it I had to hold a cardboard box and label it with a pen to get the vertices right.

 

So for example

        // east face
        //background color
        tessellator.setNormal(1F, 0F, 0.0F);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0, z + 0, minUBG, maxVBG);

 

The east face is the one which is located with all xpos = x+1, so none of the points in the face are located with xpos = x+0.  The code above has all points located at zpos = z+0,  which is the north face.

In order to do the east face, you need

(x+1, y+0, z+0, maxUBG, maxVBG)

(x+1, y+1, z+0, maxUBG, minVBG)

(x+1, y+1, z+1, minUBG, minVBG)

(x+1, y+0, z+1, minUBG, maxVBG)

The normal is right.

 

-TGG

Posted
  On 12/12/2014 at 10:14 AM, TheGreyGhost said:
Your code is a bit mixed up on which face points in which direction.  The Tessellator is hard to get right, when I was first getting used to it I had to hold a cardboard box and label it with a pen to get the vertices right.

 

And even then you'll fuck it up once in a while.

 

Doing this correctly took me like four hours even with a properly labeled drawing of which faces face which direction and have to be constructed in what order.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted
  On 12/12/2014 at 2:59 PM, diesieben07 said:

Now that was one well hidden shameless plug. :P

 

For a 1.6.4 micromod that I've since misplaced the code for (no really, I was syncing everything to dropbox and somewhere along the way I deleted the folders for everything pre-1.6.4).  Sure. :D

 

1.6.4.?  Nein, 1.5.1. and 1.6.2

 

It's one I do want to remake for 1.7 though, it's very useful.  I'd drop the slope support though, it was slightly buggy (the custom rail required air below it, so if you tried to connect a slope to a vanilla rail that was on the ground, it would work....until that rail received a block update).

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

yay, I managed to get a cube rendering! making a box with the coordinates of the different corners helped a lot.

 

however, I can't get it to render the multiple textures, and my UP face is completely black when using my custom texture (it was working when I used the sand texture)

 

renderer:

package com.zpig333.runesofwizardry.client.render;

import com.zpig333.runesofwizardry.api.IDust;
import com.zpig333.runesofwizardry.api.IDustStorageBlock;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;

import org.lwjgl.opengl.GL11;


public class DustStorageRenderer implements ISimpleBlockRenderingHandler{
    private static int dustStorageRenderID;
    //following a "singleton" pattern since I don't like having a public constructor changing a static variable (could mess stuff up)
    private static DustStorageRenderer instance = null;
    private DustStorageRenderer(){
        dustStorageRenderID = RenderingRegistry.getNextAvailableRenderId();
    }
    public static int getRenderID(){
        return dustStorageRenderID;
    }
    public static DustStorageRenderer getInstance(){
        if(instance==null){
            instance=new DustStorageRenderer();
        }
        return instance;
    }
    @Override
    public void renderInventoryBlock(Block ablock, int metadata, int modelId, RenderBlocks renderer) {
        if (ablock instanceof IDustStorageBlock) {
            IDustStorageBlock block = (IDustStorageBlock) ablock;

            //thanks to TheGreyGhost for this https://github.com/TheGreyGhost/ItemRendering/blob/master/src/TestItemRendering/blocks/BlockPyramidRenderer.java
            Tessellator tes = Tessellator.instance;
            // if you don't perform this translation, the item won't sit in the player's hand properly in 3rd person view
            GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
            // for "inventory" blocks (actually for items which are equipped, dropped, or in inventory), should render in [0,0,0] to [1,1,1]
            tes.startDrawingQuads();
            renderDustBlock(tes, 0.0, 0.0, 0.0, metadata, block);
            tes.draw();
            // don't forget to undo the translation you made at the start
            GL11.glTranslatef(0.5F, 0.5F, 0.5F);
        }
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block ablock, int modelId, RenderBlocks renderer) {
        if (ablock instanceof IDustStorageBlock) {
            IDustStorageBlock block = (IDustStorageBlock) ablock;
            Tessellator tessellator = Tessellator.instance;
            // world blocks should render in [x,y,z] to [x+1, y+1, z+1]
            // tessellator.startDrawingQuads() has already been called by the caller
            int lightValue = block.getMixedBrightnessForBlock(world, x, y, z);
            tessellator.setBrightness(lightValue);
            tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F);
            renderDustBlock(tessellator, (double)x, (double)y, (double) z, world.getBlockMetadata(x, y, z), block);
            // tessellator.draw() will be called by the caller after return
            return true;
        }
        return false;
    }
    

    @Override
    public boolean shouldRender3DInInventory(int modelId) {
        return true;
    }

    @Override
    public int getRenderId() {
        return dustStorageRenderID;
    }

    private void renderDustBlock(Tessellator tessellator, double x, double y, double z, int meta, IDustStorageBlock block) {
        //TODO most of the work: renderDustBlock
        IDust dust = block.getIDust();
        ItemStack dustStack = new ItemStack(dust,1,meta);
        IIcon bgIcon = block.getBackgroundIcon();
        IIcon fgIcon = block.getForegroundIcon();
        int primaryColor = dust.getPrimaryColor(dustStack);
        int secondaryColor = dust.getSecondaryColor(dustStack);
        //bgIcon = Blocks.sand.getIcon(0, 0);
        //fgIcon = Blocks.bedrock.getIcon(0, 0);
        double minUBG = (double) bgIcon.getMinU();
        double minVBG = (double) bgIcon.getMinV();
        double maxUBG = (double) bgIcon.getMaxU();
        double maxVBG = (double) bgIcon.getMaxV();
        //foreground texture
        double minUFG = (double) fgIcon.getMinU();
        double minVFG = (double) fgIcon.getMinV();
        double maxUFG = (double) fgIcon.getMaxU();
        double maxVFG = (double) fgIcon.getMaxV();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        // east face
        //background color
        tessellator.draw();//flush
        tessellator.startDrawingQuads();
        tessellator.setNormal(1F, 0F, 0.0F);
        tessellator.setColorRGBA_I(primaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0, z + 1, minUBG, maxVBG);
        tessellator.draw();
        
        //fg color
        tessellator.startDrawingQuads();
        tessellator.setNormal(1F, 0F, 0.0F);
        tessellator.setColorRGBA_I(secondaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0, z + 1, minUFG, maxVFG);
        tessellator.draw();
        
        // west face
        tessellator.startDrawingQuads();
        tessellator.setNormal(-1, 0, 0.0F);
        tessellator.setColorRGBA_I(primaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 1.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 0.0, y + 1.0, z + 1.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0.0, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 0.0, minUBG, maxVBG);
        tessellator.draw();
        
        tessellator.startDrawingQuads();
        tessellator.setNormal(-1, 0, 0.0F);
        tessellator.setColorRGBA_I(secondaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 1.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 0.0, y + 1.0, z + 1.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 0.0, y + 1.0, z + 0, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 0.0, y + 0.0, z + 0.0, minUFG, maxVFG);
        
        tessellator.draw();
        // north face
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(primaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 0.0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 0, y + 1, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0, minUBG, maxVBG);
        tessellator.draw();
        
        //fg color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(secondaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 0.0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 0, y + 1, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 1, y + 1.0, z + 0, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 0, minUFG, maxVFG);
        
        tessellator.draw();
        // south face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(dust.getPrimaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 1, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 1.0, minUBG, maxVBG);
        tessellator.draw();
        //fg color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, 0F, 1);
        tessellator.setColorRGBA_I(secondaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 1, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 1.0, minUFG, maxVFG);
        
        tessellator.draw();
        // bottom face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, -1F, 0.0F);
        tessellator.setColorRGBA_I(primaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 1, y + 0.0, z + 0, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0, z + 1, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 0, minUBG, maxVBG);
        tessellator.draw();
        //fg color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, -1F, 0.0F);
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1, y + 0.0, z + 0, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 0.0, z + 1, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y + 0, z + 1, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y + 0.0, z + 0, minUFG, maxVFG);
        
        tessellator.draw();
        // UP face
        tessellator.startDrawingQuads();
        //NOrmals: X+ = east, Y+ =up, z+ = south 
        //background color
        tessellator.setNormal(0, 1F, 0.0F);
        tessellator.setColorRGBA_I(primaryColor, 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 1, maxUBG, maxVBG);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 0.0, maxUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 0, minUBG, minVBG);
        tessellator.addVertexWithUV(x + 0, y +1, z + 1.0, minUBG, maxVBG);
        tessellator.draw();
        //fg color
        tessellator.startDrawingQuads();
        tessellator.setNormal(0, 1F, 0.0F);
        tessellator.setColorRGBA_I(dust.getSecondaryColor(dustStack), 0xFF);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 1, maxUFG, maxVFG);
        tessellator.addVertexWithUV(x + 1.0, y + 1, z + 0.0, maxUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y + 1.0, z + 0, minUFG, minVFG);
        tessellator.addVertexWithUV(x + 0, y +1, z + 1.0, minUFG, maxVFG);

    }
}

Posted

Definitely something wrong here, But I dont know enough to say what. my guess is that it is related to either having two "faces" per block side or the transparency.

 

screenshot: (the color is fading in and out for some reason)

 

http://prntscr.com/5hohza

 

also, I would be very happy if someone would explain to me how to post images on this forum...

Posted
  On 12/17/2014 at 12:16 AM, xilef11 said:

also, I would be very happy if someone would explain to me how to post images on this forum...

 

An [img ] tag with a URL in it that ends in .jpg, .png, or .gif

 

In this case, http://i.imgur.com/j1sL26u.png

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Hi

 

A couple of things-

1) if you are going to use brightness, you need to tessellator.setBrightness(lightValue); after every tessellator.startDrawingQuads(); because the tessellator.draw(); resets the brightness to zero.

2) for transparent blocks, the appropriate light value is the one you use, i.e.  int lightValue = block.getMixedBrightnessForBlock(world, x, y, z);

    but for opaque blocks, you need to take the light value for each face from the adjacent block, because the light value for the block itself is zero, eg

int lightValue = block.getMixedBrightnessForBlock(world, x+1, y, z); if you are drawing the east face.

3) If you are drawing the FG on top of the BG you should 'nudge' the FG face out by a very small amount to make sure it renders over the top of the BG face.  Otherwise it can get partially hidden or lead to weird stripy effects.  For example, for the east face, draw BG at x+1, and the FG at x+1.001;

 

Apart from that, your code looks ok to me.  Are you sure your dust.getSecondaryColor(dustStack) etc are correct?  the setNormals should only be required for inventory displaying; I don't think it should hurt to have them for block rendering too but you could try commenting them out if you are still having trouble.

 

-TGG

Posted

After a bit more testing, it seems the problem is my textures, since it works fine when using vanilla textures. How should transparency be handled? I currently have two png files with transparent pixels.

Posted

Hi

 

Minecraft uses two kinds of transparency -

the first is "on/off" transparency - any texels with an alpha less than 0.1 are fully transparent, any texels with an alpha of 0.1 or more are drawn fully opaque.  this is the "pass 0 " rendering.  Are you sure your png files have the proper alpha channel?

the second is alpha-blending transparency, where the texels are drawn according to their alpha level eg 0.6 means 60% opaque, 40% transparent.  this is "pass 1".

 

I think you want the on/off kind.  If you use alpha values of 0.0 or 1.0 (0 or 255) it should work fine.  If you are colouring the overlays afterwards, the png should have white texels - i.e. if your texels are green, and you try to colour them blue when rendering, you will get black.

 

-TGG

Posted
  On 12/18/2014 at 6:13 PM, TheGreyGhost said:

the second is alpha-blending transparency, where the texels are drawn according to their alpha level eg 0.6 means 60% opaque, 40% transparent.  this is "pass 1".

 

Note:

In pass 1, alpha below 0.1 is also drawn as fully transparent.  It's really annoying.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

the texels are either fully opaque or fully transparent, so the problem must be somewhere else... It seems that the textures are not correctly loaded, since a println of them in the renderer returns the following:

TextureAtlasSprite{name='runesofwizardry:dustStorage_bg', frameCount=0, rotated=false, x=0, y=0, height=0, width=0, u0=0.0, u1=0.0, v0=0.0, v1=0.0}

 

however, the log shows no message about a missing texture. Here is my block class:

package com.zpig333.runesofwizardry.api;

import net.minecraft.block.BlockFalling;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.init.Blocks;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;

import com.zpig333.runesofwizardry.client.render.DustStorageRenderer;
import com.zpig333.runesofwizardry.core.References;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public abstract class IDustStorageBlock extends BlockFalling {
    //Icons for the background and foreground
    private static IIcon bgIcon,fgIcon;
    public IDustStorageBlock(Material mat){
        super(mat);
    }
    /** returns the dust that forms this block **/
    public abstract IDust getIDust();
    @Override
    public int damageDropped(int i) {
        return i;
    }
    public IIcon getBackgroundIcon(){
        return bgIcon;
    }
    public IIcon getForegroundIcon(){
        return fgIcon;
    }
    //TODO finish setting up the block
    //TODO Icons and stuff

    @Override
    public void registerBlockIcons(IIconRegister reg) {
        //sand icon, used only for the particles when breaking block
        blockIcon = Blocks.sand.getIcon(0, 0);
        if(bgIcon==null||fgIcon==null){
            bgIcon = reg.registerIcon(References.texture_path+"dustStorage_bg");
            fgIcon = reg.registerIcon(References.texture_path+"dustStorage_fg");
        }
    }

    @Override
    public boolean renderAsNormalBlock() {
        return false;
    }

    @Override
    public int getRenderType() {
        return DustStorageRenderer.getRenderID();
    }
}

Posted

Update: it seems that removing the if(**Icon==null) statments before registering the textures fixed the problem. However, when the blocks fall, they get the sand texture. is there a (hopefully simple-ish) way to fix that?

  • 3 weeks later...

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Looking to save big on your next Temu purchase? Then you’ll love our Temu coupon code 40% off, designed especially for savvy shoppers like you. One of the best codes available right now is [acs670886]—a code that brings maximum benefits to shoppers in the USA, Canada, and European countries. Whether you're hunting for a Temu coupon code 2025 for existing customers or a Temu 40% discount coupon, we've got you covered with the most valuable offers this year. What Is The Temu Coupon Code 40% Off? Great news—both new and existing customers can unlock amazing benefits with our Temu coupon 40% off offer on the Temu app and website. This exclusive 40% discount Temu coupon is your key to unlocking unbeatable savings on a wide variety of items. [acs670886] – Get a flat 40% discount on your very first Temu purchase as a new user. [acs670886] – Existing users can also enjoy 40% off on selected items without needing to create a new account. [acs670886] – Receive a $100 coupon pack usable across multiple orders, perfect for frequent shoppers. [acs670886] – New customers can enjoy up to $100 flat discount by applying this single code during checkout. [acs670886] – Use this extra $100 off promo code for existing customers to save big and keep shopping. Temu Coupon Code 40% Off For New Users As a new user on the Temu app, you stand to gain the most when you use our exclusive Temu coupon 40% off. Don't miss the benefits that also include the Temu coupon code 40 off for existing users, making it a one-size-fits-all deal. [acs670886] – Unlock a flat 40% discount right after you register as a new Temu user. [acs670886] – Get a generous $100 coupon bundle for your initial purchases. [acs670886] – Use your bundle across multiple uses for up to $100 in savings. [acs670886] – Enjoy free shipping to over 68 countries when using this coupon. [acs670886] – Receive an extra 30% off on any purchase for your first transaction. How To Redeem The Temu 40% Off Coupon Code For New Customers? Getting started with Temu 40% off is easy. Follow these steps to use your Temu 40 off coupon code and enjoy immediate savings: Download the Temu app or visit the Temu website. Sign up as a new customer with your email address. Browse through the categories and add your favorite items to your cart. Proceed to checkout and locate the promo code box. Enter [acs670886] and click "Apply". Watch the price drop by 40% instantly! Temu Coupon Code 40% Off For Existing Users Existing Temu customers can still enjoy significant savings using our Temu 40 off coupon code. By applying the Temu coupon code for existing customers, you continue to shop smart without compromising on value. [acs670886] – Get an additional 40% off select items just for being a loyal Temu user. [acs670886] – Redeem a $100 coupon bundle that can be used on multiple purchases. [acs670886] – Receive a free gift with express shipping across the USA and Canada. [acs670886] – Stack an extra 30% discount on top of already reduced prices. [acs670886] – Enjoy free shipping in 68 countries, regardless of your cart size. How To Use The Temu Coupon Code 40% Off For Existing Customers? To make the most of the Temu coupon code 40 off as a returning customer, just follow this guide. Here's how to apply your Temu discount code for existing users: Open the Temu app or visit the website. Log into your existing account. Add desired products to your shopping cart. Navigate to the checkout page. Input [acs670886] in the promo code field and hit apply. Your 40% discount and any bonus offers will be automatically deducted. How To Find The Temu Coupon Code 40% Off? Looking for the Temu coupon code 40% off first order or the latest Temu coupons 40 off? We’ve got tips to help you find them easily and effectively. Sign up for Temu’s newsletter to receive verified and tested coupon codes directly in your inbox. Also, follow Temu’s official social media channels for real-time updates on promos, giveaways, and limited-time offers. For guaranteed deals, visit any trusted coupon website where our code [acs670886] is always listed and up to date. How Temu 40% Off Coupons Work? Yes, Temu coupon code 40% off first time user and Temu coupon code 40 percent off offers are 100% functional and easy to use. These codes work by applying a percentage-based discount automatically at checkout when entered into the promo box. Once you copy the code, add your items to the cart and enter the coupon, the system calculates your 40% discount instantly. This applies to both physical products and digital items on the Temu platform. Depending on your customer status—new or existing—the same code may also unlock other benefits like free shipping and bundled coupons. How To Earn 40% Off Coupons In Temu As A New Customer? To earn the Temu coupon code 40% off as a first-time shopper, all you need to do is sign up on the app or website. Once you're onboard, the Temu 40 off coupon code first order becomes active and applicable to your first purchase. By entering the promo code [acs670886] during your initial checkout, you’ll receive an instant 40% discount along with several bonus offers. Additionally, participating in referral programs or special promotions on Temu's homepage may earn you extra coupons and freebies. What Are The Advantages Of Using Temu 40% Off Coupons? Using the Temu 40% off coupon code legit has its fair share of perks. Whether you're shopping for fashion, gadgets, or home goods, our coupon code for Temu 40 off delivers excellent value. 40% discount on your first order 40% discount for existing customers $100 coupon bundle for multiple uses Up to 70% discount on top-rated items Extra 30% off for returning customers Up to 90% off on select flash sale products Free gift for first-time users Free shipping to 68 countries Temu Free Gift And Special Discount For New And Existing Users With our Temu 40% off coupon code and 40% off Temu coupon code, you get more than just a price cut. Temu rewards loyal and new users alike with exciting gifts and discounts. [acs670886] – Get a 40% discount on your very first Temu order. [acs670886] – Enjoy 40% off as an existing customer. [acs670886] – Save an extra 30% on any item sitewide. [acs670886] – Receive a free welcome gift on signing up as a new user. [acs670886] – Unlock up to 70% discount on curated deals within the app. [acs670886] – Get a free gift with complimentary shipping in 68 supported countries including the USA and UK. Pros And Cons Of Using Temu Coupon Code 40% Off We believe transparency is key, so here’s a quick overview of the Temu coupon 40% off code and the Temu free coupon code 40 off benefits and limitations: Pros: Save 40% instantly on both new and existing accounts Enjoy a $100 coupon bundle for extended value Combine with existing site discounts Free shipping to many countries Receive free gifts and bonus offers Cons: Limited to certain products or categories May not combine with some third-party coupons Must be applied before checkout to be valid Terms And Conditions Of The Temu 40% Off Coupon Code In 2025 To use the Temu coupon code 40% off free shipping and Temu coupon code 40% off reddit effectively, you should be aware of the following terms: No expiration date: use it whenever you like Applicable for both new and returning users Valid in 68 countries, including the USA, UK, and Canada No minimum purchase required Cannot be combined with certain store credits or gift cards Final Note You don’t need to spend hours searching for the best deal—our Temu coupon code 40% off does all the hard work for you. Just copy and apply it for immediate and guaranteed savings. With this Temu 40% off coupon, shopping smart is now easier than ever. Don’t miss your chance to save big and enjoy exclusive benefits. FAQs Of Temu 40% Off Coupon Q1. Can I use the Temu 40% off coupon code more than once? Yes, you can use the code multiple times if you create different accounts or participate in various promotions offered by Temu. Q2. Is the Temu coupon code 40% off valid for all items? The 40% discount applies to most categories but may exclude certain sale items or limited-edition products. Always check the product page for eligibility. Q3. Does the [acs670886] code provide any extra benefits? Absolutely! In addition to 40% off, you may receive free gifts, shipping, and a $100 coupon bundle depending on your location and user status. Q4. Can existing customers use the Temu 40% off coupon? Yes, existing users can also enjoy the same benefits by using the [acs670886] code during checkout. Q5. How do I know if my 40% off Temu coupon is working? Once you enter the code at checkout, the discount will be automatically applied. If it doesn’t reflect, check for any restrictions or contact Temu support.  
    • Looking to slash your shopping costs on Temu? Whether you're filling your cart with fashion, electronics, home décor, or beauty products, the Temu coupon code $100 off [acs670886] is your key to unlocking real, verified savings. This powerful code works across multiple categories, giving both new and existing users in the USA, Canada, and Europe an easy way to save more on every order. What Is the Temu Coupon Code for $100 Off? The coupon code is simple: [acs670886]. When applied, it unlocks instant savings of up to $100 off your entire purchase. Here's how you can use it: [acs670886] – Flat $100 Off on your total cart value.   [acs670886] – $100 Coupon Pack with multiple-use savings.   [acs670886] – Tailored $100 Discount for new users.   [acs670886] – $100 Promo Code for existing and loyal customers.   [acs670886] – Exclusive for North America (USA/Canada-focused benefits).   Whether you're a first-time shopper or a returning user, this code provides serious value. Temu Coupon Code $100 Off for New Users in 2025 New to Temu? Then you're starting off strong. As a first-time customer, using coupon code [acs670886] opens the door to incredible offers: Get a flat $100 off on your first purchase.   Receive a $100 coupon bundle with savings spread across multiple orders.   Enjoy free shipping to more than 68 countries.   Score an extra 30% off your first order—on top of the $100 discount.   How to Redeem Temu $100 Off for New Customers Follow these steps to apply your code successfully: Visit the official Temu website or download the mobile app.   Register as a new user using your email or social account.   Shop your favorite items and add them to your cart.   At checkout, look for the coupon or promo code section.   Enter [acs670886] and apply it.   Your $100 discount will automatically reduce your total.   Temu Coupon Code $100 Off for Existing Customers Already a Temu shopper? You can still save big. The Temu $100 coupon is not limited to new users—existing customers can use the same code for exciting benefits. Here’s what’s in store with [acs670886] for returning users: A special $100 discount designed for repeat customers.   Access to a $100 multi-use coupon pack.   Complimentary express shipping throughout the USA and Canada.   Combine with other promotions for up to 30% extra savings.   Free delivery to over 68 countries for loyal customers.   How to Use Temu Coupon Code $100 Off for Existing Users Here’s how to apply the code: Open the Temu website or app and log in.   Browse your desired categories and add products to your cart.   During checkout, find the promo code box.   Enter [acs670886] and click apply.   Instantly enjoy your discount and complete your order.   Temu Coupon Code $100 Off First Order Make your first order unforgettable with these exclusive first-time offers: [acs670886] – $100 Off First Purchase   [acs670886] – $100 Coupon Pack for First-Time Use   [acs670886] – Additional 30% Off on any item during your first order   [acs670886] – Free worldwide shipping   Temu’s new user program is built to provide maximum savings on your first few purchases, making it the perfect time to explore all their top categories. Where to Find the Temu $100 Off Coupon Code Finding verified Temu coupons is easier than ever. Here's where to look: Temu Newsletter: Subscribe to receive new and exclusive promo codes like [acs670886].   Social Media: Follow Temu on Facebook, Instagram, and Twitter for flash deals and seasonal coupons.   Trusted Coupon Websites: Look out for pages like ours that verify and update coupon codes regularly.   You’ll often find this $100 off Temu coupon code highlighted under trending offers or Reddit deal threads. Is the Temu $100 Off Coupon Legit? Yes, the Temu $100 off coupon is 100% legitimate. The code [acs670886] has been tested, verified, and is currently active. It works for both: First-time users.   Existing customers.   And the best part? It doesn’t expire, giving you flexibility on when to use it. How Does the Temu $100 Off Coupon Work? When you enter [acs670886] at checkout, the system automatically deducts $100 from your total, provided you meet any item or order requirements set by Temu. You can use the code: On Temu’s mobile app or official website.   Alongside other discounts or promotions (stackable in some cases).   Across categories like electronics, beauty, clothing, homeware, and more.   How to Earn a Temu $100 Coupon as a New Customer Becoming eligible for the Temu $100 coupon is easy. Just follow these steps: Sign up as a new user on the app or website.   After registration, you'll automatically receive a $100 coupon pack.   Check your Temu wallet or email for details on applying each part of the bundle.   Take part in referral programs and exclusive app deals to unlock additional coupons.   Benefits of Using the Temu $100 Off Coupon Using coupon code [acs670886] offers a wide range of benefits: $100 off your first purchase.   Bundled savings for multiple transactions.   Up to 70% discount on trending and seasonal items.   Free shipping to over 68 countries.   An extra 30% off on eligible products for new and returning users.   Access to free gifts and early product releases.   Whether you’re restocking essentials or trying something new, this deal ensures you never pay full price. Temu $100 Off Coupon Code + Free Gift for All Users Make the most out of your order with these bonus perks: Use [acs670886] to claim $100 off instantly.   Stack with 30% additional discounts for bigger savings.   Receive a free gift on your first order.   Access top product deals with up to 70% off.   Enjoy international shipping benefits, including the USA, UK, and EU.   Terms and Conditions of Temu $100 Off Coupon in 2025 Before applying the code, take note of these essential terms: The coupon has no expiry date.   Valid for both new and existing users.   Applicable in 68+ countries, including the USA and Canada.   No minimum purchase required for activation.   Code to use: [acs670886]   Final Note – Don’t Miss Out on the Temu $100 Off Deal If you’re ready to shop smart and save big, there’s no better time than now. With Temu coupon code $100 off [acs670886], you can unlock unbeatable savings, free gifts, and global delivery benefits in just a few clicks. Whether it’s your first time shopping or you’re coming back for more, this code delivers the value you deserve. FAQs Of  Temu $100 Off Coupon Q1: Can I use the Temu $100 coupon multiple times? Yes. In many cases, especially with the coupon pack, you can spread the $100 across multiple orders. Q2: Is the code valid on both the website and the app? Yes, [acs670886] works on both platforms. Q3: Can this be stacked with other offers? Temu often allows stacking promotions, so combining the $100 coupon with other discounts is possible. Q4: Is it only for new users? No. While new users get extra benefits, existing users can still use the same code with special versions. Q5: Which countries are eligible? The coupon is valid across 68 countries, including the USA, Canada, UK, Australia, and other European nations.  
    • I have no idea - maybe use a pre-configured modpack as working base and add some new mods one by one
    • Is there a crash-report?   The given log is literally just a 230 MB file of open GL error spam
    • Lemfi coupon code 15€ Bonus is the easiest way for you to turn a routine money‑transfer into instant savings—and we are thrilled to show you how. We tested it ourselves and unlocked the extra cash in seconds. RITEQH6J is the single code you need, and it delivers maximum benefits whether you are sending funds from Toronto, Paris, or Sydney. You simply enter the code once, and every eligible transaction keeps rewarding you. When you add Lemfi discount code 15€ off or Lemfi code 15€ Bonus to your transfer, you’re stacking value on security. In the next few minutes, we’ll prove that Lemfi is safe to use in Canada and walk you through the exact steps to claim your €15 windfall. What Is The Lemfi Promo Code for 15€ Bonus? Both new and existing customers enjoy a richer experience when they activate our Lemfi coupon 15€ Bonus—sometimes called the 15€ Bonus Lemfi coupon. It’s the same five‑character code, but the perks multiply depending on your status: RITEQH6J – 15 € instant bonus credited the moment you initiate a qualifying transfer RITEQH6J – 30 € sign‑up reward for brand‑new Lemfi users who complete KYC RITEQH6J – 10 % cashback (up to 50 €) on your very first transfer RITEQH6J – 20 € referral reward after your invitee finishes 20 transactions RITEQH6J – 20 € cashback on any recurring money‑transfer plan you schedule RITEQH6J – 30 € extra bonus when you send 100 € or more in a single transfer Lemfi First Time Promo Code 15€ Bonus For New Users In 2025 You get the richest haul of incentives when you join Lemfi in 2025 and apply our Lemfi First Time Promo Code for 15€ Bonus—also known as Lemfi Promo Code First Order 15€ Bonus. Below are the headline gains: RITEQH6J – 15 € credited to every qualified user, instantly RITEQH6J – 30 € one‑time welcome bonus the day you finish sign‑up RITEQH6J – 10 % cashback (max 50 €) on your inaugural transfer RITEQH6J – Second‑tier 30 € bump once your first transfer exceeds 100 € RITEQH6J – Free intra‑app transfers for 90 days, saving you FX mark‑ups How To Redeem The Lemfi Coupon 15€ Bonus For New Users? Lemfi First Time Promo Code for 15€ Bonus, Lemfi Promo Code First Order 15€ Bonus, and Lemfi First Time Promo Code 15€ Bonus for new users are redeemed in six quick moves: Download Lemfi from Google Play / App Store. Open an account with your legal name and Canadian address. Complete photo ID verification and selfie check. On the “Promo” screen, paste RITEQH6J and tap “Apply.” Initiate your first money transfer of 10 € or more. Watch the 15 € bonus hit your Lemfi balance before the funds even settle. Lemfi Promo Code 15€ Bonus For Existing Customers Already have a wallet? Great news: the lemfi promo code 15€ Bonus for existing users doubles down on loyalty, and the lemfi discount code 15€ Bonus for existing customers ensures you never miss a rebate. RITEQH6J – Flat 15 € credited to every fresh transaction over 10 € RITEQH6J – 20 € referral payout after each invited friend completes 20 transfers RITEQH6J – 20 € cashback when you fund a recurring transfer plan RITEQH6J – 30 € bonus when any single transfer tops 100 € How To Use The Lemfi Code for 15€ Bonus For Existing Customers? Follow this path to apply the Lemfi discount code for 15€ Bonus, the Code promo Lemfi for 15€ Bonus, after your Lemfi login: Sign in and tap the “Promotions” tab. Enter RITEQH6J in the promo box and confirm. Start a new transfer or schedule a future one. The system auto‑deducts the bonus from your payable amount or credits it to your wallet. Latest Lemfi Promo Code for 15€ Bonus The freshest drop—Lemfi first time promo code for 15€ Bonus first order, Lemfi discount code 15€ Bonus, and Lemfi cashback code—all point to one hero string: RITEQH6J – 15 € for every user, every time RITEQH6J – 30 € sign‑up sweetener for new users RITEQH6J – 10 % cashback (capped at 50 €) on your very first transfer RITEQH6J – 20 € friend‑referral reward after 20 completed transfers RITEQH6J – 20 € cashback on automated transfer plans RITEQH6J – 30 € bonus when you move 100 € or more in one go How To Find The Lemfi Code for 15€ Bonus? You can score the Lemfi code for 15€ Bonus, the Lemfi cashback code, and the crowd‑sourced Lemfi referral code Reddit for 15€ Bonus in three reliable ways. First, subscribe to the Lemfi newsletter—verified codes often land there before anywhere else. Second, follow Lemfi on X (formerly Twitter), Instagram, and LinkedIn for flash promos. Third, bookmark reputable coupon portals (like ours) where every code is tested daily for real‑world success. Is Lemfi 15€ Bonus Code Legit? Is Lemfi legit? Absolutely. Lemfi (legal name Lemonade Technology Ltd.) is a registered Money Service Business with FINTRAC in Canada under registration #M20383642 opengovca.com. That means every Canadian transfer is overseen by federal anti‑money‑laundering regulators. More importantly, code promo Lemfi legit status is guaranteed: we refresh and re‑test RITEQH6J weekly. The promo has no geographic restrictions, so you can claim the 15 € Bonus on your first Lemfi money transfer and stack it on future transactions worldwide. How Does Lemfi Code for 15€ Bonus Work? 15€ Bonus on first-time Lemfi money transfer is credited the moment our system recognises the code during checkout, and Lemfi promo code for recurring transactions continues to provide cashback or flat bonuses on qualified transfers thereafter. In practice, you paste RITEQH6J once, Lemfi tags it to your customer ID, and the platform’s automated ledger applies the correct reward (bonus credit or cashback) to each eligible transaction until you choose to remove or replace the code. How To Earn Lemfi 15€ Bonus Coupons As A New Customer? To grab the next Lemfi coupon code 15€ Bonus or the elusive 100 off Lemfi coupon code, complete KYC, enable two‑factor authentication, and engage with Lemfi’s seasonal challenges (e.g., “Send three transfers in one week”). Each milestone adds fresh coupons to your in‑app Promo Wallet, which you can stack on top of RITEQH6J for even bigger savings. What Are The Advantages Of Using The Lemfi Discount Code for 15€ Bonus? Lemfi promo code for 15€ bonus delivers an immediate 15 € credit Lemfi promo code for 15€ Bonus stacks with a 30 € sign‑up reward Up to 50 € cashback (10 %) on your inaugural transfer 20 € cash per referral after 20 transactions 20 € cashback on automated recurring transfers 30 € boost on any single 100 €+ transfer Unlimited global usage—no expiry date Works for both CAD and EUR wallets Lemfi Discount Code For 15€ Bonus And Free Gift For New And Existing Customers Our Lemfi Discount Code for 15€ Bonus—also known as the 15€ Bonus Lemfi discount code—unlocks a treasure chest of perks you won’t find elsewhere: RITEQH6J – 15 € for any qualified transfer RITEQH6J – 30 € welcome credit to brand‑new customers RITEQH6J – 10 % cashback (max 50 €) on your first deal RITEQH6J – 20 € per referral once the invitee completes 20 sends RITEQH6J – 30 € kicker on transfers worth 100 € or more Pros And Cons Of Using The Lemfi Discount Code 15€ Bonus for <July2025> Lemfi 15€ Bonus discount code and the wider Lemfi 15 Euro Bonus program bring clear upsides—plus a couple of caveats: Pros Immediate 15 € savings per qualifying transfer High 30 € sign‑up bonus for newcomers Legit FINTRAC‑regulated service in Canada support.lemfi.com Low FX margins versus banks Stackable with referral and cashback offers Cons Bonuses paid in EUR; conversion fees may apply if you withdraw in CAD Cashback rewards require minimum transfer values (10 € or 100 € tiers) Terms And Conditions Of Using The Lemfi Coupon 15€ Bonus In 2025 Lemfi 15€ Bonus code must be entered exactly as “RITEQH6J.” Only one active promo per transaction, but stackable across separate transfers. Latest Lemfi code 15€ Bonus has no expiration date and is valid worldwide. Available to KYC‑verified users aged 18 +. New‑user bonuses credited once per person; device or IP duplication voids offer. Existing‑user cashback requires recurring transfer setup. Lemfi reserves the right to amend terms with 30‑days’ notice. Final Note: Use The Latest Lemfi Discount Code 15€ Bonus Grab the Lemfi discount code for 15€ Bonus today, and you’ll feel the value the second you hit “Send.” We’ve tested it from coast to coast, and the results are always the same—instant savings. Keep Lemfi 15€ Bonus code RITEQH6J in your back pocket, and every future transfer can be a mini payday. Happy saving! FAQs Of Lemfi 15€ Bonus Code Q1. Is Lemfi safe to use in Canada? A1. Yes. Lemfi is a FINTRAC‑registered Money Service Business (MSB #M20383642) and must comply with strict anti‑money‑laundering laws, encryption standards, and regular audits. Q2. Can I combine RITEQH6J with other Lemfi promo codes? A2. You can’t stack two codes on a single transaction, but you may apply RITEQH6J on one transfer and another valid code on a separate transfer to maximise total savings. Q3. Does RITEQH6J expire? A3. No expiration date is set. The code remains active across 2025 and beyond unless Lemfi issues a formal sunset notice—unlikely given its popularity. Q4. How fast is the 15 € bonus credited? A4. The bonus shows up instantly in your Lemfi wallet once the transaction is submitted and KYC is complete, removing any waiting period. Q5. Is the 15 € bonus paid in CAD or EUR? A5. Lemfi credits the bonus in EUR. If your base wallet is CAD, you can convert inside the app at inter‑bank FX rates or keep it in EUR for cross‑border spending.
  • Topics

×
×
  • Create New...

Important Information

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