diff --git a/plugin.yml b/plugin.yml index 482da85..a45972d 100644 --- a/plugin.yml +++ b/plugin.yml @@ -3,6 +3,7 @@ main: me.EtienneDx.RealEstate.RealEstate version: ${project.version} authors: [EtienneDx, DmitryRendov, FamousLongwing] depend: [Vault, GriefPrevention] +softdepend: [WorldEdit] api-version: "1.20" commands: diff --git a/pom.xml b/pom.xml index ed71994..2949768 100644 --- a/pom.xml +++ b/pom.xml @@ -29,8 +29,8 @@ maven-compiler-plugin 3.8.1 - 16 - 16 + 17 + 17 @@ -96,6 +96,10 @@ + + enginehub-maven + https://maven.enginehub.org/repo/ + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -163,7 +167,19 @@ com.github.EtienneDx AnnotationConfig e9eab24 - + + + com.sk89q.worldedit + worldedit-core + 7.2.0-SNAPSHOT + provided + + + com.sk89q.worldedit + worldedit-bukkit + 7.2.0-SNAPSHOT + provided + diff --git a/src/me/EtienneDx/RealEstate/Config.java b/src/me/EtienneDx/RealEstate/Config.java index f57d493..60650d0 100644 --- a/src/me/EtienneDx/RealEstate/Config.java +++ b/src/me/EtienneDx/RealEstate/Config.java @@ -101,7 +101,8 @@ public class Config extends AnnotationConfig @ConfigField(name="RealEstate.Settings.MessagesFiles", comment="Language file to be used. You can see all languages files in the languages directory. If the language file does not exist, it will be created and you'll be able to modify it later on.") public String languageFile = "en.yml"; - + @ConfigField(name="RealEstate.Settings.UseWorldEdit", comment="This setting specifies whether we should restore rental areas to the state it was in before the are was rented") + public boolean RestoreRentalState=false; //this will destroy whatever was added during rental period to start with, will default to true once I save the items as rental period ends. public Config() { this.pdf = RealEstate.instance.getDescription(); diff --git a/src/me/EtienneDx/RealEstate/REListener.java b/src/me/EtienneDx/RealEstate/REListener.java index 45d1b8f..25b3d05 100644 --- a/src/me/EtienneDx/RealEstate/REListener.java +++ b/src/me/EtienneDx/RealEstate/REListener.java @@ -409,6 +409,7 @@ public class REListener implements Listener if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && event.getHand().equals(EquipmentSlot.HAND) && event.getClickedBlock().getState() instanceof Sign) { + Sign sign = (Sign)event.getClickedBlock().getState(); RealEstate.instance.log.info(sign.getLine(0)); // it is a real estate sign @@ -427,6 +428,7 @@ public class REListener implements Listener } Transaction tr = RealEstate.transactionsStore.getTransaction(claim); + if(player.isSneaking()) tr.preview(player); else diff --git a/src/me/EtienneDx/RealEstate/RealEstate.java b/src/me/EtienneDx/RealEstate/RealEstate.java index 35ae8f6..1bfa021 100644 --- a/src/me/EtienneDx/RealEstate/RealEstate.java +++ b/src/me/EtienneDx/RealEstate/RealEstate.java @@ -46,6 +46,7 @@ public class RealEstate extends JavaPlugin public final static String pluginDirPath = "plugins" + File.separator + "RealEstate" + File.separator; final static String languagesDirectory = RealEstate.pluginDirPath + "languages"; public static boolean vaultPresent = false; + public static boolean worldEditPresent = false; public static Economy econ = null; public static Permission perms = null; public static Essentials ess = null; @@ -86,6 +87,13 @@ public class RealEstate extends JavaPlugin return; } } + if (checkWorldEdit()) + { + org.bukkit.plugin.Plugin WorldEditPlugin=getServer().getPluginManager().getPlugin("WorldEdit"); + this.log.info("Found WorldEdit, using version "+WorldEditPlugin.getDescription().getVersion()); + + + } if(getServer().getPluginManager().getPlugin("Essentials") != null) { org.bukkit.plugin.Plugin ess=getServer().getPluginManager().getPlugin("Essentials"); @@ -267,6 +275,11 @@ public class RealEstate extends JavaPlugin return vaultPresent; } + private boolean checkWorldEdit() + { + worldEditPresent = getServer().getPluginManager().getPlugin("WorldEdit") !=null; + return worldEditPresent; + } private boolean setupEconomy() { RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class); diff --git a/src/me/EtienneDx/RealEstate/Transactions/ClaimLease.java b/src/me/EtienneDx/RealEstate/Transactions/ClaimLease.java index 9a7e122..9bd8121 100644 --- a/src/me/EtienneDx/RealEstate/Transactions/ClaimLease.java +++ b/src/me/EtienneDx/RealEstate/Transactions/ClaimLease.java @@ -66,6 +66,7 @@ public class ClaimLease extends BoughtTransaction if(sign.getBlock().getState() instanceof Sign) { Sign s = (Sign)sign.getBlock().getState(); + s.setWaxed(true); s.setLine(0, Messages.getMessage(RealEstate.instance.config.cfgSignsHeader, false)); s.setLine(1, ChatColor.DARK_GREEN + RealEstate.instance.config.cfgReplaceLease); //s.setLine(2, owner != null ? Bukkit.getOfflinePlayer(owner).getName() : "SERVER"); diff --git a/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java b/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java index 68541a2..33aa88c 100644 --- a/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java +++ b/src/me/EtienneDx/RealEstate/Transactions/ClaimRent.java @@ -1,5 +1,8 @@ package me.EtienneDx.RealEstate.Transactions; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -8,7 +11,6 @@ import java.time.Period; import java.time.format.DateTimeFormatter; import java.util.Map; - import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; @@ -17,6 +19,23 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import com.earth2me.essentials.User; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; +import com.sk89q.worldedit.function.operation.ForwardExtentCopy; +import com.sk89q.worldedit.function.operation.Operation; +import com.sk89q.worldedit.function.operation.Operations; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.CuboidRegion; +import com.sk89q.worldedit.session.ClipboardHolder; import me.EtienneDx.RealEstate.Messages; import me.EtienneDx.RealEstate.RealEstate; @@ -58,6 +77,41 @@ public class ClaimRent extends BoughtTransaction this.duration = duration; this.maxPeriod = RealEstate.instance.config.cfgEnableRentPeriod ? rentPeriods : 1; this.buildTrust = buildTrust; + //if worldedit saving is requested, here's where i think... to do it.. + if(RealEstate.instance.getServer().getPluginManager().getPlugin("WorldEdit")!=null) //is world edit installed? + { + if(RealEstate.instance.config.RestoreRentalState)//are we configured to use it? + { + + Location lesser=claim.getLesserBoundaryCorner(); + Location greater=claim.getGreaterBoundaryCorner(); + CuboidRegion region = new CuboidRegion(BlockVector3.at(lesser.getX(), lesser.getWorld().getMinHeight(), lesser.getZ()),BlockVector3.at(greater.getX(),greater.getWorld().getMaxHeight(),greater.getZ())); + BlockArrayClipboard clipboard = new BlockArrayClipboard (region); + com.sk89q.worldedit.world.World adaptedworld= BukkitAdapter.adapt(lesser.getWorld()); + EditSession editSession=WorldEdit.getInstance().newEditSession(adaptedworld); + ForwardExtentCopy CopyArea=new ForwardExtentCopy(editSession,region,clipboard,region.getMinimumPoint()); + try { + Operations.complete(CopyArea); + } catch (WorldEditException e) { + + RealEstate.instance.log.info("Failed to copy rental area, WorldEdit gives error: "+e.getMessage()); + } + + + String schempath = RealEstate.pluginDirPath + "/schematics/"+claim.getID().toString()+".schem"; + File file = new File(schempath); + try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) { + writer.write(clipboard); + } + catch (Exception e) + { + RealEstate.instance.log.info("Failed to copy rental area, Writing out schematic failed: "+e.getMessage()); + } + + + } + + } } @Override @@ -83,6 +137,7 @@ public class ClaimRent extends BoughtTransaction if(sign.getBlock().getState() instanceof Sign) { Sign s = (Sign) sign.getBlock().getState(); + s.setWaxed(true); s.setLine(0, Messages.getMessage(RealEstate.instance.config.cfgSignsHeader, false)); s.setLine(1, ChatColor.DARK_GREEN + RealEstate.instance.config.cfgReplaceRent); //s.setLine(2, owner != null ? Bukkit.getOfflinePlayer(owner).getName() : "SERVER"); @@ -178,6 +233,45 @@ public class ClaimRent extends BoughtTransaction } buyer = null; RealEstate.transactionsStore.saveData(); + //if worldedit saving is requested, here's where i think... to do it.. + if(RealEstate.instance.getServer().getPluginManager().getPlugin("WorldEdit")!=null) //is world edit installed? + { + if(RealEstate.instance.config.RestoreRentalState)//are we configured to use it? + { + //load schematic, paste where we got it. + String schempath = RealEstate.pluginDirPath + "/schematics/"+claim.getID().toString()+".schem"; + File file = new File(schempath); + Clipboard clipboard =null; + ClipboardFormat format= ClipboardFormats.findByFile(file); + try (ClipboardReader reader = format.getReader(new FileInputStream(file))) { + clipboard = reader.read(); + } + catch (Exception e) + { + RealEstate.instance.log.info("Failed to import previously saved schematic: "+e.getMessage()); + update(); + return; + } + Location lesser=claim.getLesserBoundaryCorner(); + + com.sk89q.worldedit.world.World world = BukkitAdapter.adapt(lesser.getWorld()); + try (EditSession editSession = WorldEdit.getInstance().newEditSession(world)) { + Operation operation = new ClipboardHolder(clipboard) + .createPaste(editSession) + .to(BlockVector3.at(lesser.getX(), lesser.getWorld().getMinHeight(), lesser.getZ())) + // configure here + .build(); + Operations.complete(operation); + } + catch(Exception e) + { + RealEstate.instance.log.info("Failed to paste initial schematic: "+e.getMessage()); + update(); + return; + + } + } + } update(); } diff --git a/src/me/EtienneDx/RealEstate/Transactions/ClaimSell.java b/src/me/EtienneDx/RealEstate/Transactions/ClaimSell.java index 406e2b3..d3ac429 100644 --- a/src/me/EtienneDx/RealEstate/Transactions/ClaimSell.java +++ b/src/me/EtienneDx/RealEstate/Transactions/ClaimSell.java @@ -38,6 +38,7 @@ public class ClaimSell extends ClaimTransaction if(sign.getBlock().getState() instanceof Sign) { Sign s = (Sign) sign.getBlock().getState(); + s.setWaxed(true); s.setLine(0, Messages.getMessage(RealEstate.instance.config.cfgSignsHeader, false)); s.setLine(1, ChatColor.DARK_GREEN + RealEstate.instance.config.cfgReplaceSell); s.setLine(2, owner != null ? Utils.getSignString(Bukkit.getOfflinePlayer(owner).getName()) : "SERVER");