Jump to content

How to set texture for dynamically registered blocks from already existing blocks [1.18.2]


Recommended Posts

Posted
  On 4/27/2022 at 5:42 PM, diesieben07 said:

Override place and call it :)

Expand  

But getSoundType is called in place deep nested in, so I would need to completely copy the code inside place and just change 1 line. Which I'm not a big fan of, but anyway I was already copying the whole code in updateCustomBlockEntityTag so I might as well do that. However I actually can't because in place there's a call to BlockItem#updateBlockStateFromTag which is private so I can't call it from my subclass. I would need to copy also that code in, but then I would also need to copy the code in BlockItem#updateState because it's private too, so it would make a bit of a mess in my code.

P.S. I don't know if it was only me, but I couldn't connect to the form yesterday, this is way I replied so late

  • Replies 92
  • Created
  • Last Reply

Top Posters In This Topic

Posted

I'm glad to announce that I found a way to fix the stretched textures.

I finally had more time to go line by line debugging starting from the baking of the JSON model, and I found the class FaceBakery that's responsible for creating the vertices of a BakedQuad.

In particular in fillVertex there are two elements being set that involve the texture rendered and are set like so: 

arr[i + 4] = Float.floatToRawIntBits(sprite.getU((double)blockFaceUV.getU(i) * .999 + blockFaceUV.getU((i + 2) % 4) * .001));
arr[i + 4 + 1] = Float.floatToRawIntBits(sprite.getV((double)blockFaceUV.getV(i) * .999 + blockFaceUV.getV((i + 2) % 4) * .001));

and so I figured out that if I had access the my models blockFaceUVs when needed I could just update those specific vertices. Sadly, there is no way to do that.

But luckily I realized that I didn't need those blockFaceUVs at all because while it's true that they hold data on which part of the sprite to take, I actually need the double parameter they compute to.

So with a little bit of math to get the inverse formula I managed to retrieve the double parameter from the data in my original sprite, then I could update those specific vertices by applying the same formula as above but using the referring sprite and the double parameter I retrieved from my original sprite.

As always I'll leave here my most updated code.

Now I just need to understand why the breaking progress is not shown and fix it, then I think the rendering part will be finally done.

Posted

I managed to solve also the breaking process not being shown.

But to be honest I'm not sure why it works 😆 I noticed that when I would start breaking the block and VerticalSlabBakedModel#getQuads would get called modelData was empty, thus making getQuads return an empty list.

I'm not sure why when breaking the block getQuads gets called with an empty modelData, however if in that case I return my jsonBakedModel.getQuads rather than an empty list it works just fine and renders the breaking process correctly, without changing the "background" sprite (to my surprise).

I'm wondering however if I need to cache also them and, in that case, how would I do that, since the modelData is empty and so the referringBlockState is null. Maybe cache them using the state passed to getQuads? But maybe since they are BakedQuads from the JSON model that has already been baked and it's static caching them is not necessary?

 

Posted (edited)

Okay, now that rendering is done I'd need some help with craftings. Should I make a new thread? Let me know.

Anyway, how do I register a custom recipe? Do I also need a custom recipe serializer? Or can I just use one of the default ones?

Should I create 4 different custom recipe classes, one for each recipe, or should I create less grouping them together?

Should my recipe classes extend CraftingRecipe? Or is it better to extend ShapedRecipe/ShapelessRecipe?

I tried implementing the recipe that should allow to craft a normal slab into a vertical slab, but I don't know how to get the block used to craft the normal slab from the normal slab, block I need to get its blockstate and return the correct version of a vertical slab.

I also don't know what's the use of getResultItem and canCraftInDimensions.

I also have more questions but I'm trying not to flood here and to solve as many things I can by myself, so maybe I'll ask them another time.

 

EDIT: I actually think I got what canCraftInDimensions does

Edited by X-Lomir
Posted (edited)

I changed to another recipe that seemed actually easier: from vertical slabs to referring block.

I created my class ReferringBlockRecipe implementing CraftingRecipe.

I know the matches logic is not correct, but it's good enough for some tests. First of all, is there a way to get the amount of empty slots or filled slots? If not I'd design the matches logic this way: loop through crafting rows, check all but last slots of each row testing whether there are two vertical slabs next to each other. Then if I found exactly 1 match, return true, otherwise return false. If there was a way to know how many empty slots there are, I would first check if there are 7 empty slots and if so search for the first (and only) match. Return true if found, return false if not.

Anyway, apart from these details, I'm wondering if my Serializer implementation is fine, I just return a new instance of ReferringBlockRecipe in fromJson and fromNetwork, while I do nothing in toNetwork. It seems to be working with the few tests I did, but maybe I'm missing something under the hood.

My code with recipes can be found here.

I have a couple more questions:

  • Once I have a BlockState of a block, and so its Item and ItemStack, how to I get its slab? Loop through all recipes that use that block as ingredient? If so, how?
  • Same as the previous one, but in the opposite sense: how do I get a block from its slab BlockState (or Item or ItemStack)?

About these two points, I've thought something:

I need on game startup to get a list of all the blocks in game that can be crafted into normal slabs, to use this list in fillItemCategory. While doing this I could just save in a static HashMap the blockstates of each block and its slab. This way I would have a list of blocks and slabs that can be used in my recipes and an easy and fast way to get from block to slab and vice versa while matching and assembling my recipes.

So with this I would only need to know how to go from block to slab (or from slab to block, since maybe it's easier to loop through all blocks with "slabs" tag rather than looping through all blocks and checking if each has a slab) and then when I'd need to go the opposite way I could just use the HashMap.

 

Edited by X-Lomir
Posted
  On 5/2/2022 at 7:53 AM, diesieben07 said:

Mostly fine except that your recipe class must not have internal state (in your case the firstIndex). Calling assemble must work without first calling matches, the two methods must operate independently of each other.

Expand  

Oh I thought that assemble would be called only after matches and so it was safe to use data from matches in assemble. If no internal state should be used, can I safely save 1 instance of my recipe so that its serializer can return always the same rather than instantiating a new one?

  On 5/2/2022 at 7:53 AM, diesieben07 said:

If you mean that you want to get a generic slab, then yes you'd have to hope that there exists a "standard" slab crafting recipe (and the slab doesn't require some modded machine). I don't quite understand why you need to do this though?

Expand  

Here I'm supposing that normal slabs will always be crafted with 3 of their respective blocks in a row. I know it could not always be the case, but it's fine for most cases. I don't need to get from block to normal slab with every recipe, but I want to implement several recipes, in particular two that involve only normal slabs and vertical slabs. So, to get the BlockState I need for the vertical slab I'd need to go from normal slab to its block, vice versa when I need to craft a normal slab from a vertical slab.

  On 5/2/2022 at 7:53 AM, diesieben07 said:

Are your recipes not made from the actual block (i.e. oak planks) instead of the slab? If so, you could make this Map, yes. But it would have to be immutable and thread safe (ImmutableMap is threadsafe), because in single player both server and client thread would use it.

Expand  

As said above, they are made of both. So if the ImmutableMap is a good idea, I think I know how to implement the recipes I need.

Problem is: how and when do I create this ImmutableMap? For how I would loop through all slabs registered in the game, modded or not, but I'm not sure when it's best to do this and how to actually implement it 😅

Posted
  On 5/2/2022 at 8:39 AM, diesieben07 said:

Recipes can come from data packs, so you have to do this after data packs are loaded. ServerAboutToStartEvent should be all you need.

Expand  

I'm trying to do what we said, but a few points are unclear to me.

  • How do I get a list of all blocks/items that have the slabs tag? I saw that in previous Forge versions it was possible to do something like BlockTags.SLABS.getValues(), but it doesn't seem to be possible anymore.
  • Once I have a block/item that is a slab, how do I get the block/item it's made from?
  • Is it okay to have a reference to my ImmutableMap in my loader class, setting its value only in the ServerAboutToStartEvent handler, and then access it anywhere around my code? In particular I need to access it in my recipes and in my VerticalSlabBlockItem#fillItemCategory.

I pushed a (very simple) draft here.

Posted
  On 5/2/2022 at 12:19 PM, diesieben07 said:

You again have to look into your map from slabs to blocks. There is no direct link.

Expand  

But how do I set values in my map at first? Of course once I have the map I'll always use that, but at first I have to put values in that map. So I need a way to go from a slab block to its block. It's fine to assume that a slab will always have a crafting made of 3 blocks in a row, if this can help.

Posted

Isn't there a way to do the opposite, that is knowing the result ItemStack and get its recipe? Because I think it's better to cycle through all items having the slabs tag rather than cycling through all items and checking if they can make a slab.

Posted

I created my ImmutableMap in my event handler as follow:

@SubscribeEvent(priority = EventPriority.LOWEST)
  public void onServerAboutToStartEvent(ServerAboutToStartEvent event) {
    Map<Item, Item> slabMap = new HashMap<Item, Item>();
    ForgeRegistries.ITEMS.tags().getTag(ItemTags.SLABS).forEach(slab -> {
      event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.CRAFTING).forEach(recipe -> {
        if (recipe.getResultItem().is(slab)) {
          recipe.getIngredients().stream().filter(ingredient -> !ingredient.test(slab.getDefaultInstance())).findFirst().ifPresent(ingredient -> {
            ItemStack block = ingredient.getItems()[0];
            if (!block.is(ItemTags.SLABS)) {
              slabMap.put(slab, block.getItem());
            }
          });
        }
      });
    });
    JustVerticalSlabsLoader.slabMap = ImmutableMap.copyOf(slabMap);
  }

This (very naive) logic works and if I print out the slabMap I get this:

{
	crimson_slab=crimson_planks,
	waxed_cut_copper_slab=waxed_cut_copper,
	birch_slab=birch_planks,
	mossy_stone_brick_slab=mossy_stone_bricks,
	cut_red_sandstone_slab=cut_red_sandstone,
	polished_andesite_slab=polished_andesite,
	smooth_sandstone_slab=smooth_sandstone,
	polished_blackstone_brick_slab=polished_blackstone_bricks,
	warped_slab=warped_planks,
	red_nether_brick_slab=red_nether_bricks,
	prismarine_slab=prismarine,
	smooth_quartz_slab=smooth_quartz,
	polished_deepslate_slab=polished_deepslate,
	waxed_oxidized_cut_copper_slab=waxed_oxidized_cut_copper,
	spruce_slab=spruce_planks,
	stone_slab=stone,
	cobblestone_slab=cobblestone,
	oxidized_cut_copper_slab=oxidized_cut_copper,
	polished_blackstone_slab=polished_blackstone,
	stone_brick_slab=stone_bricks,
	waxed_exposed_cut_copper_slab=waxed_exposed_cut_copper,
	dark_prismarine_slab=dark_prismarine,
	polished_granite_slab=polished_granite,
	andesite_slab=andesite,
	prismarine_brick_slab=prismarine_bricks,
	granite_slab=granite,
	cobbled_deepslate_slab=cobbled_deepslate,
	oak_slab=oak_planks,
	waxed_weathered_cut_copper_slab=waxed_weathered_cut_copper,
	deepslate_brick_slab=deepslate_bricks,
	quartz_slab=chiseled_quartz_block,
	end_stone_brick_slab=end_stone_bricks,
	deepslate_tile_slab=deepslate_tiles,
	cut_sandstone_slab=cut_sandstone,
	acacia_slab=acacia_planks,
	sandstone_slab=sandstone,
	purpur_slab=purpur_block,
	exposed_cut_copper_slab=exposed_cut_copper,
	polished_diorite_slab=polished_diorite,
	weathered_cut_copper_slab=weathered_cut_copper,
	smooth_stone_slab=smooth_stone,
	brick_slab=bricks,
	cut_copper_slab=cut_copper,
	blackstone_slab=blackstone,
	diorite_slab=diorite,
	red_sandstone_slab=red_sandstone,
	dark_oak_slab=dark_oak_planks,
	nether_brick_slab=nether_bricks,
	mossy_cobblestone_slab=mossy_cobblestone,
	smooth_red_sandstone_slab=smooth_red_sandstone,
	jungle_slab=jungle_planks
}

Now, this makes the game load fine and the print happens when I load a game.

However if I try to use the map in my VerticalSlabBlockItem#fillItemCategory I get a NullPointerException making the game crash on load.

How do I fix this? I pushed my code here.

Posted
  On 5/2/2022 at 5:42 PM, diesieben07 said:

fillItemCategory might be called before the game has started a server, which means there are no recipes yet. You must deal with this fact.

Expand  

Okay, I thought I was doing something wrong. In the end just a null check in fillItemCategory fixes it.

I have another problem now: I can't understand why only my ReferringBlockRecipe is working. I put some debug points in the other recipes matches and they never get called, but I made them the same exact way as my ReferringBlockRecipe, registering their serializers and all. I really don't get what's happening.

Most recent code here.

Posted

Okay, I think I'm done with recipes for now. Later on I want to add waxing recipes and stone cutting recipes, but now that I have the slabMap I think it's not going to be difficult.

Anyway, I was trying to make my vertical slabs to have a proper hover name and, while I managed to do that, I found out that my vertical slabs can't be searched in the search tab. If no string is search, they will appear at the end of the tab, otherwise with any string they do not appear. I'm not sure how to fix this, I had hoped having a proper hover name would make the research work but it looks like it's not the case.

Code is here.

Posted

I guessed something like that was happening unfortunately. So now way to make my vertical slabs be in the search results? Can't the search tree modified after it has been initialized?

Posted (edited)

So I did this:

public class RecipeUpdateEventHandler {
  @SubscribeEvent(priority = EventPriority.LOWEST)
  public void onRecipesUpdatedEvent(RecipesUpdatedEvent event) {
    Minecraft.getInstance().getSearchTree(SearchRegistry.CREATIVE_NAMES).refresh();
  }
}

and registered like so in my mod loader constructor:

public JustVerticalSlabsLoader() {
    MinecraftForge.EVENT_BUS.register(new ServerAboutToStartEventHandler());
    MinecraftForge.EVENT_BUS.register(new RecipeUpdateEventHandler());
    IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
    BLOCKS.register(bus);
    BLOCK_ENTITIES.register(bus);
    ITEMS.register(bus);
    RECIPES.register(bus);
    bus.register(new ModelRegistryEventHandler());
}

But it seems nothing changed. I get no errors but still my slabs do not appear in the search tab after searching.

However if I do the following (and I also unsubscribed the event):

public void fillItemCategory(CreativeModeTab creativeModeTab, NonNullList<ItemStack> itemStacks) {
  if (this.allowdedIn(creativeModeTab) && VerticalSlabUtils.slabMap != null) {
    MutableSearchTree<ItemStack> creativeSearchTree = Minecraft.getInstance().getSearchTree(SearchRegistry.CREATIVE_NAMES);
    for(BlockState referringBlockState : VerticalSlabUtils.slabMap.values().stream().map(item -> Block.byItem(item).defaultBlockState()).toList()) {
      ItemStack verticalSlab = VerticalSlabUtils.getItemStackWithState(this, referringBlockState);
      itemStacks.add(verticalSlab);
      creativeSearchTree.add(verticalSlab);
    }
    creativeSearchTree.refresh();
  }
}

It works without any error, but I guess it's not best practice (?)

Edited by X-Lomir
Updated a piece of code.
Posted
  On 5/4/2022 at 7:06 AM, diesieben07 said:

Yeah, this means the search tree is refreshed very often, which is an expensive operation.

Expand  
public void onServerAboutToStartEvent(ServerAboutToStartEvent event) {
    Map<Item, Item> slabMap = new LinkedHashMap<Item, Item>(), blockMap = new HashMap<Item, Item>();
    for (Item slab : ForgeRegistries.ITEMS.tags().getTag(ItemTags.SLABS)) {
      for (CraftingRecipe recipe : event.getServer().getRecipeManager().getAllRecipesFor(RecipeType.CRAFTING)) {
        NonNullList<Ingredient> ingredients = recipe.getIngredients();
        if (recipe.getResultItem().is(slab) && isRecipeWithBlocks(ingredients) && sameIngredients(ingredients)) {
          ingredients.stream().findFirst().ifPresent(ingredient -> {
            for (ItemStack itemStack : ingredient.getItems()) {
              if (!(itemStack.toString().contains("chiseled") || itemStack.toString().contains("pillar"))) {
                slabMap.put(slab, itemStack.getItem());
              }
              blockMap.put(itemStack.getItem(), slab);
            }
            if (!slabMap.containsKey(slab)) {
              slabMap.put(slab, ingredient.getItems()[0].getItem());
            }
          });
        }
      }
    }
    VerticalSlabUtils.slabMap = ImmutableMap.copyOf(slabMap);
    VerticalSlabUtils.blockMap = ImmutableMap.copyOf(blockMap);

    MutableSearchTree<ItemStack> creativeSearchTree = Minecraft.getInstance().getSearchTree(SearchRegistry.CREATIVE_NAMES);
    for(BlockState referringBlockState : VerticalSlabUtils.slabMap.values().stream().map(item -> Block.byItem(item).defaultBlockState()).toList()) {
      creativeSearchTree.add(VerticalSlabUtils.getVerticalSlabItem(referringBlockState));
    }
    creativeSearchTree.refresh();
  }

I moved the part of code adding vertical slabs to the search tree in the handler for ServerAboutToStartEvent, so it only gets called once. Still not the best in terms of efficiency as I have to loop through all the slabs after I have already done so. I would have liked to add each vertical slab to the search tree when I'm also putting the slab item in the map, however I can't do that because the hover name of a vertical slab depends on the static slabMap itself, which is null until I create it from the copy of the other one.

This should be better than refreshing the search tree every time in fillItemCategory, but I'm still not sure if it's the best possible.

Posted
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onRecipesUpdatedEvent(RecipesUpdatedEvent event) {
    MutableSearchTree<ItemStack> creativeSearchTree = Minecraft.getInstance().getSearchTree(SearchRegistry.CREATIVE_NAMES);
    for(BlockState referringBlockState : VerticalSlabUtils.slabMap.values().stream().map(item -> Block.byItem(item).defaultBlockState()).toList()) {
      creativeSearchTree.add(VerticalSlabUtils.getVerticalSlabItem(referringBlockState));
    }
    creativeSearchTree.refresh();
}

Like this it works too, but only if I add manually each vertical slab item, refreshing alone doesn't do.

P.S. I use the lowest priority to be the last one refreshing the tree, don't know if it's an actual good idea tho.

Posted

I'm trying to add stone cutter recipes now and I have a couple of issues that I hope can be solved somehow.

  1. In the stone cutter GUI my recipes show up and they give the correct result, but the item displayed is always the vertical slab mimicking oak planks. This I know it's because getResultItem() is used to render the "clickable" item to select a recipe and because I set my resultItem to a default of a vertical slab mimicking oak planks, however I don't know how to fix.
  2. For blocks that can be stone cut into 2 different kind of slabs I don't know how to make 2 vertical slab recipes appear too. So far only 1 appears. I know that my code does nothing to make more than 1 appear, but the problem is that I don't know how to do that.

Most updated code is here.

Posted
  On 5/7/2022 at 7:35 PM, diesieben07 said:

The easiest way to know this is that if it is created from your serializer's fromNetwork function, then it is on the client.

Expand  

I did this:

@Override
public BlockToVerticalSlabStonecutterRecipe fromNetwork(ResourceLocation resourceLocation, FriendlyByteBuf friendlyByteBuf) {
	return new BlockToVerticalSlabStonecutterRecipe(true);
}

Where that true is the value for a private final boolean field of my BlockToVerticalSlabStonecutterRecipe, but it appears that the field is always false and my Serializer#fromNetwork is never getting called (I put some breakpoints and they never got activated). I'm probably missing out once again something obvious.

  On 5/7/2022 at 7:35 PM, diesieben07 said:

Just make two recipe JSONs?

Expand  

Mmh... I will try to explain myself better: there are cases where a block can be stonecut into 2 different kind of slabs, so I need to have 2 different vertical slab recipes for that block too. However this, like the rest of this mod, must be dynamic, I can't go with a solution that will work when there are 2 slabs but not 3 or more, I'd need a way to dynamically add the stonecutting vertical slab recipes. For example let's take stone: it can be stonecut into stone slab and brick stone slab, so I need that also a vertical slab mimicking stone and a vertical slab mimicking stone bricks can be stonecut from stone. Let's suppose another mod adds a new stone variant, which we'll call stone tiles. Now the stonecutting recipes for stone have an extra slab, the stone tiles slab. Without any extra step also a vertical slab for stone tiles should be present in the stonecutting menu.

Posted
  On 5/8/2022 at 7:52 AM, diesieben07 said:

You'll have to use the kludge that is EffectiveSide.get.

Expand  

This works, thanks!

  On 5/8/2022 at 7:52 AM, diesieben07 said:

I don't think this is possible. There must always be a JSON file for every recipe that is being loaded. While you could use AddPackFindersEvent to create a dynamic datapack at runtime, it wouldn't allow you to inspect the already existing recipes - because recipes are loaded from datapacks, so while datapacks are being discovered there are no recipes yet.

Expand  

I understand. Then I will just go making available only the main block recipe, for example stone into stone vertical slab, but no stone into stone brick vertical slab. Anyway it's just for stonecutting, so it's important to at least have the vertical slab of the block you're using. Then it's not that important to have also all the variants mostly because normal slab variants will be available and so you can just craft them into the desired vertical slab with a single extra step. I'll consider this a small price to pay for scalability.

I have now a few things left to do for this mod:

  • Add in-world recipes for waxing. I have already added crafting waxing recipes and they correctly depend on the waxing crafting recipes of normal slabs. I would like to do the same but with the in-world waxing recipe, that is right-clicking with an honeycomb to wax a vertical slab that mimics a block that has a slab that can be in-world waxed. I would go with listening to the right-click block event and do my logic there, but I saw on Forge docs that there is a way to reuse my recipe logic to create a in-world recipe. So if there's a way to do that I'd kindly ask some suggestions on how to do that, otherwise I will just subscribe to the event and that's it.
  • Integrate my recipes with Minecraft Vanilla recipes book. I don't know what to do for this to be honest.
  • Fix a problem I found out when placing a vertical slab that's supposed to emit light: when first placed the texture of the vertical slab looks like it's light up however the vertical slab is not emitting light at all, indeed the light level is 0 all around. When placing another block next to it the vertical slab starts to emit light correctly, same goes on with reloading the world. I saw that VerticalSlabBlock#getLightEmission is called several times when placing/updating the vertical slab, many times with 0 and many times with the correct light level. I don't know how to fix this. This can be tested changing the return value of VerticalSlabBlock#getLightEmission to 15 when referringBlockState != null.
  • Make so that jumpFactor and speedFactor come from the mimicked block. But this we said that can't be changed unless Forge adds hooks for them, however I was thinking that maybe there's a way to override Entity#getBlockJumpFactor and Entity#getBlockSpeedFactor so that if a vertical slab is involved they pass to my VerticalSlabBlock the level and position that allow to mimic the correct block?

P.S. would you like to be listed as co-author or in credits (your choice)? Because none of this would have been possible without you so I would like to give you the credit you deserve, of course only if you want ot.

Posted
  On 5/8/2022 at 2:51 PM, diesieben07 said:

Look at HoneycombItem.getWaxed, it should let you wax arbitrary block states, if possible. To handle this on your block, use PlayerInteractEvent.RightClickBlock.

Expand  

Perfect, done!

  On 5/8/2022 at 2:51 PM, diesieben07 said:

The light value really must depend on the BlockState, not the BlockEntity, otherwise you will have strange effects. So you probably need to make a property on your block that sets the light level.

Expand  

I tried to do this and I failed...

I changed VerticalSlabBlock#getLightEmission to:

@Override
  public int getLightEmission(BlockState state, BlockGetter getter, BlockPos pos) {
    BlockState referringBlockState = VerticalSlabUtils.getReferringBlockState(getter, pos);
    if (referringBlockState != null) {
      int lightLevel = 15;
      // int lightLevel = referringBlockState.getLightEmission(getter, pos);
      state.setValue(LEVEL, Integer.valueOf(lightLevel));
      return lightLevel;
    }
    return super.getLightEmission(state, getter, pos);
  }

and I added the LEVEL property initialization like so:

public VerticalSlabBlock() {
    super(
      BlockBehaviour.Properties.of(Material.AIR)
      .isValidSpawn((state, getter, pos, entityType) -> false)
      .isRedstoneConductor((state, getter, pos) -> false)
      .isSuffocating((state, getter, pos) -> false)
      .lightLevel(LightBlock.LIGHT_EMISSION)
    );
    this.registerDefaultState(this.defaultBlockState().setValue(FACING, Direction.NORTH).setValue(SHAPE, StairsShape.STRAIGHT).setValue(WATERLOGGED, Boolean.valueOf(false)).setValue(LEVEL, Integer.valueOf(0)));
  }

and LEVEL is just BlockStateProperties#LEVEL.

However nothing changed, I have the same problem. Also I would like that the item too has the correct light emission, so that it works with shaders that add dynamic lighting.

  On 5/8/2022 at 2:51 PM, diesieben07 said:

This could be done fairly easily with a forge hook that allows you to access the position. Feel free to make a pull request :)

Expand  

And I would really love to do that, if only I knew how 🤣 I will try to look up how other hooks are implemented to see if I can do it.

Do you have any insight about the recipe book?

I'm sorry for asking so many questions every time, but it's really my first mod this complex and I'm discovering many things as I go, and know I'm really grateful because I couldn't have done without your help. I added you in the mod credits and I can't wait to finally publish this mod!

Posted
  On 5/9/2022 at 7:15 AM, diesieben07 said:

That's not what I meant. Do not override getLightEmission and especially do not modify the level in there. You are calling getReferringBlockState there, which will access your BlockEntity. Instead you need to set the correct level when the block is placed (from your BlockItem). Then when creating your BlockBehaviour.Properties use the BlockBehaviour.Properties#lightLevel to teach the game how to go from BlockState to light level.

Expand  

Okay, I updated my code as follows and now it works! I also removed my override of getLightEmission.

@Override
public BlockState getStateForPlacement(BlockPlaceContext placeContext) {
  BlockPos pos = placeContext.getClickedPos();
  Level level = placeContext.getLevel();
  BlockState blockstate = this.defaultBlockState().setValue(FACING, placeContext.getHorizontalDirection()).setValue(WATERLOGGED, Boolean.valueOf(level.getFluidState(pos).getType() == Fluids.WATER));
  BlockState referringBlockState = VerticalSlabUtils.getReferringBlockState(placeContext.getItemInHand());
  if (referringBlockState != null) {
    blockstate = blockstate.setValue(LEVEL, Integer.valueOf(referringBlockState.getLightEmission(level, pos)));
  }
  return blockstate.setValue(SHAPE, getStairsShape(blockstate, level, pos));
}
Posted
  On 5/9/2022 at 9:33 AM, diesieben07 said:

Why the unnecessary boxing?

Expand  

Honestly I have no idea, I saw around in Minecraft code that whenever BlockState#setValue was used to set some primitive property the value was always wrapped like that, so I assumed there was a reason for that.

  On 5/9/2022 at 9:33 AM, diesieben07 said:

Also, this can crash the game, as you are calling methods on the referringBlockState with a position it is not actually placed at.

Expand  

Then what should I do? Should I call the deprecated BlockStateBase#getLightEmission?

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

    • Maybe it refers to an issue with Java 8   Install this version: https://www.azul.com/downloads/?version=java-8-lts&os=windows&architecture=x86-64-bit&package=jre#zulu In your Launcher, change the Java Executable o the new java 8 installation at C:\Program Files\Zulu\zulu-8-jre\bin\javaw.exe
    • Make a test without baguettelib and the mods requiring it
    • If you’re looking for incredible savings on your first Temu order, look no further. With the Temu coupon code £100 off, you can save a significant amount on your purchase and enjoy a better shopping experience. For those in the United Kingdom and other European nations, the acu729640 Temu coupon code will provide the maximum benefits, ensuring you get the most value. Whether you’re shopping on the Temu app or website, this code guarantees discounts that make your experience even better. The Temu coupon £100 off and Temu 100 off coupon code are essential for anyone looking to save big on their next purchase. This coupon is valid for all new users and offers great savings on your first order, so don’t miss out on this amazing deal! What Is The Coupon Code For Temu £100 Off? Both new and existing customers can take advantage of our Temu coupon £100 off by using the £100 off Temu coupon on the Temu app and website. The acu729640 code is your gateway to massive savings: acu729640 – Get a flat £100 off on your first Temu purchase.   acu729640 – Receive a £100 coupon pack for multiple uses over time.   acu729640 – Enjoy a £100 flat discount exclusively for new customers.   acu729640 – Unlock an extra £100 promo code for existing customers to maximize savings.   acu729640 – Get a special £100 coupon for UK users, valid for all Temu orders.   Temu Coupon Code £100 Off For New Users In 2025 If you’re a new user, you’re in for a treat. By using our Temu coupon £100 off on your first order, you unlock fantastic perks that are tailored just for you. The Temu coupon code £100 off brings you the following amazing benefits: acu729640 – A flat £100 discount for new users when making your first purchase.   acu729640 – A £100 coupon bundle designed specifically for new customers.   acu729640 – Enjoy up to £100 coupon bundle for multiple uses over time.   acu729640 – Free shipping all over Europe for first-time users.   acu729640 – Get an extra 30% off on any purchase for first-time users.   How To Redeem The Temu Coupon £100 Off For New Customers? Redeeming your Temu £100 coupon as a new user is simple. Just follow these steps: Sign up or log in to your Temu account.   Browse through your desired products and add them to your cart.   Enter the Temu £100 off coupon code for new users (acu729640) during checkout.   The discount will be applied, and you’ll see the savings reflected in your total.   Temu Coupon £100 Off For Existing Customers Not just new users, existing customers can also benefit from the Temu £100 coupon codes for existing users. The Temu coupon £100 off for existing customers free shipping brings several fantastic advantages: acu729640 – Receive an extra £100 discount for existing Temu users on select orders.   acu729640 – Enjoy a £100 coupon bundle for multiple purchases, stretching your savings even further.   acu729640 – Free gift with express shipping all over Europe for loyal customers.   acu729640 – Get up to 70% off on select items, in addition to your existing discounts.   acu729640 – Free shipping in the UK with this exclusive code for existing users.   How To Use The Temu Coupon Code £100 Off For Existing Customers? To use the Temu coupon code £100 off as an existing customer, simply follow these steps: Log in to your Temu account.   Add your chosen items to your cart.   Enter the Temu coupon £100 off code (acu729640) in the promo code box.   Proceed to checkout and see the discount applied.   Latest Temu Coupon £100 Off First Order New customers can enjoy the highest benefits with the Temu coupon code £100 off first order. Whether you're shopping on the Temu app or website, using the Temu coupon code first order gives you access to these unbeatable perks: acu729640 – A flat £100 discount on your first order with no hidden charges.   acu729640 – A £100 Temu coupon code first order for your first purchase on the platform.   acu729640 – Receive up to £100 coupon for multiple use after your first order.   acu729640 – Enjoy free shipping to European countries with your first purchase.   acu729640 – Get an extra 30% off on any purchase for your first order in the UK.   How To Find The Temu Coupon Code £100 Off? Finding the best Temu coupon £100 off is simple. You can always get verified and tested coupons by signing up for the Temu newsletter. For the latest updates, visit Temu’s social media pages for exclusive deals. Trusted coupon sites are also a great source for finding the latest working Temu coupon £100 off. Is Temu £100 Off Coupon Legit? Yes, our Temu £100 Off Coupon Legit is completely safe and valid. The Temu 100 off coupon legit code (acu729640) is verified and regularly tested, ensuring you can safely use it for both your first and recurring orders. This code is applicable across the UK and Europe and has no expiration date, so you can use it whenever you want. How Does Temu £100 Off Coupon Work? The Temu coupon code £100 off first-time user works by applying the Temu coupon codes 100 off when you shop on Temu. When you enter the coupon code at checkout, a flat £100 discount is applied to your total order value. It’s that simple! This allows you to enjoy massive savings right from your very first purchase. How To Earn Temu £100 Coupons As A New Customer? To earn Temu coupon code £100 off, you simply need to sign up as a new user and make your first purchase. After signing up, you will automatically have access to the 100 off Temu coupon code, which will be applied when you place your order. Additionally, you can look for any additional promotions Temu might offer to increase your savings! What Are The Advantages Of Using The Temu Coupon £100 Off? Using the Temu coupon code 100 off comes with several key advantages: £100 discount on the first order.   £100 coupon bundle for multiple uses.   70% discount on popular items.   Extra 30% off for existing Temu UK customers.   Up to 90% off on selected items.   Free gift for new UK users.   Free delivery all over Europe.   Temu £100 Discount Code And Free Gift For New And Existing Customers There are multiple benefits to using our Temu £100 off coupon code. With the £100 off Temu coupon code, you get: acu729640 – A £100 discount for first order.   acu729640 – An extra 30% off on any item for first-time users.   acu729640 – A free gift for new Temu users.   acu729640 – Up to 70% discount on any item on the Temu app.   acu729640 – Free gift with free shipping in the UK and Europe.   Pros And Cons Of Using Temu Coupon Code £100 Off This Month Pros Temu coupon £100 off code provides a massive £100 discount on your first order.   You can use the coupon multiple times over time with the same code.   Free shipping all over Europe for all users.   Extra 30% off for first-time customers.   Free gift with certain purchases in the UK and Europe.   Cons The code may not apply to some clearance items.   The coupon is only valid for a limited range of products.   Terms And Conditions Of Using The Temu Coupon £100 Off In 2025 Temu coupon code £100 off free shipping is valid for new and existing customers in the UK and Europe.   There is no expiration date, so you can use it whenever you like.   There are no minimum purchase requirements for using our latest Temu coupon code £100 off.   The coupon applies to most products, but some exclusions may apply.   Final Note: Use The Latest Temu Coupon Code £100 Off Make sure to use the Temu coupon code £100 off while shopping for your first order to get the most savings. The Temu coupon £100 off is a great way to enjoy massive discounts and better deals on Temu. FAQs Of Temu £100 Off Coupon How do I get the Temu coupon code £100 off? Sign up for the Temu newsletter or visit trusted coupon sites to get the latest codes, including the Temu coupon £100 off. Is the Temu £100 off coupon valid for existing users? Yes, the Temu coupon £100 off is available for both new and existing customers, with additional benefits for both groups. Can I use the Temu coupon code £100 off on multiple orders? Yes, you can use the Temu £100 off coupon on multiple purchases, with certain restrictions depending on the code’s terms. Does the Temu £100 coupon have an expiration date? No, the Temu coupon £100 off has no expiration date and can be used at any time. Does the Temu £100 off coupon work in Europe? Yes, the Temu £100 off coupon is valid for users in the UK and all other European countries, offering free shipping and discounts.  
    • Looking to unlock amazing savings on your favorite online purchases? Look no further because the Temu coupon code 100€ off is here to supercharge your shopping experience. We are excited to share that the exclusive acu729640 Temu coupon code brings maximum discounts and perks to users across European nations. So, whether you’re shopping in Germany, France, or Italy, this Temu coupon 100€ off and Temu 100 off coupon code can give you unbeatable benefits every time you shop. What Is The Coupon Code For Temu 100€ Off? Whether you're a first-time buyer or a loyal Temu customer, the Temu coupon 100€ off can be your ultimate money-saver. Enjoy big rewards with this 100€ off Temu coupon when shopping through the Temu app or website. acu729640 – Get a flat 100€ off instantly on your purchase. acu729640 – Unlock a 100€ coupon pack for multiple uses over time. acu729640 – Special 100€ flat discount for new customers on their first order. acu729640 – Extra 100€ promo benefits for existing customers in Europe. acu729640 – Access a 100€ coupon exclusively curated for European users. Temu Coupon Code 100€ Off For New Users In 2025 If you’re new to Temu, you’re in for a treat! The Temu coupon 100€ off will give you the highest possible value as a first-time shopper. Here’s what you get with the Temu coupon code 100€ off: acu729640 – Flat 100€ discount for new users. acu729640 – 100€ coupon bundle for new customers. acu729640 – Use up to 100€ in multiple-use coupons. acu729640 – Enjoy free shipping across Germany, France, Italy, Switzerland, and more. acu729640 – First-time buyers also get an extra 30% discount on any purchase. How To Redeem The Temu coupon 100€ off For New Customers? To claim the Temu 100€ coupon and enjoy the Temu 100€ off coupon code for new users, follow these easy steps: Download the Temu app or visit the official Temu website. Sign up with your email or mobile number to create a new account. Browse products and add your favorite items to your cart. At checkout, enter the code acu729640 in the promo code field. Enjoy 100€ off and complete your purchase! Temu Coupon 100€ Off For Existing Customers Good news for returning shoppers! Even as an existing user, you can grab exciting rewards with our Temu 100€ coupon codes for existing users. Enjoy perks like Temu coupon 100€ off for existing customers free shipping and more: acu729640 – Get an extra 100€ off as a returning customer. acu729640 – Unlock a 100€ coupon bundle usable for multiple purchases. acu729640 – Receive a free gift with express shipping anywhere in Europe. acu729640 – Combine with up to 70% discounts already available on Temu. acu729640 – Free shipping to Germany, France, Italy, Spain, Switzerland, and other European countries. How To Use The Temu Coupon Code 100€ Off For Existing Customers? To activate your Temu coupon code 100€ off and make the most of the Temu coupon 100€ off code, follow this quick guide: Open the Temu app or website and log in to your account. Choose your desired products and add them to your shopping cart. Head to checkout and enter the code acu729640 in the promo section. Apply the code and see the instant discount of 100€. Proceed with the payment and enjoy exclusive savings! Latest Temu Coupon 100€ Off First Order Are you placing your first order on Temu? Then the Temu coupon code 100€ off first order is exactly what you need! Take advantage of these exciting offers using our Temu coupon code first order and Temu coupon code 100€ off first time user: acu729640 – Flat 100€ discount exclusively for your first order. acu729640 – Claim a 100€ Temu coupon code applicable to your first order. acu729640 – Get a coupon pack worth 100€ for multiple redemptions. acu729640 – Enjoy free shipping to European countries. acu729640 – Additional 30% off on your first order in Germany, France, Italy, Switzerland, Spain, and more. How To Find The Temu Coupon Code 100€ Off? Wondering where to grab a Temu coupon 100€ off or find real deals discussed on Temu coupon 100€ off Reddit? We’ve got you covered. You can subscribe to the Temu newsletter and receive the best coupon codes directly in your inbox. Also, follow Temu on Instagram, Facebook, and Twitter to catch the latest promo codes. For verified and working codes, visit any reputable coupon-sharing website. Is Temu 100€ Off Coupon Legit? Absolutely! The Temu 100€ Off Coupon Legit tag belongs to our trusted code. The Temu 100 off coupon legit status of acu729640 has been tested and verified. It works safely and smoothly on both first-time and recurring orders. The best part? It’s valid across all European nations and has no expiry date! How Does Temu 100€ Off Coupon Work? The Temu coupon code 100€ off first-time user and Temu coupon codes 100 off apply directly at checkout when you use the promo code. Once you apply acu729640 in the promo field during checkout, the system deducts 100€ from your cart. Depending on your user status (new or existing), you might also get extra discounts, shipping benefits, or coupon bundles. Just ensure you’re shopping from within Europe, and you're good to go! How To Earn Temu 100€ Coupons As A New Customer? To earn the Temu coupon code 100€ off and get access to the 100 off Temu coupon code, you simply need to sign up and use our exclusive promo. As a new user, register with Temu using your email or mobile number. Then, apply acu729640 at checkout and enjoy your savings. Occasionally, Temu also runs promotional campaigns where you can refer friends and earn bonus coupons, including 100€ packs. What Are The Advantages Of Using Temu Coupon 100€ Off? Here’s why using the Temu coupon code 100 off and Temu coupon code 100€ off is a smart decision: 100€ discount on the first order. 100€ coupon bundle for multiple uses. Up to 70% off on trending and popular items. Extra 30% discount for existing Temu users in Europe. Up to 90% off on select flash sale products. Free gift for all new European users. Free delivery across all European nations. Temu 100€ Discount Code And Free Gift For New And Existing Customers You’re in for multiple surprises with the Temu 100€ off coupon code and 100€ off Temu coupon code. Enjoy discounts, gifts, and free deliveries when you shop with Temu using our code. acu729640 – Flat 100€ off on your first order. acu729640 – Extra 30% off on any item in your cart. acu729640 – Special free gift for new customers. acu729640 – Up to 70% discount on selected categories. acu729640 – Free gift + free shipping across Germany, France, Italy, Switzerland, etc. Pros And Cons Of Using Temu Coupon Code 100€ Off This Month Let’s quickly go through the pros and cons of the Temu coupon 100€ off code and Temu 100 off coupon: Pros: Massive 100€ discount on your first or repeat order. Works for both new and existing customers. Valid across European nations. Combines well with ongoing discounts. Offers free shipping and gifts. Cons: Only valid on the Temu app or website. Limited-time stock availability for some items. Terms And Conditions Of Using The Temu Coupon 100€ Off In 2025 Let’s go over the Temu coupon code 100€ off free shipping and latest Temu coupon code 100€ off terms: The code acu729640 has no expiration date. Valid for both new and existing customers. Works across European countries like Germany, France, Italy, Switzerland, Spain, etc. No minimum purchase value is required. Coupon must be applied at checkout to activate benefits. Final Note: Use The Latest Temu Coupon Code 100€ Off Don’t miss out on the best deal of the year. Redeem the Temu coupon code 100€ off using acu729640 and enjoy unmatched savings across Europe. We want you to save more with each purchase. Start using the Temu coupon 100€ off and make your shopping smarter today. FAQs Of Temu 100€ Off Coupon Can I use the Temu coupon 100€ off as an existing customer? Yes, existing users can apply the code acu729640 and receive an extra 100€ discount on top of other available offers. Is the Temu 100€ off coupon code valid in Germany and France? Absolutely! The code works across major European countries, including Germany, France, Italy, Switzerland, and Spain. How many times can I use the 100€ Temu coupon code? The code acu729640 comes with a coupon bundle, allowing for multiple uses over time depending on your order type. Can I get free shipping with the Temu 100€ coupon? Yes, free shipping is part of the offer when you use our coupon code on eligible purchases within Europe. Is the Temu coupon 100€ off available on the app and website? Yes, the coupon code acu729640 is valid on both the Temu mobile app and the official website for your convenience.  
    • Looking for a massive discount while shopping online? With the Temu coupon code $100 off, you can unlock incredible savings on your favorite products. The exclusive acu729640 Temu coupon code is here to offer maximum benefits to all shoppers across the USA, Canada, and European countries. Whether you're a first-time buyer or a returning customer, this Temu coupon $100 off and Temu 100 off coupon code is your golden ticket to unbeatable deals. What Is The Coupon Code For Temu $100 Off? The best part about our coupon is that it's valid for everyone! Whether you're new to Temu or an existing customer, you can enjoy amazing benefits using the Temu coupon $100 off and $100 off Temu coupon. acu729640 – Get a flat $100 off instantly on your next order. acu729640 – Enjoy a $100 coupon pack with multiple use opportunities. acu729640 – Avail a $100 flat discount for new customers on their first purchase. acu729640 – Existing users can apply this code to receive an extra $100 promo discount. acu729640 – Perfect for shoppers in the USA/Canada looking to save big with a $100 coupon. Temu Coupon Code $100 Off For New Users In 2025 New to Temu? You're in luck because the Temu coupon $100 off and Temu coupon code $100 off are offering unmatched deals just for you. acu729640 – Get a flat $100 discount as a welcome gift. acu729640 – Receive a $100 coupon bundle curated specifically for new users. acu729640 – Enjoy up to $100 coupon benefits for multiple purchases. acu729640 – Benefit from free shipping to over 68 countries. acu729640 – Score an extra 30% off on any purchase as a first-time user. How To Redeem The Temu Coupon $100 Off For New Customers? To activate the Temu $100 coupon and Temu $100 off coupon code for new users, follow these easy steps: Download the Temu app or visit their official website. Create your new account using a valid email address. Browse through the wide range of products and add your favorites to the cart. At checkout, enter the coupon code acu729640. The $100 discount will be instantly applied to your total. Temu Coupon $100 Off For Existing Customers Already a Temu customer? Great! The Temu $100 coupon codes for existing users and Temu coupon $100 off for existing customers free shipping are still valid for you. acu729640 – Redeem a $100 extra discount on any existing account. acu729640 – Unlock a $100 coupon bundle usable across multiple purchases. acu729640 – Get a free gift and enjoy express shipping across the USA and Canada. acu729640 – Save an extra 30% even on discounted products. acu729640 – Take advantage of free shipping to 68 global destinations. How To Use The Temu Coupon Code $100 Off For Existing Customers? To use the Temu coupon code $100 off and Temu coupon $100 off code, follow these steps: Open the Temu app or log in to your existing account on the website. Shop your favorite items and proceed to checkout. Input the code acu729640 in the promo code box. Confirm your order and see the $100 discount applied instantly. Latest Temu Coupon $100 Off First Order Make your first order count with our powerful promo code! The Temu coupon code $100 off first order, Temu coupon code first order, and Temu coupon code $100 off first time user offer unbeatable value. acu729640 – Flat $100 discount on your first order. acu729640 – Access to a $100 Temu coupon code as a first-time buyer. acu729640 – Enjoy up to $100 in coupons for repeated use. acu729640 – Get free global shipping to 68 countries. acu729640 – Bonus 30% off any product for new users. How To Find The Temu Coupon Code $100 Off? Looking for the Temu coupon $100 off or the Temu coupon $100 off Reddit discussions? Here's how you can find verified codes: Sign up for Temu’s newsletter to get access to exclusive and verified promo codes. Follow Temu on their social media pages like Instagram, Facebook, and Twitter for real-time updates on new discounts. Trusted coupon-sharing websites also provide the latest working Temu codes, including our very own acu729640. Is Temu $100 Off Coupon Legit? Worried whether this deal is real? Yes, the Temu $100 Off Coupon Legit and Temu 100 off coupon legit status is fully confirmed. Our Temu coupon code acu729640 is 100% legitimate, tested, and verified. It’s valid for both new and existing customers, worldwide, and does not have an expiration date. How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupon codes 100 off provide direct value through instant cart discounts. When you apply the coupon code acu729640 at checkout, the system deducts $100 from your total. Whether you're a new user or a returning one, this code adjusts automatically based on your account type and shopping cart value. How To Earn Temu $100 Coupons As A New Customer? The best way to get the Temu coupon code $100 off and 100 off Temu coupon code is by signing up as a new customer on Temu. Once your account is created, use our promo code acu729640 to unlock a $100 coupon bundle, including a first-time order bonus, repeat usage coupons, and exclusive deals for new members. What Are The Advantages Of Using The Temu Coupon $100 Off? Here are the main benefits of using our Temu coupon code 100 off and Temu coupon code $100 off: $100 discount on your first order. $100 coupon bundle for multiple uses. 70% discount on popular items. Extra 30% off for existing Temu customers. Up to 90% off on selected products. Free gift for new users. Free delivery to 68 countries. Temu $100 Discount Code And Free Gift For New And Existing Customers The Temu $100 off coupon code and $100 off Temu coupon code also come with exclusive perks. acu729640 – Get $100 discount for your first order. acu729640 – Enjoy an additional 30% off on any item. acu729640 – Receive a free gift as a new Temu user. acu729640 – Unlock up to 70% discounts on your favorite items. acu729640 – Free gift with free shipping in 68 countries, including the USA and UK. Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Here are the main Temu coupon $100 off code and Temu 100 off coupon pros and cons: Pros: Massive $100 discount on your first order. Works for both new and returning users. No minimum purchase requirement. Valid across 68 countries. Includes free shipping and extra discounts. Cons: Limited availability during high demand. Cannot be combined with some other special promo campaigns. Terms And Conditions Of Using The Temu Coupon $100 Off In 2025 Here are the Temu coupon code $100 off free shipping and latest Temu coupon code $100 off terms and conditions: Coupon code acu729640 is valid worldwide. No expiration date – use it anytime. No minimum purchase required. Available for both new and existing users. Free shipping is applicable to 68 countries. Final Note: Use The Latest Temu Coupon Code $100 Off We encourage you to use the Temu coupon code $100 off to make the most of your online shopping. Apply it today to enjoy the biggest discounts and rewards on Temu. The Temu coupon $100 off is your chance to enjoy premium deals with zero hassle. Don’t miss this verified offer that saves both time and money. FAQs Of Temu $100 Off Coupon What is the Temu $100 off coupon code? The Temu $100 off coupon code is acu729640, which gives users a flat $100 discount, free shipping, and other benefits on the Temu app and website. It works globally. Can existing users use the Temu $100 coupon? Yes, existing users can also use the acu729640 code to get a $100 discount, a coupon bundle, and exclusive deals on selected items. Is the Temu $100 off coupon legit? Absolutely. Our coupon code acu729640 is 100% tested, verified, and has no expiration date. It works for both new and old users worldwide. Can I get free shipping with the Temu coupon code? Yes, the Temu $100 off coupon also includes free shipping to 68 countries, including the USA, Canada, UK, and many European nations. How do I apply the Temu coupon code $100 off? Simply enter the code acu729640 at checkout on the Temu app or website, and the discount will be automatically applied to your cart.  
  • Topics

×
×
  • Create New...

Important Information

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