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,79 @@
package au.lupine.quarters.api.event;

import au.lupine.quarters.object.base.CancellableQuartersEvent;
import au.lupine.quarters.object.entity.Quarter;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class CancellableQuarterDeleteEvent extends CancellableQuartersEvent {

private static final HandlerList HANDLER_LIST = new HandlerList();

private final Quarter quarter;
private final Cause cause;
private final CommandSender sender;

public CancellableQuarterDeleteEvent(@NotNull Quarter quarter, @NotNull Cause cause, @Nullable CommandSender sender) {
super(!Bukkit.isPrimaryThread());
this.quarter = quarter;
this.cause = cause;
this.sender = sender;
}

/**
* @return The deleted quarter.
*/
public @NotNull Quarter getQuarter() {
return quarter;
}

/**
* @return The {@link Cause cause} of the quarter's deletion.
*/
public @NotNull Cause getCause() {
return cause;
}

/**
* @return The {@link CommandSender sender} who caused the deletion
*/
public @Nullable CommandSender getSender() {
return sender;
}

public enum Cause {
UNKNOWN,

/**
* The quarter was deleted because a player used /quarters delete
*/
DELETE_COMMAND,

/**
* The quarter was deleted because a player used /quarters delete all
*/
DELETE_ALL_COMMAND,

/**
* The quarter was deleted because a player used /quarters delete plot
*/
DELETE_PLOT_COMMAND,

/**
* The quarter was deleted because an admin used /quartersadmin delete
*/
ADMIN_DELETE_COMMAND
}

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

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
13 changes: 13 additions & 0 deletions src/main/java/au/lupine/quarters/api/event/PreBuildGsonEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

import au.lupine.quarters.object.base.QuartersEvent;
import com.google.gson.GsonBuilder;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

public class PreBuildGsonEvent extends QuartersEvent {

private static final HandlerList HANDLER_LIST = new HandlerList();

private final GsonBuilder builder;

public PreBuildGsonEvent(GsonBuilder builder) {
Expand All @@ -15,4 +19,13 @@ public PreBuildGsonEvent(GsonBuilder builder) {
public GsonBuilder getBuilder() {
return builder;
}

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLER_LIST;
}
}
40 changes: 40 additions & 0 deletions src/main/java/au/lupine/quarters/api/event/QuarterDeleteEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package au.lupine.quarters.api.event;

import au.lupine.quarters.object.base.QuartersEvent;
import au.lupine.quarters.object.entity.Quarter;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class QuarterDeleteEvent extends QuartersEvent {

private static final HandlerList HANDLER_LIST = new HandlerList();

private final Quarter quarter;
private final CommandSender sender;

public QuarterDeleteEvent(@NotNull Quarter quarter, @Nullable CommandSender sender) {
super(!Bukkit.isPrimaryThread());
this.quarter = quarter;
this.sender = sender;
}

public @NotNull Quarter getQuarter() {
return quarter;
}

public @Nullable CommandSender getSender() {
return sender;
}

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLER_LIST;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package au.lupine.quarters.command.quarters.method;

import au.lupine.quarters.api.QuartersMessaging;
import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.command.quarters.method.delete.DeleteAllMethod;
import au.lupine.quarters.command.quarters.method.delete.DeletePlotMethod;
import au.lupine.quarters.object.base.CommandArgument;
Expand Down Expand Up @@ -47,9 +48,9 @@ private void deleteQuarterAtLocation() {

if (!quarter.isPlayerInTown(player)) throw new CommandMethodException(StringConstants.THIS_QUARTER_IS_NOT_PART_OF_YOUR_TOWN);

quarter.delete();

QuartersMessaging.sendSuccessMessage(player, StringConstants.SUCCESSFULLY_DELETED_THIS_QUARTER);
QuartersMessaging.sendCommandFeedbackToTown(town, player, "has deleted a quarter", player.getLocation());
if (quarter.delete(CancellableQuarterDeleteEvent.Cause.DELETE_COMMAND, player)) {
QuartersMessaging.sendSuccessMessage(player, StringConstants.SUCCESSFULLY_DELETED_THIS_QUARTER);
QuartersMessaging.sendCommandFeedbackToTown(town, player, "has deleted a quarter", player.getLocation());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package au.lupine.quarters.command.quarters.method.delete;

import au.lupine.quarters.api.QuartersMessaging;
import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.api.manager.QuarterManager;
import au.lupine.quarters.object.base.CommandMethod;
import au.lupine.quarters.object.entity.Quarter;
import au.lupine.quarters.object.exception.CommandMethodException;
import au.lupine.quarters.object.wrapper.StringConstants;
import com.palmergames.bukkit.towny.TownyAPI;
Expand All @@ -11,8 +13,6 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.concurrent.CopyOnWriteArrayList;

public class DeleteAllMethod extends CommandMethod {

public DeleteAllMethod(CommandSender sender, String[] args) {
Expand All @@ -27,7 +27,10 @@ public void execute() {
if (town == null) throw new CommandMethodException(StringConstants.YOU_ARE_NOT_PART_OF_A_TOWN);

Confirmation.runOnAccept(() -> {
QuarterManager.getInstance().setQuarters(town, new CopyOnWriteArrayList<>());
for (Quarter quarter : QuarterManager.getInstance().getQuarters(town)) {
quarter.delete(CancellableQuarterDeleteEvent.Cause.DELETE_ALL_COMMAND, player);
}

QuartersMessaging.sendSuccessMessage(player, "Successfully deleted all quarters in " + town.getName());
QuartersMessaging.sendCommandFeedbackToTown(town, player, "has deleted all quarters in " + town.getName(), null);
}).setTitle("Are you sure you want to delete all the quarters in " + town.getName() + "?")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package au.lupine.quarters.command.quarters.method.delete;

import au.lupine.quarters.api.QuartersMessaging;
import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.api.manager.QuarterManager;
import au.lupine.quarters.object.base.CommandMethod;
import au.lupine.quarters.object.entity.Quarter;
Expand Down Expand Up @@ -37,7 +38,7 @@ public void execute() {

Confirmation.runOnAccept(() -> {
for (Quarter quarter : quarters) {
quarter.delete();
quarter.delete(CancellableQuarterDeleteEvent.Cause.DELETE_PLOT_COMMAND, player);
}

QuartersMessaging.sendSuccessMessage(player, "Successfully deleted all quarters in this townblock");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package au.lupine.quarters.command.quartersadmin.method;

import au.lupine.quarters.api.QuartersMessaging;
import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.object.base.CommandMethod;
import au.lupine.quarters.object.entity.Quarter;
import au.lupine.quarters.object.wrapper.StringConstants;
Expand All @@ -18,8 +19,6 @@ public void execute() {
Player player = getSenderAsPlayerOrThrow();
Quarter quarter = getQuarterAtPlayerOrThrow(player);

quarter.delete();

QuartersMessaging.sendSuccessMessage(player, StringConstants.SUCCESSFULLY_DELETED_THIS_QUARTER);
if (quarter.delete(CancellableQuarterDeleteEvent.Cause.ADMIN_DELETE_COMMAND, player)) QuartersMessaging.sendSuccessMessage(player, StringConstants.SUCCESSFULLY_DELETED_THIS_QUARTER);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package au.lupine.quarters.listener;

import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.api.manager.QuarterManager;
import au.lupine.quarters.object.entity.Quarter;
import com.palmergames.bukkit.towny.TownyMessaging;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package au.lupine.quarters.object.base;

import org.bukkit.event.Cancellable;
import org.jetbrains.annotations.Nullable;

public abstract class CancellableQuartersEvent extends QuartersEvent implements Cancellable {

private boolean isCancelled;
private String cancelMessage = null;

public CancellableQuartersEvent() {
super();
Expand All @@ -14,6 +16,17 @@ public CancellableQuartersEvent(boolean isAsync) {
super(isAsync);
}

public @Nullable String getCancelMessage() {
return cancelMessage;
}

/**
* If a cancel message is set, this can be used by the event but depends on the event's implementation
*/
public void setCancelMessage(String cancelMessage) {
this.cancelMessage = cancelMessage;
}

@Override
public boolean isCancelled() {
return isCancelled;
Expand Down
13 changes: 0 additions & 13 deletions src/main/java/au/lupine/quarters/object/base/QuartersEvent.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,14 @@
package au.lupine.quarters.object.base;

import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;

public abstract class QuartersEvent extends Event {

private static final HandlerList HANDLER_LIST = new HandlerList();

public QuartersEvent() {
super();
}

public QuartersEvent(boolean isAsync) {
super(isAsync);
}

public static HandlerList getHandlerList() {
return HANDLER_LIST;
}

@Override
public @NotNull HandlerList getHandlers() {
return HANDLER_LIST;
}
}
29 changes: 28 additions & 1 deletion src/main/java/au/lupine/quarters/object/entity/Quarter.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package au.lupine.quarters.object.entity;

import au.lupine.quarters.api.QuartersMessaging;
import au.lupine.quarters.api.event.CancellableQuarterDeleteEvent;
import au.lupine.quarters.api.event.QuarterDeleteEvent;
import au.lupine.quarters.api.manager.*;
import au.lupine.quarters.object.state.ActionType;
import au.lupine.quarters.object.state.QuarterType;
Expand All @@ -11,6 +14,7 @@
import com.palmergames.bukkit.towny.object.TownyObject;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.BoundingBox;
import org.jetbrains.annotations.ApiStatus;
Expand Down Expand Up @@ -88,10 +92,13 @@ public void save() {
quarters.add(this);

qm.setQuarters(town, quarters);

QuarterDeleteEvent event = new QuarterDeleteEvent(this, null);
event.callEvent();
}

/**
* Permanently delete this quarter from the town's metadata
* Permanently and forcefully delete this quarter from the town's metadata
*/
public void delete() {
QuarterManager qm = QuarterManager.getInstance();
Expand All @@ -102,6 +109,26 @@ public void delete() {
qm.setQuarters(town, quarters);
}

/**
* Permanently delete this quarter from the town's metadata, with a cause and optional sender
* @return true if the quarter was successfully deleted, false if deletion was cancelled
*/
public boolean delete(@NotNull CancellableQuarterDeleteEvent.Cause cause, @Nullable CommandSender sender) {
CancellableQuarterDeleteEvent cqde = new CancellableQuarterDeleteEvent(this, cause, sender);

if (!cqde.callEvent()) {
String cancelMessage = cqde.getCancelMessage();
if (sender != null && cancelMessage != null) QuartersMessaging.sendErrorMessage(sender, cancelMessage);
return false;
}

delete();

new QuarterDeleteEvent(this, sender).callEvent();

return true;
}

/**
* @return An int representing the total number of blocks inside this quarter
*/
Expand Down