package buildcraft.api.properties; import java.util.List; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IUnlistedProperty; public class BuildCraftExtendedProperty<T extends Comparable<T>> extends BuildCraftProperty<T> implements IUnlistedProperty<T> { private final Predicate<T> function; public BuildCraftExtendedProperty(String name, Class<T> clazz, Predicate<T> allowingFunction) { super(name, clazz); function = allowingFunction; } public BuildCraftExtendedProperty(String name, Class<T> clazz, List<T> allowedValues) { super(name, clazz, allowedValues); function = null; } public static BuildCraftExtendedProperty<Double> create(String name, final double min, final double max) { return new BuildCraftExtendedProperty<Double>(name, Double.class, new Predicate<Double>() { @Override public boolean apply(Double input) { return input >= min && input <= max; } }); } /** This is useful if you want to use a particular class for this property, but don't care what the class contains * (it will never contain an incorrect value) */ public static <T extends Comparable<T>> BuildCraftExtendedProperty<T> createExtended(String name, Class clazz) { return new BuildCraftExtendedProperty<T>(name, clazz, Predicates.<T> alwaysTrue()); } @Override public boolean isValid(T value) { if (function == null) { return values.contains(value); } return function.apply(value); } @Override public Class<T> getType() { return getValueClass(); } @Override public String valueToString(T value) { return valueName(value); } public T getUnlistedValue(IExtendedBlockState state) { return state.getValue(asUnlistedProperty()); } // Helper methods for arguments public IUnlistedProperty<T> asUnlistedProperty() { return this; } }