diff --git a/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java index 4243716987..ed91043bc9 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/CodecHelper.java @@ -4,10 +4,15 @@ import com.mojang.serialization.*; import net.minecraft.nbt.*; +import java.util.*; import java.util.function.*; public class CodecHelper { + public static Codec> singleOrList(Codec codec) { + return Codec.withAlternative(codec.listOf(), codec, List::of); + } + public static void fromNbt(Codec codec, NbtElement nbt, Consumer ifValid) { if (nbt != null) codec.decode(NbtOps.INSTANCE, nbt).result().map(Pair::getFirst).ifPresent(ifValid); diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java index cba7625464..cde3d3d394 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/FermentRandomlyLootFunction.java @@ -1,17 +1,19 @@ package de.dafuqs.spectrum.loot.functions; -import com.google.gson.*; +import com.mojang.datafixers.util.*; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.helpers.TimeHelper; import de.dafuqs.spectrum.loot.*; import de.dafuqs.spectrum.mixin.accessors.*; import de.dafuqs.spectrum.recipe.titration_barrel.*; +import io.wispforest.owo.serialization.*; import net.minecraft.item.*; import net.minecraft.loot.condition.*; import net.minecraft.loot.context.*; import net.minecraft.loot.function.*; import net.minecraft.loot.provider.number.*; -import net.minecraft.recipe.*; import net.minecraft.util.*; import net.minecraft.util.math.*; import net.minecraft.world.biome.*; @@ -21,52 +23,61 @@ public class FermentRandomlyLootFunction extends ConditionalLootFunction { - final @Nullable Identifier fermentationRecipeIdentifier; - final @Nullable FermentationData fermentationData; - final LootNumberProvider daysFermented; - final LootNumberProvider thickness; + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> addConditionsField(i).and(i.group( + Codec.either(Identifier.CODEC, CodecUtils.toCodec(FermentationData.ENDEC)).fieldOf("fermentation").forGetter(c -> c.fermentation), + LootNumberProviderTypes.CODEC.fieldOf("days_fermented").forGetter(c -> c.daysFermented), + LootNumberProviderTypes.CODEC.fieldOf("days_fermented").forGetter(c -> c.thickness) + )).apply(i, FermentRandomlyLootFunction::new)); - public FermentRandomlyLootFunction(List conditions, @NotNull Identifier fermentationRecipeIdentifier, LootNumberProvider daysFermented, LootNumberProvider thickness) { + private final Either fermentation; + private final LootNumberProvider daysFermented; + private final LootNumberProvider thickness; + + public FermentRandomlyLootFunction(List conditions, Either fermentation, LootNumberProvider daysFermented, LootNumberProvider thickness) { super(conditions); - this.fermentationRecipeIdentifier = fermentationRecipeIdentifier; - this.fermentationData = null; + this.fermentation = fermentation; this.daysFermented = daysFermented; this.thickness = thickness; } + public FermentRandomlyLootFunction(List conditions, @NotNull Identifier fermentationRecipeIdentifier, LootNumberProvider daysFermented, LootNumberProvider thickness) { + this(conditions, Either.left(fermentationRecipeIdentifier), daysFermented, thickness); + } + public FermentRandomlyLootFunction(List conditions, @NotNull FermentationData fermentationData, LootNumberProvider daysFermented, LootNumberProvider thickness) { - super(conditions); - this.fermentationRecipeIdentifier = null; - this.fermentationData = fermentationData; - this.daysFermented = daysFermented; - this.thickness = thickness; + this(conditions, Either.right(fermentationData), daysFermented, thickness); } @Override - public LootFunctionType getType() { + public LootFunctionType getType() { return SpectrumLootFunctionTypes.FERMENT_RANDOMLY; } @Override public ItemStack process(ItemStack stack, LootContext context) { - FermentationData fermentationData = null; - if (this.fermentationRecipeIdentifier != null) { - Optional> recipe = SpectrumCommon.minecraftServer.getRecipeManager().get(this.fermentationRecipeIdentifier); - if (recipe.isPresent() && recipe.get().value() instanceof TitrationBarrelRecipe titrationBarrelRecipe) { - fermentationData = titrationBarrelRecipe.getFermentationData(); + FermentationData fermentationData = this.fermentation.map( + id -> { + var recipe = context.getWorld().getRecipeManager().get(id); + if (recipe.isPresent() && recipe.get().value() instanceof TitrationBarrelRecipe titrationBarrelRecipe) { + return titrationBarrelRecipe.getFermentationData(); + } else { + SpectrumCommon.logError("A 'spectrum:ferment_randomly' loot function has set an invalid 'fermentation_recipe_id': " + id + " It has to match an existing Titration Barrel recipe."); + return null; + } + }, + data -> this.fermentation.right().orElse(null) + ); + if (fermentationData != null) { + var origin = context.get(LootContextParameters.ORIGIN); + if (origin != null) { + BlockPos pos = BlockPos.ofFloored(origin); + Biome biome = context.getWorld().getBiome(pos).value(); + float downfall = ((BiomeAccessor)(Object) biome).getWeather().downfall(); + return TitrationBarrelRecipe.getFermentedStack(fermentationData, this.thickness.nextInt(context), TimeHelper.secondsFromMinecraftDays(this.daysFermented.nextInt(context)), downfall, stack); } else { - SpectrumCommon.logError("A 'spectrum:ferment_randomly' loot function has set an invalid 'fermentation_recipe_id': " + this.fermentationRecipeIdentifier + " It has to match an existing Titration Barrel recipe."); + SpectrumCommon.logError("A 'spectrum:ferment_randomly' loot function does not have access to 'origin'."); } } - if (fermentationData == null) { - fermentationData = this.fermentationData; - } - if (fermentationData != null) { - BlockPos pos = BlockPos.ofFloored(context.get(LootContextParameters.ORIGIN)); - Biome biome = context.getWorld().getBiome(pos).value(); - float downfall = ((BiomeAccessor)(Object) biome).getWeather().downfall(); - return TitrationBarrelRecipe.getFermentedStack(fermentationData, this.thickness.nextInt(context), TimeHelper.secondsFromMinecraftDays(this.daysFermented.nextInt(context)), downfall, stack); - } return stack; } @@ -78,40 +89,4 @@ public static ConditionalLootFunction.Builder builder(Identifier fermentation return builder((conditions) -> new FermentRandomlyLootFunction(conditions, fermentationRecipeIdentifier, daysFermented, thickness)); } - public static class Serializer extends ConditionalLootFunction.Serializer { - - private static final String FERMENTATION_RECIPE_ID_STRING = "fermentation_recipe_id"; - private static final String FERMENTATION_DATA_STRING = "fermentation_data"; - private static final String DAYS_FERMENTED_STRING = "days_fermented"; - private static final String THICKNESS_STRING = "thickness"; - - @Override - public void toJson(JsonObject jsonObject, FermentRandomlyLootFunction lootFunction, JsonSerializationContext jsonSerializationContext) { - super.toJson(jsonObject, lootFunction, jsonSerializationContext); - - if (lootFunction.fermentationRecipeIdentifier != null) { - jsonObject.addProperty(FERMENTATION_RECIPE_ID_STRING, lootFunction.fermentationRecipeIdentifier.toString()); - } else { - jsonObject.add(FERMENTATION_DATA_STRING, lootFunction.fermentationData.toJson()); - } - jsonObject.add(DAYS_FERMENTED_STRING, jsonSerializationContext.serialize(lootFunction.daysFermented)); - jsonObject.add(THICKNESS_STRING, jsonSerializationContext.serialize(lootFunction.thickness)); - } - - @Override - public FermentRandomlyLootFunction fromJson(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext, LootCondition[] lootConditions) { - LootNumberProvider daysFermented = JsonHelper.deserialize(jsonObject, DAYS_FERMENTED_STRING, jsonDeserializationContext, LootNumberProvider.class); - LootNumberProvider thickness = JsonHelper.deserialize(jsonObject, THICKNESS_STRING, jsonDeserializationContext, LootNumberProvider.class); - - if (jsonObject.has(FERMENTATION_RECIPE_ID_STRING)) { - Identifier fermentationRecipeIdentifier = Identifier.tryParse(jsonObject.get(FERMENTATION_RECIPE_ID_STRING).getAsString()); - return new FermentRandomlyLootFunction(lootConditions, fermentationRecipeIdentifier, daysFermented, thickness); - } else if (jsonObject.has(FERMENTATION_DATA_STRING)) { - FermentationData fermentationData = FermentationData.fromJson(jsonObject.get(FERMENTATION_DATA_STRING).getAsJsonObject()); - return new FermentRandomlyLootFunction(lootConditions, fermentationData, daysFermented, thickness); - } - - throw new JsonParseException("A 'ferment_randomly' loot function always needs to have either 'fermentation_data' or 'fermentation_recipe_id' set."); - } - } } diff --git a/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java b/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java index 129394d032..78af0c6c58 100644 --- a/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java +++ b/src/main/java/de/dafuqs/spectrum/loot/functions/FillPotionFillableLootFunction.java @@ -1,9 +1,11 @@ package de.dafuqs.spectrum.loot.functions; -import com.google.gson.*; +import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.api.energy.*; import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.loot.*; import net.minecraft.entity.effect.*; import net.minecraft.item.*; @@ -13,72 +15,33 @@ import net.minecraft.loot.provider.number.*; import net.minecraft.registry.*; import net.minecraft.registry.entry.*; -import net.minecraft.util.*; import java.util.*; public class FillPotionFillableLootFunction extends ConditionalLootFunction { - record InkPoweredPotionTemplate(boolean ambient, boolean showParticles, LootNumberProvider duration, - List> statusEffects, int color, LootNumberProvider amplifier, - List inkColors, LootNumberProvider inkCost, boolean unidentifiable, boolean incurable) { - - public static InkPoweredPotionTemplate fromJson(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) { - boolean ambient = JsonHelper.getBoolean(jsonObject, "ambient", false); - boolean showParticles = JsonHelper.getBoolean(jsonObject, "show_particles", false); - boolean unidentifiable = JsonHelper.getBoolean(jsonObject, "unidentifiable", false); - boolean incurable = JsonHelper.getBoolean(jsonObject, "incurable", false); - LootNumberProvider duration = JsonHelper.deserialize(jsonObject, "duration", jsonDeserializationContext, LootNumberProvider.class); - Set> statusEffects = new HashSet<>(); - JsonElement statusEffectElement = jsonObject.get("status_effect"); - if (statusEffectElement instanceof JsonArray jsonArray) { - for (JsonElement element : jsonArray) { - statusEffects.add(Registries.STATUS_EFFECT.getEntry(Identifier.tryParse(element.getAsString()))); - } - } else { - statusEffects.add(Registries.STATUS_EFFECT.getEntry(Identifier.tryParse(statusEffectElement.getAsString()))); - } - - int color = JsonHelper.getInt(jsonObject, "color", -1); - LootNumberProvider amplifier = JsonHelper.deserialize(jsonObject, "amplifier", jsonDeserializationContext, LootNumberProvider.class); - LootNumberProvider inkCost = JsonHelper.deserialize(jsonObject, "ink_cost", jsonDeserializationContext, LootNumberProvider.class); - - Set inkColors = new HashSet<>(); - JsonElement colorElement = jsonObject.get("ink_color"); - if (colorElement instanceof JsonArray jsonArray) { - for (JsonElement element : jsonArray) { - String s = element.getAsString(); - inkColors.add(InkColor.ofIdString(s).orElseThrow()); - } - } else { - String s = colorElement.getAsString(); - inkColors.add(InkColor.ofIdString(s).orElseThrow()); - } - - return new InkPoweredPotionTemplate(ambient, showParticles, duration, statusEffects.stream().toList(), color, amplifier, inkColors.stream().toList(), inkCost, unidentifiable, incurable); - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> addConditionsField(i).and( + InkPoweredPotionTemplate.CODEC.forGetter(c -> c.template) + ).apply(i, FillPotionFillableLootFunction::new)); + + public record InkPoweredPotionTemplate( + boolean ambient, boolean showParticles, LootNumberProvider duration, + List> statusEffects, int color, LootNumberProvider amplifier, + List inkColors, LootNumberProvider inkCost, boolean unidentifiable, boolean incurable + ) { - public void toJson(JsonObject jsonObject, JsonSerializationContext jsonSerializationContext) { - jsonObject.addProperty("ambient", this.ambient); - jsonObject.addProperty("show_particles", this.showParticles); - jsonObject.add("duration", jsonSerializationContext.serialize(this.duration)); - JsonArray statusEffectArray = new JsonArray(); - for (RegistryEntry statusEffect : this.statusEffects) { - statusEffectArray.add(Registries.STATUS_EFFECT.getId(statusEffect.value()).toString()); - } - jsonObject.add("status_effect", statusEffectArray); - jsonObject.addProperty("color", this.color); - jsonObject.addProperty("unidentifiable", this.unidentifiable); - jsonObject.addProperty("incurable", this.incurable); - jsonObject.add("amplifier", jsonSerializationContext.serialize(this.amplifier)); - jsonObject.add("ink_cost", jsonSerializationContext.serialize(this.inkCost)); - - JsonArray inkColorArray = new JsonArray(); - for (InkColor inkColor : this.inkColors) { - inkColorArray.add(inkColor.getID().toString()); - } - jsonObject.add("ink_color", inkColorArray); - } + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(i -> i.group( + Codec.BOOL.optionalFieldOf("ambient", false).forGetter(InkPoweredPotionTemplate::ambient), + Codec.BOOL.optionalFieldOf("show_particles", false).forGetter(InkPoweredPotionTemplate::showParticles), + LootNumberProviderTypes.CODEC.fieldOf("duration").forGetter(InkPoweredPotionTemplate::duration), + CodecHelper.singleOrList(Registries.STATUS_EFFECT.getEntryCodec()).fieldOf("status_effect").forGetter(InkPoweredPotionTemplate::statusEffects), + Codec.INT.optionalFieldOf("color", -1).forGetter(InkPoweredPotionTemplate::color), + LootNumberProviderTypes.CODEC.fieldOf("amplifier").forGetter(InkPoweredPotionTemplate::amplifier), + CodecHelper.singleOrList(InkColor.CODEC).fieldOf("ink_color").forGetter(InkPoweredPotionTemplate::inkColors), + LootNumberProviderTypes.CODEC.fieldOf("ink_cost").forGetter(InkPoweredPotionTemplate::inkCost), + Codec.BOOL.optionalFieldOf("unidentifiable", false).forGetter(InkPoweredPotionTemplate::unidentifiable), + Codec.BOOL.optionalFieldOf("incurable", false).forGetter(InkPoweredPotionTemplate::incurable) + ).apply(i, InkPoweredPotionTemplate::new)); public InkPoweredStatusEffectInstance get(LootContext context) { RegistryEntry statusEffect = this.statusEffects.get(context.getRandom().nextInt(this.statusEffects.size())); @@ -90,7 +53,7 @@ public InkPoweredStatusEffectInstance get(LootContext context) { } - final InkPoweredPotionTemplate template; + private final InkPoweredPotionTemplate template; FillPotionFillableLootFunction(List conditions, InkPoweredPotionTemplate template) { super(conditions); @@ -98,21 +61,20 @@ public InkPoweredStatusEffectInstance get(LootContext context) { } @Override - public LootFunctionType getType() { + public LootFunctionType getType() { return SpectrumLootFunctionTypes.FILL_POTION_FILLABLE; } @Override public ItemStack process(ItemStack stack, LootContext context) { - if (this.template == null) { + if (this.template == null) return stack; - } - if (!(stack.getItem() instanceof InkPoweredPotionFillable inkPoweredPotionFillable)) { + + if (!(stack.getItem() instanceof InkPoweredPotionFillable inkPoweredPotionFillable)) return stack; - } - if (inkPoweredPotionFillable.isFull(stack)) { + + if (inkPoweredPotionFillable.isFull(stack)) return stack; - } InkPoweredStatusEffectInstance effect = template.get(context); inkPoweredPotionFillable.addOrUpgradeEffects(stack, List.of(effect)); @@ -124,18 +86,4 @@ public static ConditionalLootFunction.Builder builder(InkPoweredPotionTemplat return builder((conditions) -> new FillPotionFillableLootFunction(conditions, template)); } - public static class Serializer extends ConditionalLootFunction.Serializer { - - @Override - public void toJson(JsonObject jsonObject, FillPotionFillableLootFunction lootFunction, JsonSerializationContext jsonSerializationContext) { - super.toJson(jsonObject, lootFunction, jsonSerializationContext); - lootFunction.template.toJson(jsonObject, jsonSerializationContext); - } - - @Override - public FillPotionFillableLootFunction fromJson(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext, LootCondition[] lootConditions) { - return new FillPotionFillableLootFunction(lootConditions, InkPoweredPotionTemplate.fromJson(jsonObject, jsonDeserializationContext)); - } - } - } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationData.java b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationData.java index 29bbb2e9eb..8b5e617184 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationData.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationData.java @@ -1,10 +1,7 @@ package de.dafuqs.spectrum.recipe.titration_barrel; -import com.google.gson.*; import io.wispforest.endec.*; import io.wispforest.endec.impl.*; -import net.minecraft.network.*; -import net.minecraft.util.*; import java.util.*; @@ -14,65 +11,11 @@ public record FermentationData( List statusEffectEntries ) { - private static final String FERMENTATION_SPEED_MOD_STRING = "fermentation_speed_mod"; - private static final String ANGELS_SHARE_STRING = "angels_share_percent_per_mc_day"; - private static final String EFFECTS_STRING = "effects"; - public static final StructEndec ENDEC = StructEndecBuilder.of( - Endec.FLOAT.fieldOf(FERMENTATION_SPEED_MOD_STRING, FermentationData::fermentationSpeedMod), - Endec.FLOAT.fieldOf(ANGELS_SHARE_STRING, FermentationData::angelsSharePercentPerMcDay), - FermentationStatusEffectEntry.FERMENTATION_ENTRY_ENDEC.listOf().fieldOf(EFFECTS_STRING, FermentationData::statusEffectEntries), + Endec.FLOAT.fieldOf("fermentation_speed_mod", FermentationData::fermentationSpeedMod), + Endec.FLOAT.fieldOf("angels_share_percent_per_mc_day", FermentationData::angelsSharePercentPerMcDay), + FermentationStatusEffectEntry.FERMENTATION_ENTRY_ENDEC.listOf().fieldOf("effects", FermentationData::statusEffectEntries), FermentationData::new ); - // TODO - Once the loot functions that use this, E.G. FermentRandomlyLootFunction - // TODO - then all of these, including the nested data structures, should fall away - public static FermentationData fromJson(JsonObject jsonObject) { - float fermentationSpeedMod = JsonHelper.getFloat(jsonObject, FERMENTATION_SPEED_MOD_STRING, 1.0F); - float angelsSharePerMcDay = JsonHelper.getFloat(jsonObject, ANGELS_SHARE_STRING, 0.01F); - List statusEffectEntries = new ArrayList<>(); - if (JsonHelper.hasArray(jsonObject, EFFECTS_STRING)) { - JsonArray effectsArray = JsonHelper.getArray(jsonObject, EFFECTS_STRING); - for (int i = 0; i < effectsArray.size(); i++) { - JsonObject object = effectsArray.get(i).getAsJsonObject(); - statusEffectEntries.add(FermentationStatusEffectEntry.fromJson(object)); - } - } - return new FermentationData(fermentationSpeedMod, angelsSharePerMcDay, statusEffectEntries); - } - - public void write(PacketByteBuf packetByteBuf) { - packetByteBuf.writeFloat(this.fermentationSpeedMod); - packetByteBuf.writeFloat(this.angelsSharePercentPerMcDay); - packetByteBuf.writeInt(this.statusEffectEntries.size()); - for (FermentationStatusEffectEntry fermentationStatusEffectEntry : this.statusEffectEntries) { - fermentationStatusEffectEntry.write(packetByteBuf); - } - } - - public static FermentationData read(PacketByteBuf packetByteBuf) { - float fermentationSpeedMod = packetByteBuf.readFloat(); - float angelsSharePerMcDay = packetByteBuf.readFloat(); - int statusEffectEntryCount = packetByteBuf.readInt(); - List statusEffectEntries = new ArrayList<>(statusEffectEntryCount); - for (int i = 0; i < statusEffectEntryCount; i++) { - statusEffectEntries.add(FermentationStatusEffectEntry.read(packetByteBuf)); - } - return new FermentationData(fermentationSpeedMod, angelsSharePerMcDay, statusEffectEntries); - } - - public JsonObject toJson() { - JsonObject json = new JsonObject(); - - json.addProperty(FERMENTATION_SPEED_MOD_STRING, this.fermentationSpeedMod); - json.addProperty(ANGELS_SHARE_STRING, this.angelsSharePercentPerMcDay); - JsonArray effects = new JsonArray(); - for (FermentationStatusEffectEntry entry : this.statusEffectEntries) { - effects.add(entry.toJson()); - } - json.add(EFFECTS_STRING, effects); - - return json; - } - } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationStatusEffectEntry.java b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationStatusEffectEntry.java index 5fadef1831..ccec61ed35 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationStatusEffectEntry.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/FermentationStatusEffectEntry.java @@ -1,21 +1,18 @@ package de.dafuqs.spectrum.recipe.titration_barrel; -import com.google.gson.*; -import de.dafuqs.spectrum.*; import io.wispforest.endec.*; import io.wispforest.endec.impl.*; import io.wispforest.owo.serialization.endec.*; import net.minecraft.entity.effect.*; -import net.minecraft.network.*; import net.minecraft.registry.*; -import net.minecraft.util.*; import java.util.*; public record FermentationStatusEffectEntry( StatusEffect statusEffect, int baseDuration, - List potencyEntries) { + List potencyEntries +) { public static final StructEndec FERMENTATION_ENTRY_ENDEC = StructEndecBuilder.of( MinecraftEndecs.ofRegistry(Registries.STATUS_EFFECT).fieldOf("status_effect", FermentationStatusEffectEntry::statusEffect), @@ -26,102 +23,13 @@ public record FermentationStatusEffectEntry( public record StatusEffectPotencyEntry(int minAlcPercent, int minThickness, int potency) { - private static final String MIN_ALC_STRING = "min_alc"; - private static final String MIN_THICKNESS_STRING = "min_thickness"; - private static final String MIN_POTENCY_STRING = "potency"; - public static final StructEndec POTENCY_ENDEC = StructEndecBuilder.of( - Endec.INT.fieldOf(MIN_ALC_STRING, StatusEffectPotencyEntry::minAlcPercent), - Endec.INT.fieldOf(MIN_THICKNESS_STRING, StatusEffectPotencyEntry::minThickness), - Endec.INT.fieldOf(MIN_POTENCY_STRING, StatusEffectPotencyEntry::potency), + Endec.INT.fieldOf("min_alc", StatusEffectPotencyEntry::minAlcPercent), + Endec.INT.fieldOf("min_thickness", StatusEffectPotencyEntry::minThickness), + Endec.INT.fieldOf("potency", StatusEffectPotencyEntry::potency), StatusEffectPotencyEntry::new ); - public static StatusEffectPotencyEntry fromJson(JsonObject jsonObject) { - int minAlcPercent = JsonHelper.getInt(jsonObject, MIN_ALC_STRING, 0); - int minThickness = JsonHelper.getInt(jsonObject, MIN_THICKNESS_STRING, 0); - int potency = JsonHelper.getInt(jsonObject, MIN_POTENCY_STRING, 0); - return new StatusEffectPotencyEntry(minAlcPercent, minThickness, potency); - } - - public JsonObject toJson() { - JsonObject json = new JsonObject(); - json.addProperty(MIN_ALC_STRING, this.minAlcPercent); - json.addProperty(MIN_THICKNESS_STRING, this.minThickness); - json.addProperty(MIN_POTENCY_STRING, this.potency); - return json; - } - - public void write(PacketByteBuf packetByteBuf) { - packetByteBuf.writeInt(this.minAlcPercent); - packetByteBuf.writeInt(this.minThickness); - packetByteBuf.writeInt(this.potency); - } - - public static StatusEffectPotencyEntry read(PacketByteBuf packetByteBuf) { - return new StatusEffectPotencyEntry(packetByteBuf.readInt(), packetByteBuf.readInt(), packetByteBuf.readInt()); - } - } - - private static final String EFFECT_ID_STRING = "id"; - private static final String BASE_DURATION_STRING = "base_duration"; - private static final String POTENCY_STRING = "potency"; - - public static FermentationStatusEffectEntry fromJson(JsonObject jsonObject) { - Identifier statusEffectIdentifier = Identifier.tryParse(JsonHelper.getString(jsonObject, EFFECT_ID_STRING)); - StatusEffect statusEffect = Registries.STATUS_EFFECT.get(statusEffectIdentifier); - if (statusEffect == null) { - SpectrumCommon.logError("Status effect " + statusEffectIdentifier + " does not exist in the status effect registry. Falling back to WEAKNESS"); - statusEffect = StatusEffects.WEAKNESS.value(); - } - int baseDuration = JsonHelper.getInt(jsonObject, BASE_DURATION_STRING, 1200); - - List potencyEntries = new ArrayList<>(); - if (JsonHelper.hasArray(jsonObject, POTENCY_STRING)) { - JsonArray potencyArray = JsonHelper.getArray(jsonObject, POTENCY_STRING); - for (int i = 0; i < potencyArray.size(); i++) { - JsonObject object = potencyArray.get(i).getAsJsonObject(); - potencyEntries.add(StatusEffectPotencyEntry.fromJson(object)); - } - } else { - potencyEntries.add(new StatusEffectPotencyEntry(0, 0, 0)); - } - return new FermentationStatusEffectEntry(statusEffect, baseDuration, potencyEntries); - } - - public JsonObject toJson() { - JsonObject json = new JsonObject(); - - json.addProperty(EFFECT_ID_STRING, Registries.STATUS_EFFECT.getId(this.statusEffect).toString()); - json.addProperty(BASE_DURATION_STRING, this.baseDuration); - JsonArray effects = new JsonArray(); - for (StatusEffectPotencyEntry entry : this.potencyEntries) { - effects.add(entry.toJson()); - } - json.add(POTENCY_STRING, effects); - - return json; - } - - public void write(PacketByteBuf packetByteBuf) { - packetByteBuf.writeString(Registries.STATUS_EFFECT.getId(this.statusEffect).toString()); - packetByteBuf.writeInt(baseDuration); - packetByteBuf.writeInt(this.potencyEntries.size()); - for (StatusEffectPotencyEntry potencyEntry : this.potencyEntries) { - potencyEntry.write(packetByteBuf); - } - } - - public static FermentationStatusEffectEntry read(PacketByteBuf packetByteBuf) { - Identifier statusEffectIdentifier = Identifier.tryParse(packetByteBuf.readString()); - StatusEffect statusEffect = Registries.STATUS_EFFECT.get(statusEffectIdentifier); - int baseDuration = packetByteBuf.readInt(); - int potencyEntryCount = packetByteBuf.readInt(); - List potencyEntries = new ArrayList<>(potencyEntryCount); - for (int i = 0; i < potencyEntryCount; i++) { - potencyEntries.add(StatusEffectPotencyEntry.read(packetByteBuf)); - } - return new FermentationStatusEffectEntry(statusEffect, baseDuration, potencyEntries); } } diff --git a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java index 59890c683a..36930c2ae3 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java @@ -213,7 +213,7 @@ protected float getThickness(int contentCount) { @Override public RecipeSerializer getSerializer() { - return SpectrumRecipeTypes.TITRATION_BARREL_RECIPE_SERIALIZER; + return SpectrumRecipeSerializers.TITRATION_BARREL; } // sadly we cannot use text.append() here, since the guidebook does not support it diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeSerializers.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeSerializers.java index a987943033..d7ae78eea5 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeSerializers.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeSerializers.java @@ -28,6 +28,8 @@ public class SpectrumRecipeSerializers { + private static final Deferrer DEFERRER = new Deferrer(); + // VANILLA public static final RecipeSerializer REPAIR_ANYTHING_SERIALIZER = register("repair_anything", new EmptyRecipeSerializer<>(RepairAnythingRecipe::new)); public static final RecipeSerializer CLEAR_INK_SERIALIZER = register("clear_ink", new EmptyRecipeSerializer<>(ClearInkRecipe::new)); @@ -86,7 +88,7 @@ public class SpectrumRecipeSerializers { public static final RecipeSerializer CINDERHEARTH_RECIPE_SERIALIZER = register("cinderhearth", new CinderhearthRecipeSerializer()); // Titration Barrel - public static final RecipeSerializer TITRATION_BARREL_RECIPE_SERIALIZER = register("titration_barrel", new TitrationBarrelRecipeSerializer()); + public static final RecipeSerializer TITRATION_BARREL = register("titration_barrel", new TitrationBarrelRecipeSerializer()); public static final RecipeSerializer TITRATION_BARREL_JADE_WINE = register("titration_barrel_jade_wine", new EmptyRecipeSerializer<>(JadeWineRecipe::new)); public static final RecipeSerializer TITRATION_BARREL_AQUA_REGIA = register("titration_barrel_aqua_regia", new EmptyRecipeSerializer<>(AquaRegiaRecipe::new)); public static final RecipeSerializer TITRATION_BARREL_NECTERED_VIOGNIER = register("titration_barrel_nectered_viognier", new EmptyRecipeSerializer<>(NecteredViognierRecipe::new)); @@ -100,11 +102,11 @@ public class SpectrumRecipeSerializers { static , T extends Recipe> S register(String id, S serializer) { - return Registry.register(Registries.RECIPE_SERIALIZER, SpectrumCommon.locate(id), serializer); + return DEFERRER.defer(serializer, v -> Registry.register(Registries.RECIPE_SERIALIZER, SpectrumCommon.locate(id), v)); } public static void register() { - + DEFERRER.flush(); } }