diff --git a/config.yml b/config.yml index a0e5b3c..b8b57f8 100644 --- a/config.yml +++ b/config.yml @@ -97,6 +97,7 @@ limitGroups: ## %friends% The names of friends added to this region separated by ', ' ## %friendsuuid% The UUID's of friends added to this region separated by ', ' ## %price% The price of the region formatted with the configured characters before and after the number +## %rawprice% The price without formatting, like '10.0' or '7.77' ## %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years' ## %world% The name of the world that the region is in ## %type% The type of the region, 'rent' or 'buy' @@ -108,7 +109,9 @@ limitGroups: ## %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes) ## %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section) ## %resellprice% The price of a region when it is in resell mode +## %rawresellprice% The resellprice without formatting, like '10.0' or '7.77' ## %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency characters) +## %rawmoneyback% The moneyback without formatting, like '10.0' or '7.77' ## %moneybackpercent% The percentage of the price the player will get back when unrenting (only the number between 0-100) ## %maxextends% The maximum number of extends a player can do on the region ## %extendsleft% The number of extends that are left (maxextends - timesextended) diff --git a/lang/EN.yml b/lang/EN.yml index ce7929f..dc27ad1 100644 --- a/lang/EN.yml +++ b/lang/EN.yml @@ -193,8 +193,10 @@ setprice-noPermission: "You don't have permission to change the price of a regio setprice-help: "/as setprice [region], the region you stand in will be used if not specified." setprice-notRegistered: "The specified region is not registered: %0%." setprice-wrongPrice: "'%0%' is not a valid price." -setprice-successRent: "Price of region %0% changed to %1% per %2%." -setprice-successBuy: "Price of region %0% changed to %1%." +setprice-successRent: "Price of region %region% changed to %price% per %duration%." +setprice-successBuy: "Price of region %region% changed to %price%." +setprice-successRemoved: "Price of %region% has been removed, it will now use the price from a group or the default.yml file, new price: %price%." +setprice-noLandlord: "You don't have permission to change the price because you are not the landlord of %region%." setduration-noPermission: "You don't have permission to change the duration of a rent." setduration-help: "/as setduration [region], the region you stand in will be used if not specified." @@ -202,6 +204,8 @@ setduration-notRegistered: "%0% is not registered for renting." setduration-wrongAmount: "'%0%' is not a valid amount, use a whole number." setduration-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit." setduration-success: "Duration of region %0% changed to '%1%'." +setduration-noLandlord: "You don't have permission to change the duration because you are not the landlord of %region%." +setduration-successRemoved: "Duration of %region% has been removed, it will now use the duration from a group or the default.yml file, new duration: %duration%." setup-noRegion: "You did not specify a region on the second line." setup-wrongRegion: "The region you specified does not exist." @@ -217,6 +221,7 @@ setup-noPermissionRent: "You don't have permission for setting up rental regions setup-noPermissionBuy: "You don't have permission for setting up buy regions." setup-couldNotDetect: "Found multiple regions with the same priority and/or parent/child relation, specify one on the second line (2 of the regions that were found: %0% and %1%)." setup-blacklisted: "%0% is on the blacklist and cannot be added to AreaShop." +setup-noPermission: "You cannot add the region '%0%', you are not an owner/member or don't have the permission for it." destroy-noPermissionRent: "You don't have permission for deregistering a rental region." destroy-noPermissionBuy: "You don't have permission for deregistering a buy region." @@ -296,6 +301,8 @@ add-blacklisted: "On the blacklist: &7%0%." add-specifyWorld: "Specify the world of the region when using from console." add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)." add-noRegion: "Region '%0%' does not exist in this world." +add-noPermissionRegions: "No permission to add: &7%0%." +add-noPermissionOwnerMember: "&7You either are not a member/owner of this region or have no permission to add your regions." del-noRegion: "The specified region is not registered: %0%." del-noPermission: "You don't have permission to remove regions." diff --git a/plugin.yml b/plugin.yml index 6291bd1..005467d 100644 --- a/plugin.yml +++ b/plugin.yml @@ -52,6 +52,13 @@ permissions: areashop.notifyupdate: true areashop.stack: true areashop.setlandlord: true + areashop.landlord.*: + description: Give access to all landlord features + children: + areashop.createrent.owner: true + areashop.createbuy.owner: true + areashop.setprice.landlord: true + areashop.setduration.landlord: true areashop.help: description: Allows you to see the help pages default: true @@ -74,11 +81,23 @@ permissions: description: Allows you to sell your own region default: true areashop.createrent: - description: Allows you to set up signs for renting regions + description: Allows you to add rent regions to AreaShop default: op + areashop.createrent.member: + description: Allows you to add rent regions to AreaShop for which you are registered as member + default: false + areashop.createrent.owner: + description: Allows you to add rent regions to AreaShop for which you are registered as owner + default: false areashop.createbuy: - description: Allows you to set up signs for buying regions + description: Allows you to add buy regions to AreaShop default: op + areashop.createbuy.member: + description: Allows you to add buy regions to AreaShop for which you are registered as member + default: false + areashop.createbuy.owner: + description: Allows you to add buy regions to AreaShop for which you are registered as owner + default: false areashop.destroyrent: description: Allows you to break signs used for renting regions default: op @@ -97,9 +116,15 @@ permissions: areashop.setprice: description: Allows you to change the price default: op + areashop.setprice.landlord: + description: Allows you to change the price of a region that you are landlord of + default: false areashop.setduration: description: Allows you to change the duration of a rent default: op + areashop.setduration.landlord: + description: Allows you to change the duration of a region that you are landlord of + default: false areashop.teleport: description: Teleport to your region default: true diff --git a/src/nl/evolutioncoding/areashop/AreaShop.java b/src/nl/evolutioncoding/areashop/AreaShop.java index 8a120fb..e6208ca 100644 --- a/src/nl/evolutioncoding/areashop/AreaShop.java +++ b/src/nl/evolutioncoding/areashop/AreaShop.java @@ -77,6 +77,7 @@ public final class AreaShop extends JavaPlugin { public static final String tagRegionName = "%region%"; public static final String tagRegionType = "%type%"; public static final String tagPrice = "%price%"; + public static final String tagRawPrice = "%rawprice%"; public static final String tagDuration = "%duration%"; public static final String tagRentedUntil = "%until%"; public static final String tagRentedUntilShort = "%untilshort%"; @@ -86,10 +87,12 @@ public final class AreaShop extends JavaPlugin { public static final String tagTimeLeft = "%timeleft%"; public static final String tagClicker = "%clicker%"; public static final String tagResellPrice = "%resellprice%"; + public static final String tagRawResellPrice = "%rawresellprice%"; public static final String tagFriends = "%friends%"; public static final String tagFriendsUUID = "%friendsuuid%"; public static final String tagMoneyBackPercentage = "%moneybackpercent%"; public static final String tagMoneyBackAmount = "%moneyback%"; + public static final String tagRawMoneyBackAmount = "%rawmoneyback%"; public static final String tagMaxExtends = "%maxextends%"; public static final String tagExtendsLeft = "%extendsleft%"; public static final String tagMaxRentTime = "%maxrenttime%"; diff --git a/src/nl/evolutioncoding/areashop/commands/AddCommand.java b/src/nl/evolutioncoding/areashop/commands/AddCommand.java index 0857918..2fe1d77 100644 --- a/src/nl/evolutioncoding/areashop/commands/AddCommand.java +++ b/src/nl/evolutioncoding/areashop/commands/AddCommand.java @@ -5,16 +5,18 @@ import java.util.List; import nl.evolutioncoding.areashop.AreaShop; import nl.evolutioncoding.areashop.Utils; +import nl.evolutioncoding.areashop.managers.FileManager.AddResult; import nl.evolutioncoding.areashop.regions.BuyRegion; -import nl.evolutioncoding.areashop.regions.GeneralRegion; -import nl.evolutioncoding.areashop.regions.RentRegion; import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent; +import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType; +import nl.evolutioncoding.areashop.regions.RentRegion; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import com.sk89q.worldedit.bukkit.selections.Selection; import com.sk89q.worldguard.protection.regions.ProtectedRegion; @@ -39,8 +41,14 @@ public class AddCommand extends CommandAreaShop { } @Override - public void execute(CommandSender sender, Command command, String[] args) { - if(!sender.hasPermission("areashop.createrent") && !sender.hasPermission("areashop.createbuy")) { + public void execute(final CommandSender sender, Command command, final String[] args) { + if( !sender.hasPermission("areashop.createrent") + && !sender.hasPermission("areashop.createrent.member") + && !sender.hasPermission("areashop.createrent.owner") + + && !sender.hasPermission("areashop.createbuy") + && !sender.hasPermission("areashop.createbuy.member") + && !sender.hasPermission("areashop.createbuy.owner")) { plugin.message(sender, "add-noPermission"); return; } @@ -48,20 +56,18 @@ public class AddCommand extends CommandAreaShop { if(args.length < 2 || args[1] == null || (!"rent".equals(args[1].toLowerCase()) && !"buy".equals(args[1].toLowerCase()))) { plugin.message(sender, "add-help"); return; - } - boolean isRent = "rent".equals(args[1].toLowerCase()); - if((isRent && !sender.hasPermission("areashop.createrent")) || (!isRent && !sender.hasPermission("areashop.createbuy"))) { - plugin.message(sender, "add-noPermission"); - return; } List regions = new ArrayList(); World world = null; + Player player = null; + if(sender instanceof Player) { + player = (Player)sender; + } if(args.length == 2) { - if(!(sender instanceof Player)) { + if(player == null) { plugin.message(sender, "cmd-weOnlyByPlayer"); return; - } - Player player = (Player)sender; + } Selection selection = plugin.getWorldEdit().getSelection(player); if(selection == null) { plugin.message(player, "cmd-noSelection"); @@ -74,7 +80,7 @@ public class AddCommand extends CommandAreaShop { return; } } else { - if(sender instanceof Player) { + if(player != null) { if(args.length == 4) { world = Bukkit.getWorld(args[3]); if(world == null) { @@ -103,53 +109,100 @@ public class AddCommand extends CommandAreaShop { } regions.add(region); } + final boolean isRent = "rent".equals(args[1].toLowerCase()); + final List finalRegions = regions; + final Player finalPlayer = player; + final World finalWorld = world; + AreaShop.debug("Starting add task with " + regions.size() + " regions"); + new BukkitRunnable() { + private int current = 0; + private ArrayList namesSuccess = new ArrayList(); + private ArrayList namesAlready = new ArrayList(); + private ArrayList namesBlacklisted = new ArrayList(); + private ArrayList namesNoPermission = new ArrayList(); - ArrayList namesSuccess = new ArrayList(); - ArrayList namesAlready = new ArrayList(); - ArrayList namesBlacklisted = new ArrayList(); - for(ProtectedRegion region : regions) { - GeneralRegion asRegion = plugin.getFileManager().getRegion(region.getId()); - if(asRegion != null) { - namesAlready.add(region.getId()); - } else if(plugin.getFileManager().isBlacklisted(region.getId())) { - namesBlacklisted.add(region.getId()); - } else { - namesSuccess.add(region.getId()); - if(isRent) { - RentRegion rent = new RentRegion(plugin, region.getId(), world); - // Run commands - rent.runEventCommands(RegionEvent.CREATED, true); - plugin.getFileManager().addRent(rent); - rent.handleSchematicEvent(RegionEvent.CREATED); - // Set the flags for the region - rent.updateRegionFlags(); - // Run commands - rent.runEventCommands(RegionEvent.CREATED, false); - rent.saveRequired(); - } else { - BuyRegion buy = new BuyRegion(plugin, region.getId(), world); - // Run commands - buy.runEventCommands(RegionEvent.CREATED, true); - - plugin.getFileManager().addBuy(buy); - buy.handleSchematicEvent(RegionEvent.CREATED); - // Set the flags for the region - buy.updateRegionFlags(); - // Run commands - buy.runEventCommands(RegionEvent.CREATED, false); - buy.saveRequired(); + @Override + public void run() { + for(int i=0; i= finalRegions.size()) { + if(!namesSuccess.isEmpty()) { + plugin.message(sender, "add-success", args[1], Utils.createCommaSeparatedList(namesSuccess)); + } + if(!namesAlready.isEmpty()) { + plugin.message(sender, "add-failed", Utils.createCommaSeparatedList(namesAlready)); + } + if(!namesBlacklisted.isEmpty()) { + plugin.message(sender, "add-blacklisted", Utils.createCommaSeparatedList(namesBlacklisted)); + } + if(!namesNoPermission.isEmpty()) { + plugin.message(sender, "add-noPermissionRegions", Utils.createCommaSeparatedList(namesNoPermission)); + plugin.message(sender, "add-noPermissionOwnerMember"); + } + this.cancel(); } } - } - if(!namesSuccess.isEmpty()) { - plugin.message(sender, "add-success", args[1], Utils.createCommaSeparatedList(namesSuccess)); - } - if(!namesAlready.isEmpty()) { - plugin.message(sender, "add-failed", Utils.createCommaSeparatedList(namesAlready)); - } - if(!namesBlacklisted.isEmpty()) { - plugin.message(sender, "add-blacklisted", Utils.createCommaSeparatedList(namesBlacklisted)); - } + }.runTaskTimer(plugin, 1, 1); } @Override diff --git a/src/nl/evolutioncoding/areashop/commands/SetdurationCommand.java b/src/nl/evolutioncoding/areashop/commands/SetdurationCommand.java index 702e001..6e911bc 100644 --- a/src/nl/evolutioncoding/areashop/commands/SetdurationCommand.java +++ b/src/nl/evolutioncoding/areashop/commands/SetdurationCommand.java @@ -31,7 +31,7 @@ public class SetdurationCommand extends CommandAreaShop { @Override public void execute(CommandSender sender, Command command, String[] args) { - if(!sender.hasPermission("areashop.setduration")) { + if(!sender.hasPermission("areashop.setduration") && (!sender.hasPermission("areashop.setduration.landlord") && sender instanceof Player)) { plugin.message(sender, "setduration-noPermission"); return; } @@ -39,8 +39,12 @@ public class SetdurationCommand extends CommandAreaShop { plugin.message(sender, "setduration-help"); return; } + int regionArgument = 3; + if(args.length >= 2 && ("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1]))) { + regionArgument = 2; + } RentRegion rent = null; - if(args.length <= 3) { + if(args.length <= regionArgument) { if (sender instanceof Player) { // get the region by location List regions = plugin.getFileManager().getApplicableRentRegions(((Player) sender).getLocation()); @@ -58,10 +62,22 @@ public class SetdurationCommand extends CommandAreaShop { return; } } else { - rent = plugin.getFileManager().getRent(args[3]); + rent = plugin.getFileManager().getRent(args[regionArgument]); } if(rent == null) { - plugin.message(sender, "setduration-notRegistered", args[3]); + plugin.message(sender, "setduration-notRegistered", args[regionArgument]); + return; + } + if(!sender.hasPermission("areashop.setduration") && !rent.isLandlord(((Player)sender).getUniqueId())) { + plugin.message(sender, "setduration-noLandlord", rent); + return; + } + if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) { + plugin.message(sender, "setduration-successRemoved", rent); + rent.setDuration(null); + rent.updateRegionFlags(); + rent.updateSigns(); + rent.saveRequired(); return; } try { diff --git a/src/nl/evolutioncoding/areashop/commands/SetlandlordCommand.java b/src/nl/evolutioncoding/areashop/commands/SetlandlordCommand.java index a073d99..bd6f6c6 100644 --- a/src/nl/evolutioncoding/areashop/commands/SetlandlordCommand.java +++ b/src/nl/evolutioncoding/areashop/commands/SetlandlordCommand.java @@ -34,7 +34,7 @@ public class SetlandlordCommand extends CommandAreaShop { @Override public void execute(CommandSender sender, Command command, String[] args) { if(!sender.hasPermission("areashop.setlandlord")) { - plugin.message(sender, "setteleport-noPermission"); + plugin.message(sender, "setlandlord-noPermission"); return; } if(args.length < 2) { diff --git a/src/nl/evolutioncoding/areashop/commands/SetownerCommand.java b/src/nl/evolutioncoding/areashop/commands/SetownerCommand.java index d834958..0c647d4 100644 --- a/src/nl/evolutioncoding/areashop/commands/SetownerCommand.java +++ b/src/nl/evolutioncoding/areashop/commands/SetownerCommand.java @@ -123,7 +123,7 @@ public class SetownerCommand extends CommandAreaShop { } if(region.isBuyRegion()) { BuyRegion buy = (BuyRegion)region; - buy.setLandlord(uuid); + buy.setBuyer(uuid); buy.saveRequired(); plugin.message(sender, "setowner-succesBuy", region); buy.updateRegionFlags(); diff --git a/src/nl/evolutioncoding/areashop/commands/SetpriceCommand.java b/src/nl/evolutioncoding/areashop/commands/SetpriceCommand.java index 54c9d8d..5ea2e4d 100644 --- a/src/nl/evolutioncoding/areashop/commands/SetpriceCommand.java +++ b/src/nl/evolutioncoding/areashop/commands/SetpriceCommand.java @@ -33,7 +33,7 @@ public class SetpriceCommand extends CommandAreaShop { @Override public void execute(CommandSender sender, Command command, String[] args) { - if(!sender.hasPermission("areashop.setprice")) { + if(!sender.hasPermission("areashop.setprice") && (!sender.hasPermission("areashop.setprice.landlord") && sender instanceof Player)) { plugin.message(sender, "setprice-noPermission"); return; } @@ -66,6 +66,22 @@ public class SetpriceCommand extends CommandAreaShop { plugin.message(sender, "setprice-notRegistered", args[2]); return; } + if(!sender.hasPermission("areashop.setprice") && !region.isLandlord(((Player)sender).getUniqueId())) { + plugin.message(sender, "setprice-noLandlord", region); + return; + } + if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) { + if(region.isRentRegion()) { + ((RentRegion)region).removePrice(); + } else if(region.isBuyRegion()) { + ((BuyRegion)region).removePrice(); + } + plugin.message(sender, "setprice-successRemoved", region); + region.updateSigns(); + region.updateRegionFlags(); + region.saveRequired(); + return; + } double price = 0.0; try { price = Double.parseDouble(args[1]); @@ -75,10 +91,10 @@ public class SetpriceCommand extends CommandAreaShop { } if(region.isRentRegion()) { ((RentRegion)region).setPrice(price); - plugin.message(sender, "setprice-successRent", region.getName(), ((RentRegion)region).getFormattedPrice(), ((RentRegion)region).getDurationString()); + plugin.message(sender, "setprice-successRent", region); } else if(region.isBuyRegion()) { ((BuyRegion)region).setPrice(price); - plugin.message(sender, "setprice-successBuy", region.getName(), ((BuyRegion)region).getFormattedPrice()); + plugin.message(sender, "setprice-successBuy", region); } region.updateSigns(); region.updateRegionFlags(); diff --git a/src/nl/evolutioncoding/areashop/listeners/SignChangeListener.java b/src/nl/evolutioncoding/areashop/listeners/SignChangeListener.java index 3acd587..cfb37fc 100644 --- a/src/nl/evolutioncoding/areashop/listeners/SignChangeListener.java +++ b/src/nl/evolutioncoding/areashop/listeners/SignChangeListener.java @@ -3,10 +3,12 @@ package nl.evolutioncoding.areashop.listeners; import java.util.List; import nl.evolutioncoding.areashop.AreaShop; +import nl.evolutioncoding.areashop.managers.FileManager.AddResult; import nl.evolutioncoding.areashop.regions.BuyRegion; import nl.evolutioncoding.areashop.regions.GeneralRegion; -import nl.evolutioncoding.areashop.regions.RentRegion; import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent; +import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType; +import nl.evolutioncoding.areashop.regions.RentRegion; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -53,7 +55,7 @@ public final class SignChangeListener implements Listener { // Check if the sign is meant for this plugin if(event.getLine(0).contains(plugin.getConfig().getString("signTags.rent"))) { - if(!player.hasPermission("areashop.createrent")) { + if(!player.hasPermission("areashop.createrent") && !player.hasPermission("areashop.createrent.member") && !player.hasPermission("areashop.createrent.owner")) { plugin.message(player, "setup-noPermissionRent"); return; } @@ -92,6 +94,8 @@ public final class SignChangeListener implements Listener { } } } + + boolean priceSet = fourthLine != null && fourthLine.length() != 0; boolean durationSet = thirdLine != null && thirdLine.length() != 0; @@ -99,15 +103,23 @@ public final class SignChangeListener implements Listener { if(secondLine == null || secondLine.length() == 0) { plugin.message(player, "setup-noRegion"); return; - } else if(regionManager.getRegion(secondLine) == null) { + } + ProtectedRegion region = regionManager.getRegion(secondLine); + if(region == null) { plugin.message(player, "setup-wrongRegion"); return; - } else if(plugin.getFileManager().isBlacklisted(secondLine)) { + } + + AddResult addResult = plugin.getFileManager().checkRegionAdd(player, regionManager.getRegion(secondLine), RegionType.RENT); + if(addResult == AddResult.BLACKLISTED) { plugin.message(player, "setup-blacklisted", secondLine); return; - } else if(plugin.getFileManager().getRent(secondLine) != null) { + } else if(addResult == AddResult.ALREADYADDED) { plugin.message(player, "setup-alreadyRentSign"); return; + } else if(addResult == AddResult.NOPERMISSION) { + plugin.message(player, "setup-noPermission", secondLine); + return; } else if(thirdLine != null && thirdLine.length() != 0 && !plugin.checkTimeFormat(thirdLine)) { plugin.message(player, "setup-wrongDuration"); return; @@ -125,6 +137,15 @@ public final class SignChangeListener implements Listener { // Add rent to the FileManager final RentRegion rent = new RentRegion(plugin, secondLine, event.getPlayer().getWorld()); + boolean isMember = player != null && region.getMembers().contains(player.getUniqueId()); + boolean isOwner = player != null && region.getOwners().contains(player.getUniqueId()); + boolean landlord = (!player.hasPermission("areashop.createrent") + && ((player.hasPermission("areashop.createrent.owner") && isOwner) + || (player.hasPermission("areashop.createrent.member") && isMember))); + + if(landlord) { + rent.setLandlord(player.getUniqueId()); + } if(priceSet) { rent.setPrice(price); } @@ -156,7 +177,7 @@ public final class SignChangeListener implements Listener { } } else if (event.getLine(0).contains(plugin.getConfig().getString("signTags.buy"))) { // Check for permission - if(!player.hasPermission("areashop.createbuy")) { + if(!player.hasPermission("areashop.createbuy") && !player.hasPermission("areashop.createbuy.member") && !player.hasPermission("areashop.createbuy.owner")) { plugin.message(player, "setup-noPermissionBuy"); return; } @@ -200,15 +221,22 @@ public final class SignChangeListener implements Listener { if(secondLine == null || secondLine.length() == 0) { plugin.message(player, "setup-noRegion"); return; - } else if(regionManager.getRegion(secondLine) == null) { + } + ProtectedRegion region = regionManager.getRegion(secondLine); + if(region == null) { plugin.message(player, "setup-wrongRegion"); return; - } else if(plugin.getFileManager().isBlacklisted(secondLine)) { + } + AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, RegionType.BUY); + if(addResult == AddResult.BLACKLISTED) { plugin.message(player, "setup-blacklisted", secondLine); return; - } else if(plugin.getFileManager().getBuy(secondLine) != null) { - plugin.message(player, "setup-alreadyBuySign"); + } else if(addResult == AddResult.ALREADYADDED) { + plugin.message(player, "setup-alreadyRentSign"); return; + } else if(addResult == AddResult.NOPERMISSION) { + plugin.message(player, "setup-noPermission", secondLine); + return; } else { double price = 0.0; if(priceSet) { @@ -223,6 +251,15 @@ public final class SignChangeListener implements Listener { // Add buy to the FileManager final BuyRegion buy = new BuyRegion(plugin, secondLine, event.getPlayer().getWorld()); + boolean isMember = player != null && region.getMembers().contains(player.getUniqueId()); + boolean isOwner = player != null && region.getOwners().contains(player.getUniqueId()); + boolean landlord = (!player.hasPermission("areashop.createbuy") + && ((player.hasPermission("areashop.createbuy.owner") && isOwner) + || (player.hasPermission("areashop.createbuy.member") && isMember))); + + if(landlord) { + buy.setLandlord(player.getUniqueId()); + } if(priceSet) { buy.setPrice(price); } diff --git a/src/nl/evolutioncoding/areashop/managers/FileManager.java b/src/nl/evolutioncoding/areashop/managers/FileManager.java index acfe3a0..8dc1e98 100644 --- a/src/nl/evolutioncoding/areashop/managers/FileManager.java +++ b/src/nl/evolutioncoding/areashop/managers/FileManager.java @@ -36,6 +36,7 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import com.google.common.base.Charsets; @@ -69,6 +70,22 @@ public class FileManager { private String versionPath = null; private String schemFolder = null; + /* Enum for region types */ + public enum AddResult { + BLACKLISTED("blacklisted"), + NOPERMISSION("nopermission"), + ALREADYADDED("alreadyadded"), + SUCCESS("success"); + + private final String value; + private AddResult(String value) { + this.value = value; + } + public String getValue() { + return value; + } + } + /** * Constructor, initialize variabeles * @param plugin @@ -230,6 +247,10 @@ public class FileManager { regions.put(buy.getName().toLowerCase(), buy); } + /** + * Add a RegionGroup + * @param group The RegionGroup to add + */ public void addGroup(RegionGroup group) { groups.put(group.getName().toLowerCase(), group); String lowGroup = group.getName().toLowerCase(); @@ -241,6 +262,44 @@ public class FileManager { } } + /** + * Check if a player can add a certain region as rent or buy region + * @param sender The player/console that wants to add a region + * @param region The WorldGuard region to add + * @param type The type the region should have in AreaShop + * @return The result if a player would want to add this region + */ + public AddResult checkRegionAdd(CommandSender sender, ProtectedRegion region, RegionType type) { + Player player = null; + if(sender instanceof Player) { + player = (Player)sender; + } + // Determine if the player is an owner or member of the region + boolean isMember = player != null && region.getMembers().contains(player.getUniqueId()); + boolean isOwner = player != null && region.getOwners().contains(player.getUniqueId()); + AreaShop.debug("checkRegionAdd: isOwner=" + isOwner + ", isMember=" + isMember); + String typeString = null; + if(type == RegionType.RENT) { + typeString = "rent"; + } else { + typeString = "buy"; + } + AreaShop.debug(" permissions: .create=" + sender.hasPermission("areashop.create" + typeString) + ", .create.owner=" + sender.hasPermission("areashop.create" + typeString + ".owner") + ", .create.member=" + sender.hasPermission("areashop.create" + typeString + ".member")); + if(!(sender.hasPermission("areashop.create" + typeString) + || (sender.hasPermission("areashop.create" + typeString + ".owner") && isOwner) + || (sender.hasPermission("areashop.create" + typeString + ".member") && isMember))) { + return AddResult.NOPERMISSION; + } + GeneralRegion asRegion = plugin.getFileManager().getRegion(region.getId()); + if(asRegion != null) { + return AddResult.ALREADYADDED; + } else if(plugin.getFileManager().isBlacklisted(region.getId())) { + return AddResult.BLACKLISTED; + } else { + return AddResult.SUCCESS; + } + } + /** * Remove a rent from the list * @param rent The region to remove diff --git a/src/nl/evolutioncoding/areashop/regions/BuyRegion.java b/src/nl/evolutioncoding/areashop/regions/BuyRegion.java index 087cbdd..ea0bc0d 100644 --- a/src/nl/evolutioncoding/areashop/regions/BuyRegion.java +++ b/src/nl/evolutioncoding/areashop/regions/BuyRegion.java @@ -78,7 +78,7 @@ public class BuyRegion extends GeneralRegion { * Set the buyer of this region * @param buyer The UUID of the player that should be set as buyer */ - public void setLandlord(UUID buyer) { + public void setBuyer(UUID buyer) { if(buyer == null) { setSetting("buy.buyer", null); setSetting("buy.buyerName", null); @@ -159,6 +159,13 @@ public class BuyRegion extends GeneralRegion { setSetting("buy.price", price); } + /** + * Remove the price so that the price will be taken from a group or the default.yml file + */ + public void removePrice() { + setSetting("buy.price", null); + } + /** * Set the region into resell mode with the given price * @param price The price this region should be put up for sale @@ -205,10 +212,13 @@ public class BuyRegion extends GeneralRegion { // Fill the replacements map with things specific to a BuyRegion HashMap result = new HashMap(); result.put(AreaShop.tagPrice, getFormattedPrice()); + result.put(AreaShop.tagRawPrice, getPrice()); result.put(AreaShop.tagPlayerName, getPlayerName()); result.put(AreaShop.tagPlayerUUID, getBuyer()); result.put(AreaShop.tagResellPrice, getFormattedResellPrice()); + result.put(AreaShop.tagRawResellPrice, getResellPrice()); result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount()); + result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount()); double moneyBackPercent = getMoneyBackPercentage(); if((moneyBackPercent%1.0) == 0.0) { result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent); @@ -307,7 +317,7 @@ public class BuyRegion extends GeneralRegion { // Run commands this.runEventCommands(RegionEvent.RESELL, true); // Set the owner - setLandlord(player.getUniqueId()); + setBuyer(player.getUniqueId()); // Update everything handleSchematicEvent(RegionEvent.RESELL); @@ -347,7 +357,7 @@ public class BuyRegion extends GeneralRegion { // Run commands this.runEventCommands(RegionEvent.BOUGHT, true); // Set the owner - setLandlord(player.getUniqueId()); + setBuyer(player.getUniqueId()); // Update everything handleSchematicEvent(RegionEvent.BOUGHT); @@ -421,7 +431,7 @@ public class BuyRegion extends GeneralRegion { /* Remove friends and the owner */ clearFriends(); - setLandlord(null); + setBuyer(null); updateSigns(); diff --git a/src/nl/evolutioncoding/areashop/regions/GeneralRegion.java b/src/nl/evolutioncoding/areashop/regions/GeneralRegion.java index 72797a5..87c19d1 100644 --- a/src/nl/evolutioncoding/areashop/regions/GeneralRegion.java +++ b/src/nl/evolutioncoding/areashop/regions/GeneralRegion.java @@ -386,6 +386,15 @@ public abstract class GeneralRegion { } } + /** + * Check if the specified player is the landlord of this region + * @param landlord The UUID of the players to check for landlord + * @return true if the player is the landlord, otherwise false + */ + public boolean isLandlord(UUID landlord) { + return landlord !=null && getLandlord() != null && getLandlord().equals(landlord); + } + /** * Get the WorldGuard region associated with this AreaShop region * @return The ProtectedRegion of WorldGuard or null if the region does not exist anymore diff --git a/src/nl/evolutioncoding/areashop/regions/RentRegion.java b/src/nl/evolutioncoding/areashop/regions/RentRegion.java index 0c3539d..b534a1f 100644 --- a/src/nl/evolutioncoding/areashop/regions/RentRegion.java +++ b/src/nl/evolutioncoding/areashop/regions/RentRegion.java @@ -137,6 +137,7 @@ public class RentRegion extends GeneralRegion { // Fill the replacements map with things specific to a RentRegion HashMap result = new HashMap(); result.put(AreaShop.tagPrice, getFormattedPrice()); + result.put(AreaShop.tagRawPrice, getPrice()); result.put(AreaShop.tagDuration, getDurationString()); result.put(AreaShop.tagPlayerName, getPlayerName()); result.put(AreaShop.tagPlayerUUID, getRenter()); @@ -148,6 +149,7 @@ public class RentRegion extends GeneralRegion { result.put(AreaShop.tagRentedUntilShort, dateString); result.put(AreaShop.tagTimeLeft, getTimeLeftString()); result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount()); + result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount()); double moneyBackPercent = getMoneyBackPercentage(); if((moneyBackPercent%1.0) == 0.0) { result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent); @@ -319,6 +321,13 @@ public class RentRegion extends GeneralRegion { setSetting("rent.price", price); } + /** + * Remove the price so that the price will be taken from a group or the default.yml file + */ + public void removePrice() { + setSetting("rent.price", null); + } + /** * Set the duration of the rent * @param duration The duration of the rent (as specified on the documentation pages)