Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package io.papermc.paper.event.player;

import org.bukkit.advancement.Advancement;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;

/**
* An event fired when a {@link Player} has an advancement revoked
*/
@NullMarked
public final class PlayerAdvancementCriterionRevokeEvent extends PlayerEvent implements Cancellable {

private static final HandlerList HANDLER_LIST = new HandlerList();

private boolean cancelled;

private final Advancement advancement;
private final String criterion;

@ApiStatus.Internal
public PlayerAdvancementCriterionRevokeEvent(final Player player, Advancement advancement, String criterion) {
super(player);
this.advancement = advancement;
this.criterion = criterion;
}

/**
* Gets the advancement associated with this event.
*
* @return the advancement being revoked
*/
public Advancement getAdvancement() {
return this.advancement;
}

/**
* Gets the criterion associated with this event.
*
* @return the criterion being revoked
*/
public String getCriterion() {
return this.criterion;
}

@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}

public boolean isCancelled() {
return this.cancelled;
}

public void setCancelled(final boolean cancel) {
this.cancelled = cancel;
}

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package io.papermc.paper.event.player;

import org.bukkit.advancement.Advancement;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.ApiStatus;
import org.jspecify.annotations.NullMarked;

/**
* An event fired when a {@link Player} has an advancement revoked
*/
@NullMarked
public final class PlayerAdvancementRevokeEvent extends PlayerEvent implements Cancellable {

private static final HandlerList HANDLER_LIST = new HandlerList();

private boolean cancelled;

private final Advancement advancement;

@ApiStatus.Internal
public PlayerAdvancementRevokeEvent(final Player player, Advancement advancement) {
super(player);
this.advancement = advancement;
}

/**
* Gets the advancement associated with this event.
*
* @return the advancement being revoked
*/
public Advancement getAdvancement() {
return this.advancement;
}

@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}

public boolean isCancelled() {
return this.cancelled;
}

public void setCancelled(final boolean cancel) {
this.cancelled = cancel;
}

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,37 @@
}
});
}
@@ -193,10 +_,30 @@
boolean result = false;
AdvancementProgress progress = this.getOrStartProgress(advancement);
boolean wasDone = progress.isDone();
+
if (progress.revokeProgress(criterion)) {
+ // Paper start - Add PlayerAdvancementCriterionRevokeEvent
+ if (!new io.papermc.paper.event.player.PlayerAdvancementCriterionRevokeEvent(this.player.getBukkitEntity(), advancement.toBukkit(), criterion).callEvent()) {
+ progress.grantProgress(criterion);
+ return false;
+ }
+ // Paper end - Add PlayerAdvancementCriterionRevokeEvent
+
this.registerListeners(advancement);
this.progressChanged.add(advancement);
result = true;
+
+ if (wasDone && !progress.isDone()) {
+ // Paper start - Add PlayerAdvancementRevokeEvent
+ final io.papermc.paper.event.player.PlayerAdvancementRevokeEvent event = new io.papermc.paper.event.player.PlayerAdvancementRevokeEvent(this.player.getBukkitEntity(), advancement.toBukkit());
+ this.player.level().getCraftServer().getPluginManager().callEvent(event);
+
+ if (!event.callEvent()) { // Cancelled
+ progress.grantProgress(criterion);
+ return false;
+ }
+ // Paper end - Add PlayerAdvancementRevokeEvent
+ }
Comment thread
FlowerDevelops marked this conversation as resolved.
Resolved
}

if (wasDone && !progress.isDone()) {
@@ -239,7 +_,7 @@
public void flushDirty(final ServerPlayer player, final boolean showAdvancements) {
if (this.isFirstPacket || !this.rootsToUpdate.isEmpty() || !this.progressChanged.isEmpty()) {
Expand Down