From 8a3c54afd127d01d2bb6adb2996b8e08aeffbe8c Mon Sep 17 00:00:00 2001 From: Ryan <7389646+ryanbarlow97@users.noreply.github.com> Date: Sun, 27 Sep 2026 11:21:44 +0000 Subject: [PATCH] Add hooks for confirming and refunding construction charges BeginVehicleConstructionEvent gains keepPlacement, so a listener can cancel the first left-click and wait for a confirming second one without the player having to reopen the station menu. A new VehicleConstructionCancelEvent fires when a started construction is abandoned, so charges taken at the start can be refunded alongside the dropped materials. Categories now keep their config order. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../vfbuilders/core/ActiveStation.java | 3 ++ .../events/BeginVehicleConstructionEvent.java | 14 ++++++ .../VehicleConstructionCancelEvent.java | 49 +++++++++++++++++++ .../vfbuilders/loaders/CategoryLoader.java | 4 +- .../vfbuilders/managers/StationManager.java | 4 +- 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/tfminecraft/vfbuilders/events/VehicleConstructionCancelEvent.java diff --git a/src/main/java/net/tfminecraft/vfbuilders/core/ActiveStation.java b/src/main/java/net/tfminecraft/vfbuilders/core/ActiveStation.java index 31b8201..3e92897 100644 --- a/src/main/java/net/tfminecraft/vfbuilders/core/ActiveStation.java +++ b/src/main/java/net/tfminecraft/vfbuilders/core/ActiveStation.java @@ -11,6 +11,7 @@ import net.tfminecraft.vfbuilders.api.ConstructionFreezes; import net.tfminecraft.vfbuilders.display.StationTimerDisplay; import net.tfminecraft.vfbuilders.events.VehicleConstructEvent; +import net.tfminecraft.vfbuilders.events.VehicleConstructionCancelEvent; import net.tfminecraft.vfbuilders.loaders.BlueprintLoader; import net.tfminecraft.vfbuilders.loaders.StationLoader; import net.tfminecraft.vehicleframework.VFLogger; @@ -144,6 +145,8 @@ public void complete() { public void cancelConstruction() { if (blueprint != null) { blueprint.drop(loc.clone().add(0.5, 1, 0.5)); + Bukkit.getPluginManager().callEvent( + new VehicleConstructionCancelEvent(constructorUuid, blueprint, this)); } removeHolograms(); spawnLoc = null; diff --git a/src/main/java/net/tfminecraft/vfbuilders/events/BeginVehicleConstructionEvent.java b/src/main/java/net/tfminecraft/vfbuilders/events/BeginVehicleConstructionEvent.java index 4c523d8..13d658a 100644 --- a/src/main/java/net/tfminecraft/vfbuilders/events/BeginVehicleConstructionEvent.java +++ b/src/main/java/net/tfminecraft/vfbuilders/events/BeginVehicleConstructionEvent.java @@ -17,6 +17,7 @@ public class BeginVehicleConstructionEvent extends Event implements Cancellable private final ActiveStation station; private final Location spawnLocation; private boolean cancelled; + private boolean keepPlacement; public BeginVehicleConstructionEvent( Player constructor, @@ -56,6 +57,19 @@ public void setCancelled(boolean cancelled) { this.cancelled = cancelled; } + /** + * Whether a cancelled event leaves the player's placement active, so another + * left-click within the placement window fires this event again. Listeners use + * this to ask for a confirming second click. + */ + public boolean isKeepPlacement() { + return keepPlacement; + } + + public void setKeepPlacement(boolean keepPlacement) { + this.keepPlacement = keepPlacement; + } + @Override public HandlerList getHandlers() { return HANDLERS; diff --git a/src/main/java/net/tfminecraft/vfbuilders/events/VehicleConstructionCancelEvent.java b/src/main/java/net/tfminecraft/vfbuilders/events/VehicleConstructionCancelEvent.java new file mode 100644 index 0000000..a0ea3e3 --- /dev/null +++ b/src/main/java/net/tfminecraft/vfbuilders/events/VehicleConstructionCancelEvent.java @@ -0,0 +1,49 @@ +package net.tfminecraft.vfbuilders.events; + +import java.util.UUID; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import net.tfminecraft.vfbuilders.core.ActiveStation; +import net.tfminecraft.vfbuilders.core.Blueprint; + +/** + * Fired when a started construction is abandoned, after its materials are dropped back + * at the station (the station was removed, or its blueprint disappeared on reload). + */ +public class VehicleConstructionCancelEvent extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + + private final UUID constructorUuid; + private final Blueprint blueprint; + private final ActiveStation station; + + public VehicleConstructionCancelEvent(UUID constructorUuid, Blueprint blueprint, ActiveStation station) { + this.constructorUuid = constructorUuid; + this.blueprint = blueprint; + this.station = station; + } + + /** Null for constructions saved before the constructor was recorded. */ + public UUID getConstructorUuid() { + return constructorUuid; + } + + public Blueprint getBlueprint() { + return blueprint; + } + + public ActiveStation getStation() { + return station; + } + + @Override + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } +} diff --git a/src/main/java/net/tfminecraft/vfbuilders/loaders/CategoryLoader.java b/src/main/java/net/tfminecraft/vfbuilders/loaders/CategoryLoader.java index c86302b..ae2c6fb 100644 --- a/src/main/java/net/tfminecraft/vfbuilders/loaders/CategoryLoader.java +++ b/src/main/java/net/tfminecraft/vfbuilders/loaders/CategoryLoader.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Set; @@ -15,7 +16,8 @@ import net.tfminecraft.vfbuilders.core.BlueprintCategory; public class CategoryLoader implements LoaderInterface{ - public static HashMap map = new HashMap<>(); + // Linked so menus list categories in config order. + public static HashMap map = new LinkedHashMap<>(); public static HashMap get(){ return map; diff --git a/src/main/java/net/tfminecraft/vfbuilders/managers/StationManager.java b/src/main/java/net/tfminecraft/vfbuilders/managers/StationManager.java index 2f76455..299e789 100644 --- a/src/main/java/net/tfminecraft/vfbuilders/managers/StationManager.java +++ b/src/main/java/net/tfminecraft/vfbuilders/managers/StationManager.java @@ -267,7 +267,9 @@ public void onPlayerLeftClick(PlayerInteractEvent e) { p, blueprint, station, clickLoc); Bukkit.getPluginManager().callEvent(beginEvent); if (beginEvent.isCancelled()) { - activePlacements.remove(uuid); + if (!beginEvent.isKeepPlacement()) { + activePlacements.remove(uuid); + } return; }