Skip to content

Commit

Permalink
finally fix research
Browse files Browse the repository at this point in the history
  • Loading branch information
khjxiaogu committed Dec 7, 2024
1 parent a0de5eb commit f57e9c3
Show file tree
Hide file tree
Showing 11 changed files with 138 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ public static void clearAll() {

// clear cache when modification applied
public static void clearCache() {
allResearches = OptionalLazy.of(() -> researches.all());
if(allResearches.isResolved())
allResearches = OptionalLazy.of(() -> researches.all());
}

public static void delete(Research r) {
Expand Down Expand Up @@ -202,6 +203,7 @@ public static void initFromRegistry(CompoundTag data) {
// no need
FHResearch.clearAll();
prepareReload();
//clearCache();
MinecraftForge.EVENT_BUS.post(new ResearchLoadEvent.Pre());
FHResearch.load(data);
}
Expand Down Expand Up @@ -345,7 +347,8 @@ public static void prepareReload() {
public static void readOne(String key, Research r) {
r.setId(key);
r.packetInit();
//researches.register(r);
researches.register(r);
clearCache();
}

public static void readAll(List<Research> rss) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,19 +67,27 @@
public class FHIcons {
private static final TypedCodecRegistry<FHIcon> serializers = new TypedCodecRegistry<>();
public static final Codec<FHIcon> CODEC=new AlternativeCodecBuilder<FHIcon>(FHIcon.class)
.fallback(()->FHNopIcon.INSTANCE)
.addSaveOnly(FHNopIcon.class ,FHNopIcon.CODEC.codec())
.add(FHItemIcon.class, FHItemIcon.ICON_CODEC)
.add(FHItemIcon.class,FHItemIcon.CODEC.codec())
.add(FHAnimatedIcon.class,FHAnimatedIcon.ICON_CODEC)
.add(serializers.codec())
.add(FHNopIcon.CODEC.codec())
.addSaveOnly(FHIcon.class,FHNopIcon.CODEC.codec())
.build();
public static final Codec<FHIcon> DEFAULT_CODEC=new AlternativeCodecBuilder<FHIcon>(FHIcon.class)
.fallback(()->FHNopIcon.INSTANCE)
.addSaveOnly(FHNopIcon.class ,FHNopIcon.CODEC.codec())
.add(FHItemIcon.class, FHItemIcon.ICON_CODEC)
.add(FHItemIcon.class,FHItemIcon.CODEC.codec())
.add(FHAnimatedIcon.class,FHAnimatedIcon.ICON_CODEC)
.add(serializers.codec())
.add(FHNopIcon.CODEC.codec())
.build();
private static class FHAnimatedIcon extends FHIcon {
private static final MapCodec<FHAnimatedIcon> CODEC=RecordCodecBuilder.mapCodec(t->t.group(
Codec.list(FHIcons.CODEC).fieldOf("icons").forGetter(o->o.icons)
Codec.list(FHIcons.DEFAULT_CODEC).fieldOf("icons").forGetter(o->o.icons)
).apply(t, FHAnimatedIcon::new));
private static final Codec<FHAnimatedIcon> ICON_CODEC=Codec.list(FHIcons.CODEC).xmap(FHAnimatedIcon::new, o->o.icons);
private static final Codec<FHAnimatedIcon> ICON_CODEC=Codec.list(FHIcons.DEFAULT_CODEC).xmap(FHAnimatedIcon::new, o->o.icons);
List<FHIcon> icons;
public FHAnimatedIcon() {
icons = new ArrayList<>();
Expand Down Expand Up @@ -107,8 +115,8 @@ public void draw(GuiGraphics ms, int x, int y, int w, int h) {

private static class FHCombinedIcon extends FHIcon {
private static final MapCodec<FHCombinedIcon> CODEC=RecordCodecBuilder.mapCodec(t->t.group(
FHIcons.CODEC.fieldOf("base").forGetter(o->o.large),
FHIcons.CODEC.fieldOf("small").forGetter(o->o.small)
FHIcons.CODEC.optionalFieldOf("base",FHNopIcon.INSTANCE).forGetter(o->o.large),
FHIcons.CODEC.optionalFieldOf("small",FHNopIcon.INSTANCE).forGetter(o->o.small)
).apply(t, FHCombinedIcon::new));
FHIcon large;
FHIcon small;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public FHResearchSyncPacket(FriendlyByteBuf buffer) {

public void encode(FriendlyByteBuf buffer) {
ObjectWriter.writeObject(buffer, data);
System.out.println("encoded "+data);
System.out.println("encoded "+key+":"+data);
buffer.writeUtf(key);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
import com.teammoeg.frostedheart.content.research.network.FHEffectProgressSyncPacket;
import com.teammoeg.frostedheart.content.research.research.Research;
import com.teammoeg.frostedheart.util.io.CodecUtil;
import com.teammoeg.frostedheart.util.io.codec.CompressDifferCodec;
import com.teammoeg.frostedheart.util.io.codec.CompressDifferMapCodec;
import com.teammoeg.frostedheart.util.io.registry.TypedCodecRegistry;

import dev.ftb.mods.ftblibrary.icon.Icon;
Expand Down Expand Up @@ -125,7 +127,9 @@ public Effect(BaseData data) {
hidden=data.hidden;
}
public BaseData getBaseData() {
return new BaseData(name, tooltip, icon, nonce, hidden);
BaseData bd= new BaseData(name, tooltip, icon, nonce, hidden);
System.out.println(bd);
return bd;
}
/**
* Instantiates a new Effect.<br>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package com.teammoeg.frostedheart.content.research.research.effects;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
Expand Down Expand Up @@ -48,28 +49,27 @@

import mezz.jei.library.util.RecipeUtil;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.ItemLike;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

public class EffectCrafting extends Effect {
public static final MapCodec<EffectCrafting> CODEC=RecordCodecBuilder.mapCodec(t->t.group(
Effect.BASE_CODEC.forGetter(Effect::getBaseData),

CodecUtil.<EffectCrafting,Ingredient,List<ResourceLocation>>either(
CodecUtil.INGREDIENT_CODEC.fieldOf("item"),
Codec.list(ResourceLocation.CODEC).fieldOf("recipes"),
Codec.list(ResourceLocation.CODEC).optionalFieldOf("recipes",Arrays.asList()),
o->o.ingredient,
o->o.unlocks.stream().map(Recipe::getId).collect(Collectors.toList())
))
),
Effect.BASE_CODEC.forGetter(Effect::getBaseData))
.apply(t,EffectCrafting::new));
List<Recipe<?>> unlocks = new ArrayList<>();
Ingredient ingredient = null;
Expand All @@ -88,11 +88,11 @@ public EffectCrafting(ItemStack item) {
this.ingredient = Ingredient.of(item);
}

public EffectCrafting(BaseData data,Either<Ingredient,List<ResourceLocation>> unlocks) {
public EffectCrafting(Either<Ingredient,List<ResourceLocation>> unlocks,BaseData data) {
super(data);

unlocks.ifLeft(t->{this.ingredient=t;});
unlocks.ifRight(o->o.stream().map(FHTeamDataManager.getRecipeManager()::byKey).filter(Optional::isPresent).map(Optional::get).forEach(this.unlocks::add));

}

public EffectCrafting(ResourceLocation recipe) {
Expand Down Expand Up @@ -221,4 +221,10 @@ public Ingredient getIngredient() {
return ingredient;
}

@Override
public String toString() {
return "EffectCrafting [name=" + name + ", tooltip=" + tooltip + ", icon=" + icon + ", nonce=" + nonce
+ ", hidden=" + hidden + "]";
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
*/
public class EffectItemReward extends Effect {
public static final MapCodec<EffectItemReward> CODEC=RecordCodecBuilder.mapCodec(t->t.group(Effect.BASE_CODEC.forGetter(Effect::getBaseData),
Codec.list(CodecUtil.ITEMSTACK_CODEC).fieldOf("rewards").forGetter(o->o.rewards))
Codec.list(CodecUtil.ITEMSTACK_STRING_CODEC).fieldOf("rewards").forGetter(o->o.rewards))
.apply(t,EffectItemReward::new));
List<ItemStack> rewards;

Expand Down
30 changes: 29 additions & 1 deletion src/main/java/com/teammoeg/frostedheart/util/io/CodecUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@
import com.mojang.datafixers.util.Either;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.*;
import com.mojang.serialization.DataResult.PartialResult;
import com.mojang.serialization.codecs.EitherMapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.teammoeg.frostedheart.FHMain;
import com.teammoeg.frostedheart.util.ConstructorCodec;
import com.teammoeg.frostedheart.util.RegistryUtils;
import com.teammoeg.frostedheart.util.io.codec.*;
import com.teammoeg.frostedheart.util.io.codec.BooleansCodec.BooleanCodecBuilder;
import io.netty.handler.codec.DecoderException;
import io.netty.handler.codec.EncoderException;
import net.minecraft.ResourceLocationException;
import net.minecraft.core.BlockPos;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry;
Expand All @@ -23,8 +26,11 @@
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.Tag;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;

import java.lang.reflect.Array;
Expand Down Expand Up @@ -127,6 +133,14 @@ public <T> DataResult<Pair<byte[], T>> decode(DynamicOps<T> ops, T input) {
tag.ifPresent(n->out.setTag(n));
return out;
}));
public static final Codec<ItemStack> ITEMSTACK_STRING_CODEC = new AlternativeCodecBuilder<>(ItemStack.class)
.add(ITEMSTACK_CODEC)
.add(ResourceLocation.CODEC.comapFlatMap(t->{
Item it=RegistryUtils.getItem(t);
if(it==Items.AIR||it==null)return DataResult.error(()->"Not a item");
return DataResult.success(new ItemStack(it,1));

}, t->RegistryUtils.getRegistryName(t.getItem()))).build();
public static final Codec<CompoundTag> COMPOUND_TAG_CODEC=CodecUtil.convertSchema(NbtOps.INSTANCE).comapFlatMap(t->{
if(t instanceof CompoundTag)
return DataResult.success((CompoundTag)t);
Expand All @@ -138,6 +152,15 @@ public <T> DataResult<Pair<byte[], T>> decode(DynamicOps<T> ops, T input) {
public static final Codec<Ingredient> INGREDIENT_CODEC = new PacketOrSchemaCodec<>(JsonOps.INSTANCE,o2->DataResult.success(o2.toJson()),o->{
if(o.isJsonArray()||o.isJsonObject())
return DataResult.success(Ingredient.fromJson(o));
if(o.isJsonPrimitive()) {
try {
Item i=RegistryUtils.getItem(new ResourceLocation(o.getAsString()));
if(i!=null&&i!=Items.AIR)
return DataResult.success(Ingredient.of(i));
}catch(ResourceLocationException rle) {

}
}
return DataResult.error(()->"Not a ingredient");
},Ingredient::toNetwork,Ingredient::fromNetwork);
public static final Codec<IngredientWithSize> INGREDIENT_SIZE_CODEC=PacketOrSchemaCodec.create(JsonOps.INSTANCE,IngredientWithSize::serialize,IngredientWithSize::deserialize,IngredientWithSize::write,IngredientWithSize::read);
Expand Down Expand Up @@ -228,6 +251,11 @@ public static <S,A,B> RecordCodecBuilder<S, Either<A, B>> either(
return Either.right(fb.apply(o));
});
}
public static <S,A> RecordCodecBuilder<S, A> poly(
MapCodec<A> readWrite,MapCodec<A> readOnly,
Function<S,A> getter){
return new EitherMapCodec<>(readWrite,readOnly).xmap(t->t.left().or(()->t.right()).get(), t->Either.left(t)).forGetter(getter);
}
public static <A> Codec<A> debugCodec(Codec<A> codec){
return new Codec<>() {

Expand Down Expand Up @@ -267,7 +295,7 @@ public <T> DataResult<A> decode(DynamicOps<T> ops, MapLike<T> input) {
public <T> RecordBuilder<T> encode(A input, DynamicOps<T> ops, RecordBuilder<T> prefix) {
RecordBuilder<T> res=codec.encode(input, ops, prefix);
System.out.println(codec);
System.out.println(res.build(ops.empty()));
//System.out.println(res.build(ops.empty()));
return res;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.teammoeg.frostedheart.util.io.codec.CompressDifferMapCodec;

import net.minecraft.resources.ResourceLocation;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.teammoeg.frostedheart.util.io.codec;

import java.util.stream.Stream;

import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.MapLike;
import com.mojang.serialization.RecordBuilder;

public class CompressDifferMapCodec<A> extends MapCodec<A> {
MapCodec<A> uncompressed;
MapCodec<A> compressed;
public CompressDifferMapCodec(MapCodec<A> uncompressed) {
super();
this.uncompressed = uncompressed;
this.compressed=uncompressed.codec().fieldOf("value");
}


public CompressDifferMapCodec(MapCodec<A> uncompressed, MapCodec<A> compressed) {
super();
this.uncompressed = uncompressed;
this.compressed = compressed;
}


@Override
public String toString() {
return "CompressDiff[U " + uncompressed +"C "+ compressed +"]";
}

@Override
public <T> DataResult<A> decode(DynamicOps<T> ops, MapLike<T> input) {
if(ops.compressMaps()) {
return compressed.decode(ops, input);
}
return uncompressed.decode(ops, input);
}

@Override
public <T> RecordBuilder<T> encode(A input, DynamicOps<T> ops, RecordBuilder<T> prefix) {
if(ops.compressMaps()) {
return compressed.encode(input, ops,prefix);
}
return uncompressed.encode(input,ops,prefix);
}

@Override
public <T> Stream<T> keys(DynamicOps<T> ops) {
if(ops.compressMaps()) {
return compressed.keys(ops);
}
return uncompressed.keys(ops);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -403,18 +403,20 @@ public RecordBuilder<Object> mapBuilder() {

@Override
public DataResult<Object> mergeToList(Object list, List<Object> values) {
//System.out.println("merges "+values+" into "+list);
if (list instanceof List) {
List<Object> li = (List<Object>) list;
li.addAll(values);
return DataResult.success(li);
} else if (list == NULLTAG || list == null) {
return DataResult.success(values);
return DataResult.success(new ArrayList<>(values));
}
return DataResult.error(()->"Not a Map or Empty");
return DataResult.error(()->"Not a List or Empty");
}

@Override
public DataResult<Object> mergeToList(Object list, Object value) {
// System.out.println(list);
//System.out.println("merge "+value+" into "+list);
if (list == NULLTAG || list == null) {
return DataResult.success(Stream.of(value).collect(Collectors.toList()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,4 +248,8 @@ public T get() {
return val;
throw new NoSuchElementException("Object not present");
}

public boolean isResolved() {
return isResolved;
}
}

0 comments on commit f57e9c3

Please sign in to comment.