package com.hypixel.hytale.server.npc.asset.builder; import com.hypixel.hytale.server.npc.asset.builder.providerevaluators.ProviderEvaluator; import com.hypixel.hytale.server.npc.util.expression.ExecutionContext; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import java.util.Collections; import java.util.List; import java.util.function.BiConsumer; import javax.annotation.Nonnull; public class FeatureEvaluatorHelper { @Nonnull private List evaluators = new ObjectArrayList(); private List> providerReferenceValidators; private List> componentRequirementValidators; private boolean locked; private boolean containsProviderReference; private boolean isFeatureRequiringComponent; private boolean disallowParameterProviders; public FeatureEvaluatorHelper() { } public FeatureEvaluatorHelper(boolean couldRequireFeature) { this.isFeatureRequiringComponent = couldRequireFeature; } public boolean isDisallowParameterProviders() { return this.disallowParameterProviders; } public void add(ProviderEvaluator evaluator) { this.evaluators.add(evaluator); } public boolean canAddProvider() { return !this.locked; } @Nonnull public FeatureEvaluatorHelper lock() { this.locked = true; this.evaluators = Collections.unmodifiableList(this.evaluators); return this; } public void setContainsReference() { this.containsProviderReference = true; } public void addProviderReferenceValidator(BiConsumer referenceValidator) { if (this.providerReferenceValidators == null) { this.providerReferenceValidators = new ObjectArrayList(); } this.providerReferenceValidators.add(referenceValidator); } public void addComponentRequirementValidator(BiConsumer validator) { if (this.componentRequirementValidators == null) { this.componentRequirementValidators = new ObjectArrayList(); } this.componentRequirementValidators.add(validator); } @Nonnull public List getProviders() { return this.evaluators; } public boolean requiresProviderReferenceEvaluation() { return this.containsProviderReference; } public boolean belongsToFeatureRequiringComponent() { return this.isFeatureRequiringComponent; } public void validateProviderReferences(BuilderManager manager, ExecutionContext context) { if (this.providerReferenceValidators != null) { for (BiConsumer validator : this.providerReferenceValidators) { validator.accept(manager, context); } } } public void validateComponentRequirements(FeatureEvaluatorHelper providers, ExecutionContext context) { if (this.componentRequirementValidators != null) { for (BiConsumer validator : this.componentRequirementValidators) { validator.accept(providers, context); } } } public void disallowParameterProviders() { this.disallowParameterProviders = true; } }