Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
29a43dd
RELEASE for 1.20.1 [no-snapshot] (#4426)
github-actions[bot] Jan 6, 2026
e3ce902
7.4.x Haze small fusion ctm tweaks bc it was bothering me (#4432)
HazeVista Jan 7, 2026
8c0f8c8
Two-Phase Recipe Addition System (#3981)
TechLord22 Jan 8, 2026
241534f
Fix overwriting FOV when on concrete (#4446)
zetrock1 Jan 9, 2026
22990cb
Add option to display temperatures in Celsius (#3839)
TarLaboratories Jan 9, 2026
f66abea
Correction and update of the new uk_ua (#4452)
MetenBouldry Jan 9, 2026
a91ad87
Use Generic Builder pattern for MachineBuilder (#4422)
jurrejelle Jan 9, 2026
0830c46
Fix crash when rejoining world in latest (#4453)
jurrejelle Jan 9, 2026
5564a85
Stop placeholder execution when an exception is encountered (#4455)
TarLaboratories Jan 10, 2026
59d17a0
Fix tank valve info (#4454)
zetrock1 Jan 10, 2026
3d1c341
Spray cans with AE2 IColorableBlockEntity support (#4264)
zetrock1 Jan 10, 2026
ba3bec0
add a mixin to make test method names be displayed in snake_case (#4463)
screret Jan 13, 2026
e399fd7
Fix voltage display (#4462)
illuciaz23 Jan 13, 2026
24574c9
Rework machine copy/paste card to support copying pipes, covers, cove…
gustovafing Jan 14, 2026
a2a7a6f
Fixed Multi Smelter texture again. (#4469)
Conity723 Jan 14, 2026
6c6c2fd
Add "type: tests" to the set of required labels that pass the check (…
screret Jan 14, 2026
7ac9e80
Distribute display voltage logic to machine implementations (#4459)
toapuro Jan 14, 2026
4d3bb04
Terminal tooltip change to ensure consistent terminology (#4458)
HazeVista Jan 14, 2026
27f5082
Add Hotkey for StepAssist (#4291)
zetrock1 Jan 14, 2026
781b6e7
Add HV, IV screwdriver and chainsaw (#4310)
zetrock1 Jan 15, 2026
dc67cd7
DFS stack-based recipe lookup implementation (#3986)
jurrejelle Jan 15, 2026
58457f2
Jade battery provider (#4317)
zetrock1 Jan 15, 2026
ce64595
Add CC: Tweaked peripheral for ghost programmed circuit (#4468)
blockninja124 Jan 15, 2026
fcbe8d7
Revert "Add CC: Tweaked peripheral for ghost programmed circuit" (#4478)
Ghostipedia Jan 15, 2026
3dca9ef
Only allow http and https (#4457)
TarLaboratories Jan 15, 2026
3484551
Clean up adjacency condition serialization (#4260)
screret Jan 20, 2026
195bed9
Add check to not cache invalid recipes (#4486)
jurrejelle Jan 21, 2026
02bfeb4
Remove BlockEntity Check in MinerLogic (#4488)
lilpaladin1 Jan 24, 2026
ebf4c07
merge 1.20.1 into 1.20.1-v8
gustovafing Jan 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/manage-pr-labels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
with:
mode: minimum
count: 1
labels: 'type: feature, type: bugfix, type: refactor, type: translation, ignore changelog'
labels: 'type: feature, type: bugfix, type: refactor, type: translation, type: tests, ignore changelog'
exit_type: failure

- name: Check for Required Release Label # require exactly one of these labels
Expand Down
52 changes: 52 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,57 @@
# ChangeLog

## Version [v7.4.1](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.4.0-1.20.1...v7.4.1-1.20.1)
### Added

- Improvements to Sodalite and Lazurite by @htmlcsjs in [#4297](https://github.com/GregTechCEu/GregTech-Modern/pull/4297)
- Allow accessing block nbt from placeholders by @TarLaboratories in [#4161](https://github.com/GregTechCEu/GregTech-Modern/pull/4161)
- Fix blackstone and tuff ores not dropping dusts by @JuiceyBeans in [#4376](https://github.com/GregTechCEu/GregTech-Modern/pull/4376)
- Make netherite tools and items fire resistant by @JuiceyBeans in [#4378](https://github.com/GregTechCEu/GregTech-Modern/pull/4378)
- Jade support for Long Distance Pipeline Endpoints by @JuiceyBeans in [#4420](https://github.com/GregTechCEu/GregTech-Modern/pull/4420)

### Fixed

- Fix vanilla fuel not working in boilers by @jurrejelle in [#4249](https://github.com/GregTechCEu/GregTech-Modern/pull/4249)
- Fix manual mode for item/fluid filter covers and conveyors/pumps by @programmer3481 in [#4245](https://github.com/GregTechCEu/GregTech-Modern/pull/4245)
- no more z fighting by @Spicierspace153 in [#4240](https://github.com/GregTechCEu/GregTech-Modern/pull/4240)
- Fix #4154 Charcoal Pile Igniter by @zetrock1 in [#4246](https://github.com/GregTechCEu/GregTech-Modern/pull/4246)
- Add tooltips for link covers by @zetrock1 in [#4265](https://github.com/GregTechCEu/GregTech-Modern/pull/4265)
- Large Boiler throttle modifies burn time of current fuel by @DilithiumThoride in [#4258](https://github.com/GregTechCEu/GregTech-Modern/pull/4258)
- Fix scythe not breaking items in an AOE by @Ujhik in [#4207](https://github.com/GregTechCEu/GregTech-Modern/pull/4207)
- Fix GT Capes not rendering in multiplayer by @DilithiumThoride in [#4271](https://github.com/GregTechCEu/GregTech-Modern/pull/4271)
- Fix dupes of Carbon dust and Coal dust by @zetrock1 in [#4301](https://github.com/GregTechCEu/GregTech-Modern/pull/4301)
- rework the check for decomposition amounts by @jonasGajdosikas in [#4298](https://github.com/GregTechCEu/GregTech-Modern/pull/4298)
- Fix ghost circuit in item detector by @zetrock1 in [#4293](https://github.com/GregTechCEu/GregTech-Modern/pull/4293)
- Fixes shiny material set double plates. by @Flare32 in [#4213](https://github.com/GregTechCEu/GregTech-Modern/pull/4213)
- Add directional setting UI and fix Machine UI TitleBar by @remakefactory in [#4238](https://github.com/GregTechCEu/GregTech-Modern/pull/4238)
- KubeJS Duration Check by @YoungOnionMC in [#4327](https://github.com/GregTechCEu/GregTech-Modern/pull/4327)
- Fixes some cases where handleRecipe() succeeds when it should fail by @DilithiumThoride in [#4300](https://github.com/GregTechCEu/GregTech-Modern/pull/4300)
- Allow tags in shaped recipes to get recycle info by @jurrejelle in [#4292](https://github.com/GregTechCEu/GregTech-Modern/pull/4292)
- Prevent clientside state mutations in QuarkTechSuite helmet by @Mqrius in [#4322](https://github.com/GregTechCEu/GregTech-Modern/pull/4322)
- (Docs) Fix GTValues.VA being used as a function in material property modification, add reference to coil temps in Material Properties by @carbonatek in [#4338](https://github.com/GregTechCEu/GregTech-Modern/pull/4338)
- Update spotless to 8.1.0 by @Reabstraction in [#4323](https://github.com/GregTechCEu/GregTech-Modern/pull/4323)
- PumpBiomeModifier - change priority of tags by @zetrock1 in [#4369](https://github.com/GregTechCEu/GregTech-Modern/pull/4369)
- Make fuel jetpacks work on servers by @Mqrius in [#4341](https://github.com/GregTechCEu/GregTech-Modern/pull/4341)
- Fix facade cover json by @jurrejelle in [#4418](https://github.com/GregTechCEu/GregTech-Modern/pull/4418)
- Correct Data Stick interaction handling by @remakefactory in [#4409](https://github.com/GregTechCEu/GregTech-Modern/pull/4409)
- Fixes to overlay textures on some machines. by @Conity723 in [#4403](https://github.com/GregTechCEu/GregTech-Modern/pull/4403)
- Fix {fromAscii} placeholder by @TarLaboratories in [#4392](https://github.com/GregTechCEu/GregTech-Modern/pull/4392)
- Fix rotor holder Z-fighting by @zetrock1 in [#4335](https://github.com/GregTechCEu/GregTech-Modern/pull/4335)
- Refactor naquadah reactor overlays to a workableMultiblockMachineCasing compatible format by @jonasGajdosikas in [#4353](https://github.com/GregTechCEu/GregTech-Modern/pull/4353)
- Fix ranged output items voiding if there wasn't enough output space by @DilithiumThoride in [#4290](https://github.com/GregTechCEu/GregTech-Modern/pull/4290)
- Add recipe for Copper Ingot disassembling by @esmenard in [#4399](https://github.com/GregTechCEu/GregTech-Modern/pull/4399)
- Fix multiblock controller rotation overlay logic by @jkieberking in [#4199](https://github.com/GregTechCEu/GregTech-Modern/pull/4199)
- Add missing rock types to initializeCobbleReplacements() by @Pyritie in [#4329](https://github.com/GregTechCEu/GregTech-Modern/pull/4329)

### Changed

- Large Boiler throttle modifies burn time of current fuel by @DilithiumThoride in [#4258](https://github.com/GregTechCEu/GregTech-Modern/pull/4258)
- ja_jp fix by @code-onigiri in [#4319](https://github.com/GregTechCEu/GregTech-Modern/pull/4319)
- Change out LDLib client side check to GTCEu one by @jurrejelle in [#4365](https://github.com/GregTechCEu/GregTech-Modern/pull/4365)
- Update uk_ua.json by @StarmanMine142 in [#4411](https://github.com/GregTechCEu/GregTech-Modern/pull/4411)
- Port existing keybinds to new system by @TechLord22 in [#4069](https://github.com/GregTechCEu/GregTech-Modern/pull/4069)


## Version [v7.4.0](https://github.com/GregTechCEu/GregTech-Modern/compare/v7.3.0-1.20.1...v7.4.0-1.20.1)
### Added

Expand Down
25 changes: 25 additions & 0 deletions docs/content/Modpacks/Changes/v7.5.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title: "Version 7.5.0"
---


# Updating from `7.4.1` to `7.5.0`

## MachineBuilder Generics
We have added a second Generic argument to our (Multiblock)MachineBuilder. This effectively means that anywhere where you used to store a partially finished `MachineBuilder<?>`, you now need to store a `MachineBuilder<?, ?>`. The same holds for `MultiblockMachineBuilder<?,?>`.

## RecipeCondition Generics
We have added a Generic argument to `RecipeCondition` describing the condition.
This means that your custom recipe conditions now need to extend `RecipeCondition<MyCondition>` (whereas before they just extended `RecipeCondition`).
For example, if you have a custom recipe condition class like so: `public class ExampleCondition extends RecipeCondition`, it should now be `public class ExampleCondition extends RecipeCondition<ExampleCondition>`.
You also need to adjust the generics of `getType()` and `createTemplate()` to match this change, like so:
```patch
- public RecipeConditionType<?> getType() {
+ public RecipeConditionType<ExampleCondition> getType() {

- public RecipeCondition createTemplate() {
+ public ExampleCondition createTemplate() {
```

## Machine & Cover Copy/Paste System
A new system for copying machines using the Machine Memory Card has been added, see [this page](../Other-Topics/Cover-Machine-Copy-Paste-Support.md) if you want to add extra copy/paste behaviour to your own machines and covers.
78 changes: 44 additions & 34 deletions docs/content/Modpacks/Examples/Custom-Recipe-Condition.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,50 @@ They are registered using
@Mod(ExampleMod.MOD_ID)
public class ExampleMod {

public ExampleMod(FMLJavaModLoadingContext context) {
var bus = context.getModEventBus();
bus.addGenericListener(RecipeConditionType.class, this::registerConditions);
}

// in 1.20.1
public static RecipeConditionType<ExampleCondition> EXAMPLE_CONDITION;

public ExampleMod() {
IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus();
modBus.addGenericListener(RecipeConditionType.class, this::registerConditions);
}

public void registerConditions(GTCEuAPI.RegisterEvent<String, RecipeConditionType<?>> event) {
EXAMPLE_CONDITION = GTRegistries.RECIPE_CONDITIONS.register("example_condition", // (1)
new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC));
}
// end 1.20.1

// in 1.21.1
public static final RecipeConditionType<ExampleCondition> EXAMPLE_CONDITION = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS,
ResourceLocation.fromNamespaceAndPath(ExampleMod.MOD_ID, "example_condition"), // (2)
new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC));

public ExampleMod(IEventBus modBus, FMLModContainer container) {
modBus.addListener(CommonInit::onRegister);
bus.addListener(RecipeConditionType.class, this::registerConditions);
}

public void registerConditions(GTCEuAPI.RegisterEvent<String, RecipeConditionType<?>> event) {
EXAMPLE_CONDITION = GTRegistries.RECIPE_CONDITIONS.register("example_condition",
new RecipeConditionType<>(
ExampleCondition::new,
ExampleCondition.CODEC
)
);
new RecipeConditionType<>(ExampleCondition::new, ExampleCondition.CODEC));
}
// end 1.21.1
}
```

1. The 1.20.1 version doesn't require a namespace, so make sure you don't use the same ID as someone else!
2. You may use a helper method akin to `GTCEu.id` for creating the ResourceLocation, but you **must** use your own namespace for it.

We will set up a condition that requires that the power buffer of the machine is above a certain Y level.
```java
public class ExampleCondition extends RecipeCondition {
public class ExampleCondition extends RecipeCondition<ExampleCondition> {

public int height;

public static final Codec<ExampleCondition> CODEC = RecordCodecBuilder
.create(instance -> RecipeCondition.isReverse(instance)
.and(Codec.INT.fieldOf("height").forGetter(val -> val.height))
.apply(instance, ExampleCondition::new));
public static final Codec<ExampleCondition> CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance)
.and(Codec.INT.fieldOf("height").forGetter(val -> val.height)
).apply(instance, ExampleCondition::new));

public int height;

public ExampleCondition(boolean isReverse, int height) {
this.isReverse = isReverse;
Expand All @@ -52,14 +67,14 @@ public class ExampleCondition extends RecipeCondition {

public ExampleCondition(int height) {
this(false, height);
}
}

public ExampleCondition() {
this(false, 0);
}

@Override
public RecipeConditionType<?> getType() {
public RecipeConditionType<ExampleCondition> getType() {
return ExampleMod.EXAMPLE_CONDITION;
}

Expand All @@ -74,7 +89,7 @@ public class ExampleCondition extends RecipeCondition {
}

@Override
public RecipeCondition createTemplate() {
public ExampleCondition createTemplate() {
return new ExampleCondition(0);
}
}
Expand All @@ -85,7 +100,7 @@ Lets step through this example. This will not be in order as it is in the file,
Starting with:
```java
@Override
public RecipeConditionType<?> getType() {
public RecipeConditionType<ExampleCondition> getType() {
return ExampleMod.EXAMPLE_CONDITION;
}

Expand All @@ -105,16 +120,12 @@ This part is quite simple, and just returns the type and tooltip for the conditi
public ExampleCondition(int height) {
this(false, height);
}

public ExampleCondition() {
this(false, 0);
}
```
These are the constructors. We need the `isReverse`, as it is part of the overarching `RecipeCondition` type. `isReverse` means that if the condition is met, your recipe won't be run. Furthermore, a no-arg constructor is required for (de)serialization.
These are the constructors. We need the `isReverse`, as it is part of the overarching `RecipeCondition` type. `isReverse` means that if the condition is met, your recipe won't be run. Furthermore, a constructor with all arguments is required for (de)serialization.

```java
@Override
public RecipeCondition createTemplate() {
public ExampleCondition createTemplate() {
return new ExampleCondition(0);
}
```
Expand All @@ -131,21 +142,20 @@ This creates the basic "template" that might be used for serialization. This sho
This is the actual condition.

```java
public static final Codec<ExampleCondition> CODEC = RecordCodecBuilder.create(instance -> RecipeCondition.isReverse(instance).and(
Codec.INT.fieldOf("height").forGetter(val -> val.height)
).apply(instance, ExampleCondition::new));

public int height;

public static final Codec<ExampleCondition> CODEC = RecordCodecBuilder
.create(instance -> RecipeCondition.isReverse(instance)
.and(Codec.INT.fieldOf("height").forGetter(val -> val.height))
.apply(instance, ExampleCondition::new));
```

The CODEC is how java knows how to serialize/deserialize your condition. This is needed for syncing between client/server, and storing it to json to load when the world loads.
It consists of a few parts:

- `RecordCodecBuilder.create(instance -> ` means we will start a RecordCodecBuilder, or a builder that only consists of simple types.
- `RecipeCondition.isReverse(instance)` is a helper codec that serializes the isReverse boolean of your codec.
- `.and(` means this is the next field in the record.
- `Codec.INT.fieldOf("height").forGetter(val -> val.height)` means we want to serialize an INT, we want to call it "height" in the json, and to get the value you call `.height`.
- `.and(` allows adding additional fields to the codec.
- `Codec.INT.fieldOf("height").forGetter(val -> val.height)` means we want to serialize an integer, we want to call it "height" in the JSON, and to get the value to serialize you use `ExampleCondition#height`.
- `.apply(instance, ExampleCondition::new)` means when deserializing back to an object, you apply these steps to get the values (in this case `bool isReverse, int height`) and call the constructor with those arguments.
In this case, this would call our `new ExampleCondition(isReverse, height)` constructor we have defined earlier.

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
title: Adding Copy & Paste support to covers and machines
---

The Machine Memory Card item allows for machine settings and covers to be copied to other machines.

To add extra fields to copy, override the following methods on a machine or cover:
```java
/// Copies the current machine/cover config to a CompoundTag.
public CompoundTag copyConfig(CompoundTag tag);
/// Loads a machine/cover config from a CompoundTag.
public void pasteConfig(ServerPlayer player, CompoundTag tag);
/// Returns a list of items (covers, filters, etc) which are needed to copy and paste this machine.
public List<ItemStack> getItemsRequiredToPaste();
```
Loading