diff --git a/src/main/java/net/knarcraft/paidsigns/listener/SignBreakListener.java b/src/main/java/net/knarcraft/paidsigns/listener/SignBreakListener.java index 8e604e2..137e762 100644 --- a/src/main/java/net/knarcraft/paidsigns/listener/SignBreakListener.java +++ b/src/main/java/net/knarcraft/paidsigns/listener/SignBreakListener.java @@ -94,7 +94,7 @@ public class SignBreakListener implements Listener { private void removeTrackedSign(Block block, boolean refund) { if (block.getState() instanceof Sign) { try { - TrackedSignManager.removeTrackedSign(block.getLocation(), refund); + TrackedSignManager.removeTrackedSign(block.getLocation(), refund, false); } catch (IOException ignored) { } } diff --git a/src/main/java/net/knarcraft/paidsigns/listener/SignListener.java b/src/main/java/net/knarcraft/paidsigns/listener/SignListener.java index b7b179e..e560359 100644 --- a/src/main/java/net/knarcraft/paidsigns/listener/SignListener.java +++ b/src/main/java/net/knarcraft/paidsigns/listener/SignListener.java @@ -7,6 +7,9 @@ import net.knarcraft.paidsigns.container.PaidSignConditionMatch; import net.knarcraft.paidsigns.formatting.PaidSignsTranslatableMessage; import net.knarcraft.paidsigns.manager.EconomyManager; import net.knarcraft.paidsigns.manager.TrackedSignManager; +import org.bukkit.Bukkit; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.Sign; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,6 +21,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.logging.Level; /** * A listener for listening to registered paid signs @@ -116,6 +120,21 @@ public class SignListener implements Listener { } performPaidSignTransaction(paidSign, player, event); + + if (!event.isCancelled()) { + //Immediately refund if a plugin destroyed the sign within 5 ticks of the creation + Bukkit.getScheduler().scheduleSyncDelayedTask(PaidSigns.getInstance(), () -> { + Block block = event.getBlock(); + if (!(block.getBlockData() instanceof Sign)) { + try { + TrackedSignManager.removeTrackedSign(block.getLocation(), true, true); + } catch (IOException e) { + PaidSigns.getInstance().getLogger().log(Level.WARNING, String.format("Unable to save changes " + + "about removed tracked sign at %s", block.getLocation())); + } + } + }, 5); + } } /** diff --git a/src/main/java/net/knarcraft/paidsigns/manager/TrackedSignManager.java b/src/main/java/net/knarcraft/paidsigns/manager/TrackedSignManager.java index 96da46d..4339ce9 100644 --- a/src/main/java/net/knarcraft/paidsigns/manager/TrackedSignManager.java +++ b/src/main/java/net/knarcraft/paidsigns/manager/TrackedSignManager.java @@ -48,16 +48,17 @@ public final class TrackedSignManager { * * @param signLocation

The location the sign was removed from

* @param refund

Whether to perform a refund after un-tracking the sign

+ * @param forceRefund

Whether to force a refund, even if refunding is disabled

* @throws IOException

If unable to save the tracked signs

*/ - public static void removeTrackedSign(Location signLocation, boolean refund) throws IOException { + public static void removeTrackedSign(Location signLocation, boolean refund, boolean forceRefund) throws IOException { if (!trackedSigns.containsKey(signLocation)) { return; } TrackedSign trackedSign = trackedSigns.get(signLocation); trackedSigns.remove(signLocation); saveTrackedSigns(); - refund(trackedSign, refund); + refund(trackedSign, refund, forceRefund); } /** @@ -113,7 +114,7 @@ public final class TrackedSignManager { Bukkit.getScheduler().scheduleSyncDelayedTask(PaidSigns.getInstance(), () -> { PaidSigns.getInstance().getLogger().log(Level.WARNING, "The sign at " + signLocation + " no longer exists. Removing from sign tracker. Refunding the player."); - refund(trackedSign, true); + refund(trackedSign, true, false); }, 100); return; } @@ -145,9 +146,10 @@ public final class TrackedSignManager { * * @param trackedSign

The tracked sign to refund for

* @param refund

Whether to actually refund

+ * @param forceRefund

Whether to force a refund, even if refunding is disabled

*/ - private static void refund(TrackedSign trackedSign, boolean refund) { - if (!PaidSigns.getInstance().areRefundsEnabled() || !refund) { + private static void refund(TrackedSign trackedSign, boolean refund, boolean forceRefund) { + if ((!PaidSigns.getInstance().areRefundsEnabled() || !refund) && !forceRefund) { return; } OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(trackedSign.playerId());