Skip to content

Commit fd0243a

Browse files
Fix Ranged Fluid Ingredients deserializing incorrectly in SMP (#4150)
Co-authored-by: Jurre Groenendijk <[email protected]>
1 parent 24f2079 commit fd0243a

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,50 @@
11
package com.gregtechceu.gtceu.api.recipe.content;
22

33
import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient;
4+
import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient;
45

56
import net.minecraft.network.FriendlyByteBuf;
67
import net.minecraftforge.fluids.FluidStack;
78

89
import com.google.gson.JsonElement;
910
import com.mojang.serialization.Codec;
1011

12+
import static com.gregtechceu.gtceu.api.registry.GTRegistries.FLUID_SERIALIZERS;
13+
1114
public class SerializerFluidIngredient implements IContentSerializer<FluidIngredient> {
1215

1316
public static SerializerFluidIngredient INSTANCE = new SerializerFluidIngredient();
1417

18+
static {
19+
FLUID_SERIALIZERS.unfreeze();
20+
FLUID_SERIALIZERS.register("FluidIngredient", FluidIngredient::fromNetwork);
21+
FLUID_SERIALIZERS.register("IntProviderFluidIngredient", IntProviderFluidIngredient::fromNetwork);
22+
};
23+
1524
private SerializerFluidIngredient() {}
1625

1726
@Override
1827
public void toNetwork(FriendlyByteBuf buf, FluidIngredient content) {
28+
String name = content.getClass().getSimpleName();
29+
if (!FLUID_SERIALIZERS.containKey(name)) {
30+
throw new IllegalArgumentException(
31+
"SerializerFluidIngredient tried to serialize a FluidIngredient's subclass %s, which is not in the FluidSerializers registry!"
32+
.formatted(name));
33+
}
34+
buf.writeUtf(name);
1935
content.toNetwork(buf);
2036
}
2137

2238
@Override
2339
public FluidIngredient fromNetwork(FriendlyByteBuf buf) {
24-
return FluidIngredient.fromNetwork(buf);
40+
String name = buf.readUtf();
41+
var fromNetworkFunction = FLUID_SERIALIZERS.get(name);
42+
if (fromNetworkFunction == null) {
43+
throw new IllegalArgumentException(
44+
"SerializerFluidIngredient's fromNetwork received a package containing an invalid FluidSerializer name." +
45+
" Name: %s ".formatted(name));
46+
}
47+
return fromNetworkFunction.apply(buf);
2548
}
2649

2750
@Override

src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredient.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import net.minecraft.nbt.CompoundTag;
88
import net.minecraft.nbt.NbtOps;
9+
import net.minecraft.network.FriendlyByteBuf;
910
import net.minecraft.util.ExtraCodecs;
1011
import net.minecraft.util.GsonHelper;
1112
import net.minecraft.util.RandomSource;
@@ -226,4 +227,16 @@ public CompoundTag toNBT() {
226227
public static IntProviderFluidIngredient fromNBT(CompoundTag nbt) {
227228
return IntProviderFluidIngredient.fromJson(NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, nbt));
228229
}
230+
231+
public void toNetwork(FriendlyByteBuf buffer) {
232+
inner.toNetwork(buffer);
233+
buffer.writeVarIntArray(new int[] { countProvider.getMinValue(), countProvider.getMaxValue() });
234+
}
235+
236+
public static IntProviderFluidIngredient fromNetwork(FriendlyByteBuf buffer) {
237+
FluidIngredient inner = FluidIngredient.fromNetwork(buffer);
238+
int[] range = buffer.readVarIntArray(2);
239+
IntProvider provider = UniformInt.of(range[0], range[1]);
240+
return new IntProviderFluidIngredient(inner, provider);
241+
}
229242
}

src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
import com.gregtechceu.gtceu.api.recipe.category.GTRecipeCategory;
1414
import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic;
1515
import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType;
16+
import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient;
1617
import com.gregtechceu.gtceu.api.sound.SoundEntry;
1718

1819
import net.minecraft.client.Minecraft;
1920
import net.minecraft.core.Registry;
2021
import net.minecraft.core.RegistryAccess;
2122
import net.minecraft.core.registries.BuiltInRegistries;
2223
import net.minecraft.core.registries.Registries;
24+
import net.minecraft.network.FriendlyByteBuf;
2325
import net.minecraft.resources.ResourceKey;
2426
import net.minecraft.resources.ResourceLocation;
2527
import net.minecraft.world.item.crafting.RecipeSerializer;
@@ -36,6 +38,8 @@
3638
import com.mojang.serialization.Codec;
3739
import org.jetbrains.annotations.ApiStatus;
3840

41+
import java.util.function.Function;
42+
3943
public final class GTRegistries {
4044

4145
// GT Registry
@@ -67,6 +71,8 @@ public final class GTRegistries {
6771
.create(Registries.PLACEMENT_MODIFIER_TYPE, GTCEu.MOD_ID);
6872
public static final DeferredRegister<Codec<? extends IGlobalLootModifier>> GLOBAL_LOOT_MODIFIES = DeferredRegister
6973
.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, GTCEu.MOD_ID);
74+
public static final GTRegistry<String, Function<FriendlyByteBuf, FluidIngredient>> FLUID_SERIALIZERS = new GTRegistry.String<>(
75+
GTCEu.id("fluid_serializers"));
7076

7177
public static <V, T extends V> T register(Registry<V> registry, ResourceLocation name, T value) {
7278
ResourceKey<?> registryKey = registry.key();

0 commit comments

Comments
 (0)