Skip to content

Commit

Permalink
feat: More Condition stuff, plus recipe condition
Browse files Browse the repository at this point in the history
  • Loading branch information
Zepalesque committed May 23, 2024
1 parent a9b980e commit 3a206f6
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 18 deletions.
4 changes: 3 additions & 1 deletion src/main/java/net/zepalesque/zenith/Zenith.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import net.zepalesque.zenith.api.condition.ConfigCondition;
import net.zepalesque.zenith.api.condition.config.ConfigSerializer;
import net.zepalesque.zenith.config.ZConfig;
import net.zepalesque.zenith.recipe.condition.ZenithRecipeConditions;
import org.slf4j.Logger;

import java.nio.file.Path;
Expand All @@ -36,9 +37,10 @@ public class Zenith
public Zenith(IEventBus bus, Dist dist) {

bus.addListener(this::commonSetup);
bus.addListener(DataPackRegistryEvent.NewRegistry.class, event -> event.dataPackRegistry(Keys.CONDITION, Condition.CODEC, Condition.CODEC));
bus.addListener(DataPackRegistryEvent.NewRegistry.class, event -> event.dataPackRegistry(Keys.CONDITION, Condition.ELEMENT_CODEC, Condition.ELEMENT_CODEC));

ConditionElements.ELEMENTS.register(bus);
ZenithRecipeConditions.CODECS.register(bus);

// Register example config serializer
ConfigCondition.registerSerializer("zenith", new ConfigSerializer(ZConfig.Serializer::serialize, ZConfig.Serializer::deserialize));
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/net/zepalesque/zenith/api/condition/Condition.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package net.zepalesque.zenith.api.condition;

import com.mojang.serialization.Codec;
import net.minecraft.core.Holder;
import net.minecraft.resources.RegistryFileCodec;
import net.minecraft.util.ExtraCodecs;
import net.zepalesque.zenith.Zenith;

import java.util.function.Function;

public interface Condition<T extends Condition<?>> {

Codec<Condition<?>> CODEC = ExtraCodecs.lazyInitializedCodec(
() -> ConditionElements.CONDITION_SERIALIZER_REGISTRY.byNameCodec().dispatch("condition", Condition::codec, Function.identity()));
Codec<Condition<?>> ELEMENT_CODEC = ExtraCodecs.lazyInitializedCodec(
() -> ConditionElements.ELEMENT_REGISTRY.byNameCodec().dispatch("condition", Condition::codec, Function.identity()));

Codec<Holder<Condition<?>>> CODEC = RegistryFileCodec.create(Zenith.Keys.CONDITION, ELEMENT_CODEC);

boolean isMet();
boolean test();

Codec<T> codec();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@
public class ConditionElements {

public static final DeferredRegister<Codec<? extends Condition<?>>> ELEMENTS = DeferredRegister.create(Zenith.Keys.CONDITION_ELEMENT, Zenith.MODID);
public static final Registry<Codec<? extends Condition<?>>> CONDITION_SERIALIZER_REGISTRY = new RegistryBuilder<>(Zenith.Keys.CONDITION_ELEMENT).sync(true).create();
public static final Registry<Codec<? extends Condition<?>>> ELEMENT_REGISTRY = new RegistryBuilder<>(Zenith.Keys.CONDITION_ELEMENT).sync(true).create();

// Mod-Related Conditions
public static final DeferredHolder<Codec<? extends Condition<?>>, Codec<ModLoadedCondition>> MOD_LOADED = ELEMENTS.register("mod_loaded", () -> ModLoadedCondition.CODEC);
public static final DeferredHolder<Codec<? extends Condition<?>>, Codec<ConfigCondition>> REDUX_CONFIG = ELEMENTS.register("config_enabled", () -> ConfigCondition.CODEC);
public static final DeferredHolder<Codec<? extends Condition<?>>, Codec<DevEnvironmentCondition>> DEV_ENVIRONMENT = ELEMENTS.register("dev_environment", () -> DevEnvironmentCondition.CODEC);

// Logic
public static final DeferredHolder<Codec<? extends Condition<?>>, Codec<LogicConditions.And<?, ?>>> AND = ELEMENTS.register("and", () -> LogicConditions.And.CODEC);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public ConfigCondition(@Nullable String serializerId, @Nullable ConfigValue<Bool
}

@Override
public boolean isMet() {
public boolean test() {
return this.config == null || this.config.get();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package net.zepalesque.zenith.api.condition;

import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import net.neoforged.fml.loading.FMLLoader;

public class DevEnvironmentCondition implements Condition<DevEnvironmentCondition> {

public static final DevEnvironmentCondition INSTANCE = new DevEnvironmentCondition();

public static final Codec<DevEnvironmentCondition> CODEC = MapCodec.unit(INSTANCE).stable().codec();

private DevEnvironmentCondition() {
}

@Override
public boolean test() {
return !FMLLoader.isProduction();
}

@Override
public Codec<DevEnvironmentCondition> codec() {
return CODEC;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ public class LogicConditions {
public static class And<E extends Condition<?>, T extends Condition<?>> implements Condition<And<?, ?>> {

public static final Codec<And<?, ?>> CODEC = RecordCodecBuilder.create((condition) ->
condition.group(Condition.CODEC.fieldOf("arg1").forGetter((cond) -> cond.arg1),
Condition.CODEC.fieldOf("arg2").forGetter((cond) -> cond.arg2))
condition.group(Condition.ELEMENT_CODEC.fieldOf("arg1").forGetter((cond) -> cond.arg1),
Condition.ELEMENT_CODEC.fieldOf("arg2").forGetter((cond) -> cond.arg2))
.apply(condition, And::new));

protected final E arg1;
Expand All @@ -21,8 +21,8 @@ public And(E arg1, T arg2) {
}

@Override
public boolean isMet() {
return this.arg1.isMet() && this.arg2.isMet();
public boolean test() {
return this.arg1.test() && this.arg2.test();
}

@Override
Expand All @@ -35,7 +35,7 @@ public boolean isMet() {
public static class Not<E extends Condition<?>> implements Condition<Not<?>> {

public static final Codec<Not<?>> CODEC = RecordCodecBuilder.create((condition) ->
condition.group(Condition.CODEC.fieldOf("inverted").forGetter((cond) -> cond.condition))
condition.group(Condition.ELEMENT_CODEC.fieldOf("inverted").forGetter((cond) -> cond.condition))
.apply(condition, Not::new));

protected final E condition;
Expand All @@ -48,8 +48,8 @@ public Not(E condition) {
}

@Override
public boolean isMet() {
return !this.condition.isMet();
public boolean test() {
return !this.condition.test();
}

@Override
Expand All @@ -61,8 +61,8 @@ public Codec<Not<?>> codec() {
public static class Or<E extends Condition<?>, T extends Condition<?>> implements Condition<Or<?, ?>> {

public static final Codec<Or<?, ?>> CODEC = RecordCodecBuilder.create((condition) ->
condition.group(Condition.CODEC.fieldOf("arg1").forGetter((cond) -> cond.arg1),
Condition.CODEC.fieldOf("arg2").forGetter((cond) -> cond.arg2))
condition.group(Condition.ELEMENT_CODEC.fieldOf("arg1").forGetter((cond) -> cond.arg1),
Condition.ELEMENT_CODEC.fieldOf("arg2").forGetter((cond) -> cond.arg2))
.apply(condition, Or::new));

protected final E arg1;
Expand All @@ -77,8 +77,8 @@ public Or(E arg1, T arg2) {
}

@Override
public boolean isMet() {
return this.arg1.isMet() || this.arg2.isMet();
public boolean test() {
return this.arg1.test() || this.arg2.test();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public ModLoadedCondition(String modid) {
}

@Override
public boolean isMet() {
public boolean test() {
return ModList.get().isLoaded(this.modid);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package net.zepalesque.zenith.recipe.condition;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.zepalesque.zenith.api.condition.Condition;

import java.util.Objects;
import java.util.Optional;

public class ConditionCondition implements ICondition {

public static Codec<ConditionCondition> CODEC = RecordCodecBuilder.create(
builder -> builder
.group(Condition.CODEC.fieldOf("condition").forGetter(cc -> cc.condition))
.apply(builder, ConditionCondition::new));

public final Holder<Condition<?>> condition;

public ConditionCondition(Holder<Condition<?>> pCondition)
{
this.condition = pCondition;
}

@Override
public boolean test(IContext context) {
Optional<Condition<?>> optional = this.condition.unwrap().right();
return optional.isEmpty() || optional.get().test();
}


@Override
public Codec<? extends ICondition> codec() {
return CODEC;
}

@Override
public String toString() {
return "data_condition(" + Objects.requireNonNullElse(this.condition, "null") + ")";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package net.zepalesque.zenith.recipe.condition;

import com.mojang.serialization.Codec;
import net.neoforged.neoforge.common.conditions.ICondition;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.NeoForgeRegistries;
import net.zepalesque.zenith.Zenith;

public class ZenithRecipeConditions {

public static final DeferredRegister<Codec<? extends ICondition>> CODECS = DeferredRegister.create(NeoForgeRegistries.Keys.CONDITION_CODECS, Zenith.MODID);

public static final DeferredHolder<Codec<? extends ICondition>, Codec<ConditionCondition>> ZCOND_PREDICATE = CODECS.register("when", () -> ConditionCondition.CODEC);

}

0 comments on commit 3a206f6

Please sign in to comment.