use of org.spongepowered.common.advancement.criterion.SpongeOperatorCriterion in project SpongeCommon by SpongePowered.
the class SpongeCriterionUtil method collectCriteria.
private static List<List<String>> collectCriteria(final AdvancementCriterion criterion, final Map<String, Criterion> criteria) {
List<List<String>> requirements = new ArrayList<>();
if (criterion instanceof SpongeAndCriterion) {
((SpongeOperatorCriterion) criterion).criteria().forEach(c -> requirements.addAll(SpongeCriterionUtil.collectCriteria(c, criteria)));
} else if (criterion instanceof SpongeOrCriterion) {
// OR List of AND Criteria of OR Criteria
final List<List<List<String>>> andRequirementsList = ((SpongeOperatorCriterion) criterion).criteria().stream().map(c -> SpongeCriterionUtil.collectCriteria(c, criteria)).collect(Collectors.toList());
List<List<String>> finalList = new ArrayList<>();
// For every AND Criteria
for (List<List<String>> andRequirements : andRequirementsList) {
if (finalList.isEmpty()) {
// Just take the first one in as is
finalList.addAll(andRequirements);
} else {
List<List<String>> workingList = new ArrayList<>();
for (List<String> andRequirement : andRequirements) {
for (List<String> prevAndRequirement : finalList) {
// For every AND requirement and FOR every previous AND requirement
// combine their OR requirements
// !! this can get very big very quickly !!
// TODO limit requirement count?
final List<String> newAndRequirement = new ArrayList<>(prevAndRequirement);
newAndRequirement.addAll(andRequirement);
workingList.add(newAndRequirement);
}
}
finalList = workingList;
}
}
requirements.addAll(finalList);
} else if (criterion instanceof SpongeScoreCriterion) {
final SpongeScoreCriterion scoreCriterion = (SpongeScoreCriterion) criterion;
for (int i = 0; i < scoreCriterion.goal(); i++) {
final DefaultedAdvancementCriterion internalCriterion = scoreCriterion.internalCriteria.get(i);
criteria.put(internalCriterion.name(), ((Criterion) internalCriterion));
requirements.add(Collections.singletonList(internalCriterion.name()));
}
} else {
criteria.put(criterion.name(), (Criterion) criterion);
requirements.add(Collections.singletonList(criterion.name()));
}
return requirements;
}
Aggregations