Jump to content

Recommended Posts

Posted (edited)

I've been working on the ability to add banner patterns to elytras, and I've actually gotten it to work. However, when an elytra has a banner attached the transparent parts of the wings are rendered with a gray color. 

 

Photos:

  Reveal hidden contents

 

My layer renderer -> https://hastebin.com/roquzivade.hs

My 'banner/elytra textures' cache -> https://hastebin.com/fusewojuva.hs

My texture class (currently the same as a normal LayerColourMaskTexture class) -> https://hastebin.com/tazuwapabe.hs

 

This only happens when I have a banner attached to the elytra, so it leads me to believe there's something I've missed in my texture class. I've tried adding a check on the multiplied colour, testing to see if it that shade of gray was present and then setting the pixel RGBA to a transparent pixel, but that didn't work.

 

I think I'm a bit in over my head here, it'd be great if someone could help push me in the right direction.

 

Cheers!

Edited by ReconCubed
added extra photo
Posted

Howdy

 

Are you sure this blend function is what you intend?

GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);

Normally I would expect to see something like

GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);

 

Your texture generator doesn't appear to handle alpha values explicitly?  It seems to be doing some sort of magic manipulations there, it would help if you named your variables more clearly. 

This in particular just doesn't look right; I presume it is trying to extract the alpha value but it's not clear to me why the alpha value is in the lowest 8 bits initially but needs to be shifted to the upper 8 bits

int j1 = (i1 & 255) << 24 & -16777216;

 

-TGG

 

Posted
  On 4/30/2020 at 10:43 AM, TheGreyGhost said:

Howdy

 

Are you sure this blend function is what you intend?

GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);

Normally I would expect to see something like

GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);

 

Your texture generator doesn't appear to handle alpha values explicitly?  It seems to be doing some sort of magic manipulations there, it would help if you named your variables more clearly. 

This in particular just doesn't look right; I presume it is trying to extract the alpha value but it's not clear to me why the alpha value is in the lowest 8 bits initially but needs to be shifted to the upper 8 bits

int j1 = (i1 & 255) << 24 & -16777216;

 

-TGG

 

Expand  

Yeah, the texture generator is currently a direct copy+paste of vanillas LayeredColorMaskTexture, which is used to generate banners.

 I started off with just using that class, but that didn't work so I copied it over to my own to make tweaks. This is my first time playing with texture generators so I don't really understand it very well yet. 

 

I've managed to seperate the transparent pixels, even manipulate their colour. But I can't seem to get the alpha channel to actually work.

https://hastebin.com/ogalajogux.hs

 

I've trief 0x00 and all its counterparts I could find on the internet for just a transparent RGBA value in bytes. No luck there, just renders as white or black.

 

 

As for the blend func change, I've switched my source factor and destination factor to match what you've suggested, but not changes. The original elytra layer uses source factor one & dest factor zero, so I figured it'd be fine.

 

 

Posted

Are banners transparent (cutout)?  That may be the problem if you've copied the texture gen code from banners.

The vanilla elytra isn't really transparent, it's cutout so the blending function is irrelevant, the alpha test is the important function.  i.e. if alpha is less than the cutoff it's transparent, otherwise it's opaque.  I can't tell from your code whether cutout (alpha test) is enabled or not.  But if it renders as opaque no matter what RGBA you write into the texture, then it's probably disabled.

 

The first thing I'd try is something like this:

                            for (int height = 0; height < nativeimage2.getHeight(); ++height) {
                                for (int width = 0; width < nativeimage2.getWidth(); ++width) {
                                    int pixelRGBA = nativeimage2.getPixelRGBA(width, height);
                                    if (height == width) {
                                      nativeimage1.setPixelRGBA(width, height, 0);  // will be transparent
                                    } else {
                                      nativeimage1.setPixelRGBA(width, height, pixelRGBA);
									}	                           
                                }
                            }

If that has cutout pixels in it, you know that the rendering is ok.  Otherwise your rendering mode is wrong (alpha cutoff is not correct).

 

I think your code for generating the texture is not right.  The int RGBA value that you get is actually composed of four components

bits 0 -> 7 are red

bits 8 -> 15 are green

bits 16 -> 23 are blue

bits 24 -> 31 are the alpha value.

 

so you calculate

int alphaValue = (pixelRGBA >> 24) & 0xff;

int colourWithoutAlpha = (pixelRGBA & 0xffffff);

// blend your colours without Alpha here

then

int newRGBA = (alphaValue << 24) | (newColourWithoutAlpha);

 

using blendPixel probably won't give you what you want because it blends the alpha channels as well which will probably mess up your culling.

 

Perhaps if you describe how exactly you want the two textures to be combined it might help.

Do you want partial blending of the banner texture onto the elytra?  Or are you just wanting the elytra to be coloured to match the banner except where the elytra has a cutout (i.e. all-or-nothing blending)?  In the second case I don't think you need blendPixel at all - just check every pixel in the elytra texture and if the alphaValue is above the cutoff, write the banner pixel to the output texture, otherwise write a transparent pixel (alpha of zero)

 

-TGG

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted
  On 4/30/2020 at 3:40 PM, TheGreyGhost said:

Are banners transparent (cutout)?  That may be the problem if you've copied the texture gen code from banners.

The vanilla elytra isn't really transparent, it's cutout so the blending function is irrelevant, the alpha test is the important function.  i.e. if alpha is less than the cutoff it's transparent, otherwise it's opaque.  I can't tell from your code whether cutout (alpha test) is enabled or not.  But if it renders as opaque no matter what RGBA you write into the texture, then it's probably disabled.

 

The first thing I'd try is something like this:

                            for (int height = 0; height < nativeimage2.getHeight(); ++height) {
                                for (int width = 0; width < nativeimage2.getWidth(); ++width) {
                                    int pixelRGBA = nativeimage2.getPixelRGBA(width, height);
                                    if (height == width) {
                                      nativeimage1.setPixelRGBA(width, height, 0);  // will be transparent
                                    } else {
                                      nativeimage1.setPixelRGBA(width, height, pixelRGBA);
									}	                           
                                }
                            }

If that has cutout pixels in it, you know that the rendering is ok.  Otherwise your rendering mode is wrong (alpha cutoff is not correct).

 

I think your code for generating the texture is not right.  The int RGBA value that you get is actually composed of four components

bits 0 -> 7 are red

bits 8 -> 15 are green

bits 16 -> 23 are blue

bits 24 -> 31 are the alpha value.

 

so you calculate

int alphaValue = (pixelRGBA >> 24) & 0xff;

int colourWithoutAlpha = (pixelRGBA & 0xffffff);

// blend your colours without Alpha here

then

int newRGBA = (alphaValue << 24) | (newColourWithoutAlpha);

 

using blendPixel probably won't give you what you want because it blends the alpha channels as well which will probably mess up your culling.

 

Perhaps if you describe how exactly you want the two textures to be combined it might help.

Do you want partial blending of the banner texture onto the elytra?  Or are you just wanting the elytra to be coloured to match the banner except where the elytra has a cutout (i.e. all-or-nothing blending)?  In the second case I don't think you need blendPixel at all - just check every pixel in the elytra texture and if the alphaValue is above the cutoff, write the banner pixel to the output texture, otherwise write a transparent pixel (alpha of zero)

 

-TGG

Expand  

 

Sorry it took a while to reply! Was away over the weekend.

 

I tried adding alpha test in my custom elytra layer, and set the transparent pixels to 0. That ended up just rendering black for those pixels. It seems to be targetting the correct pixels from the original texture images, however just turning them black and making the entire thing a black square with the textures on it (like the photos in my OP).

I also went back to have a 2nd look at the vanilla elytra layer, I believe they do use blendFunc, I cant see anything about the alpha test func in there.

 

Also, to answer your question: I have made some textures using the vanilla Elytra & shield patterns as a base (much like how the banner & shield do it). zUS6QHN.png

 

I'm simply trying to render the proper elytra transparency, like the below picture, but with the custom textures I use above for all the banner patterns & colours. 

150px-Elytra_JE2_BE2.png?version=8329d6c

 

Cheers!

 

 

 

 

Posted
  On 5/5/2020 at 10:19 AM, TheGreyGhost said:

Hmm ok

If you put your code into a github repository I'll download it in the next few days and have a look, if you like.

 

Cheers

  TGG

Expand  

 

Thanks!

Here's my repo: https://github.com/ReconCubed/thecommunityupdate

 

The related files are:

https://github.com/ReconCubed/thecommunityupdate/tree/master/src/main/java/me/reconcubed/communityupdate/client/render

https://github.com/ReconCubed/thecommunityupdate/blob/master/src/main/java/me/reconcubed/communityupdate/util/BannerTextures.java

 

I appreciate the help!

 

Posted

Well after a bit of refactoring I figured out the problem

It's more obvious when I replaced the magic numbers with the proper OpenGL constants

 

            TextureUtil.prepareImage(this.getGlTextureId(), overlaidElytra.getWidth(), overlaidElytra.getHeight());
            GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, Float.MAX_VALUE);  // Sets alpha of final image to max.... delete this line and it works fine.
            overlaidElytra.uploadTextureSub(0, 0, 0, false);
            GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, 0.0F);

 

-TGG

 

PS the refactored code FYI

 

package me.reconcubed.communityupdate.client.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.TextureUtil;

import java.io.IOException;
import java.util.List;

import net.minecraft.client.renderer.texture.NativeImage;
import net.minecraft.client.renderer.texture.Texture;
import net.minecraft.item.DyeColor;
import net.minecraft.resources.IResource;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL14;

@OnlyIn(Dist.CLIENT)
public class LayeredColorMaskTextureCustom extends Texture {
    private static final Logger LOGGER = LogManager.getLogger();
    private final ResourceLocation textureLocation;
    private final List<String> listTextures;
    private final List<DyeColor> listDyeColors;

    public LayeredColorMaskTextureCustom(ResourceLocation textureLocationIn, List<String> p_i46101_2_, List<DyeColor> p_i46101_3_) {
        this.textureLocation = textureLocationIn;
        this.listTextures = p_i46101_2_;
        this.listDyeColors = p_i46101_3_;
    }

    public void loadTexture(IResourceManager manager) throws IOException {
        try (
                IResource iresource = manager.getResource(this.textureLocation);
                NativeImage baseElytra = NativeImage.read(iresource.getInputStream());
                NativeImage overlaidElytra = new NativeImage(baseElytra.getWidth(), baseElytra.getHeight(), false);
        ) {
            overlaidElytra.copyImageData(baseElytra);

            for (int i = 0; i < 17 && i < this.listTextures.size() && i < this.listDyeColors.size(); ++i) {
                String bannerTextureRL = this.listTextures.get(i);
                if (bannerTextureRL != null) {
                    try (
                            NativeImage bannerLayer = net.minecraftforge.client.MinecraftForgeClient.getImageLayer(new ResourceLocation(bannerTextureRL), manager);
                    ) {
                        int bannerLayerColour = this.listDyeColors.get(i).getSwappedColorValue();
                        if (bannerLayer.getWidth() == overlaidElytra.getWidth() && bannerLayer.getHeight() == overlaidElytra.getHeight()) {
                            for (int height = 0; height < bannerLayer.getHeight(); ++height) {
                                for (int width = 0; width < bannerLayer.getWidth(); ++width) {

                                    int alphaBanner = bannerLayer.getPixelRGBA(width, height) & 0xff;  // extract the red channel, could have used green or blue also.
                                    int alphaElytra = baseElytra.getPixelLuminanceOrAlpha(width, height) & 0xff;
                                    //  algorithm is:
                                    //  if elytra pixel is transparent, do nothing
                                    //  otherwise:
                                    //    the banner blend layer is a greyscale which is converted to a transparency:
                                    //     blend the banner's colour into elytra pixel using the banner blend transparency

                                    if (alphaElytra != 0 && alphaBanner != 0) {
                                      int elytraPixelRGBA = baseElytra.getPixelRGBA(width, height);
                                      int multipliedColorRGB = MathHelper.multiplyColor(elytraPixelRGBA, bannerLayerColour) & 0xFFFFFF;
                                      int multipliedColorRGBA = multipliedColorRGB | (alphaBanner << 24);
                                      overlaidElytra.blendPixel(width, height, multipliedColorRGBA);
                                    }

                                }
                            }
                        }
                    }
                }
            }

            TextureUtil.prepareImage(this.getGlTextureId(), overlaidElytra.getWidth(), overlaidElytra.getHeight());
          GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, 0.0F);
            overlaidElytra.uploadTextureSub(0, 0, 0, false);
        } catch (IOException ioexception) {
            LOGGER.error("Couldn't load layered color mask image", (Throwable) ioexception);
        }

    }
}

 

 

 

Posted
  On 5/9/2020 at 7:09 AM, TheGreyGhost said:

Well after a bit of refactoring I figured out the problem

It's more obvious when I replaced the magic numbers with the proper OpenGL constants

 

            TextureUtil.prepareImage(this.getGlTextureId(), overlaidElytra.getWidth(), overlaidElytra.getHeight());
            GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, Float.MAX_VALUE);  // Sets alpha of final image to max.... delete this line and it works fine.
            overlaidElytra.uploadTextureSub(0, 0, 0, false);
            GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, 0.0F);

 

-TGG

 

PS the refactored code FYI

 

package me.reconcubed.communityupdate.client.render;

import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.TextureUtil;

import java.io.IOException;
import java.util.List;

import net.minecraft.client.renderer.texture.NativeImage;
import net.minecraft.client.renderer.texture.Texture;
import net.minecraft.item.DyeColor;
import net.minecraft.resources.IResource;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import org.lwjgl.opengl.GL14;

@OnlyIn(Dist.CLIENT)
public class LayeredColorMaskTextureCustom extends Texture {
    private static final Logger LOGGER = LogManager.getLogger();
    private final ResourceLocation textureLocation;
    private final List<String> listTextures;
    private final List<DyeColor> listDyeColors;

    public LayeredColorMaskTextureCustom(ResourceLocation textureLocationIn, List<String> p_i46101_2_, List<DyeColor> p_i46101_3_) {
        this.textureLocation = textureLocationIn;
        this.listTextures = p_i46101_2_;
        this.listDyeColors = p_i46101_3_;
    }

    public void loadTexture(IResourceManager manager) throws IOException {
        try (
                IResource iresource = manager.getResource(this.textureLocation);
                NativeImage baseElytra = NativeImage.read(iresource.getInputStream());
                NativeImage overlaidElytra = new NativeImage(baseElytra.getWidth(), baseElytra.getHeight(), false);
        ) {
            overlaidElytra.copyImageData(baseElytra);

            for (int i = 0; i < 17 && i < this.listTextures.size() && i < this.listDyeColors.size(); ++i) {
                String bannerTextureRL = this.listTextures.get(i);
                if (bannerTextureRL != null) {
                    try (
                            NativeImage bannerLayer = net.minecraftforge.client.MinecraftForgeClient.getImageLayer(new ResourceLocation(bannerTextureRL), manager);
                    ) {
                        int bannerLayerColour = this.listDyeColors.get(i).getSwappedColorValue();
                        if (bannerLayer.getWidth() == overlaidElytra.getWidth() && bannerLayer.getHeight() == overlaidElytra.getHeight()) {
                            for (int height = 0; height < bannerLayer.getHeight(); ++height) {
                                for (int width = 0; width < bannerLayer.getWidth(); ++width) {

                                    int alphaBanner = bannerLayer.getPixelRGBA(width, height) & 0xff;  // extract the red channel, could have used green or blue also.
                                    int alphaElytra = baseElytra.getPixelLuminanceOrAlpha(width, height) & 0xff;
                                    //  algorithm is:
                                    //  if elytra pixel is transparent, do nothing
                                    //  otherwise:
                                    //    the banner blend layer is a greyscale which is converted to a transparency:
                                    //     blend the banner's colour into elytra pixel using the banner blend transparency

                                    if (alphaElytra != 0 && alphaBanner != 0) {
                                      int elytraPixelRGBA = baseElytra.getPixelRGBA(width, height);
                                      int multipliedColorRGB = MathHelper.multiplyColor(elytraPixelRGBA, bannerLayerColour) & 0xFFFFFF;
                                      int multipliedColorRGBA = multipliedColorRGB | (alphaBanner << 24);
                                      overlaidElytra.blendPixel(width, height, multipliedColorRGBA);
                                    }

                                }
                            }
                        }
                    }
                }
            }

            TextureUtil.prepareImage(this.getGlTextureId(), overlaidElytra.getWidth(), overlaidElytra.getHeight());
          GlStateManager.pixelTransfer(GL11.GL_ALPHA_BIAS, 0.0F);
            overlaidElytra.uploadTextureSub(0, 0, 0, false);
        } catch (IOException ioexception) {
            LOGGER.error("Couldn't load layered color mask image", (Throwable) ioexception);
        }

    }
}

 

 

 

Expand  

You're an absolute legend mate. Thank you! It worked perfectly. 

 

Have a good one :)

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

    • Working $200 Off Temu Coupon Code [acu639380] First Order Exclusive Temu Coupon Code (acu639380) – Save Big on Your Shopping! Temu has become a go-to online marketplace for shoppers looking for high-quality products at unbeatable prices. With millions of trending items, fast delivery, and free shipping available in 67 countries, Temu ensures a seamless shopping experience for its users. Now, you can make your purchases even more rewarding by using the Temu coupon code (acu639380) to unlock huge discounts of up to $200 and exclusive deals. Why Use the Temu Coupon Code (acu639380)? By applying the Temu discount code (acu639380) at checkout, you can enjoy massive savings of up to $200 on a wide range of categories, including electronics, fashion, home essentials, beauty products, and more. This special offer is available to both new and existing users, ensuring that everyone gets a chance to save big on their favorite items What Discounts Can You Get with Temu Coupon Code (acu639380)? Here’s what you can unlock with the Temu promo code (acu639380): $200 Off for New Users – First-time shoppers can enjoy a flat $200 discount on their initial order. $200 Off for Existing Users – Loyal customers can also claim $200 off their purchases with the same code. Extra 40% Off – The Temu discount code (acu639380) provides an additional 40% off on select items, maximizing your savings. $200 Coupon Bundle – Both new and existing users can receive a $200 coupon bundle, perfect for future purchases. Free Gifts for New Users – If you’re shopping on Temu for the first time, you June receive free gifts with your order. Temu Coupons for Different Countries Temu caters to shoppers worldwide, offering incredible discounts based on your location. Here’s how the Temu coupon code (acu639380) benefits users across different regions: United States – Get $200 off your first order using the Temu coupon code (acu639380). Canada – Enjoy $200 off on your first-time purchase. United Kingdom – Use the Temu promo code (acu639380) to get $200 off your first order. Japan – Japanese shoppers can claim $200 off their initial purchase. Mexico – Get an extra 40% discount on select products with the Temu coupon (acu639380). Brazil – Shoppers in Brazil can also save 40% on select items. Germany – Receive a 40% discount on eligible products with the Temu promo code (acu639380). How to Use the Temu Coupon Code (acu639380)? Applying the Temu discount code (acu639380) is simple and hassle-free. Follow these easy steps to redeem your discount: Sign Up or Log In – Create a new account or log in to your existing Temu account. Shop for Your Favorite Items – Browse through Temu’s vast collection and add products to your cart. Enter the Coupon Code – At checkout, apply the Temu promo code (acu639380) in the designated field. Enjoy Your Discount – See the discount applied to your order and proceed with payment. Why Shop on Temu? Apart from huge discounts, Temu offers several benefits that make shopping more exciting and budget-friendly: Up to 90% Off on Select Products – Temu regularly offers massive discounts on top-selling items. Fast & Free Shipping – Get your products delivered quickly with free shipping to 67 countries. Wide Product Selection – Shop from a vast range of categories, including electronics, fashion, home essentials, and more. Safe & Secure Payments – Temu ensures a secure checkout process for a smooth shopping experience. Exclusive App Deals – Download the Temu app for extra discounts and app-only promotions. Final Thoughts With Temu’s exclusive coupon code (acu639380), you can unlock huge savings and enjoy a premium shopping experience at an affordable price. Whether you are a new user looking for a $200 discount or an existing customer wanting an extra 40% off, Temu has something for everyone. Don't forget to claim your $200 coupon bundle and free gifts before these amazing deals expire! Start shopping today on Temu and use the Temu coupon code (acu639380) to maximize your savings!  
    • Temu Coupon Code $100 Off [acu639380] First Time User Unlock Huge Savings: Temu Coupon Code (acu639380) for June 2025 Temu is transforming the way the world shops—and June 2025 delivers its boldest offers yet. With the exclusive Temu coupon code (acu639380), you're entering a world of rewards: from a $100 discount to premium coupon bundles, it's your passport to smart, stylish savings. The Temu Advantage in June 2025 Temu is known for redefining affordability and access. With unbeatable prices across trending categories—from fashion to electronics—it now delivers to 67 countries with speed and reliability. But this month, it’s not just about what you buy. It’s about how much you save. With Temu coupon code (acu639380) in hand, your savings soar. Instant Rewards with Temu Coupon Code (acu639380) If you haven't activated this exclusive code, here's what you're missing: $100 Off for first-time users $100 Off for returning customers 40% Off on sitewide items Free gifts for new sign-ups $100 Coupon Bundle available for all users What Makes Temu Coupon Code (acu639380) Unique? This code is designed to reward all shoppers—first-timers and loyal fans alike. Here’s how each discount delivers: Temu coupon code (acu639380) $100 off: Best for newcomers stocking up. Temu coupon code (acu639380) $100 off for existing users: Returning shoppers save big. Temu coupon code (acu639380) 40% off: Big savings on trending picks. Temu $100 coupon bundle: Split savings across several purchases. Temu first time user coupon: Ideal to kickstart your shopping spree. Global Value, Personalized Access Temu isn't just generous—it’s international. Whether you're in a Toronto high-rise or a Yorkshire farmhouse, the Temu promo code (acu639380) unlocks smart deals and chic finds. Coupon Code Highlights by Country Temu coupon code $100 off for USA – (acu639380) Temu coupon code $100 off for Canada – (acu639380) Temu coupon code $100 off for UK – (acu639380) Temu coupon code $100 off for Japan – (acu639380) Temu coupon code 40% off for Mexico – (acu639380) Temu coupon code 40% off for Brazil – (acu639380) Why Temu is the Marketplace of the Moment Unbeatable prices: Save up to 90% every day Worldwide reach: Ships to 67 countries New promotions: Fresh Temu new offers in June 2025 Fast, free delivery: No matter where you are FAQ: Maximize Your Temu Experience What’s the best Temu discount in June 2025? The top offer is Temu coupon code (acu639380) $100 off, for both new and existing users. Can I use these deals worldwide? Yes. The Temu discount code (acu639380) for June 2025 is valid in North America, South America, Europe, and Asia. Can I combine discounts? Absolutely. Pair your Temu $100 coupon bundle with seasonal deals for extra savings. Final Takeaway Smart shopping isn’t just about what you add to your cart—it’s about how you unlock value. With Temu coupon codes for new users, Temu coupon codes for existing users, and exciting June 2025 promotions, the best time to save is now. Don’t wait. Use Temu coupon code (acu639380) today to claim your rewards and transform the way you shop. New offers, global access, and exclusive savings await.  
    • Maybe it refers to an issue with the system - check for CPU/GPU driver updates
    • I haven't tried any other launchers, but I was getting the same results when I tried using forge with the vanilla launcher.
    • Make a test without sodiumextras
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

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