diff --git a/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java b/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java index 4a68a14..19f62ee 100644 --- a/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java +++ b/src/main/java/com/modnmetl/virtualrealty/VirtualRealty.java @@ -14,7 +14,7 @@ import com.modnmetl.virtualrealty.listeners.protection.PlotProtectionListener; import com.modnmetl.virtualrealty.listeners.protection.WorldProtectionListener; import com.modnmetl.virtualrealty.listeners.stake.DraftListener; -import com.modnmetl.virtualrealty.listeners.stake.StakeConfirmationListener; +import com.modnmetl.virtualrealty.listeners.stake.ConfirmationListener; import com.modnmetl.virtualrealty.managers.DynmapManager; import com.modnmetl.virtualrealty.managers.MetricsManager; import com.modnmetl.virtualrealty.managers.PlotManager; @@ -24,13 +24,11 @@ import com.modnmetl.virtualrealty.sql.Database; import com.modnmetl.virtualrealty.utils.Loader; import com.modnmetl.virtualrealty.utils.configuration.ConfigurationFactory; -import com.modnmetl.virtualrealty.utils.loader.CustomClassLoader; import com.modnmetl.virtualrealty.utils.multiversion.VMaterial; import com.modnmetl.virtualrealty.utils.UpdateChecker; import com.zaxxer.hikari.HikariDataSource; import lombok.Getter; import lombok.Setter; -import lombok.SneakyThrows; import org.apache.commons.io.FileUtils; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -41,20 +39,13 @@ import javax.sql.DataSource; import java.io.*; -import java.lang.instrument.Instrumentation; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLDecoder; import java.sql.SQLException; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; -import java.util.stream.Collectors; public final class VirtualRealty extends JavaPlugin { @@ -266,7 +257,7 @@ private void registerListeners() { new PlotEntranceListener(this); new PlayerActionListener(this); new DraftListener(this); - new StakeConfirmationListener(this); + new ConfirmationListener(this); try { List> classes = new ArrayList<>(); classes.add(Class.forName("com.modnmetl.virtualrealty.listeners.premium.PanelListener", true, getLoader())); diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java b/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java index 5744088..a17f506 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/CommandManager.java @@ -79,15 +79,30 @@ public List onTabComplete(@NotNull CommandSender sender, @NotNull Comman } else if (args.length < 6) { switch (args.length) { case 3: { - tabCompleter.add(String.valueOf(plotSize.getLength())); + String length = String.valueOf(plotSize.getLength()); + if (args[args.length - 1].isEmpty()) { + tabCompleter.add(length.toLowerCase()); + } else if (length.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) { + tabCompleter.add(length.toLowerCase()); + } break; } case 4: { - tabCompleter.add(String.valueOf(plotSize.getHeight())); + String height = String.valueOf(plotSize.getHeight()); + if (args[args.length - 1].isEmpty()) { + tabCompleter.add(height.toLowerCase()); + } else if (height.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) { + tabCompleter.add(height.toLowerCase()); + } break; } case 5: { - tabCompleter.add(String.valueOf(plotSize.getWidth())); + String width = String.valueOf(plotSize.getWidth()); + if (args[args.length - 1].isEmpty()) { + tabCompleter.add(width.toLowerCase()); + } else if (width.toLowerCase().startsWith(args[args.length - 1].toLowerCase())) { + tabCompleter.add(width.toLowerCase()); + } break; } } diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/SubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/SubCommand.java index 9f2ea5b..3a187c3 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/SubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/SubCommand.java @@ -18,12 +18,23 @@ public abstract class SubCommand { private final String[] args; private final CommandSender commandSender; private final LinkedList helpList; + private final boolean bypass; + + @SneakyThrows + public SubCommand(CommandSender sender, Command command, String label, String[] args, boolean bypass, LinkedList helpList) throws FailedCommandException { + this.args = args; + this.helpList = helpList; + this.commandSender = sender; + this.bypass = bypass; + exec(sender, command, label, args); + } @SneakyThrows public SubCommand(CommandSender sender, Command command, String label, String[] args, LinkedList helpList) throws FailedCommandException { this.args = args; this.helpList = helpList; this.commandSender = sender; + this.bypass = false; exec(sender, command, label, args); } @@ -62,6 +73,10 @@ public void assertPermission(String permission) throws InsufficientPermissionsEx } } + public boolean isBypass() { + return this.bypass; + } + public void printHelp() throws FailedCommandException { for (String s : helpList) { commandSender.sendMessage(s); diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/plot/PlotCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/plot/PlotCommand.java index f969084..94cfecb 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/plot/PlotCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/plot/PlotCommand.java @@ -33,8 +33,14 @@ public class PlotCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - boolean displayError = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--error")); - args = Arrays.stream(args).filter(s1 -> !s1.equalsIgnoreCase("--error")).toArray(String[]::new); + boolean displayError = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--error") || s.equalsIgnoreCase("-e")); + boolean bypass = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--yes") || s.equalsIgnoreCase("-y")); + args = Arrays.stream(args).filter(s1 -> + !s1.equalsIgnoreCase("--error") && + !s1.equalsIgnoreCase("--yes") && + !s1.equalsIgnoreCase("-e") && + !s1.equalsIgnoreCase("-y")) + .toArray(String[]::new); if ((args.length > 0 && args[0].equalsIgnoreCase("help")) || args.length == 0) { printHelp(sender); return false; diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/AddSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/AddSubCommand.java index cf9df9a..f394e17 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/AddSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/AddSubCommand.java @@ -27,7 +27,7 @@ public class AddSubCommand extends SubCommand { } public AddSubCommand(CommandSender sender, Command command, String label, String[] args) throws FailedCommandException { - super(sender, command, label, args, HELP); + super(sender, command, label, args, false, HELP); } @Override diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/StakeSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/StakeSubCommand.java index 7fe2f87..5a82939 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/StakeSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/plot/subcommand/StakeSubCommand.java @@ -2,23 +2,38 @@ import com.modnmetl.virtualrealty.VirtualRealty; import com.modnmetl.virtualrealty.commands.SubCommand; +import com.modnmetl.virtualrealty.enums.ConfirmationType; import com.modnmetl.virtualrealty.enums.Direction; +import com.modnmetl.virtualrealty.enums.PlotSize; import com.modnmetl.virtualrealty.exceptions.FailedCommandException; import com.modnmetl.virtualrealty.listeners.stake.DraftListener; +import com.modnmetl.virtualrealty.managers.ConfirmationManager; +import com.modnmetl.virtualrealty.managers.PlotManager; +import com.modnmetl.virtualrealty.objects.Plot; +import com.modnmetl.virtualrealty.objects.data.Confirmation; import com.modnmetl.virtualrealty.objects.data.PlotItem; import com.modnmetl.virtualrealty.objects.region.Cuboid; import com.modnmetl.virtualrealty.objects.region.GridStructure; import com.modnmetl.virtualrealty.utils.RegionUtil; +import com.modnmetl.virtualrealty.utils.multiversion.Chat; +import de.tr7zw.nbtapi.NBTItem; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import java.time.LocalDateTime; import java.util.*; public class StakeSubCommand extends SubCommand { - public static Set stakeConfirmations = new HashSet<>(); - public StakeSubCommand(CommandSender sender, Command command, String label, String[] args) throws FailedCommandException { super(sender, command, label, args, new LinkedList<>()); } @@ -45,10 +60,78 @@ public void exec(CommandSender sender, Command command, String label, String[] a player.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().draftModeCancelledCollision); return; } - stakeConfirmations.add(player.getUniqueId()); for (String s : VirtualRealty.getMessages().stakeConfirmation) { sender.sendMessage(VirtualRealty.PREFIX + s); } + Confirmation confirmation = new Confirmation(ConfirmationType.STAKE, (Player) sender, "YES") { + @Override + public void success() { + GridStructure gridStructure = DraftListener.DRAFT_MAP.get(this.getSender()).getKey(); + PlotItem plotItem = DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getKey(); + PlotSize plotSize = plotItem.getPlotSize(); + ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack(); + NBTItem item = new NBTItem(plotItemStack); + gridStructure.removeGrid(); + this.getSender().sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().notCollidingCreating); + long timeStart = System.currentTimeMillis(); + Plot plot = PlotManager.createPlot(gridStructure.getPreviewLocation().subtract(0, 1, 0), plotSize, plotItem.getLength(), plotItem.getHeight(), plotItem.getWidth(), plotItem.isNatural()); + AbstractMap.SimpleEntry floorData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_floor_material"), item.getByte("vrplot_floor_data")); + AbstractMap.SimpleEntry borderData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_border_material"), item.getByte("vrplot_border_data")); + if (!plotItem.isNatural()) { + if (VirtualRealty.legacyVersion) { + plot.setFloorMaterial(Material.valueOf(floorData.getKey()), floorData.getValue()); + plot.setBorderMaterial(Material.valueOf(borderData.getKey()), borderData.getValue()); + } else { + plot.setFloorMaterial(Bukkit.createBlockData(floorData.getKey()).getMaterial(), floorData.getValue()); + plot.setBorderMaterial(Bukkit.createBlockData(borderData.getKey()).getMaterial(), borderData.getValue()); + } + } + plot.setOwnedBy(this.getSender().getUniqueId()); + if (plotItem.getAdditionalDays() == 0) { + plot.setOwnedUntilDate(Plot.MAX_DATE); + } else { + plot.setOwnedUntilDate(LocalDateTime.now().plusDays(plotItem.getAdditionalDays())); + } + this.getSender().getInventory().remove(plotItemStack); + long timeEnd = System.currentTimeMillis(); + BaseComponent textComponent = new TextComponent(VirtualRealty.PREFIX + VirtualRealty.getMessages().creationPlotComponent1); + BaseComponent textComponent2 = new TextComponent(VirtualRealty.getMessages().creationPlotComponent2.replaceAll("%plot_id%", String.valueOf(plot.getID()))); + BaseComponent textComponent3 = new TextComponent(VirtualRealty.getMessages().creationPlotComponent3.replaceAll("%creation_time%", String.valueOf(timeEnd - timeStart))); + textComponent2.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(VirtualRealty.getMessages().clickToShowDetailedInfo.replaceAll("%plot_id%", String.valueOf(plot.getID())))})); + textComponent2.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/vrplot info " + plot.getID())); + textComponent.addExtra(textComponent2); + textComponent.addExtra(textComponent3); + new Chat(textComponent).sendTo(this.getSender()); + new BukkitRunnable() { + @Override + public void run() { + gridStructure.setCuboidId(plot.getID()); + gridStructure.setDisplayTicks(20 * 6); + gridStructure.preview(true, false); + } + }.runTaskLater(VirtualRealty.getInstance(), 20); + DraftListener.DRAFT_MAP.remove(this.getSender()); + ConfirmationManager.removeStakeConfirmations(this.getConfirmationType(), this.getSender().getUniqueId()); + } + + @Override + public void failed() { + this.getSender().getInventory().removeItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack()); + this.getSender().getInventory().remove(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getValue().getItemStack()); + this.getSender().getInventory().addItem(DraftListener.DRAFT_MAP.get(this.getSender()).getValue().getKey().getItemStack()); + DraftListener.DRAFT_MAP.get(this.getSender()).getKey().removeGrid(); + DraftListener.DRAFT_MAP.remove(this.getSender()); + this.getSender().sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().stakeCancelled); + DraftListener.DRAFT_MAP.remove(this.getSender()); + ConfirmationManager.removeStakeConfirmations(this.getConfirmationType(), this.getSender().getUniqueId()); + } + + @Override + public void expiry() { + ConfirmationManager.removeStakeConfirmations(this.getConfirmationType(), this.getSender().getUniqueId()); + } + }; + ConfirmationManager.confirmations.add(confirmation); } } diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java index 1a3be53..638aa7d 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/VirtualRealtyCommand.java @@ -9,6 +9,7 @@ import org.bukkit.permissions.Permission; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.logging.Level; @@ -37,8 +38,14 @@ public class VirtualRealtyCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - boolean displayError = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--error")); - args = Arrays.stream(args).filter(s1 -> !s1.equalsIgnoreCase("--error")).toArray(String[]::new); + boolean displayError = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--error") || s.equalsIgnoreCase("-e")); + boolean bypass = Arrays.stream(args).anyMatch(s -> s.equalsIgnoreCase("--yes") || s.equalsIgnoreCase("-y")); + args = Arrays.stream(args).filter(s1 -> + !s1.equalsIgnoreCase("--error") && + !s1.equalsIgnoreCase("--yes") && + !s1.equalsIgnoreCase("-e") && + !s1.equalsIgnoreCase("-y")) + .toArray(String[]::new); if (!sender.hasPermission(COMMAND_PERMISSION)) { sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().insufficientPermissions.replaceAll("%permission%", COMMAND_PERMISSION.getName())); return false; @@ -48,8 +55,12 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command return false; } try { - Class clazz = Class.forName("com.modnmetl.virtualrealty.commands.vrplot.subcommand." + String.valueOf(args[0].toCharArray()[0]).toUpperCase(Locale.ROOT) + args[0].substring(1) + "SubCommand", true, VirtualRealty.getLoader()); - clazz.getConstructors()[0].newInstance(sender, command, label, args); + Class clazz = Class.forName("com.modnmetl.virtualrealty.commands.vrplot.subcommand." + String.valueOf(args[0].toCharArray()[0]).toUpperCase() + args[0].substring(1) + "SubCommand", true, VirtualRealty.getLoader()); + if (bypass) { + clazz.getConstructors()[1].newInstance(sender, command, label, args, true); + } else { + clazz.getConstructors()[0].newInstance(sender, command, label, args); + } } catch (Exception e) { if(!(e instanceof InvocationTargetException)) { printHelp(sender); diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/AssignSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/AssignSubCommand.java index 44e6b84..7f79307 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/AssignSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/AssignSubCommand.java @@ -26,8 +26,8 @@ public class AssignSubCommand extends SubCommand { HELP.add(" §a/vrplot assign §8<§7plot§8> §8<§7username§8>"); } - public AssignSubCommand(CommandSender sender, Command command, String label, String[] args) throws FailedCommandException { - super(sender, command, label, args, HELP); + public AssignSubCommand(CommandSender sender, Command command, String label, String[] args, boolean bypass) throws FailedCommandException { + super(sender, command, label, args, bypass, HELP); } @Override diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/CreateSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/CreateSubCommand.java index 31c380b..039ef8e 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/CreateSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/CreateSubCommand.java @@ -23,8 +23,7 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -import java.util.Arrays; -import java.util.LinkedList; +import java.util.*; public class CreateSubCommand extends SubCommand { @@ -77,10 +76,6 @@ public void exec(CommandSender sender, Command command, String label, String[] a sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().graterThenZero); return; } - if (length > 500 || width > 500 || height > 500) { - sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().hardLimit); - return; - } Cuboid cuboid = RegionUtil.getRegion(location, Direction.byYaw(location.getYaw()), length, height, width); if (RegionUtil.isCollidingWithAnotherPlot(cuboid)) { sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().cantCreateOnExisting); diff --git a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/RemoveSubCommand.java b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/RemoveSubCommand.java index 2cd7ec9..e235d42 100644 --- a/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/RemoveSubCommand.java +++ b/src/main/java/com/modnmetl/virtualrealty/commands/vrplot/subcommand/RemoveSubCommand.java @@ -2,13 +2,17 @@ import com.modnmetl.virtualrealty.VirtualRealty; import com.modnmetl.virtualrealty.commands.SubCommand; +import com.modnmetl.virtualrealty.enums.ConfirmationType; import com.modnmetl.virtualrealty.exceptions.FailedCommandException; +import com.modnmetl.virtualrealty.managers.ConfirmationManager; import com.modnmetl.virtualrealty.managers.PlotManager; import com.modnmetl.virtualrealty.objects.Plot; +import com.modnmetl.virtualrealty.objects.data.Confirmation; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; -import java.util.LinkedList; +import java.util.*; public class RemoveSubCommand extends SubCommand { @@ -24,6 +28,10 @@ public RemoveSubCommand(CommandSender sender, Command command, String label, Str super(sender, command, label, args, HELP); } + public RemoveSubCommand(CommandSender sender, Command command, String label, String[] args, boolean bypass) throws FailedCommandException { + super(sender, command, label, args, bypass, HELP); + } + @Override public void exec(CommandSender sender, Command command, String label, String[] args) throws Exception { assertPermission(); @@ -43,8 +51,39 @@ public void exec(CommandSender sender, Command command, String label, String[] a sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().noPlotFound); return; } - plot.remove(); - sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().removedPlot); + if (sender instanceof Player) { + if (this.isBypass()) { + plot.remove(sender); + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().removedPlot); + } else { + for (String s : VirtualRealty.getMessages().removeConfirmation) { + sender.sendMessage(VirtualRealty.PREFIX + s.replaceAll("%plot_id%", String.valueOf(plot.getID()))); + } + Confirmation confirmation = new Confirmation(ConfirmationType.REMOVE, (Player) sender, plot.getID(), "YES") { + @Override + public void success() { + plot.remove(((Player) sender).getKiller()); + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().removedPlot); + ConfirmationManager.removeConfirmations(plot.getID(), this.getConfirmationType()); + } + + @Override + public void failed() { + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().removalCancelled); + ConfirmationManager.removeConfirmations(plot.getID(), this.getConfirmationType()); + } + + @Override + public void expiry() { + ConfirmationManager.removeConfirmations(plot.getID(), this.getConfirmationType()); + } + }; + ConfirmationManager.confirmations.add(confirmation); + } + } else { + plot.remove(sender); + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().removedPlot); + } } } diff --git a/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java b/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java index 096a89d..017f952 100644 --- a/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java +++ b/src/main/java/com/modnmetl/virtualrealty/configs/MessagesConfiguration.java @@ -45,6 +45,7 @@ public class MessagesConfiguration extends OkaeriConfig { public String specifyExpiryDate = "§cSpecify expiry date!"; public String minPlotID = "§cMinimum plot ID is %min_id%!"; public String maxPlotID = "§cMaximum plot ID is %max_id%!"; + public String noRegionFileFound = "No saved plot schema found, remove and restore not possible - deleting plot record only"; //Permissions public String cantDoAnyDMG = "§cYou can't do any damage here!"; @@ -115,8 +116,14 @@ public class MessagesConfiguration extends OkaeriConfig { "§7You are about to stake your claim to the plot shown, once done you cannot undo.", "§7Type §aYES §7to proceed." ); + public String removalCancelled = "§cRemoval cancelled."; + public List removeConfirmation = Arrays.asList( + "§7You are about to remove §a%plot_id%§7, once done you cannot undo.", + "§7Type §aYES §7to proceed." + ); //Other + public String confirmationExpired = "§cConfirmation not received, command cancelled."; public String visualBoundaryDisplayed = "§aThe visual boundary was displayed."; public String visualBoundaryActive = "§cThe visual boundary is already active for this region."; diff --git a/src/main/java/com/modnmetl/virtualrealty/configs/PluginConfiguration.java b/src/main/java/com/modnmetl/virtualrealty/configs/PluginConfiguration.java index 8af198f..1f93abc 100644 --- a/src/main/java/com/modnmetl/virtualrealty/configs/PluginConfiguration.java +++ b/src/main/java/com/modnmetl/virtualrealty/configs/PluginConfiguration.java @@ -60,6 +60,10 @@ public GameMode getDefaultPlotGamemode() { @CustomKey("enable-dynmap-markers") public boolean dynmapMarkers = false; + @Comment("The minimum number of blocks required between plots") + @CustomKey("enforce-plot-separation") + public int plotSpacing = 1; + @Comment("Choose which type of plots should be highlighted on Dynmap page | Choose from: { ALL, AVAILABLE, OWNED }") public HighlightType dynmapType = HighlightType.ALL; diff --git a/src/main/java/com/modnmetl/virtualrealty/enums/ConfirmationType.java b/src/main/java/com/modnmetl/virtualrealty/enums/ConfirmationType.java new file mode 100644 index 0000000..4284744 --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/enums/ConfirmationType.java @@ -0,0 +1,8 @@ +package com.modnmetl.virtualrealty.enums; + +public enum ConfirmationType { + + STAKE, + REMOVE + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/listeners/stake/ConfirmationListener.java b/src/main/java/com/modnmetl/virtualrealty/listeners/stake/ConfirmationListener.java new file mode 100644 index 0000000..459b961 --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/listeners/stake/ConfirmationListener.java @@ -0,0 +1,62 @@ +package com.modnmetl.virtualrealty.listeners.stake; + +import com.modnmetl.virtualrealty.VirtualRealty; +import com.modnmetl.virtualrealty.commands.plot.subcommand.StakeSubCommand; +import com.modnmetl.virtualrealty.commands.vrplot.subcommand.RemoveSubCommand; +import com.modnmetl.virtualrealty.enums.ConfirmationType; +import com.modnmetl.virtualrealty.enums.PlotSize; +import com.modnmetl.virtualrealty.listeners.VirtualListener; +import com.modnmetl.virtualrealty.managers.ConfirmationManager; +import com.modnmetl.virtualrealty.managers.PlotManager; +import com.modnmetl.virtualrealty.objects.Plot; +import com.modnmetl.virtualrealty.objects.data.Confirmation; +import com.modnmetl.virtualrealty.objects.data.PlotItem; +import com.modnmetl.virtualrealty.objects.region.GridStructure; +import com.modnmetl.virtualrealty.utils.multiversion.Chat; +import de.tr7zw.nbtapi.NBTItem; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import javax.persistence.Version; +import java.awt.event.KeyEvent; +import java.time.LocalDateTime; +import java.util.AbstractMap; + +public class ConfirmationListener extends VirtualListener { + + public ConfirmationListener(VirtualRealty plugin) { + super(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onChat(AsyncPlayerChatEvent e) { + Player player = e.getPlayer(); + for (Confirmation confirmation : ConfirmationManager.getConfirmations()) { + if (player.getUniqueId() == confirmation.getSender().getUniqueId()) { + e.setCancelled(true); + new BukkitRunnable() { + @Override + public void run() { + if (confirmation.getProceedText().equalsIgnoreCase(e.getMessage())) { + confirmation.success(); + } else { + confirmation.failed(); + } + } + }.runTask(VirtualRealty.getInstance()); + break; + } + } + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/listeners/stake/StakeConfirmationListener.java b/src/main/java/com/modnmetl/virtualrealty/listeners/stake/StakeConfirmationListener.java deleted file mode 100644 index 2c919b0..0000000 --- a/src/main/java/com/modnmetl/virtualrealty/listeners/stake/StakeConfirmationListener.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.modnmetl.virtualrealty.listeners.stake; - -import com.modnmetl.virtualrealty.VirtualRealty; -import com.modnmetl.virtualrealty.commands.plot.subcommand.StakeSubCommand; -import com.modnmetl.virtualrealty.enums.PlotSize; -import com.modnmetl.virtualrealty.listeners.VirtualListener; -import com.modnmetl.virtualrealty.managers.PlotManager; -import com.modnmetl.virtualrealty.objects.Plot; -import com.modnmetl.virtualrealty.objects.data.PlotItem; -import com.modnmetl.virtualrealty.objects.region.GridStructure; -import com.modnmetl.virtualrealty.utils.multiversion.Chat; -import de.tr7zw.nbtapi.NBTItem; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -import java.time.LocalDateTime; -import java.util.AbstractMap; - -public class StakeConfirmationListener extends VirtualListener { - - public StakeConfirmationListener(VirtualRealty plugin) { - super(plugin); - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onChat(AsyncPlayerChatEvent e) { - if (StakeSubCommand.stakeConfirmations.contains(e.getPlayer().getUniqueId())) { - e.setCancelled(true); - Player player = e.getPlayer(); - GridStructure gridStructure = DraftListener.DRAFT_MAP.get(player).getKey(); - PlotItem plotItem = DraftListener.DRAFT_MAP.get(player).getValue().getKey(); - PlotSize plotSize = plotItem.getPlotSize(); - ItemStack plotItemStack = DraftListener.DRAFT_MAP.get(player).getValue().getValue().getItemStack(); - NBTItem item = new NBTItem(plotItemStack); - gridStructure.removeGrid(); - if (e.getMessage().equalsIgnoreCase("YES")) { - new BukkitRunnable() { - @Override - public void run() { - player.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().notCollidingCreating); - long timeStart = System.currentTimeMillis(); - Plot plot = PlotManager.createPlot(gridStructure.getPreviewLocation().subtract(0, 1, 0), plotSize, plotItem.getLength(), plotItem.getHeight(), plotItem.getWidth(), plotItem.isNatural()); - AbstractMap.SimpleEntry floorData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_floor_material"), item.getByte("vrplot_floor_data")); - AbstractMap.SimpleEntry borderData = new AbstractMap.SimpleEntry<>(item.getString("vrplot_border_material"), item.getByte("vrplot_border_data")); - if (!plotItem.isNatural()) { - if (VirtualRealty.legacyVersion) { - plot.setFloorMaterial(Material.valueOf(floorData.getKey()), floorData.getValue()); - plot.setBorderMaterial(Material.valueOf(borderData.getKey()), borderData.getValue()); - } else { - plot.setFloorMaterial(Bukkit.createBlockData(floorData.getKey()).getMaterial(), floorData.getValue()); - plot.setBorderMaterial(Bukkit.createBlockData(borderData.getKey()).getMaterial(), borderData.getValue()); - } - } - plot.setOwnedBy(player.getUniqueId()); - if (plotItem.getAdditionalDays() == 0) { - plot.setOwnedUntilDate(Plot.MAX_DATE); - } else { - plot.setOwnedUntilDate(LocalDateTime.now().plusDays(plotItem.getAdditionalDays())); - } - player.getInventory().remove(plotItemStack); - long timeEnd = System.currentTimeMillis(); - BaseComponent textComponent = new TextComponent(VirtualRealty.PREFIX + VirtualRealty.getMessages().creationPlotComponent1); - BaseComponent textComponent2 = new TextComponent(VirtualRealty.getMessages().creationPlotComponent2.replaceAll("%plot_id%", String.valueOf(plot.getID()))); - BaseComponent textComponent3 = new TextComponent(VirtualRealty.getMessages().creationPlotComponent3.replaceAll("%creation_time%", String.valueOf(timeEnd - timeStart))); - textComponent2.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(VirtualRealty.getMessages().clickToShowDetailedInfo.replaceAll("%plot_id%", String.valueOf(plot.getID())))})); - textComponent2.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/vrplot info " + plot.getID())); - textComponent.addExtra(textComponent2); - textComponent.addExtra(textComponent3); - new Chat(textComponent).sendTo(player); - new BukkitRunnable() { - @Override - public void run() { - gridStructure.setCuboidId(plot.getID()); - gridStructure.setDisplayTicks(20 * 6); - gridStructure.preview(true, false); - } - }.runTaskLater(VirtualRealty.getInstance(), 20); - } - }.runTaskLater(VirtualRealty.getInstance(), 10); - } else { - player.getInventory().removeItem(DraftListener.DRAFT_MAP.get(player).getValue().getValue().getItemStack()); - player.getInventory().remove(DraftListener.DRAFT_MAP.get(player).getValue().getValue().getItemStack()); - player.getInventory().addItem(DraftListener.DRAFT_MAP.get(player).getValue().getKey().getItemStack()); - DraftListener.DRAFT_MAP.get(player).getKey().removeGrid(); - DraftListener.DRAFT_MAP.remove(player); - player.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().stakeCancelled); - } - DraftListener.DRAFT_MAP.remove(player); - } - } - - -} diff --git a/src/main/java/com/modnmetl/virtualrealty/managers/ConfirmationManager.java b/src/main/java/com/modnmetl/virtualrealty/managers/ConfirmationManager.java new file mode 100644 index 0000000..2215906 --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/managers/ConfirmationManager.java @@ -0,0 +1,28 @@ +package com.modnmetl.virtualrealty.managers; + +import com.modnmetl.virtualrealty.enums.ConfirmationType; +import com.modnmetl.virtualrealty.objects.data.Confirmation; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class ConfirmationManager { + + @Getter + public static final List confirmations = new ArrayList<>(); + + public static void removeConfirmations(int plotID, ConfirmationType confirmationType) { + confirmations.removeIf(confirmation -> confirmation.getPlotID() == plotID && confirmation.getConfirmationType() == confirmationType); + } + + public static void removeStakeConfirmations(ConfirmationType confirmationType, UUID sender) { + confirmations.removeIf(confirmation -> confirmation.getConfirmationType() == confirmationType && confirmation.getSender().getUniqueId() == sender); + } + + public static boolean isConfirmationAvailable(UUID confirmationUUID) { + return confirmations.stream().anyMatch(s -> s.getConfirmationUUID() == confirmationUUID); + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/managers/DynmapManager.java b/src/main/java/com/modnmetl/virtualrealty/managers/DynmapManager.java index 0cc2434..6bd30d8 100644 --- a/src/main/java/com/modnmetl/virtualrealty/managers/DynmapManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/managers/DynmapManager.java @@ -44,36 +44,34 @@ public void run() { Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("dynmap"); if (plugin == null) return; dynmapPresent = true; - if (plugin.isEnabled()) { - dapi = (DynmapAPI) plugin; - if (dapi.markerAPIInitialized()) { - markerset = dapi.getMarkerAPI().getMarkerSet("virtualrealty.plots"); - if (markerset == null) - markerset = dapi.getMarkerAPI().createMarkerSet("virutalrealty.plots", "Plots", dapi.getMarkerAPI().getMarkerIcons(), false); - for (MarkerSet markerSet : dapi.getMarkerAPI().getMarkerSets()) { - if (markerSet.getMarkerSetLabel().equalsIgnoreCase("Plots")) { - markerset = markerSet; - } - } - try { - if (dapi.getMarkerAPI().getMarkerIcon("virtualrealty_main_icon") == null) { - InputStream in = this.getClass().getResourceAsStream("/ploticon.png"); - if (in != null && in.available() > 0) { - markerIcon = dapi.getMarkerAPI().createMarkerIcon("virtualrealty_main_icon", "Plots", in); - } - } else { - markerIcon = dapi.getMarkerAPI().getMarkerIcon("virtualrealty_main_icon"); - } - } catch (IOException ignored) { - } - VirtualRealty.debug("Registering plots markers.."); - for (Plot plot : PlotManager.getPlots()) { - resetPlotMarker(plot); + if (!plugin.isEnabled()) return; + dapi = (DynmapAPI) plugin; + if (!dapi.markerAPIInitialized()) return; + markerset = dapi.getMarkerAPI().getMarkerSet("virtualrealty.plots"); + if (markerset == null) + markerset = dapi.getMarkerAPI().createMarkerSet("virutalrealty.plots", "Plots", dapi.getMarkerAPI().getMarkerIcons(), false); + for (MarkerSet markerSet : dapi.getMarkerAPI().getMarkerSets()) { + if (markerSet.getMarkerSetLabel().equalsIgnoreCase("Plots")) { + markerset = markerSet; + } + } + try { + if (dapi.getMarkerAPI().getMarkerIcon("virtualrealty_main_icon") == null) { + InputStream in = this.getClass().getResourceAsStream("/ploticon.png"); + if (in != null && in.available() > 0) { + markerIcon = dapi.getMarkerAPI().createMarkerIcon("virtualrealty_main_icon", "Plots", in); } - VirtualRealty.debug("Registered plots markers"); - this.cancel(); + } else { + markerIcon = dapi.getMarkerAPI().getMarkerIcon("virtualrealty_main_icon"); } + } catch (IOException ignored) { + } + VirtualRealty.debug("Registering plots markers.."); + for (Plot plot : PlotManager.getPlots()) { + resetPlotMarker(plot); } + VirtualRealty.debug("Registered plots markers"); + this.cancel(); } }.runTaskTimer(instance, 20, 20 * 5); } @@ -124,8 +122,10 @@ public static void resetPlotMarker(Plot plot) { public static void removeDynMapMarker(Plot plot) { if (VirtualRealty.getDynmapManager() == null || !VirtualRealty.getDynmapManager().isDynmapPresent() || VirtualRealty.getDynmapManager().dapi == null || VirtualRealty.getDynmapManager().markerset == null) return; AreaMarker marker = VirtualRealty.getDynmapManager().markerset.findAreaMarker("virtualrealty.plots." + plot.getID()); - areaMarkers.remove(marker); - marker.deleteMarker(); + if (marker != null) { + areaMarkers.remove(marker); + marker.deleteMarker(); + } } } diff --git a/src/main/java/com/modnmetl/virtualrealty/managers/MetricsManager.java b/src/main/java/com/modnmetl/virtualrealty/managers/MetricsManager.java index f5ddb36..391ea13 100644 --- a/src/main/java/com/modnmetl/virtualrealty/managers/MetricsManager.java +++ b/src/main/java/com/modnmetl/virtualrealty/managers/MetricsManager.java @@ -70,9 +70,4 @@ public void registerMetrics() { VirtualRealty.debug("Registered metrics"); } - public void addLicenseUser(String licenseName) { - licenses.add(licenseName); - metrics.addCustomChart(new SimplePie("used_license", () -> licenseName)); - } - } diff --git a/src/main/java/com/modnmetl/virtualrealty/objects/Executable.java b/src/main/java/com/modnmetl/virtualrealty/objects/Executable.java new file mode 100644 index 0000000..1dfa53d --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/objects/Executable.java @@ -0,0 +1,11 @@ +package com.modnmetl.virtualrealty.objects; + +public interface Executable { + + void success(); + + void failed(); + + void expiry(); + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/objects/Plot.java b/src/main/java/com/modnmetl/virtualrealty/objects/Plot.java index 8747dbd..6467ad5 100644 --- a/src/main/java/com/modnmetl/virtualrealty/objects/Plot.java +++ b/src/main/java/com/modnmetl/virtualrealty/objects/Plot.java @@ -19,6 +19,7 @@ import lombok.SneakyThrows; import org.bukkit.*; import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; @@ -369,8 +370,7 @@ public void prepareCorners() { public void initialize(boolean natural) { long time = System.currentTimeMillis(); prepareCorners(); - if (plotSize == PlotSize.AREA) return; - prepareBlocks(createdLocation, natural); + if (plotSize != PlotSize.AREA) prepareBlocks(createdLocation, natural); VirtualRealty.debug("Plot initialize time: " + (System.currentTimeMillis() - time) + " ms"); } @@ -653,18 +653,26 @@ public void update() { " WHERE `ID`='" + this.ID + "'"); } - public void remove() { - this.unloadPlot(); + public void remove(CommandSender sender) { + if (plotSize != PlotSize.AREA) { + if (SchematicUtil.doesPlotFileExist(ID)) { + this.unloadPlot(); + SchematicUtil.deletePlotFile(ID); + } else { + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().noRegionFileFound); + } + } for (PlotMember member : this.getMembers()) { removeMember(member); } - DynmapManager.removeDynMapMarker(this); + if (VirtualRealty.getDynmapManager() != null) { + DynmapManager.removeDynMapMarker(this); + } try { Database.getInstance().getStatement().execute("DELETE FROM `" + VirtualRealty.getPluginConfiguration().mysql.plotsTableName + "` WHERE `ID` = '" + ID + "';"); } catch (SQLException e) { e.printStackTrace(); } - SchematicUtil.deletePlotFile(ID); PlotManager.removePlotFromList(this); VirtualRealty.debug("Removed plot #" + this.ID); } diff --git a/src/main/java/com/modnmetl/virtualrealty/objects/data/Confirmation.java b/src/main/java/com/modnmetl/virtualrealty/objects/data/Confirmation.java new file mode 100644 index 0000000..0509f6c --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/objects/data/Confirmation.java @@ -0,0 +1,51 @@ +package com.modnmetl.virtualrealty.objects.data; + +import com.modnmetl.virtualrealty.VirtualRealty; +import com.modnmetl.virtualrealty.enums.ConfirmationType; +import com.modnmetl.virtualrealty.managers.ConfirmationManager; +import com.modnmetl.virtualrealty.objects.Executable; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.UUID; + +@Getter +public abstract class Confirmation implements Executable { + + private final UUID confirmationUUID; + private final ConfirmationType confirmationType; + private final Player sender; + private Integer plotID; + private final String proceedText; + + public Confirmation(ConfirmationType confirmationType, Player sender, String proceedText) { + this.confirmationUUID = UUID.randomUUID(); + this.confirmationType = confirmationType; + this.sender = sender; + this.proceedText = proceedText; + this.runExpiry(); + } + + public Confirmation(ConfirmationType confirmationType, Player sender, Integer plotID, String proceedText) { + this.confirmationUUID = UUID.randomUUID(); + this.confirmationType = confirmationType; + this.sender = sender; + this.plotID = plotID; + this.proceedText = proceedText; + this.runExpiry(); + } + + private void runExpiry() { + new BukkitRunnable() { + @Override + public void run() { + if (ConfirmationManager.isConfirmationAvailable(confirmationUUID)) { + sender.sendMessage(VirtualRealty.PREFIX + VirtualRealty.getMessages().confirmationExpired); + expiry(); + } + } + }.runTaskLater(VirtualRealty.getInstance(), 20 * 60); + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/objects/region/GridStructure.java b/src/main/java/com/modnmetl/virtualrealty/objects/region/GridStructure.java index 87a4087..330a70b 100644 --- a/src/main/java/com/modnmetl/virtualrealty/objects/region/GridStructure.java +++ b/src/main/java/com/modnmetl/virtualrealty/objects/region/GridStructure.java @@ -4,7 +4,8 @@ import com.modnmetl.virtualrealty.enums.Direction; import com.modnmetl.virtualrealty.managers.PlotManager; import com.modnmetl.virtualrealty.objects.Plot; -import com.modnmetl.virtualrealty.utils.RegionUtil; +import com.modnmetl.virtualrealty.objects.math.BlockVector2; +import com.modnmetl.virtualrealty.utils.VectorUtils; import com.modnmetl.virtualrealty.utils.data.VirtualBlock; import lombok.Data; import lombok.SneakyThrows; @@ -15,6 +16,8 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.NumberConversions; +import org.jetbrains.annotations.NotNull; import java.util.*; @@ -59,43 +62,43 @@ public void preview(boolean visualization, boolean colliding) { } public void preview(Location playerPreviewLocation, boolean visualization, boolean colliding) { + int maxDistance = viewer.getClientViewDistance() * 16; changedBlocks.clear(); Plot plot = PlotManager.getPlot(cuboidId); - Location location = previewLocation; LinkedList blocks = new LinkedList<>(); LinkedList borderBlocks = new LinkedList<>(); - Direction direction = Direction.byYaw(location.getYaw()); + Direction direction = Direction.byYaw(previewLocation.getYaw()); int maxX; int maxZ; int minX; int minZ; switch(direction) { case SOUTH: { - maxX = location.getBlockX() + 1 + 1; - maxZ = location.getBlockZ() + getLength() + 1; - minX = location.getBlockX() - getWidth() + 1; - minZ = location.getBlockZ() - 1; + maxX = previewLocation.getBlockX() + 1 + 1; + maxZ = previewLocation.getBlockZ() + getLength() + 1; + minX = previewLocation.getBlockX() - getWidth() + 1; + minZ = previewLocation.getBlockZ() - 1; break; } case WEST: { - maxX = location.getBlockX() + 1 + 1; - maxZ = location.getBlockZ() + 1 + 1; - minX = location.getBlockX() - getLength() + 1; - minZ = location.getBlockZ() - getWidth(); + maxX = previewLocation.getBlockX() + 1 + 1; + maxZ = previewLocation.getBlockZ() + 1 + 1; + minX = previewLocation.getBlockX() - getLength() + 1; + minZ = previewLocation.getBlockZ() - getWidth(); break; } case NORTH: { - maxX = location.getBlockX() + getWidth() + 1; - maxZ = location.getBlockZ() + 1 + 1; - minX = location.getBlockX(); - minZ = location.getBlockZ() - getLength(); + maxX = previewLocation.getBlockX() + getWidth() + 1; + maxZ = previewLocation.getBlockZ() + 1 + 1; + minX = previewLocation.getBlockX(); + minZ = previewLocation.getBlockZ() - getLength(); break; } case EAST: { - maxX = location.getBlockX() + getLength() + 1; - maxZ = location.getBlockZ() + getWidth() + 1; - minX = location.getBlockX(); - minZ = location.getBlockZ() - 1; + maxX = previewLocation.getBlockX() + getLength() + 1; + maxZ = previewLocation.getBlockZ() + getWidth() + 1; + minX = previewLocation.getBlockX(); + minZ = previewLocation.getBlockZ() - 1; break; } default: @@ -104,7 +107,10 @@ public void preview(Location playerPreviewLocation, boolean visualization, boole for (int x = minX - 1; x < maxX; x++) { for (int z = minZ; z < maxZ; z++) { if (x == minX - 1 || z == minZ || x == maxX - 1 || z == maxZ - 1) { - borderBlocks.add(location.getWorld().getBlockAt(x, location.getBlockY(), z)); + Block block = previewLocation.getWorld().getBlockAt(x, previewLocation.getBlockY(), z); + if (previewLocation.distance(block.getLocation()) < maxDistance) { + borderBlocks.add(block); + } } } } @@ -116,23 +122,23 @@ public void preview(Location playerPreviewLocation, boolean visualization, boole } else { switch (direction) { case SOUTH: { - bottomLeftCorner = new Location(location.getWorld(), location.getBlockX() + 1, location.getBlockY() - 10, location.getBlockZ() - 1); - topRightCorner = new Location(location.getWorld(), location.getBlockX() - getWidth(), location.getBlockY() + getHeight(), location.getBlockZ() + getLength()); + bottomLeftCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() + 1, previewLocation.getBlockY() - 10, previewLocation.getBlockZ() - 1); + topRightCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() - getWidth(), previewLocation.getBlockY() + getHeight(), previewLocation.getBlockZ() + getLength()); break; } case WEST: { - bottomLeftCorner = new Location(location.getWorld(), location.getBlockX() + 1, location.getBlockY() - 10, location.getBlockZ() + 1); - topRightCorner = new Location(location.getWorld(), location.getBlockX() - getLength(), location.getBlockY() + getHeight(), location.getBlockZ() - getWidth()); + bottomLeftCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() + 1, previewLocation.getBlockY() - 10, previewLocation.getBlockZ() + 1); + topRightCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() - getLength(), previewLocation.getBlockY() + getHeight(), previewLocation.getBlockZ() - getWidth()); break; } case NORTH: { - bottomLeftCorner = new Location(location.getWorld(), location.getBlockX() - 1, location.getBlockY() - 10, location.getBlockZ() + 1); - topRightCorner = new Location(location.getWorld(), location.getBlockX() + getWidth(), location.getBlockY() + getHeight(), location.getBlockZ() - getLength()); + bottomLeftCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() - 1, previewLocation.getBlockY() - 10, previewLocation.getBlockZ() + 1); + topRightCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() + getWidth(), previewLocation.getBlockY() + getHeight(), previewLocation.getBlockZ() - getLength()); break; } case EAST: { - bottomLeftCorner = new Location(location.getWorld(), location.getBlockX() + getLength(), location.getBlockY() - 10, location.getBlockZ() - 1); - topRightCorner = new Location(location.getWorld(), location.getBlockX() - 1, location.getBlockY() + getHeight(), location.getBlockZ() + getWidth()); + bottomLeftCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() + getLength(), previewLocation.getBlockY() - 10, previewLocation.getBlockZ() - 1); + topRightCorner = new Location(previewLocation.getWorld(), previewLocation.getBlockX() - 1, previewLocation.getBlockY() + getHeight(), previewLocation.getBlockZ() + getWidth()); break; } default: @@ -154,11 +160,30 @@ public void preview(Location playerPreviewLocation, boolean visualization, boole blocks.add(playerBlockLocation.getBlock()); } // grid pillars - for (int y = bottomLeftCorner.getBlockY(); y < bottomLeftCorner.getBlockY() + getHeight() + 10; y++) { - blocks.add(new Location(world, minX - 1, y, minZ).getBlock()); - blocks.add(new Location(world, maxX - 1, y, minZ).getBlock()); - blocks.add(new Location(world, minX - 1, y, maxZ - 1).getBlock()); - blocks.add(new Location(world, maxX - 1, y, maxZ - 1).getBlock()); + BlockVector2 firstPillarV = BlockVector2.at(minX - 1, minZ); + BlockVector2 secondPillarV = BlockVector2.at(maxX - 1, minZ); + BlockVector2 thirdPillarV = BlockVector2.at(minX - 1, maxZ - 1); + BlockVector2 fourthPillarV = BlockVector2.at(maxX - 1, maxZ - 1); + BlockVector2 previewV = BlockVector2.at(previewLocation.getBlockX(), previewLocation.getBlockZ()); + if (VectorUtils.distance(previewV, firstPillarV) < maxDistance) { + for (int y = bottomLeftCorner.getBlockY(); y < bottomLeftCorner.getBlockY() + getHeight() + 10; y++) { + blocks.add(firstPillarV.toLocation(this.world, y).getBlock()); + } + } + if (VectorUtils.distance(previewV, secondPillarV) < maxDistance) { + for (int y = bottomLeftCorner.getBlockY(); y < bottomLeftCorner.getBlockY() + getHeight() + 10; y++) { + blocks.add(secondPillarV.toLocation(this.world, y).getBlock()); + } + } + if (VectorUtils.distance(previewV, thirdPillarV) < maxDistance) { + for (int y = bottomLeftCorner.getBlockY(); y < bottomLeftCorner.getBlockY() + getHeight() + 10; y++) { + blocks.add(thirdPillarV.toLocation(this.world, y).getBlock()); + } + } + if (VectorUtils.distance(previewV, fourthPillarV) < maxDistance) { + for (int y = bottomLeftCorner.getBlockY(); y < bottomLeftCorner.getBlockY() + getHeight() + 10; y++) { + blocks.add(fourthPillarV.toLocation(this.world, y).getBlock()); + } } swapBlocks( blocks, diff --git a/src/main/java/com/modnmetl/virtualrealty/utils/RegionUtil.java b/src/main/java/com/modnmetl/virtualrealty/utils/RegionUtil.java index 57246c7..f8a61b4 100644 --- a/src/main/java/com/modnmetl/virtualrealty/utils/RegionUtil.java +++ b/src/main/java/com/modnmetl/virtualrealty/utils/RegionUtil.java @@ -55,13 +55,13 @@ public static boolean isCollidingWithAnotherPlot(Cuboid cuboid) { long time = System.currentTimeMillis(); for (Plot plot : PlotManager.getPlots(cuboid.getWorld().getName())) { for (BlockVector2 blockVector2 : plot.getCuboid().getFlatRegion()) { - if (cuboid.isIn(blockVector2, cuboid.getWorld(), 1)) { - VirtualRealty.debug("Collision checked! (Found) " + (System.currentTimeMillis() - time) + " ms | Spacing: 1"); + if (cuboid.isIn(blockVector2, cuboid.getWorld(), VirtualRealty.getPluginConfiguration().plotSpacing)) { + VirtualRealty.debug("Collision checked! (Found) " + (System.currentTimeMillis() - time) + " ms | Spacing: " + VirtualRealty.getPluginConfiguration().plotSpacing); return true; } } } - VirtualRealty.debug("Collision checked! " + (System.currentTimeMillis() - time) + " ms | Spacing: 1"); + VirtualRealty.debug("Collision checked! " + (System.currentTimeMillis() - time) + " ms | Spacing: " + VirtualRealty.getPluginConfiguration().plotSpacing); return false; } diff --git a/src/main/java/com/modnmetl/virtualrealty/utils/VectorUtils.java b/src/main/java/com/modnmetl/virtualrealty/utils/VectorUtils.java new file mode 100644 index 0000000..9bfbe20 --- /dev/null +++ b/src/main/java/com/modnmetl/virtualrealty/utils/VectorUtils.java @@ -0,0 +1,17 @@ +package com.modnmetl.virtualrealty.utils; + +import com.modnmetl.virtualrealty.objects.math.BlockVector2; +import org.bukkit.util.NumberConversions; + +public class VectorUtils { + + public static double distance(BlockVector2 vector, BlockVector2 vector2) { + return Math.sqrt(distanceSquared(vector, vector2)); + } + + public static double distanceSquared(BlockVector2 vector, BlockVector2 vector2) { + return NumberConversions.square(vector.getBlockX() - vector2.getBlockX()) + + NumberConversions.square(vector.getBlockZ() - vector2.getBlockZ()); + } + +} diff --git a/src/main/java/com/modnmetl/virtualrealty/utils/data/SchematicUtil.java b/src/main/java/com/modnmetl/virtualrealty/utils/data/SchematicUtil.java index 90c3cab..8bd4868 100644 --- a/src/main/java/com/modnmetl/virtualrealty/utils/data/SchematicUtil.java +++ b/src/main/java/com/modnmetl/virtualrealty/utils/data/SchematicUtil.java @@ -135,6 +135,13 @@ public static LinkedList load(int plotID) { return null; } + public static boolean doesPlotFileExist(int plotID) { + File region = new File(VirtualRealty.plotsSchemaFolder, REGION_PREFIX + plotID + REGION_SUFFIX); + File legacyRegion = new File(VirtualRealty.plotsSchemaFolder, LEGACY_REGION_PREFIX + plotID + REGION_SUFFIX); + File oldRegion = new File(VirtualRealty.plotsSchemaFolder, OldSchematicUtil.OLD_REGION_PREFIX + plotID + OldSchematicUtil.OLD_REGION_SUFFIX); + return region.exists() || legacyRegion.exists() || oldRegion.exists(); + } + public static boolean isPlotFileLegacy(int plotID) throws FileNotFoundException { File region = new File(VirtualRealty.plotsSchemaFolder, REGION_PREFIX + plotID + REGION_SUFFIX); File legacyRegion = new File(VirtualRealty.plotsSchemaFolder, LEGACY_REGION_PREFIX + plotID + REGION_SUFFIX); @@ -144,7 +151,7 @@ public static boolean isPlotFileLegacy(int plotID) throws FileNotFoundException } public static void deletePlotFile(int id) { - File file = new File(VirtualRealty.plotsSchemaFolder, "plot" + id + ".region"); + File file = new File(VirtualRealty.plotsSchemaFolder, OldSchematicUtil.OLD_REGION_PREFIX + id + OldSchematicUtil.OLD_REGION_SUFFIX); if (file.exists()) { if (file.delete()) { VirtualRealty.debug("Deleted plot file (" + file.getName() + ")");