Skip to content

Commit 1b95cd6

Browse files
black magic for a mixin (extending a map codec)
1 parent b538abb commit 1b95cd6

File tree

5 files changed

+83
-32
lines changed

5 files changed

+83
-32
lines changed

src/main/java/com/rae/creatingspace/api/gui/elements/InputBoxWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void setResponder(Consumer<String> stringConsumer){
7070
}
7171

7272
@Override
73-
protected void renderWidget(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
73+
public void render(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
7474
super.renderWidget(graphics, mouseX, mouseY, partialTicks);
7575
//editBox.render(ms,mouseX,mouseY,partialTicks);
7676
}

src/main/java/com/rae/creatingspace/api/gui/elements/Orbit.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public boolean isMouseOver(double mouseX, double mouseY) {
8181
}
8282

8383
@Override
84-
protected void renderWidget(@NotNull GuiGraphics ms, int mouseX, int mouseY, float partialTicks) {
84+
public void render(@NotNull GuiGraphics ms, int mouseX, int mouseY, float partialTicks) {
8585
if (visible) {
8686
isHovered = isMouseOver(mouseX, mouseY);
8787
beforeRender(ms, mouseX, mouseY, partialTicks);

src/main/java/com/rae/creatingspace/api/gui/elements/SliderWidget.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ public boolean mouseClicked(double p_93641_, double p_93642_, int p_93643_) {
5252
public void setMax(int max) {
5353
this.max = max;
5454
}
55+
5556
@Override
56-
protected void renderWidget(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
57+
public void render(@NotNull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
5758
if (visible){
5859
lerpedValue.tickChaser();
5960

src/main/java/com/rae/creatingspace/mixin/recipe/SequencedAssemblyRecipeMixin.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
package com.rae.creatingspace.mixin.recipe;
22

3-
import com.rae.creatingspace.CreatingSpace;
4-
import com.rae.creatingspace.configs.CSConfigs;
53
import com.rae.creatingspace.content.recipes.IMoreNbtConditions;
6-
import com.simibubi.create.content.processing.recipe.ProcessingRecipe;
74
import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe;
85
import net.minecraft.core.component.DataComponents;
96
import net.minecraft.nbt.CompoundTag;
107
import net.minecraft.nbt.Tag;
118
import net.minecraft.resources.ResourceLocation;
12-
import net.minecraft.world.Container;
139
import net.minecraft.world.item.ItemStack;
1410
import net.minecraft.world.item.component.CustomData;
15-
import net.minecraft.world.item.crafting.RecipeType;
16-
import net.minecraft.world.level.Level;
1711
import org.spongepowered.asm.mixin.Mixin;
1812
import org.spongepowered.asm.mixin.Unique;
1913
import org.spongepowered.asm.mixin.injection.At;
@@ -22,10 +16,6 @@
2216

2317
import java.util.ArrayList;
2418
import java.util.Objects;
25-
import java.util.Optional;
26-
import java.util.function.Predicate;
27-
28-
import static com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe.getRecipes;
2919

3020
@Mixin(value = SequencedAssemblyRecipe.class)
3121
public class SequencedAssemblyRecipeMixin implements IMoreNbtConditions {
@@ -89,6 +79,7 @@ public void addTagBack(ResourceLocation id, ItemStack input, CallbackInfoReturna
8979
}
9080
}
9181
}
82+
9283
/*@Inject(method = "getRecipe(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/Container;Lnet/minecraft/world/item/crafting/RecipeType;Ljava/lang/Class;Ljava/util/function/Predicate;)Ljava/util/Optional;", at = @At(value = "RETURN"),remap = false )
9384
private static <C extends Container, R extends ProcessingRecipe<C>> void debugInfo(Level world, C inv, RecipeType<R> type, Class<R> recipeClass, Predicate<? super R> recipeFilter, CallbackInfoReturnable<Optional<R>> cir) {
9485
if (CSConfigs.COMMON.additionalLogInfo.get()) {
Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,98 @@
11
package com.rae.creatingspace.mixin.recipe;
22

3-
import com.google.gson.JsonElement;
4-
import com.google.gson.JsonObject;
3+
import com.mojang.serialization.*;
54
import com.rae.creatingspace.content.recipes.IMoreNbtConditions;
65
import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipe;
76
import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer;
8-
import net.minecraft.resources.ResourceLocation;
9-
import net.minecraft.util.GsonHelper;
7+
import io.netty.buffer.ByteBuf;
8+
import net.minecraft.network.RegistryFriendlyByteBuf;
9+
import net.minecraft.network.codec.ByteBufCodecs;
10+
import net.minecraft.network.codec.StreamCodec;
11+
import org.spongepowered.asm.mixin.Final;
1012
import org.spongepowered.asm.mixin.Mixin;
13+
import org.spongepowered.asm.mixin.Shadow;
14+
import org.spongepowered.asm.mixin.Unique;
1115
import org.spongepowered.asm.mixin.injection.At;
1216
import org.spongepowered.asm.mixin.injection.Inject;
17+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1318
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1419

1520
import java.util.ArrayList;
21+
import java.util.List;
22+
import java.util.stream.Stream;
1623

1724
@Mixin(value = SequencedAssemblyRecipeSerializer.class)
1825
public abstract class SequencedAssemblyRecipeSerializerMixin {
19-
@Inject(method = "readFromJson", at = @At("RETURN"), remap = false, cancellable = true)
20-
public void readKeepNbtJson(ResourceLocation recipeId, JsonObject json, CallbackInfoReturnable<SequencedAssemblyRecipe> cir) {
21-
SequencedAssemblyRecipe recipe = cir.getReturnValue();
22-
if (GsonHelper.isValidNode(json, "keepNbt")) {
23-
ArrayList<String> collector = new ArrayList<>();
24-
for (JsonElement ob : GsonHelper.getAsJsonArray(json, "keepNbt")) {
25-
collector.add(ob.getAsString());
26-
}
27-
((IMoreNbtConditions) recipe).setKeepNbt(collector);
2826

27+
@Shadow @Final private MapCodec<SequencedAssemblyRecipe> CODEC;
28+
final MapCodec<SequencedAssemblyRecipe> NEW_CODEC = new MapCodec<>() {
29+
@Override
30+
public <T> RecordBuilder<T> encode(SequencedAssemblyRecipe input, DynamicOps<T> ops, RecordBuilder<T> prefix) {
31+
return cS_1_21_1$encode(input, ops, prefix);
2932
}
30-
if (GsonHelper.isValidNode(json, "machNbt")) {
31-
ArrayList<String> collector = new ArrayList<>();
32-
for (JsonElement ob : GsonHelper.getAsJsonArray(json, "machNbt")) {
33-
collector.add(ob.getAsString());
34-
}
35-
((IMoreNbtConditions) recipe).setMachNbt(collector);
33+
34+
@Override
35+
public <T> DataResult<SequencedAssemblyRecipe> decode(DynamicOps<T> ops, MapLike<T> input) {
36+
return cS_1_21_1$decode(ops, input);
3637
}
38+
39+
@Override
40+
public <T> Stream<T> keys(DynamicOps<T> ops) {
41+
return Stream.concat(
42+
CODEC.keys(ops),
43+
Stream.of(ops.createString("keepNbt"), ops.createString("matchNbt"))
44+
);
45+
}
46+
};
47+
48+
49+
//Black Magic
50+
@Unique
51+
private <T> DataResult<SequencedAssemblyRecipe> cS_1_21_1$decode(DynamicOps<T> ops, MapLike<T> input) {
52+
return CODEC.decode(ops, input).flatMap(assemblyRecipe -> {
53+
54+
DataResult<List<String>> keepNbtResult = Codec.STRING.listOf().parse(ops,input.get(ops.createString("keepNbt")));
55+
56+
DataResult<List<String>> matchNbtResult = Codec.STRING.listOf().parse(ops,input.get(ops.createString("matchNbt")));
57+
58+
return keepNbtResult.flatMap(keepNbt ->
59+
matchNbtResult.map(matchNbt -> {
60+
((IMoreNbtConditions)assemblyRecipe).setKeepNbt(new ArrayList<>(keepNbt));
61+
((IMoreNbtConditions)assemblyRecipe).setMachNbt(new ArrayList<>(matchNbt));
62+
return assemblyRecipe;
63+
})
64+
);
65+
});
66+
}
67+
68+
@Unique
69+
private <T> RecordBuilder<T> cS_1_21_1$encode(SequencedAssemblyRecipe recipe, DynamicOps<T> ops, RecordBuilder<T> prefix) {
70+
return CODEC.encode(recipe, ops, prefix)
71+
.add("keepNbt", Codec.STRING.listOf().encodeStart(ops, ((IMoreNbtConditions) recipe).getKeepNbt()))
72+
.add("matchNbt", Codec.STRING.listOf().encodeStart(ops, ((IMoreNbtConditions) recipe).getMachNbt()));
73+
}
74+
75+
private static final
76+
@Unique
77+
StreamCodec<ByteBuf, List<String>> STRING_LIST_STREAM_CODEC =
78+
ByteBufCodecs.fromCodec(Codec.list(Codec.STRING));
79+
80+
@Inject(method = "fromNetwork", at = @At("RETURN"), cancellable = true)
81+
public void readKeepNbt(RegistryFriendlyByteBuf buffer, CallbackInfoReturnable<SequencedAssemblyRecipe> cir) {
82+
SequencedAssemblyRecipe recipe = cir.getReturnValue();
83+
((IMoreNbtConditions) recipe).setKeepNbt(new ArrayList<>(STRING_LIST_STREAM_CODEC.decode(buffer)));
84+
((IMoreNbtConditions) recipe).setMachNbt(new ArrayList<>(STRING_LIST_STREAM_CODEC.decode(buffer)));
3785
cir.setReturnValue(recipe);
3886
}
87+
88+
@Inject(method = "toNetwork", at = @At("RETURN"))
89+
public void writeKeepNbt(RegistryFriendlyByteBuf buffer, SequencedAssemblyRecipe recipe, CallbackInfo ci) {
90+
STRING_LIST_STREAM_CODEC.encode(buffer, ((IMoreNbtConditions) recipe).getKeepNbt());
91+
STRING_LIST_STREAM_CODEC.encode(buffer, ((IMoreNbtConditions) recipe).getMachNbt());
92+
}
93+
94+
@Inject(method = "codec", at = @At("RETURN"))
95+
public void addToCodec(CallbackInfoReturnable<MapCodec<SequencedAssemblyRecipe>> cir) {
96+
cir.setReturnValue(NEW_CODEC);
97+
}
3998
}

0 commit comments

Comments
 (0)