Search in sources :

Example 1 with CriterionProgress

use of org.spongepowered.api.advancement.criteria.CriterionProgress in project SpongeCommon by SpongePowered.

the class MixinAdvancementProgress method revokeCriterion.

/**
 * @author Cybermaxke
 * @reason Rewrite the method to add support for triggering
 *         score criteria and calling revoke events.
 */
@Overwrite
public boolean revokeCriterion(String criterionIn) {
    final net.minecraft.advancements.CriterionProgress criterionProgress = this.criteria.get(criterionIn);
    if (criterionProgress == null || !criterionProgress.isObtained()) {
        return false;
    }
    if (SpongeScoreCriterion.BYPASS_EVENT) {
        criterionProgress.reset();
        return true;
    }
    final Cause cause = SpongeImpl.getCauseStackManager().getCurrentCause();
    final Player player = ((IMixinPlayerAdvancements) this.playerAdvancements).getPlayer();
    final CriterionProgress progress = (CriterionProgress) criterionProgress;
    final AdvancementCriterion criterion = progress.getCriterion();
    final IMixinCriterion mixinCriterion = (IMixinCriterion) criterion;
    // The score criterion needs special care
    final SpongeScoreCriterion scoreCriterion = mixinCriterion.getScoreCriterion();
    CriterionEvent event;
    if (scoreCriterion != null) {
        final SpongeScoreCriterionProgress scoreProgress = (SpongeScoreCriterionProgress) get(scoreCriterion).get();
        final int lastScore = scoreProgress.getScore();
        final int score = lastScore + 1;
        if (lastScore == scoreCriterion.getGoal()) {
            event = SpongeEventFactory.createCriterionEventScoreRevoke(cause, getAdvancement(), scoreCriterion, player, lastScore, score);
        } else if (score == scoreCriterion.getGoal()) {
            event = SpongeEventFactory.createCriterionEventScoreGrant(cause, getAdvancement(), scoreCriterion, player, Instant.now(), lastScore, score);
        } else {
            event = SpongeEventFactory.createCriterionEventScoreChange(cause, getAdvancement(), scoreCriterion, player, lastScore, score);
        }
    } else {
        event = SpongeEventFactory.createCriterionEventRevoke(cause, getAdvancement(), criterion, player);
    }
    if (SpongeImpl.postEvent(event)) {
        return false;
    }
    criterionProgress.reset();
    return true;
}
Also used : Player(org.spongepowered.api.entity.living.player.Player) CriterionEvent(org.spongepowered.api.event.advancement.CriterionEvent) ScoreAdvancementCriterion(org.spongepowered.api.advancement.criteria.ScoreAdvancementCriterion) AdvancementCriterion(org.spongepowered.api.advancement.criteria.AdvancementCriterion) SpongeScoreCriterion(org.spongepowered.common.advancement.SpongeScoreCriterion) IMixinPlayerAdvancements(org.spongepowered.common.interfaces.advancement.IMixinPlayerAdvancements) SpongeScoreCriterionProgress(org.spongepowered.common.advancement.SpongeScoreCriterionProgress) IMixinCriterion(org.spongepowered.common.interfaces.advancement.IMixinCriterion) Cause(org.spongepowered.api.event.cause.Cause) SpongeOrCriterionProgress(org.spongepowered.common.advancement.SpongeOrCriterionProgress) IMixinCriterionProgress(org.spongepowered.common.interfaces.advancement.IMixinCriterionProgress) SpongeScoreCriterionProgress(org.spongepowered.common.advancement.SpongeScoreCriterionProgress) ScoreCriterionProgress(org.spongepowered.api.advancement.criteria.ScoreCriterionProgress) ICriterionProgress(org.spongepowered.common.advancement.ICriterionProgress) SpongeAndCriterionProgress(org.spongepowered.common.advancement.SpongeAndCriterionProgress) CriterionProgress(org.spongepowered.api.advancement.criteria.CriterionProgress) Overwrite(org.spongepowered.asm.mixin.Overwrite)

Example 2 with CriterionProgress

use of org.spongepowered.api.advancement.criteria.CriterionProgress in project SpongeCommon by SpongePowered.

the class MixinAdvancementProgress method grantCriterion.

/**
 * @author Cybermaxke
 * @reason Rewrite the method to add support for triggering
 *         score criteria and calling grant events.
 */
@Overwrite
public boolean grantCriterion(String criterionIn) {
    final net.minecraft.advancements.CriterionProgress criterionProgress = this.criteria.get(criterionIn);
    if (criterionProgress == null || criterionProgress.isObtained()) {
        return false;
    }
    if (SpongeScoreCriterion.BYPASS_EVENT) {
        criterionProgress.obtain();
        return true;
    }
    final Cause cause = SpongeImpl.getCauseStackManager().getCurrentCause();
    final Player player = ((IMixinPlayerAdvancements) this.playerAdvancements).getPlayer();
    final CriterionProgress progress = (CriterionProgress) criterionProgress;
    final AdvancementCriterion criterion = progress.getCriterion();
    final IMixinCriterion mixinCriterion = (IMixinCriterion) criterion;
    // The score criterion needs special care
    final SpongeScoreCriterion scoreCriterion = mixinCriterion.getScoreCriterion();
    CriterionEvent event;
    if (scoreCriterion != null) {
        final SpongeScoreCriterionProgress scoreProgress = (SpongeScoreCriterionProgress) get(scoreCriterion).get();
        final int lastScore = scoreProgress.getScore();
        final int score = lastScore + 1;
        if (lastScore == scoreCriterion.getGoal()) {
            event = SpongeEventFactory.createCriterionEventScoreRevoke(cause, getAdvancement(), scoreCriterion, player, lastScore, score);
        } else if (score == scoreCriterion.getGoal()) {
            event = SpongeEventFactory.createCriterionEventScoreGrant(cause, getAdvancement(), scoreCriterion, player, Instant.now(), lastScore, score);
        } else {
            event = SpongeEventFactory.createCriterionEventScoreChange(cause, getAdvancement(), scoreCriterion, player, lastScore, score);
        }
    } else {
        event = SpongeEventFactory.createCriterionEventGrant(cause, getAdvancement(), criterion, player, Instant.now());
    }
    if (SpongeImpl.postEvent(event)) {
        return false;
    }
    criterionProgress.obtain();
    return true;
}
Also used : Player(org.spongepowered.api.entity.living.player.Player) CriterionEvent(org.spongepowered.api.event.advancement.CriterionEvent) ScoreAdvancementCriterion(org.spongepowered.api.advancement.criteria.ScoreAdvancementCriterion) AdvancementCriterion(org.spongepowered.api.advancement.criteria.AdvancementCriterion) SpongeScoreCriterion(org.spongepowered.common.advancement.SpongeScoreCriterion) IMixinPlayerAdvancements(org.spongepowered.common.interfaces.advancement.IMixinPlayerAdvancements) SpongeScoreCriterionProgress(org.spongepowered.common.advancement.SpongeScoreCriterionProgress) IMixinCriterion(org.spongepowered.common.interfaces.advancement.IMixinCriterion) Cause(org.spongepowered.api.event.cause.Cause) SpongeOrCriterionProgress(org.spongepowered.common.advancement.SpongeOrCriterionProgress) IMixinCriterionProgress(org.spongepowered.common.interfaces.advancement.IMixinCriterionProgress) SpongeScoreCriterionProgress(org.spongepowered.common.advancement.SpongeScoreCriterionProgress) ScoreCriterionProgress(org.spongepowered.api.advancement.criteria.ScoreCriterionProgress) ICriterionProgress(org.spongepowered.common.advancement.ICriterionProgress) SpongeAndCriterionProgress(org.spongepowered.common.advancement.SpongeAndCriterionProgress) CriterionProgress(org.spongepowered.api.advancement.criteria.CriterionProgress) Overwrite(org.spongepowered.asm.mixin.Overwrite)

Aggregations

AdvancementCriterion (org.spongepowered.api.advancement.criteria.AdvancementCriterion)2 CriterionProgress (org.spongepowered.api.advancement.criteria.CriterionProgress)2 ScoreAdvancementCriterion (org.spongepowered.api.advancement.criteria.ScoreAdvancementCriterion)2 ScoreCriterionProgress (org.spongepowered.api.advancement.criteria.ScoreCriterionProgress)2 Player (org.spongepowered.api.entity.living.player.Player)2 CriterionEvent (org.spongepowered.api.event.advancement.CriterionEvent)2 Cause (org.spongepowered.api.event.cause.Cause)2 Overwrite (org.spongepowered.asm.mixin.Overwrite)2 ICriterionProgress (org.spongepowered.common.advancement.ICriterionProgress)2 SpongeAndCriterionProgress (org.spongepowered.common.advancement.SpongeAndCriterionProgress)2 SpongeOrCriterionProgress (org.spongepowered.common.advancement.SpongeOrCriterionProgress)2 SpongeScoreCriterion (org.spongepowered.common.advancement.SpongeScoreCriterion)2 SpongeScoreCriterionProgress (org.spongepowered.common.advancement.SpongeScoreCriterionProgress)2 IMixinCriterion (org.spongepowered.common.interfaces.advancement.IMixinCriterion)2 IMixinCriterionProgress (org.spongepowered.common.interfaces.advancement.IMixinCriterionProgress)2 IMixinPlayerAdvancements (org.spongepowered.common.interfaces.advancement.IMixinPlayerAdvancements)2