1
0
mirror of https://github.com/GeyserMC/Rainbow.git synced 2025-12-19 14:59:16 +00:00

Add codecs for match predicates

This commit is contained in:
Eclipse
2025-06-28 19:09:26 +00:00
parent 577cf4c97f
commit 1b62597f6f
3 changed files with 117 additions and 14 deletions

View File

@@ -8,27 +8,27 @@ import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.StringRepresentable; import net.minecraft.util.StringRepresentable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public record GeyserConditionPredicate(ConditionProperty property, boolean expected) implements GeyserPredicate { public record GeyserConditionPredicate(Property property, boolean expected) implements GeyserPredicate {
public static final MapCodec<GeyserConditionPredicate> CODEC = RecordCodecBuilder.mapCodec(instance -> public static final MapCodec<GeyserConditionPredicate> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group( instance.group(
ConditionProperty.CODEC.forGetter(GeyserConditionPredicate::property), Property.CODEC.forGetter(GeyserConditionPredicate::property),
Codec.BOOL.optionalFieldOf("expected", true).forGetter(GeyserConditionPredicate::expected) Codec.BOOL.optionalFieldOf("expected", true).forGetter(GeyserConditionPredicate::expected)
).apply(instance, GeyserConditionPredicate::new) ).apply(instance, GeyserConditionPredicate::new)
); );
public static final ConditionProperty BROKEN = unit(ConditionProperty.Type.BROKEN); public static final Property BROKEN = unit(Property.Type.BROKEN);
public static final ConditionProperty DAMAGED = unit(ConditionProperty.Type.DAMAGED); public static final Property DAMAGED = unit(Property.Type.DAMAGED);
public static final ConditionProperty FISHING_ROD_CAST = unit(ConditionProperty.Type.FISHING_ROD_CAST); public static final Property FISHING_ROD_CAST = unit(Property.Type.FISHING_ROD_CAST);
@Override @Override
public Type type() { public Type type() {
return Type.CONDITION; return Type.CONDITION;
} }
public interface ConditionProperty { public interface Property {
MapCodec<ConditionProperty> CODEC = Type.CODEC.dispatchMap("property", ConditionProperty::type, Type::codec); MapCodec<Property> CODEC = Type.CODEC.dispatchMap("property", Property::type, Type::codec);
Type type(); Type type();
@@ -42,14 +42,14 @@ public record GeyserConditionPredicate(ConditionProperty property, boolean expec
public static final Codec<Type> CODEC = StringRepresentable.fromEnum(Type::values); public static final Codec<Type> CODEC = StringRepresentable.fromEnum(Type::values);
private final String name; private final String name;
private final MapCodec<? extends ConditionProperty> codec; private final MapCodec<? extends Property> codec;
Type(String name, MapCodec<? extends ConditionProperty> codec) { Type(String name, MapCodec<? extends Property> codec) {
this.name = name; this.name = name;
this.codec = codec; this.codec = codec;
} }
public MapCodec<? extends ConditionProperty> codec() { public MapCodec<? extends Property> codec() {
return codec; return codec;
} }
@@ -60,7 +60,7 @@ public record GeyserConditionPredicate(ConditionProperty property, boolean expec
} }
} }
public record CustomModelData(int index) implements ConditionProperty { public record CustomModelData(int index) implements Property {
public static final MapCodec<CustomModelData> CODEC = RecordCodecBuilder.mapCodec(instance -> public static final MapCodec<CustomModelData> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group( instance.group(
ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("index", 0).forGetter(CustomModelData::index) ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("index", 0).forGetter(CustomModelData::index)
@@ -73,7 +73,7 @@ public record GeyserConditionPredicate(ConditionProperty property, boolean expec
} }
} }
public record HasComponent(DataComponentType<?> component) implements ConditionProperty { public record HasComponent(DataComponentType<?> component) implements Property {
public static final MapCodec<HasComponent> CODEC = RecordCodecBuilder.mapCodec(instance -> public static final MapCodec<HasComponent> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group( instance.group(
DataComponentType.CODEC.fieldOf("component").forGetter(HasComponent::component) DataComponentType.CODEC.fieldOf("component").forGetter(HasComponent::component)
@@ -86,7 +86,7 @@ public record GeyserConditionPredicate(ConditionProperty property, boolean expec
} }
} }
private static ConditionProperty unit(ConditionProperty.Type type) { private static Property unit(Property.Type type) {
return () -> type; return () -> type;
} }
} }

View File

@@ -0,0 +1,102 @@
package org.geysermc.packgenerator.mappings.predicate;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.item.CrossbowItem;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
public record GeyserMatchPredicate(MatchPredicateData data) implements GeyserPredicate {
public static final MapCodec<GeyserMatchPredicate> CODEC = MatchPredicateData.CODEC.xmap(GeyserMatchPredicate::new, GeyserMatchPredicate::data);
@Override
public Type type() {
return Type.MATCH;
}
public interface MatchPredicateData {
MapCodec<MatchPredicateData> CODEC = Type.CODEC.dispatchMap("property", MatchPredicateData::type, Type::codec);
Type type();
enum Type implements StringRepresentable {
CHARGE_TYPE("charge_type", ChargeType.CODEC),
TRIM_MATERIAL("trim_material", TrimMaterial.CODEC),
CONTEXT_DIMENSION("context_dimension", ContextDimension.CODEC),
CUSTOM_MODEL_DATA("custom_model_data", CustomModelData.CODEC);
public static final Codec<Type> CODEC = StringRepresentable.fromEnum(Type::values);
private final String name;
private final MapCodec<? extends MatchPredicateData> codec;
Type(String name, MapCodec<? extends MatchPredicateData> codec) {
this.name = name;
this.codec = codec;
}
public MapCodec<? extends MatchPredicateData> codec() {
return codec;
}
@Override
public @NotNull String getSerializedName() {
return name;
}
}
}
public record ChargeType(CrossbowItem.ChargeType chargeType) implements MatchPredicateData {
public static final MapCodec<ChargeType> CODEC = simpleCodec(CrossbowItem.ChargeType.CODEC, ChargeType::chargeType, ChargeType::new);
@Override
public Type type() {
return Type.CHARGE_TYPE;
}
}
// TODO might change into ResourceKey?
public record TrimMaterial(ResourceLocation material) implements MatchPredicateData {
public static final MapCodec<TrimMaterial> CODEC = simpleCodec(ResourceLocation.CODEC, TrimMaterial::material, TrimMaterial::new);
@Override
public Type type() {
return Type.TRIM_MATERIAL;
}
}
// TODO might change into ResourceKey?
public record ContextDimension(ResourceLocation dimension) implements MatchPredicateData {
public static final MapCodec<ContextDimension> CODEC = simpleCodec(ResourceLocation.CODEC, ContextDimension::dimension, ContextDimension::new);
@Override
public Type type() {
return Type.CONTEXT_DIMENSION;
}
}
public record CustomModelData(String string, int index) implements MatchPredicateData {
public static final MapCodec<CustomModelData> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group(
Codec.STRING.fieldOf("value").forGetter(CustomModelData::string),
ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("index", 0).forGetter(CustomModelData::index)
).apply(instance, CustomModelData::new)
);
@Override
public Type type() {
return Type.CUSTOM_MODEL_DATA;
}
}
private static <P, T> MapCodec<P> simpleCodec(Codec<T> codec, Function<P, T> getter, Function<T, P> constructor) {
return codec.fieldOf("value").xmap(constructor, getter);
}
}

View File

@@ -16,7 +16,8 @@ public interface GeyserPredicate {
Type type(); Type type();
enum Type implements StringRepresentable { enum Type implements StringRepresentable {
CONDITION("condition", GeyserConditionPredicate.CODEC); CONDITION("condition", GeyserConditionPredicate.CODEC),
MATCH("match", GeyserMatchPredicate.CODEC);
public static final Codec<Type> CODEC = StringRepresentable.fromEnum(Type::values); public static final Codec<Type> CODEC = StringRepresentable.fromEnum(Type::values);