package de.slikey.effectlib.math; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import net.objecthunter.exp4j.function.Function; import org.bukkit.configuration.ConfigurationSection; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.logging.Level; public class EquationTransform implements Transform { private Expression expression; private static Function randFunction; private final Set<String> inputVariables; @Override public void load(ConfigurationSection parameters) { setEquation(parameters.getString("equation", "")); } public EquationTransform(String equation) { this(equation, "t"); } public EquationTransform(String equation, String inputVariable) { inputVariables = new HashSet<String>(); inputVariables.add(inputVariable); setEquation(equation); } public EquationTransform(String equation, String... inputVariables) { this.inputVariables = new HashSet<String>(); for (String inputVariable : inputVariables) { this.inputVariables.add(inputVariable); } setEquation(equation); } public void setEquation(String equation) { try { if (randFunction == null) { randFunction = new Function("rand", 2) { private Random random = new Random(); @Override public double apply(double... args) { return random.nextDouble() * (args[1] - args[0]) + args[0]; } }; } expression = new ExpressionBuilder(equation) .function(randFunction) .variables(inputVariables) .build(); } catch (Exception ex) { expression = null; org.bukkit.Bukkit.getLogger().log(Level.WARNING, "Error parsing equation " + equation, ex); } } @Override public double get(double t) { if (expression == null) { return 0; } for (String inputVariable : inputVariables) { expression.setVariable(inputVariable, t); } return expression.evaluate(); } public double get(double... t) { if (expression == null) { return 0; } int index = 0; for (String inputVariable : inputVariables) { expression.setVariable(inputVariable, t[index]); if (index < t.length - 1) index++; } return expression.evaluate(); } }