use of org.spongepowered.api.event.advancement.CriterionEvent 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;
}
use of org.spongepowered.api.event.advancement.CriterionEvent 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;
}
use of org.spongepowered.api.event.advancement.CriterionEvent in project SpongeCommon by SpongePowered.
the class AdvancementProgressMixin method impl$revokeCriterion.
private boolean impl$revokeCriterion(String rawCriterion) {
final net.minecraft.advancements.CriterionProgress criterionProgress = this.criteria.get(rawCriterion);
if (criterionProgress == null || !criterionProgress.isDone()) {
return false;
}
if (SpongeScoreCriterion.BYPASS_EVENT) {
criterionProgress.revoke();
return true;
}
final Cause cause = PhaseTracker.getCauseStackManager().currentCause();
final ServerPlayer player = ((PlayerAdvancementsBridge) this.impl$playerAdvancements).bridge$getPlayer();
final CriterionProgress progress = (CriterionProgress) criterionProgress;
final AdvancementCriterion criterion = progress.criterion();
final CriterionBridge criterionBridge = (CriterionBridge) criterion;
// The score criterion needs special care
final SpongeScoreCriterion scoreCriterion = criterionBridge.bridge$getScoreCriterion();
final CriterionEvent event;
final Advancement advancement = ((org.spongepowered.api.advancement.AdvancementProgress) this).advancement();
if (scoreCriterion != null) {
final SpongeScoreCriterionProgress scoreProgress = (SpongeScoreCriterionProgress) this.impl$progressMap.get(scoreCriterion.name());
final int lastScore = scoreProgress.score();
final int score = lastScore + 1;
if (lastScore == scoreCriterion.goal()) {
event = SpongeEventFactory.createCriterionEventScoreRevoke(cause, advancement, scoreCriterion, player, lastScore, score);
} else if (score == scoreCriterion.goal()) {
event = SpongeEventFactory.createCriterionEventScoreGrant(cause, advancement, scoreCriterion, player, Instant.now(), lastScore, score);
} else {
event = SpongeEventFactory.createCriterionEventScoreChange(cause, advancement, scoreCriterion, player, lastScore, score);
}
} else {
event = SpongeEventFactory.createCriterionEventRevoke(cause, advancement, criterion, player);
}
if (SpongeCommon.post(event)) {
return false;
}
criterionProgress.revoke();
return true;
}
use of org.spongepowered.api.event.advancement.CriterionEvent in project SpongeCommon by SpongePowered.
the class AdvancementProgressMixin method impl$grantCriterion.
private boolean impl$grantCriterion(String rawCriterion) {
final net.minecraft.advancements.CriterionProgress criterionProgress = this.criteria.get(rawCriterion);
if (criterionProgress == null || criterionProgress.isDone()) {
return false;
}
if (SpongeScoreCriterion.BYPASS_EVENT) {
criterionProgress.grant();
return true;
}
final Cause cause = PhaseTracker.getCauseStackManager().currentCause();
final ServerPlayer player = ((PlayerAdvancementsBridge) this.impl$playerAdvancements).bridge$getPlayer();
final CriterionProgress progress = (CriterionProgress) criterionProgress;
final AdvancementCriterion criterion = progress.criterion();
final CriterionBridge criterionBridge = (CriterionBridge) criterion;
// The score criterion needs special care
final SpongeScoreCriterion scoreCriterion = criterionBridge.bridge$getScoreCriterion();
final CriterionEvent event;
if (scoreCriterion != null) {
final SpongeScoreCriterionProgress scoreProgress = (SpongeScoreCriterionProgress) this.impl$progressMap.get(scoreCriterion.name());
final int lastScore = scoreProgress.score();
final int score = lastScore + 1;
if (lastScore == scoreCriterion.goal()) {
event = SpongeEventFactory.createCriterionEventScoreRevoke(cause, this.bridge$getAdvancement(), scoreCriterion, player, lastScore, score);
} else if (score == scoreCriterion.goal()) {
event = SpongeEventFactory.createCriterionEventScoreGrant(cause, this.bridge$getAdvancement(), scoreCriterion, player, Instant.now(), lastScore, score);
} else {
event = SpongeEventFactory.createCriterionEventScoreChange(cause, this.bridge$getAdvancement(), scoreCriterion, player, lastScore, score);
}
} else {
event = SpongeEventFactory.createCriterionEventGrant(cause, this.bridge$getAdvancement(), criterion, player, Instant.now());
}
if (SpongeCommon.post(event)) {
return false;
}
criterionProgress.grant();
return true;
}
Aggregations