@Override
public <T> List<ConfigFunction<T>> getConfigFunctions(T holder, boolean useFallback)
{
List<ConfigFunction<T>> result = new ArrayList<ConfigFunction<T>>(configFunctions.size());
ConfigFunctionsManager manager = TerrainControl.getConfigFunctionsManager();
for (StringOnLine configFunctionLine : configFunctions)
{
String configFunctionString = configFunctionLine.string;
int bracketIndex = configFunctionString.indexOf('(');
String functionName = configFunctionString.substring(0, bracketIndex);
String parameters = configFunctionString.substring(bracketIndex + 1, configFunctionString.length() - 1);
List<String> args = Arrays.asList(StringHelper.readCommaSeperatedString(parameters));
ConfigFunction<T> function = manager.getConfigFunction(functionName, holder, args);
result.add(function);
if (!function.isValid())
{
TerrainControl.log(LogMarker.WARN, "Invalid resource {} in {} on line {}: {}",
functionName, this.name, configFunctionLine.line, function.getError());