Skip to content

Commit

Permalink
Add ExpressionLootCondition
Browse files Browse the repository at this point in the history
  • Loading branch information
melontini committed Apr 17, 2024
1 parent a585f34 commit 39c1230
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 6 deletions.
7 changes: 6 additions & 1 deletion src/main/java/me/melontini/commander/impl/Commander.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
import me.melontini.commander.impl.builtin.BuiltInEvents;
import me.melontini.commander.impl.builtin.BuiltInSelectors;
import me.melontini.commander.impl.event.data.DynamicEventManager;
import me.melontini.commander.impl.util.ArithmeticaLootNumberProvider;
import me.melontini.commander.impl.util.eval.EvalUtils;
import me.melontini.commander.impl.util.loot.ArithmeticaLootNumberProvider;
import me.melontini.commander.impl.util.loot.ExpressionLootCondition;
import me.melontini.commander.impl.util.mappings.MappingKeeper;
import me.melontini.commander.impl.util.mappings.MinecraftDownloader;
import me.melontini.dark_matter.api.base.util.Exceptions;
Expand All @@ -21,8 +22,11 @@
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.mappingio.tree.MemoryMappingTree;
import net.minecraft.loot.condition.LootConditionType;
import net.minecraft.loot.provider.number.LootNumberProviderType;
import net.minecraft.loot.provider.number.LootNumberProviderTypes;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;

Expand All @@ -40,6 +44,7 @@ public class Commander implements ModInitializer {

public static final PrependingLogger LOGGER = PrependingLogger.get();
public static final LootNumberProviderType ARITHMETICA_PROVIDER = LootNumberProviderTypes.register("commander:arithmetica", ExtraCodecs.toJsonSerializer(Arithmetica.CODEC.xmap(ArithmeticaLootNumberProvider::new, ArithmeticaLootNumberProvider::value)));
public static final LootConditionType EXPRESSION_CONDITION = Registry.register(Registries.LOOT_CONDITION_TYPE, id("expression"), new LootConditionType(ExtraCodecs.toJsonSerializer(ExpressionLootCondition.CODEC)));

public static final Path COMMANDER_PATH = FabricLoader.getInstance().getGameDir().resolve(".commander");
public static final String MINECRAFT_VERSION = getVersion();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,18 @@ public static EvaluationValue evaluate(LootContext context, Expression exp) {
}

public static DataResult<Arithmetica> parseEither(Either<Double, String> either) {
return either.map(d -> DataResult.success(Arithmetica.constant(d)), string -> parseExpression(string).map(func -> Arithmetica.of(context -> func.apply(context).getNumberValue().doubleValue(), string)));
return either.map(d -> DataResult.success(Arithmetica.constant(d)), string -> wrapExpression(parseExpression(string)).map(func -> Arithmetica.of(context -> func.apply(context).getNumberValue().doubleValue(), string)));
}

public static DataResult<Function<LootContext, EvaluationValue>> parseExpression(String expression) {
public static DataResult<Function<LootContext, EvaluationValue>> wrapExpression(DataResult<Expression> result) {
return result.map(expression -> context -> evaluate(context, expression));
}

public static DataResult<Expression> parseExpression(String expression) {
try {
Expression exp = new Expression(expression.replace(":", "__idcl__"), CONFIGURATION);
exp.validate();
return DataResult.success(context -> evaluate(context, exp));
return DataResult.success(exp);
} catch (Throwable throwable) {
return DataResult.error(throwable::getLocalizedMessage);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package me.melontini.commander.impl.util;
package me.melontini.commander.impl.util.loot;

import me.melontini.commander.api.expression.Arithmetica;
import me.melontini.commander.impl.Commander;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.melontini.commander.impl.util.loot;

import com.ezylang.evalex.Expression;
import com.mojang.serialization.Codec;
import me.melontini.commander.impl.Commander;
import me.melontini.commander.impl.util.eval.EvalUtils;
import net.minecraft.loot.condition.LootCondition;
import net.minecraft.loot.condition.LootConditionType;
import net.minecraft.loot.context.LootContext;

public record ExpressionLootCondition(Expression expression) implements LootCondition {
public static final Codec<ExpressionLootCondition> CODEC = Codec.STRING
.comapFlatMap(EvalUtils::parseExpression, exp -> exp.getExpressionString().replace("__idcl__", ":"))
.xmap(ExpressionLootCondition::new, ExpressionLootCondition::expression);

@Override
public LootConditionType getType() {
return Commander.EXPRESSION_CONDITION;
}

@Override
public boolean test(LootContext context) {
return EvalUtils.evaluate(context, expression).getBooleanValue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ private static String sb(Consumer<StringBuilder> consumer) {
}

public static DataResult<Function<LootContext, String>> parseExpression(String expression, String cast) {
var result = EvalUtils.parseExpression(expression);
var result = EvalUtils.wrapExpression(EvalUtils.parseExpression(expression));
if (cast != null) {
return switch (cast) {
case "long" -> result.map(function -> context -> String.valueOf(function.apply(context).getNumberValue().longValue()));
Expand Down

0 comments on commit 39c1230

Please sign in to comment.