Skip to content
Merged
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
Expand Up @@ -124,7 +124,8 @@ private void openOnPlayerThread() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen result: player={}", player.getName());
complete(ScreenResult.answer(answer), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.answer(answer));
});

anvilGui.createInventory();
Expand Down Expand Up @@ -241,7 +242,8 @@ private void setupItems() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen cancel: player={}", player.getName());
complete(ScreenResult.manualCancel(), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.manualCancel());
});
anvilGui.getSecondItemComponent().addItem(cancelGuiItem, 0, 0);
}
Expand Down Expand Up @@ -295,6 +297,24 @@ public void close() {
scheduleCleanup(gui, impl, true);
}

/**
* Finishes a click-triggered result on the next tick. Closing the anvil inside the click event
* left the client holding its predicted cursor item (a copy of the input), which creative-mode
* players could then keep. Waiting one tick lets the server resync the cancelled click first.
*/
private void completeAfterClick(ScreenResult result) {
try {
ScheduledTask task =
player.getScheduler().run(plugin, ignored -> complete(result, true), null);
if (task != null) {
return;
}
} catch (Throwable ignored) {
// Fall through and finish now.
}
complete(result, true);
}

private void complete(ScreenResult result, boolean closePlayer) {
AnvilGui gui;
AnvilInventoryImpl impl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ private void openOnPlayerThread() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen result: player={}", player.getName());
complete(ScreenResult.answer(answer), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.answer(answer));
});

anvilGui.createInventory();
Expand Down Expand Up @@ -238,7 +239,8 @@ private void setupItems() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen cancel: player={}", player.getName());
complete(ScreenResult.manualCancel(), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.manualCancel());
});
anvilGui.getSecondItemComponent().addItem(cancelGuiItem, 0, 0);
}
Expand Down Expand Up @@ -292,6 +294,24 @@ public void close() {
scheduleCleanup(gui, impl, true);
}

/**
* Finishes a click-triggered result on the next tick. Closing the anvil inside the click event
* left the client holding its predicted cursor item (a copy of the input), which creative-mode
* players could then keep. Waiting one tick lets the server resync the cancelled click first.
*/
private void completeAfterClick(ScreenResult result) {
try {
ScheduledTask task =
player.getScheduler().run(plugin, ignored -> complete(result, true), null);
if (task != null) {
return;
}
} catch (Throwable ignored) {
// Fall through and finish now.
}
complete(result, true);
}

private void complete(ScreenResult result, boolean closePlayer) {
AnvilGui gui;
AnvilInventoryImpl impl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ private void openOnPlayerThread() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen result: player={}", player.getName());
complete(ScreenResult.answer(answer), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.answer(answer));
});

anvilGui.createInventory();
Expand Down Expand Up @@ -238,7 +239,8 @@ private void setupItems() {
plugin
.getSLF4JLogger()
.debug("FrameworkAnvilScreen cancel: player={}", player.getName());
complete(ScreenResult.manualCancel(), true);
event.setCancelled(true);
completeAfterClick(ScreenResult.manualCancel());
});
anvilGui.getSecondItemComponent().addItem(cancelGuiItem, 0, 0);
}
Expand Down Expand Up @@ -292,6 +294,24 @@ public void close() {
scheduleCleanup(gui, impl, true);
}

/**
* Finishes a click-triggered result on the next tick. Closing the anvil inside the click event
* left the client holding its predicted cursor item (a copy of the input), which creative-mode
* players could then keep. Waiting one tick lets the server resync the cancelled click first.
*/
private void completeAfterClick(ScreenResult result) {
try {
ScheduledTask task =
player.getScheduler().run(plugin, ignored -> complete(result, true), null);
if (task != null) {
return;
}
} catch (Throwable ignored) {
// Fall through and finish now.
}
complete(result, true);
}

private void complete(ScreenResult result, boolean closePlayer) {
AnvilGui gui;
AnvilInventoryImpl impl;
Expand Down
Loading