use of org.spongepowered.common.advancement.SpongeScoreCriterion 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.common.advancement.SpongeScoreCriterion 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.common.advancement.SpongeScoreCriterion 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.common.advancement.SpongeScoreCriterion in project SpongeCommon by SpongePowered.
the class MixinAdvancement method onInit.
@SuppressWarnings("ConstantConditions")
@Inject(method = "<init>", at = @At("RETURN"))
private void onInit(ResourceLocation id, @Nullable Advancement parentIn, @Nullable DisplayInfo displayIn, AdvancementRewards rewardsIn, Map<String, Criterion> criteriaIn, String[][] requirementsIn, CallbackInfo ci) {
if (displayIn != null) {
((IMixinDisplayInfo) displayIn).setAdvancement(this);
}
String path = id.getResourcePath();
this.name = path.replace('/', '_');
this.spongeId = id.getResourceDomain() + ':' + this.name;
if (displayIn != null) {
this.name = SpongeTexts.toPlain(displayIn.getTitle());
}
if (!AdvancementRegistryModule.INSIDE_REGISTER_EVENT) {
AdvancementRegistryModule.getInstance().registerAdditionalCatalog(this);
} else {
// Wait to set the parent until the advancement is registered
this.tempParent = parentIn;
this.parent = SpongeAdvancementBuilder.DUMMY_ROOT_ADVANCEMENT;
}
// This is only possible when REGISTER_ADVANCEMENTS_ON_CONSTRUCT is true
if (parentIn == null) {
// Remove the root suffix from json file tree ids
if (path.endsWith("/root")) {
path = path.substring(0, path.lastIndexOf('/'));
}
path = path.replace('/', '_');
String name = path;
if (displayIn != null) {
name = this.name;
}
path = id.getResourceDomain() + ':' + path;
this.tree = new SpongeAdvancementTree(this, path, name);
AdvancementTreeRegistryModule.getInstance().registerAdditionalCatalog(this.tree);
} else {
this.tree = ((org.spongepowered.api.advancement.Advancement) parentIn).getTree().orElse(null);
}
this.text = SpongeTexts.toText(this.displayText);
final ImmutableList.Builder<Text> toastText = ImmutableList.builder();
if (this.display != null) {
final FrameType frameType = this.display.getFrame();
toastText.add(Text.builder(new SpongeTranslation("advancements.toast." + frameType.getName())).format(((AdvancementType) (Object) frameType).getTextFormat()).build());
toastText.add(getDisplayInfo().get().getTitle());
} else {
toastText.add(Text.of("Unlocked advancement"));
toastText.add(Text.of(getId()));
}
this.toastText = toastText.build();
final Set<String> scoreCriteria = new HashSet<>();
final Map<String, ICriterion> criterionMap = new HashMap<>();
for (Map.Entry<String, Criterion> entry : new HashMap<>(criteriaIn).entrySet()) {
final IMixinCriterion mixinCriterion = (IMixinCriterion) entry.getValue();
final ICriterion criterion;
if (mixinCriterion.getScoreGoal() != null) {
criterion = new SpongeScoreCriterion(entry.getKey(), mixinCriterion.getScoreGoal(), entry.getValue().getCriterionInstance());
scoreCriteria.add(entry.getKey());
((SpongeScoreCriterion) criterion).internalCriteria.forEach(criterion1 -> criteriaIn.put(criterion1.getName(), (Criterion) criterion1));
} else {
criterion = (ICriterion) mixinCriterion;
((IMixinCriterion) criterion).setName(entry.getKey());
}
criterionMap.put(entry.getKey(), criterion);
}
final List<String[]> entries = new ArrayList<>();
final List<AdvancementCriterion> andCriteria = new ArrayList<>();
for (String[] array : requirementsIn) {
final Set<AdvancementCriterion> orCriteria = new HashSet<>();
for (String name : array) {
final ICriterion criterion = criterionMap.get(name);
if (criterion instanceof SpongeScoreCriterion) {
((SpongeScoreCriterion) criterion).internalCriteria.forEach(criterion1 -> entries.add(new String[] { criterion1.getName() }));
} else {
entries.add(new String[] { criterion.getName() });
}
orCriteria.add(criterion);
}
andCriteria.add(OrCriterion.of(orCriteria));
}
this.criterion = AndCriterion.of(andCriteria);
if (!scoreCriteria.isEmpty()) {
scoreCriteria.forEach(criteriaIn::remove);
this.criteria = ImmutableMap.copyOf(criteriaIn);
this.requirements = entries.toArray(new String[entries.size()][]);
}
}
Aggregations