Jump to content

Recommended Posts

Posted (edited)

I'm somewhat of a beginner at forge and I'm trying to add custom recipe types to my mod. I've been trying to adapt the solution from https://www.youtube.com/watch?v=IOFbegpYY0k and update it to 1.20.2 with the help of the forge docs without success.

Does anyone know anything about creating such behaviour? Any help would be appreciated.

My recipe is a simple recipe similar to the legacy smithing recipe, heres a JSON example (the "//" will be replaced with some items):

{
  "type": "magic_overhaul:rune_inscribing",
  "base": {
    "item": "//base item"
  },
  "template": {
    "item": "//template item"
  },
  "output": {
    "count": 1,
    "item": "//output item"
  }
}

What I'm interested most is how to implement the RecipeSerializer and RecipeType classes within my Recipe class.

Here's my current RecipeSerializer:

  Reveal hidden contents

Here's the RecipeType:

  Reveal hidden contents

 

Please comment if you need any more code fragments.

Edited by JacksStuff
Posted
  On 4/12/2024 at 5:44 PM, dee12452 said:

I don't spot anything obvious. Can you post the code where you register the serializer?

Expand  
public class ModRecipes {
    public static final DeferredRegister<RecipeSerializer<?>> SERIALIZERS =
            DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, MagicOverhaul.MOD_ID);

    public static final RegistryObject<RecipeSerializer<RuneInscribingRecipe>> RUNE_INSCRIBING_SERIALIZER =
            SERIALIZERS.register("rune_inscribing", () -> new RuneInscribingRecipe.Serializer());


    public static void register(IEventBus eventBus){
        SERIALIZERS.register(eventBus);
    }
}

 

Posted
  On 4/12/2024 at 9:35 PM, dee12452 said:

Yeah this looks good, alright post all of `RuneInscribingRecipe`

Expand  
  Reveal hidden contents

 

Posted

There's a couple of discrepancies between my 1.20.2 implementation that's working and yours here but nothing I'd imagine is directly causing an issue. 

What's the exact problem that's happening? Is there a crash? Are you using a custom crafting menu you made from scratch (i.e. a new class that likely extends AbstractContainerMenu + a screen to go along with it)?  

Posted (edited)
  On 4/13/2024 at 3:05 AM, dee12452 said:

There's a couple of discrepancies between my 1.20.2 implementation that's working and yours here but nothing I'd imagine is directly causing an issue. 

What's the exact problem that's happening? Is there a crash? Are you using a custom crafting menu you made from scratch (i.e. a new class that likely extends AbstractContainerMenu + a screen to go along with it)?  

Expand  

1.The game doesn't crash, everything seems normal, but when i insert the designated items into the block entity, the result item does not show up.

2.Yes, I'm using a custom menu, here's the source code:

  Reveal hidden contents

 

Edited by JacksStuff
Posted (edited)

Ok yeah I think this might be where the problem starts.

For starters, I think you can get rid of your RecipeType impl and make it a static constant instead. I'm not 100% sure this will fix it but it's posssible.

RuneInscribingRecipe

    public class RuneInscribingRecipe implements Recipe<SimpleContainer> {
        public static final RecipeType<RuneInscribingRecipe> RECIPE_TYPE = new RecipeType<>(){};
        
        // ....

        @Override
        public RecipeType<?> getType() {
            return RECIPE_TYPE;
        }
        
        // ....
    }

RuneInscriberMenu

    private Optional<RecipeHolder<RuneInscribingRecipe>> getCurrentRecipe() {
        SimpleContainer inventory = new SimpleContainer(2);
        inventory.setItem(BASE_INPUT_SLOT, this.inventory.getStackInSlot(BASE_INPUT_SLOT));
        inventory.setItem(TEMPLATE_INPUT_SLOT, this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));
        List<RecipeHolder<RuneInscribingRecipe>> list = this.blockEntity.getLevel().getRecipeManager().getRecipesFor(RuneInscribingRecipe.RECIPE_TYPE, inventory, this.blockEntity.getLevel());
        if (list.isEmpty()) {
            return Optional.empty();
        }

        return Optional.of(list.get(0));
    }

 

Also, this here is a little suspicious where you're getting the `this.inventory.getStackInSlot` calls. I'd try and make sure those are what you expect they are with either a Debug line in IDE or print statement

SimpleContainer inventory = new SimpleContainer(2);
inventory.setItem(BASE_INPUT_SLOT, this.inventory.getStackInSlot(BASE_INPUT_SLOT));
System.out.printf("CHECKING BASE INPUT OF RECIPE: %s\n", this.inventory.getStackInSlot(BASE_INPUT_SLOT));
inventory.setItem(TEMPLATE_INPUT_SLOT, this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));
System.out.printf("CHECKING TEMPLATE INPUT OF RECIPE: %s\n", this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));

^ See what the result of those print statements are, make sure they're right

Edited by dee12452
Remove potential false info
Posted
  On 4/13/2024 at 11:29 AM, dee12452 said:

Ok yeah I think this might be where the problem starts.

For starters, I think you can get rid of your RecipeType impl and make it a static constant instead. I'm not 100% sure this will fix it but it's posssible.

RuneInscribingRecipe

    public class RuneInscribingRecipe implements Recipe<SimpleContainer> {
        public static final RecipeType<RuneInscribingRecipe> RECIPE_TYPE = new RecipeType<>(){};
        
        // ....

        @Override
        public RecipeType<?> getType() {
            return RECIPE_TYPE;
        }
        
        // ....
    }

RuneInscriberMenu

    private Optional<RecipeHolder<RuneInscribingRecipe>> getCurrentRecipe() {
        SimpleContainer inventory = new SimpleContainer(2);
        inventory.setItem(BASE_INPUT_SLOT, this.inventory.getStackInSlot(BASE_INPUT_SLOT));
        inventory.setItem(TEMPLATE_INPUT_SLOT, this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));
        List<RecipeHolder<RuneInscribingRecipe>> list = this.blockEntity.getLevel().getRecipeManager().getRecipesFor(RuneInscribingRecipe.RECIPE_TYPE, inventory, this.blockEntity.getLevel());
        if (list.isEmpty()) {
            return Optional.empty();
        }

        return Optional.of(list.get(0));
    }

 

Also, this here is a little suspicious where you're getting the `this.inventory.getStackInSlot` calls. I'd try and make sure those are what you expect they are with either a Debug line in IDE or print statement

SimpleContainer inventory = new SimpleContainer(2);
inventory.setItem(BASE_INPUT_SLOT, this.inventory.getStackInSlot(BASE_INPUT_SLOT));
System.out.printf("CHECKING BASE INPUT OF RECIPE: %s\n", this.inventory.getStackInSlot(BASE_INPUT_SLOT));
inventory.setItem(TEMPLATE_INPUT_SLOT, this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));
System.out.printf("CHECKING TEMPLATE INPUT OF RECIPE: %s\n", this.inventory.getStackInSlot(TEMPLATE_INPUT_SLOT));

^ See what the result of those print statements are, make sure they're right

Expand  

Thanks for the suggestions, but nothing seemed to change after applying them. Also the "this.inventory.getStackInSlot" thing prints the correct items.

Posted

Hm yeah sorry, not seeing anything else that's sticking out, I'd need to debug myself probably. Do you have a github or bitbucket repo? I could poke around when I have time to see what the problem might be.

Posted
  On 4/13/2024 at 1:59 PM, dee12452 said:

Hm yeah sorry, not seeing anything else that's sticking out, I'd need to debug myself probably. Do you have a github or bitbucket repo? I could poke around when I have time to see what the problem might be.

Expand  

Here's my github repo https://github.com/JacksStuff0905/magic-overhaul-1.20.X, maybe you might find something. Either way thanks a lot for all the help.

Posted

Sure, I'm sorry I couldn't be more helpful so far.

 

 Does this always return empty?

List<RecipeHolder<RuneInscribingRecipe>> list = this.blockEntity.getLevel().getRecipeManager().getRecipesFor(RuneInscribingRecipe.RECIPE_TYPE, inventory, this.blockEntity.getLevel());

 

Posted
  On 4/13/2024 at 5:07 PM, dee12452 said:

Sure, I'm sorry I couldn't be more helpful so far.

 

 Does this always return empty?

List<RecipeHolder<RuneInscribingRecipe>> list = this.blockEntity.getLevel().getRecipeManager().getRecipesFor(RuneInscribingRecipe.RECIPE_TYPE, inventory, this.blockEntity.getLevel());

 

Expand  

Yeah, always an empty list, I checked multiple times. 

Posted
{
  "type": "magic_overhaul:rune_inscribing",
  "base": {
    "item": "//base item"
  },
  "template": {
    "item": "//template item"
  },
  "output": {
    "count": 1,
    "item": "//output item"
  }
}

^ Ok, where is your recipe JSON placed in your file structure? What's it called? And paste the actual JSON you're testing with, because it needs to be valid.

Posted
  On 4/13/2024 at 6:55 PM, dee12452 said:
{
  "type": "magic_overhaul:rune_inscribing",
  "base": {
    "item": "//base item"
  },
  "template": {
    "item": "//template item"
  },
  "output": {
    "count": 1,
    "item": "//output item"
  }
}

^ Ok, where is your recipe JSON placed in your file structure? What's it called? And paste the actual JSON you're testing with, because it needs to be valid.

Expand  

I accidentally forgot to push the recent changes, so all the stuff about the recipes is missing from github. Just fixed that. The JSON is located in the data/magic_overhaul/recipes folder and looks like this:

{
  "type": "magic_overhaul:rune_inscribing",
  "base": {
    "item": "minecraft:stone"
  },
  "template": {
    "item": "magic_overhaul:rune_template_acnar"
  },
  "output": {
    "count": 1,
    "item": "magic_overhaul:rune_acnar"
  }
}

 

Posted

@JacksStuff looks like at least one of your problems is your recipe JSON. ItemStack's CODEC isn't defined the way you're thinking it is. Try this instead

{
  "type": "magic_overhaul:rune_inscribing",
  "base": {
    "item": "minecraft:stone"
  },
  "template": {
    "item": "magic_overhaul:rune_template_acnar"
  },
  "output": {
    "Count": 1,
    "id": "magic_overhaul:rune_acnar"
  }
}

 

Posted
  On 4/14/2024 at 9:27 PM, chxr said:

Im running on a similar problem. Codecs are hurting my head more than they should

Expand  

Yeah CODECs are super funky the first time you start working with them, I definitely had a few woes in the beginning when moving to 1.20.2. What's the JSON structure of your recipe? I'm sure either I or ChatGPT can whip you up a CODEC for it pretty quickly lol.

Posted
  On 4/15/2024 at 2:11 PM, dee12452 said:

Yeah CODECs are super funky the first time you start working with them, I definitely had a few woes in the beginning when moving to 1.20.2. What's the JSON structure of your recipe? I'm sure either I or ChatGPT can whip you up a CODEC for it pretty quickly lol.

Expand  

Funny enough, Chatgpt is confusing me even more. My BE works like a furnace, you need 8 items and two fuel to make a third item. Here is an example recipe. In this case, 8 aberrant shards, each one in one slot, and two of aberrant fuel, each one on one slot for a total of 10 slots. Supposedly any block with the tag aberrant_fuel should be accepted but im not sure this is how the json should look:

 

{
  "type": "relativedimensions:particle_rebound",
  "inputItem": [
    {
      "item": "relativedimensions:aberrant_shard"
    }
  ],
  "fuelItem": [
    {
      "tag": "relativedimensions:block/aberrant_fuel"
    }
  ],
  "output": {
    "Count": 1,
    "id": "relativedimensions:aberrant_ingot"
  }
}

 

Posted

@chxr

Looks like you're making some sort of a crafting table / furnace hybrid? Are the inputs needing arranging like a shaped recipe, or is it shapeless?

I'll assume it's shapeless since that just adds a lot more complexity. In that case I'd probably do something like this

{
  "type": "relativedimensions:particle_rebound",
  "inputs": [
    {
      "ingredient": {
        "item": "relativedimensions:aberrant_shard"
      },
      "count": 8
    }
  ],
  "fuel": {
    "tag": "relativedimensions:block/aberrant_fuel"
  },
  "output": {
    "Count": 1,
    "id": "relativedimensions:aberrant_ingot"
  }
}

inputs: A list of ingredients and how many are needed. The count among each input adds up to 8. Since there's only 1 ingredient, the count is set to 8.

fuel: Same thing as before but remove the list and just make it an object with a tag.

output: Kept the same.

 

In this case the Codec I would make is

    public record ParticleReboundIngredient(Ingredient ingredient, int count) {
        public static final Codec<ParticleReboundIngredient> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        Ingredient.CODEC.fieldOf("ingredient").forGetter((i) -> i.ingredient),
                        Codec.INT.fieldOf("count").forGetter(i -> i.count)
                ).apply(builder, ParticleReboundIngredient::new)
        );
    }
    
    public record ParticleReboundFuel(String tag) {
        public static final Codec<ParticleReboundFuel> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(Codec.STRING.fieldOf("tag").forGetter(f -> f.tag)).apply(builder, ParticleReboundFuel::new)
        );
        
        public boolean isFuel(ItemStack stack) {
            // TODO: Check if fuel item matches the tag
        }
    }

    public record ParticleReboundRecipe(List<ParticleReboundIngredient> inputs, ParticleReboundFuel fuel, ItemStack output) {
        public static final Codec<ParticleReboundRecipe> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        ParticleReboundIngredient.CODEC.listOf().fieldOf("inputs").forGetter(r -> r.inputs),
                        ParticleReboundFuel.CODEC.fieldOf("fuel").forGetter(r -> r.fuel),
                        ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output)
                ).apply(builder, ParticleReboundRecipe::new)
        );
    }

 

There might be a more proper Codec for the fuel and the tag that's built into minecraft / forge, but I didn't look

Posted (edited)

 

  On 4/15/2024 at 6:29 PM, dee12452 said:

@chxr

Looks like you're making some sort of a crafting table / furnace hybrid? Are the inputs needing arranging like a shaped recipe, or is it shapeless?

I'll assume it's shapeless since that just adds a lot more complexity. In that case I'd probably do something like this

{
  "type": "relativedimensions:particle_rebound",
  "inputs": [
    {
      "ingredient": {
        "item": "relativedimensions:aberrant_shard"
      },
      "count": 8
    }
  ],
  "fuel": {
    "tag": "relativedimensions:block/aberrant_fuel"
  },
  "output": {
    "Count": 1,
    "id": "relativedimensions:aberrant_ingot"
  }
}

inputs: A list of ingredients and how many are needed. The count among each input adds up to 8. Since there's only 1 ingredient, the count is set to 8.

fuel: Same thing as before but remove the list and just make it an object with a tag.

output: Kept the same.

 

In this case the Codec I would make is

    public record ParticleReboundIngredient(Ingredient ingredient, int count) {
        public static final Codec<ParticleReboundIngredient> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        Ingredient.CODEC.fieldOf("ingredient").forGetter((i) -> i.ingredient),
                        Codec.INT.fieldOf("count").forGetter(i -> i.count)
                ).apply(builder, ParticleReboundIngredient::new)
        );
    }
    
    public record ParticleReboundFuel(String tag) {
        public static final Codec<ParticleReboundFuel> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(Codec.STRING.fieldOf("tag").forGetter(f -> f.tag)).apply(builder, ParticleReboundFuel::new)
        );
        
        public boolean isFuel(ItemStack stack) {
            // TODO: Check if fuel item matches the tag
        }
    }

    public record ParticleReboundRecipe(List<ParticleReboundIngredient> inputs, ParticleReboundFuel fuel, ItemStack output) {
        public static final Codec<ParticleReboundRecipe> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        ParticleReboundIngredient.CODEC.listOf().fieldOf("inputs").forGetter(r -> r.inputs),
                        ParticleReboundFuel.CODEC.fieldOf("fuel").forGetter(r -> r.fuel),
                        ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output)
                ).apply(builder, ParticleReboundRecipe::new)
        );
    }

 

There might be a more proper Codec for the fuel and the tag that's built into minecraft / forge, but I didn't look

Expand  

Pretty much, although all the recipes im planning to make on it are shapeless. The idea is that the chamber uses energy to "fuse" the items in each of the center slots together, in this case an ingot. The two slots at the sides are fuel. (A special kind of wood in this case).

Here is an image of the interface just for reference (The center slot is the output)

spacer.png

 

As for the code- Can you elaborate a little bit on it? Seeing three different record classes has confused me a lot. (Elaborate as in why make them in three different records. I understand the code itself more or less)

Edited by chxr
Posted
  On 4/15/2024 at 9:53 PM, chxr said:

 

Pretty much, although all the recipes im planning to make on it are shapeless. The idea is that the chamber uses energy to "fuse" the items in each of the center slots together, in this case an ingot. The two slots at the sides are fuel. (A special kind of wood in this case).

Here is an image of the interface just for reference (The center slot is the output)

spacer.png

 

As for the code- Can you elaborate a little bit on it? Seeing three different record classes has confused me a lot. (Elaborate as in why make them in three different records. I understand the code itself more or less)

Expand  

That looks pretty cool, nice!

 

Sure, so looking at that JSON file I posted, I pretty much made a record class for each "custom" data type in that JSON. The Input is a good example of why

```

"inputs": [ { "ingredient": { "item": "relativedimensions:aberrant_shard" }, "count": 8 } ],

```

So here's the inputs, it's an array, which we can use the Codec builder's builder.listOf to define an array. Each Item is of some arbitrary object with keys "ingredient" (which we know is an Ingredient) and a "count" which is an int. You don't have to have an intermediate class to map this to necessarily but I found that it's just easier to see the data that way, hence the 'ParticleReboundIngredient' represents one of these inputs.

 

Let me know if that makes sense or not. 

Posted
  On 4/15/2024 at 10:33 PM, dee12452 said:

That looks pretty cool, nice!

 

Sure, so looking at that JSON file I posted, I pretty much made a record class for each "custom" data type in that JSON. The Input is a good example of why

```

"inputs": [ { "ingredient": { "item": "relativedimensions:aberrant_shard" }, "count": 8 } ],

```

So here's the inputs, it's an array, which we can use the Codec builder's builder.listOf to define an array. Each Item is of some arbitrary object with keys "ingredient" (which we know is an Ingredient) and a "count" which is an int. You don't have to have an intermediate class to map this to necessarily but I found that it's just easier to see the data that way, hence the 'ParticleReboundIngredient' represents one of these inputs.

 

Let me know if that makes sense or not. 

Expand  

It does but I'm struggling to see how to make it work in my recipe? (Its structure is the same as OP's, with a serializer subclass)

Posted
 public class ParticleReboundRecipe implements Recipe<CraftingContainer> {
   private List<ParticleReboundIngredient> inputs;
   private ParticleReboundFuel fuel; 
   private ItemStack output;
   
   public ParticleReboundRecipe(List<ParticleReboundIngredient> inputs, ParticleReboundFuel fuel, ItemStack output) {
     this.inputs = inputs;
     this.fuel = fuel;
     this.output = output;
   }
   
    // TODO: Implement interface ...
   
   // TODO: Move to separate file if desired
	public record ParticleReboundIngredient(Ingredient ingredient, int count) {
        public static final Codec<ParticleReboundIngredient> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        Ingredient.CODEC.fieldOf("ingredient").forGetter((i) -> i.ingredient),
                        Codec.INT.fieldOf("count").forGetter(i -> i.count)
                ).apply(builder, ParticleReboundIngredient::new)
        );
    }
    
   // TODO: Move to separate file if desired
    public record ParticleReboundFuel(String tag) {
        public static final Codec<ParticleReboundFuel> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(Codec.STRING.fieldOf("tag").forGetter(f -> f.tag)).apply(builder, ParticleReboundFuel::new)
        );
        
        public boolean isFuel(ItemStack stack) {
            // TODO: Check if fuel item matches the tag
        }
    }
   
   public class Serializer implements RecipeSerializer<ParticleReboundRecipe> {
     public static final Codec<ParticleReboundRecipe> CODEC = RecordCodecBuilder.create(
       builder -> builder.group(
         ParticleReboundIngredient.CODEC.listOf().fieldOf("inputs").forGetter(r -> r.inputs),
         ParticleReboundFuel.CODEC.fieldOf("fuel").forGetter(r -> r.fuel),
         ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output)
       ).apply(builder, ParticleReboundRecipe::new)
     );

     @Override
     public @NotNull Codec<ParticleReboundRecipe> codec() {
       return CODEC;
     }
     
     // TODO: The rest ...
   }
 }

 

?

Posted
  On 4/16/2024 at 1:00 AM, dee12452 said:
 public class ParticleReboundRecipe implements Recipe<CraftingContainer> {
   private List<ParticleReboundIngredient> inputs;
   private ParticleReboundFuel fuel; 
   private ItemStack output;
   
   public ParticleReboundRecipe(List<ParticleReboundIngredient> inputs, ParticleReboundFuel fuel, ItemStack output) {
     this.inputs = inputs;
     this.fuel = fuel;
     this.output = output;
   }
   
    // TODO: Implement interface ...
   
   // TODO: Move to separate file if desired
	public record ParticleReboundIngredient(Ingredient ingredient, int count) {
        public static final Codec<ParticleReboundIngredient> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(
                        Ingredient.CODEC.fieldOf("ingredient").forGetter((i) -> i.ingredient),
                        Codec.INT.fieldOf("count").forGetter(i -> i.count)
                ).apply(builder, ParticleReboundIngredient::new)
        );
    }
    
   // TODO: Move to separate file if desired
    public record ParticleReboundFuel(String tag) {
        public static final Codec<ParticleReboundFuel> CODEC = RecordCodecBuilder.create(
                builder -> builder.group(Codec.STRING.fieldOf("tag").forGetter(f -> f.tag)).apply(builder, ParticleReboundFuel::new)
        );
        
        public boolean isFuel(ItemStack stack) {
            // TODO: Check if fuel item matches the tag
        }
    }
   
   public class Serializer implements RecipeSerializer<ParticleReboundRecipe> {
     public static final Codec<ParticleReboundRecipe> CODEC = RecordCodecBuilder.create(
       builder -> builder.group(
         ParticleReboundIngredient.CODEC.listOf().fieldOf("inputs").forGetter(r -> r.inputs),
         ParticleReboundFuel.CODEC.fieldOf("fuel").forGetter(r -> r.fuel),
         ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output)
       ).apply(builder, ParticleReboundRecipe::new)
     );

     @Override
     public @NotNull Codec<ParticleReboundRecipe> codec() {
       return CODEC;
     }
     
     // TODO: The rest ...
   }
 }

 

?

Expand  

Yeah sorry i just managed to make it now, i shouldn't have tried to make it work in my head yesterday late at night. It correctly is recognizing the recipe. Im running on some other errors but they are now due to my recipe's inner workings and not the game not recognizing the recipe itself

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

    • Looks like an issue with biomeswevegone
    • In the server.properties, set max-tick-time to -1   if there are further issues, make a test without distanthorizons
    • Verified user can get a $300 off TℰℳU Coupon code using the code ((“{{ '[''com31844'']}}”)). This TℰℳU $100Off code is specifically for new and existing customers both and can be redeemed to receive a $100discount on your purchase. Our exclusive TℰℳU Coupon code offers a flat $100off your purchase, plus an additional 100% discount on top of that. You can slash prices by up to $100as a new TℰℳU customer using code ((“{{ '[''com31844'']}}”)). Existing users can enjoy $100off their next haul with this code. But that’s not all! With our TℰℳU Coupon codes for 2025, you can get up to 90% discount on select items and clearance sales. Whether you’re a new customer or an existing shopper, our TℰℳU codes provide extra discounts tailored just for you. Save up to 100% with these current TℰℳU Coupons ["^"{{ '[''com31844'']}} "^"] for April 2025. The latest TℰℳU coupon codes at here. New users at TℰℳU receive a $100discount on orders over $100Use the code ((“{{ '[''com31844'']}}”)) during checkout to get TℰℳU Coupon $100Off For New Users. You can save $100Off your first order with the coupon code available for a limited time only. TℰℳU 90% Off promo code ((“{{ '[''com31844'']}}”)) will save you $100on your order. To get a discount, click on the item to purchase and enter the coe. Yes, offers $100Off coupon code “{{ '[''com31844'']}}” for first time users. You can get a $100bonus plus $100Off any purchase at TℰℳU with the $100Coupon Bundle at TℰℳU if you sign up with the referral code ((“{{ '[''com31844'']}}”)) and make a first purchase of $100or more. Free TℰℳU codes $100off — ((“{{ '[''com31844'']}}”)) Get a $100discount on your TℰℳU order with the promo code "{{ '[''com31844'']}}". You can get a discount by clicking on the item to purchase and entering this TℰℳU Coupon code $100off ((“{{ '[''com31844'']}}”)). ŢℰNew User Coupon ((“{{ '[''com31844'']}})): Up To $100OFF For First-Time Users Our TℰℳU first-time user coupon codes are designed just for new customers, offering the biggest discounts and the best deals currently available on TℰℳU To maximize your savings, download the TℰℳU app and apply our TℰℳU new user coupon during checkout. TℰℳU Coupon Codes For Existing Users ((“{{ '[''com31844'']}}”)): $100Price Slash Have you been shopping on TℰℳU or a while? Our TℰℳU Coupon for existing customers is here to reward you for your continued support, offering incredible discounts on your favorite products. TℰℳU Coupon For $100Off ((“{{ '[''com31844'']}}”)): Get A Flat $100Discount On Order Value Get ready to save big with our incredible TℰℳU Coupon for $100off! Our amazing ŢℰM$100off coupon code will give you a flat $100discount on your order value, making your shopping experience even more rewarding. TℰℳU Coupon Code For $100Off ((“{{ '[''com31844'']}}”)): For Both New And Existing Customers Our incredible TℰℳU Coupon code for $100off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our $100off code for TℰℳU will give you an additional discount! TℰℳU Coupon Bundle ((“{{ '[''com31844'']}}”)): Flat $100Off + Up To $100Discount Get ready for an unbelievable deal with our TℰℳU Coupon bundle for 2025! Our TℰℳU Coupon bundles will give you a flat $100discount and an additional $100off on top of it. Free TℰℳU Coupons ((“{{ '[''com31844'']}}”)): Unlock Unlimited Savings! Get ready to unlock a world of savings with our free TℰℳU Coupons! We’ve got you covered with a wide range of TℰℳU Coupon code options that will help you maximize your shopping experience. 100% Off TℰℳU Coupons, Promo Codes + 25% Cash Back ((“{{ '[''com31844'']}}”)) Redeem TℰℳU Coupon Code ((“{{ '[''com31844'']}}”)) TℰℳU Coupon $100OFF ((“{{ '[''com31844'']}}”)) TℰℳU Coupon $100OFF FOR EXISTING CUSTOMERS ((“{{ '[''com31844'']}}”)) TℰℳU Coupon $100OFF FIRST ORDER ((“{{ '[''com31844'']}}”)) TℰℳU Coupon $100OFF REDDIT ((“{{ '[''com31844'']}}”)) TℰℳU Coupon $100OFF FOR EXISTING CUSTOMERS REDDIT ((“{{ '[''com31844'']}}”)) TℰℳU $100OFF CODE ((“{{ '[''com31844'']}}”)) TℰℳU 70 OFF COUPON 2025 ((“{{ '[''com31844'']}}”)) DOMINOS 70 RS OFF COUPON CODE ((“{{ '[''com31844'']}}”)) WHAT IS A COUPON RATE ((“{{ '[''com31844'']}}”)) TℰℳU $100OFF FOR EXISTING CUSTOMERS ((“{{ '[''com31844'']}}”)) TℰℳU $100OFF FIRST ORDER ((“{{ '[''com31844'']}}”)) TℰℳU $100OFF FREE SHIPPING ((“{{ '[''com31844'']}}”)) You can get an exclusive $100off discount on your TℰℳU purchase with the code [{{ '[''com31844'']}}] Or [{{ '[''com31844'']}}].This code is specially designed for new customers and offers a significant price cut on your shopping. Make your first purchase on TℰℳU more rewarding by using this code to get $100off instantly.   TℰℳU Coupon Code For $100Off [{{ '[''com31844'']}}] Or [{{ '[''com31844'']}}]: Get A Flat $100Discount On Order Value Get ready to save big with our incredible TℰℳU coupon for $100off! Our coupon code will give you a flat $100discount on your order value, making your shopping experience even more rewarding.   Exclusive TℰℳU Discount Code [{{ '[''com31844'']}}] Or [{{ '[''com31844'']}}]: Flat $300 OFF for New and Existing Customers Using our TℰℳU promo code you can get A$ 200 off your order and 100% off using our TℰℳU promo code [{{ '[''com31844'']}}] Or [{{ '[''com31844'']}}]. As a new TℰℳU customer, you can save up to $100using this promo code. For returning users, our TℰℳU promo code offers a $100price slash on your next shopping spree. This is our way of saying thank you for shopping with us! Get ready to save big with our incredible TℰℳU Coupon code for $300 off! Our amazing TℰℳU $300 off coupon code will give you a flat $300 discount on your order value, making your shopping experience even more rewarding.   TℰℳU Coupon Code For 40% Off ["{com31844}"] For Both New And Existing Customers   Our incredible TℰℳU Coupon code for 40% off is here to help you save big on your purchases. Whether you’re a new user or an existing customer, our 40% off code for TℰℳU will give you an additional discount!   TℰℳU Coupon Bundle ["{com31844}"]: Flat $300 Off + Up To 90% Discount   Get ready for an unbelievable deal with our TℰℳU Coupon bundle for 2025! Our TℰℳU Coupon bundles will give you a flat $300 discount and an additional 40% off on top of it.   Free TℰℳU Coupons ["{com31844}"]: Unlock Unlimited Savings!   Get ready to unlock a world of savings with our free TℰℳU Coupons! We’ve got you covered with a wide range of TℰℳU Coupon code options that will help you maximize your shopping experience.   50% Off TℰℳU Coupons, Promo Codes + 25% Cash Back ["{com31844}"]   Redeem TℰℳU Coupon Code ["{com31844}"]   TℰℳU Coupon $300 OFF ["{com31844}"]   TℰℳU Coupon $300 OFF ["{com31844}"]   TℰℳU Coupon $300 OFF FOR EXISTING CUSTOMERS ["{com31844}"]   TℰℳU Coupon $300 OFF FIRST ORDER ["{com31844}"]   TℰℳU Coupon $300 OFF FIRST ORDER ["{com31844}"]   TℰℳU Coupon $300 OFF FOR EXISTING CUSTOMERS FREE SHIPPING USA ["{com31844}"]   TℰℳU Coupon $300 OFF HOW DOES IT WORK ["{com31844}"]   TℰℳU Coupon $300 OFF FOR EXISTING CUSTOMERS CANADA ["{com31844}"]   TℰℳU Coupon $300 OFF 2025 ["{com31844}"]   TℰℳU Coupon $300 OFF FOR NEW CUSTOMERS ["{com31844}"]   TℰℳU Coupon $300 OFF CANADA ["{com31844}"]   TℰℳU Coupon $300 OFF FOR EXISTING CUSTOMERS FIRST ORDER ["{com31844}"]   TℰℳU 300 OFF COUPON BUNDLE ["{com31844}"]   This TℰℳU coupon $300 off is designed to provide substantial savings on your purchases, making shopping for your favorite items easier than ever. With our $300 off TℰℳU coupon, you'll be amazed at how much you can save on your next order. Here are the key benefits you can expect when using our coupon code {com31844} "OR" {com31844}: {com31844} "OR" {com31844}: Flat $300 off on your purchase {com31844} "OR" {com31844}: $300 coupon pack for multiple uses {com31844} "OR" {com31844}: $300 flat discount for new customers {com31844} "OR" {com31844}: Extra $300 promo code for existing customers {com31844} "OR" {com31844}: $300 coupon exclusively for USA/Canada users H2: TℰℳU Coupon Code $300 Off For New Users In 2024 New users can reap the highest benefits by using our coupon code on the TℰℳU app. This TℰℳU coupon $300 off is specifically designed to welcome new customers with incredible savings  
    • Now the serve runs for a bit, then crashes after 20 minutes of running, what's the issue here? apologies if I need to start a new post and didn't https://pastebin.com/uBpp5bCz  
  • 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.