use of org.spongepowered.api.advancement.criteria.AdvancementCriterion in project SpongeCommon by SpongePowered.
the class MixinAdvancementProgress method processProgressMap.
private void processProgressMap(AdvancementCriterion criterion, Map<AdvancementCriterion, ICriterionProgress> progressMap) {
if (criterion instanceof OperatorCriterion) {
((OperatorCriterion) criterion).getCriteria().forEach(child -> processProgressMap(child, progressMap));
if (criterion instanceof AndCriterion) {
progressMap.put(criterion, new SpongeAndCriterionProgress(this, (SpongeAndCriterion) criterion));
} else if (criterion instanceof OrCriterion) {
progressMap.put(criterion, new SpongeOrCriterionProgress(this, (SpongeOrCriterion) criterion));
}
} else if (criterion instanceof SpongeScoreCriterion) {
final SpongeScoreCriterion scoreCriterion = (SpongeScoreCriterion) criterion;
for (AdvancementCriterion internalCriterion : scoreCriterion.internalCriteria) {
final IMixinCriterionProgress progress = (IMixinCriterionProgress) this.criteria.get(internalCriterion.getName());
progress.setCriterion(internalCriterion);
progressMap.put(internalCriterion, (ICriterionProgress) progress);
}
progressMap.put(scoreCriterion, new SpongeScoreCriterionProgress(this, scoreCriterion));
} else if (criterion != SpongeEmptyCriterion.INSTANCE) {
final IMixinCriterionProgress progress = (IMixinCriterionProgress) this.criteria.get(criterion.getName());
progress.setCriterion(criterion);
progressMap.put(criterion, (ICriterionProgress) progress);
}
}
use of org.spongepowered.api.advancement.criteria.AdvancementCriterion in project SpongeCommon by SpongePowered.
the class MixinICriterionTriggerListener method onGrantCriterion.
@SuppressWarnings("unchecked")
@Inject(method = "grantCriterion", at = @At("HEAD"), cancellable = true)
private void onGrantCriterion(PlayerAdvancements playerAdvancements, CallbackInfo ci) {
final org.spongepowered.api.advancement.Advancement advancement = (org.spongepowered.api.advancement.Advancement) this.advancement;
AdvancementCriterion advancementCriterion = (AdvancementCriterion) this.advancement.getCriteria().get(this.criterionName);
final IMixinCriterion mixinCriterion = (IMixinCriterion) advancementCriterion;
if (mixinCriterion.getScoreCriterion() != null) {
advancementCriterion = mixinCriterion.getScoreCriterion();
}
// Sponge filters are always handled in the trigger method
if (!(this.criterionInstance instanceof SpongeFilteredTrigger)) {
final FilteredTrigger filteredTrigger = (FilteredTrigger) this.criterionInstance;
if (filteredTrigger.getType() instanceof SpongeTrigger) {
final Cause cause = Sponge.getCauseStackManager().getCurrentCause();
final Player player = ((IMixinPlayerAdvancements) playerAdvancements).getPlayer();
final TypeToken typeToken = TypeToken.of(filteredTrigger.getType().getConfigurationType());
final CriterionEvent.Trigger event = SpongeEventFactory.createCriterionEventTrigger(cause, advancement, advancementCriterion, typeToken, player, filteredTrigger, true);
SpongeImpl.postEvent(event);
if (!event.getResult()) {
ci.cancel();
return;
}
}
}
SpongeImpl.getCauseStackManager().pushCause(this.criterionInstance);
// the score be increased by one.
if (advancementCriterion instanceof ScoreAdvancementCriterion) {
((IMixinPlayerAdvancements) playerAdvancements).getPlayer().getProgress(advancement).get((ScoreAdvancementCriterion) advancementCriterion).get().add(1);
ci.cancel();
SpongeImpl.getCauseStackManager().popCause();
}
}
use of org.spongepowered.api.advancement.criteria.AdvancementCriterion in project SpongeCommon by SpongePowered.
the class MixinPlayerAdvancements method onUnregisterListenersGetProgress.
@Redirect(method = "registerListeners(Lnet/minecraft/advancements/Advancement;)V", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/advancements/CriterionProgress;isObtained()Z"))
private boolean onUnregisterListenersGetProgress(CriterionProgress progress) {
final AdvancementCriterion criterion = ((org.spongepowered.api.advancement.criteria.CriterionProgress) progress).getCriterion();
final IMixinCriterion mixinCriterion = (IMixinCriterion) criterion;
// Only remove the trigger once the goal is reached
if (mixinCriterion.getScoreCriterion() != null) {
return ((IMixinCriterionProgress) progress).getAdvancementProgress().get(mixinCriterion.getScoreCriterion()).get().achieved();
}
return progress.isObtained();
}
use of org.spongepowered.api.advancement.criteria.AdvancementCriterion in project LanternServer by LanternPowered.
the class AbstractCriterion method build.
private static AdvancementCriterion build(Class<? extends OperatorCriterion> type, Function<Set<AdvancementCriterion>, AdvancementCriterion> function, AdvancementCriterion criterion, Iterable<AdvancementCriterion> criteria) {
checkNotNull(criteria, "criteria");
final List<AdvancementCriterion> builder = new ArrayList<>();
build(type, criterion, builder);
for (AdvancementCriterion criterion1 : criteria) {
build(type, criterion1, builder);
}
return builder.isEmpty() ? EmptyCriterion.INSTANCE : builder.size() == 1 ? builder.get(0) : function.apply(ImmutableSet.copyOf(builder));
}
use of org.spongepowered.api.advancement.criteria.AdvancementCriterion in project LanternServer by LanternPowered.
the class LanternTrigger method trigger.
@SuppressWarnings("unchecked")
@Override
public void trigger(Player player) {
final LanternPlayerAdvancements playerAdvancements = ((LanternPlayer) player).getAdvancementsProgress();
final Collection<AbstractCriterionProgress> collection = this.progress.get(playerAdvancements);
if (!collection.isEmpty()) {
final Cause cause = CauseStack.current().getCurrentCause();
for (AbstractCriterionProgress progress : new ArrayList<>(this.progress.get(playerAdvancements))) {
final Advancement advancement = progress.getAdvancementProgress().getAdvancement();
final AdvancementCriterion criterion = progress.getCriterion();
final FilteredTrigger filteredTrigger = criterion.getTrigger().get();
final CriterionEvent.Trigger event = SpongeEventFactory.createCriterionEventTrigger(cause, advancement, criterion, this.configTypeToken, player, filteredTrigger, this.eventHandler != null);
if (this.eventHandler != null) {
this.eventHandler.accept(event);
}
Sponge.getEventManager().post(event);
if (event.getResult()) {
if (progress instanceof ScoreCriterionProgress) {
((ScoreCriterionProgress) progress).add(1);
} else {
progress.grant();
}
}
}
}
}
Aggregations