Add permissions for landlords to add regions

Added things:
- "areashop.createrent.owner", "areashop.createrent.member",
"areashop.createbuy.owner" and "areashop.createbuy.member" to let
players add regions to AreaShop when they are member/owner of the
WorldGuard region (because they made the region for example).
- "areashop.setprice.landlord" to give landlords access to setting the
price for their regions
- "areashop.setduration.landlord" to give landlords access to setting
the duration for their regions
- When "default" or "reset" is given as price then the price will be
removed and therefore inherited from a group or default.yml
- When "default" or "reset" is given as duration then the duration will
be removed and therefore inherited from a group or default.yml
This commit is contained in:
Thijs Wiefferink 2015-03-17 21:22:57 +01:00
parent d1a3027e0b
commit fde60e2a27
14 changed files with 331 additions and 84 deletions

View File

@ -97,6 +97,7 @@ limitGroups:
## %friends% The names of friends added to this region separated by ', ' ## %friends% The names of friends added to this region separated by ', '
## %friendsuuid% The UUID's 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 ## %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' ## %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 ## %world% The name of the world that the region is in
## %type% The type of the region, 'rent' or 'buy' ## %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) ## %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) ## %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 ## %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) ## %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) ## %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 ## %maxextends% The maximum number of extends a player can do on the region
## %extendsleft% The number of extends that are left (maxextends - timesextended) ## %extendsleft% The number of extends that are left (maxextends - timesextended)

View File

@ -193,8 +193,10 @@ setprice-noPermission: "You don't have permission to change the price of a regio
setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified." setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified."
setprice-notRegistered: "The specified region is not registered: %0%." setprice-notRegistered: "The specified region is not registered: %0%."
setprice-wrongPrice: "'%0%' is not a valid price." setprice-wrongPrice: "'%0%' is not a valid price."
setprice-successRent: "Price of region %0% changed to %1% per %2%." setprice-successRent: "Price of region %region% changed to %price% per %duration%."
setprice-successBuy: "Price of region %0% changed to %1%." 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-noPermission: "You don't have permission to change the duration of a rent."
setduration-help: "/as setduration <amount> <identifier> [region], the region you stand in will be used if not specified." setduration-help: "/as setduration <amount> <identifier> [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-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-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit."
setduration-success: "Duration of region %0% changed to '%1%'." 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-noRegion: "You did not specify a region on the second line."
setup-wrongRegion: "The region you specified does not exist." 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-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-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-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-noPermissionRent: "You don't have permission for deregistering a rental region."
destroy-noPermissionBuy: "You don't have permission for deregistering a buy 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-specifyWorld: "Specify the world of the region when using from console."
add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)." add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)."
add-noRegion: "Region '%0%' does not exist in this world." 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-noRegion: "The specified region is not registered: %0%."
del-noPermission: "You don't have permission to remove regions." del-noPermission: "You don't have permission to remove regions."

View File

@ -52,6 +52,13 @@ permissions:
areashop.notifyupdate: true areashop.notifyupdate: true
areashop.stack: true areashop.stack: true
areashop.setlandlord: 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: areashop.help:
description: Allows you to see the help pages description: Allows you to see the help pages
default: true default: true
@ -74,11 +81,23 @@ permissions:
description: Allows you to sell your own region description: Allows you to sell your own region
default: true default: true
areashop.createrent: areashop.createrent:
description: Allows you to set up signs for renting regions description: Allows you to add rent regions to AreaShop
default: op 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: areashop.createbuy:
description: Allows you to set up signs for buying regions description: Allows you to add buy regions to AreaShop
default: op 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: areashop.destroyrent:
description: Allows you to break signs used for renting regions description: Allows you to break signs used for renting regions
default: op default: op
@ -97,9 +116,15 @@ permissions:
areashop.setprice: areashop.setprice:
description: Allows you to change the price description: Allows you to change the price
default: op default: op
areashop.setprice.landlord:
description: Allows you to change the price of a region that you are landlord of
default: false
areashop.setduration: areashop.setduration:
description: Allows you to change the duration of a rent description: Allows you to change the duration of a rent
default: op default: op
areashop.setduration.landlord:
description: Allows you to change the duration of a region that you are landlord of
default: false
areashop.teleport: areashop.teleport:
description: Teleport to your region description: Teleport to your region
default: true default: true

View File

@ -77,6 +77,7 @@ public final class AreaShop extends JavaPlugin {
public static final String tagRegionName = "%region%"; public static final String tagRegionName = "%region%";
public static final String tagRegionType = "%type%"; public static final String tagRegionType = "%type%";
public static final String tagPrice = "%price%"; public static final String tagPrice = "%price%";
public static final String tagRawPrice = "%rawprice%";
public static final String tagDuration = "%duration%"; public static final String tagDuration = "%duration%";
public static final String tagRentedUntil = "%until%"; public static final String tagRentedUntil = "%until%";
public static final String tagRentedUntilShort = "%untilshort%"; 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 tagTimeLeft = "%timeleft%";
public static final String tagClicker = "%clicker%"; public static final String tagClicker = "%clicker%";
public static final String tagResellPrice = "%resellprice%"; public static final String tagResellPrice = "%resellprice%";
public static final String tagRawResellPrice = "%rawresellprice%";
public static final String tagFriends = "%friends%"; public static final String tagFriends = "%friends%";
public static final String tagFriendsUUID = "%friendsuuid%"; public static final String tagFriendsUUID = "%friendsuuid%";
public static final String tagMoneyBackPercentage = "%moneybackpercent%"; public static final String tagMoneyBackPercentage = "%moneybackpercent%";
public static final String tagMoneyBackAmount = "%moneyback%"; public static final String tagMoneyBackAmount = "%moneyback%";
public static final String tagRawMoneyBackAmount = "%rawmoneyback%";
public static final String tagMaxExtends = "%maxextends%"; public static final String tagMaxExtends = "%maxextends%";
public static final String tagExtendsLeft = "%extendsleft%"; public static final String tagExtendsLeft = "%extendsleft%";
public static final String tagMaxRentTime = "%maxrenttime%"; public static final String tagMaxRentTime = "%maxrenttime%";

View File

@ -5,16 +5,18 @@ import java.util.List;
import nl.evolutioncoding.areashop.AreaShop; import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils; import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.managers.FileManager.AddResult;
import nl.evolutioncoding.areashop.regions.BuyRegion; 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.RegionEvent;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.bukkit.selections.Selection; import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@ -39,8 +41,14 @@ public class AddCommand extends CommandAreaShop {
} }
@Override @Override
public void execute(CommandSender sender, Command command, String[] args) { public void execute(final CommandSender sender, Command command, final String[] args) {
if(!sender.hasPermission("areashop.createrent") && !sender.hasPermission("areashop.createbuy")) { 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"); plugin.message(sender, "add-noPermission");
return; 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()))) { if(args.length < 2 || args[1] == null || (!"rent".equals(args[1].toLowerCase()) && !"buy".equals(args[1].toLowerCase()))) {
plugin.message(sender, "add-help"); plugin.message(sender, "add-help");
return; 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<ProtectedRegion> regions = new ArrayList<ProtectedRegion>(); List<ProtectedRegion> regions = new ArrayList<ProtectedRegion>();
World world = null; World world = null;
Player player = null;
if(sender instanceof Player) {
player = (Player)sender;
}
if(args.length == 2) { if(args.length == 2) {
if(!(sender instanceof Player)) { if(player == null) {
plugin.message(sender, "cmd-weOnlyByPlayer"); plugin.message(sender, "cmd-weOnlyByPlayer");
return; return;
} }
Player player = (Player)sender;
Selection selection = plugin.getWorldEdit().getSelection(player); Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) { if(selection == null) {
plugin.message(player, "cmd-noSelection"); plugin.message(player, "cmd-noSelection");
@ -74,7 +80,7 @@ public class AddCommand extends CommandAreaShop {
return; return;
} }
} else { } else {
if(sender instanceof Player) { if(player != null) {
if(args.length == 4) { if(args.length == 4) {
world = Bukkit.getWorld(args[3]); world = Bukkit.getWorld(args[3]);
if(world == null) { if(world == null) {
@ -103,53 +109,100 @@ public class AddCommand extends CommandAreaShop {
} }
regions.add(region); regions.add(region);
} }
final boolean isRent = "rent".equals(args[1].toLowerCase());
final List<ProtectedRegion> 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<String> namesSuccess = new ArrayList<String>();
private ArrayList<String> namesAlready = new ArrayList<String>();
private ArrayList<String> namesBlacklisted = new ArrayList<String>();
private ArrayList<String> namesNoPermission = new ArrayList<String>();
ArrayList<String> namesSuccess = new ArrayList<String>(); @Override
ArrayList<String> namesAlready = new ArrayList<String>(); public void run() {
ArrayList<String> namesBlacklisted = new ArrayList<String>(); for(int i=0; i<plugin.getConfig().getInt("adding.regionsPerTick"); i++) {
for(ProtectedRegion region : regions) { if(current < finalRegions.size()) {
GeneralRegion asRegion = plugin.getFileManager().getRegion(region.getId()); ProtectedRegion region = finalRegions.get(current);
if(asRegion != null) { // Determine if the player is an owner or member of the region
namesAlready.add(region.getId()); boolean isMember = finalPlayer != null && region.getMembers().contains(finalPlayer.getUniqueId());
} else if(plugin.getFileManager().isBlacklisted(region.getId())) { boolean isOwner = finalPlayer != null && region.getOwners().contains(finalPlayer.getUniqueId());
namesBlacklisted.add(region.getId()); String type = null;
} else { if(isRent) {
namesSuccess.add(region.getId()); type = "rent";
if(isRent) { } else {
RentRegion rent = new RentRegion(plugin, region.getId(), world); type = "buy";
// Run commands }
rent.runEventCommands(RegionEvent.CREATED, true); AddResult result = plugin.getFileManager().checkRegionAdd(sender, region, isRent ? RegionType.RENT : RegionType.BUY);
plugin.getFileManager().addRent(rent); if(result == AddResult.ALREADYADDED) {
rent.handleSchematicEvent(RegionEvent.CREATED); namesAlready.add(region.getId());
// Set the flags for the region } else if(result == AddResult.BLACKLISTED) {
rent.updateRegionFlags(); namesBlacklisted.add(region.getId());
// Run commands } else if(result == AddResult.NOPERMISSION) {
rent.runEventCommands(RegionEvent.CREATED, false); namesNoPermission.add(region.getId());
rent.saveRequired(); } else {
} else { namesSuccess.add(region.getId());
BuyRegion buy = new BuyRegion(plugin, region.getId(), world); // Check if the player should be landlord
// Run commands boolean landlord = (!sender.hasPermission("areashop.create" + type)
buy.runEventCommands(RegionEvent.CREATED, true); && ((sender.hasPermission("areashop.create" + type + ".owner") && isOwner)
|| (sender.hasPermission("areashop.create" + type + ".member") && isMember)));
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(RegionEvent.CREATED); if(isRent) {
// Set the flags for the region RentRegion rent = new RentRegion(plugin, region.getId(), finalWorld);
buy.updateRegionFlags(); // Set landlord
// Run commands if(landlord) {
buy.runEventCommands(RegionEvent.CREATED, false); rent.setLandlord(finalPlayer.getUniqueId());
buy.saveRequired(); }
// 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(), finalWorld);
// Set landlord
if(landlord) {
buy.setLandlord(finalPlayer.getUniqueId());
}
// 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();
}
}
current++;
}
}
if(current >= 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();
} }
} }
} }.runTaskTimer(plugin, 1, 1);
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));
}
} }
@Override @Override

View File

@ -31,7 +31,7 @@ public class SetdurationCommand extends CommandAreaShop {
@Override @Override
public void execute(CommandSender sender, Command command, String[] args) { 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"); plugin.message(sender, "setduration-noPermission");
return; return;
} }
@ -39,8 +39,12 @@ public class SetdurationCommand extends CommandAreaShop {
plugin.message(sender, "setduration-help"); plugin.message(sender, "setduration-help");
return; return;
} }
int regionArgument = 3;
if(args.length >= 2 && ("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1]))) {
regionArgument = 2;
}
RentRegion rent = null; RentRegion rent = null;
if(args.length <= 3) { if(args.length <= regionArgument) {
if (sender instanceof Player) { if (sender instanceof Player) {
// get the region by location // get the region by location
List<RentRegion> regions = plugin.getFileManager().getApplicableRentRegions(((Player) sender).getLocation()); List<RentRegion> regions = plugin.getFileManager().getApplicableRentRegions(((Player) sender).getLocation());
@ -58,10 +62,22 @@ public class SetdurationCommand extends CommandAreaShop {
return; return;
} }
} else { } else {
rent = plugin.getFileManager().getRent(args[3]); rent = plugin.getFileManager().getRent(args[regionArgument]);
} }
if(rent == null) { 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; return;
} }
try { try {

View File

@ -34,7 +34,7 @@ public class SetlandlordCommand extends CommandAreaShop {
@Override @Override
public void execute(CommandSender sender, Command command, String[] args) { public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.setlandlord")) { if(!sender.hasPermission("areashop.setlandlord")) {
plugin.message(sender, "setteleport-noPermission"); plugin.message(sender, "setlandlord-noPermission");
return; return;
} }
if(args.length < 2) { if(args.length < 2) {

View File

@ -123,7 +123,7 @@ public class SetownerCommand extends CommandAreaShop {
} }
if(region.isBuyRegion()) { if(region.isBuyRegion()) {
BuyRegion buy = (BuyRegion)region; BuyRegion buy = (BuyRegion)region;
buy.setLandlord(uuid); buy.setBuyer(uuid);
buy.saveRequired(); buy.saveRequired();
plugin.message(sender, "setowner-succesBuy", region); plugin.message(sender, "setowner-succesBuy", region);
buy.updateRegionFlags(); buy.updateRegionFlags();

View File

@ -33,7 +33,7 @@ public class SetpriceCommand extends CommandAreaShop {
@Override @Override
public void execute(CommandSender sender, Command command, String[] args) { 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"); plugin.message(sender, "setprice-noPermission");
return; return;
} }
@ -66,6 +66,22 @@ public class SetpriceCommand extends CommandAreaShop {
plugin.message(sender, "setprice-notRegistered", args[2]); plugin.message(sender, "setprice-notRegistered", args[2]);
return; 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; double price = 0.0;
try { try {
price = Double.parseDouble(args[1]); price = Double.parseDouble(args[1]);
@ -75,10 +91,10 @@ public class SetpriceCommand extends CommandAreaShop {
} }
if(region.isRentRegion()) { if(region.isRentRegion()) {
((RentRegion)region).setPrice(price); ((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()) { } else if(region.isBuyRegion()) {
((BuyRegion)region).setPrice(price); ((BuyRegion)region).setPrice(price);
plugin.message(sender, "setprice-successBuy", region.getName(), ((BuyRegion)region).getFormattedPrice()); plugin.message(sender, "setprice-successBuy", region);
} }
region.updateSigns(); region.updateSigns();
region.updateRegionFlags(); region.updateRegionFlags();

View File

@ -3,10 +3,12 @@ package nl.evolutioncoding.areashop.listeners;
import java.util.List; import java.util.List;
import nl.evolutioncoding.areashop.AreaShop; import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.managers.FileManager.AddResult;
import nl.evolutioncoding.areashop.regions.BuyRegion; import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion; 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.RegionEvent;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -53,7 +55,7 @@ public final class SignChangeListener implements Listener {
// Check if the sign is meant for this plugin // Check if the sign is meant for this plugin
if(event.getLine(0).contains(plugin.getConfig().getString("signTags.rent"))) { 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"); plugin.message(player, "setup-noPermissionRent");
return; return;
} }
@ -92,6 +94,8 @@ public final class SignChangeListener implements Listener {
} }
} }
} }
boolean priceSet = fourthLine != null && fourthLine.length() != 0; boolean priceSet = fourthLine != null && fourthLine.length() != 0;
boolean durationSet = thirdLine != null && thirdLine.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) { if(secondLine == null || secondLine.length() == 0) {
plugin.message(player, "setup-noRegion"); plugin.message(player, "setup-noRegion");
return; return;
} else if(regionManager.getRegion(secondLine) == null) { }
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "setup-wrongRegion"); plugin.message(player, "setup-wrongRegion");
return; 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); plugin.message(player, "setup-blacklisted", secondLine);
return; return;
} else if(plugin.getFileManager().getRent(secondLine) != null) { } else if(addResult == AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign"); plugin.message(player, "setup-alreadyRentSign");
return; return;
} else if(addResult == AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
return;
} else if(thirdLine != null && thirdLine.length() != 0 && !plugin.checkTimeFormat(thirdLine)) { } else if(thirdLine != null && thirdLine.length() != 0 && !plugin.checkTimeFormat(thirdLine)) {
plugin.message(player, "setup-wrongDuration"); plugin.message(player, "setup-wrongDuration");
return; return;
@ -125,6 +137,15 @@ public final class SignChangeListener implements Listener {
// Add rent to the FileManager // Add rent to the FileManager
final RentRegion rent = new RentRegion(plugin, secondLine, event.getPlayer().getWorld()); 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) { if(priceSet) {
rent.setPrice(price); rent.setPrice(price);
} }
@ -156,7 +177,7 @@ public final class SignChangeListener implements Listener {
} }
} else if (event.getLine(0).contains(plugin.getConfig().getString("signTags.buy"))) { } else if (event.getLine(0).contains(plugin.getConfig().getString("signTags.buy"))) {
// Check for permission // 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"); plugin.message(player, "setup-noPermissionBuy");
return; return;
} }
@ -200,15 +221,22 @@ public final class SignChangeListener implements Listener {
if(secondLine == null || secondLine.length() == 0) { if(secondLine == null || secondLine.length() == 0) {
plugin.message(player, "setup-noRegion"); plugin.message(player, "setup-noRegion");
return; return;
} else if(regionManager.getRegion(secondLine) == null) { }
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "setup-wrongRegion"); plugin.message(player, "setup-wrongRegion");
return; 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); plugin.message(player, "setup-blacklisted", secondLine);
return; return;
} else if(plugin.getFileManager().getBuy(secondLine) != null) { } else if(addResult == AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyBuySign"); plugin.message(player, "setup-alreadyRentSign");
return; return;
} else if(addResult == AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
return;
} else { } else {
double price = 0.0; double price = 0.0;
if(priceSet) { if(priceSet) {
@ -223,6 +251,15 @@ public final class SignChangeListener implements Listener {
// Add buy to the FileManager // Add buy to the FileManager
final BuyRegion buy = new BuyRegion(plugin, secondLine, event.getPlayer().getWorld()); 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) { if(priceSet) {
buy.setPrice(price); buy.setPrice(price);
} }

View File

@ -36,6 +36,7 @@ import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
@ -69,6 +70,22 @@ public class FileManager {
private String versionPath = null; private String versionPath = null;
private String schemFolder = 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 * Constructor, initialize variabeles
* @param plugin * @param plugin
@ -230,6 +247,10 @@ public class FileManager {
regions.put(buy.getName().toLowerCase(), buy); regions.put(buy.getName().toLowerCase(), buy);
} }
/**
* Add a RegionGroup
* @param group The RegionGroup to add
*/
public void addGroup(RegionGroup group) { public void addGroup(RegionGroup group) {
groups.put(group.getName().toLowerCase(), group); groups.put(group.getName().toLowerCase(), group);
String lowGroup = group.getName().toLowerCase(); 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 * Remove a rent from the list
* @param rent The region to remove * @param rent The region to remove

View File

@ -78,7 +78,7 @@ public class BuyRegion extends GeneralRegion {
* Set the buyer of this region * Set the buyer of this region
* @param buyer The UUID of the player that should be set as buyer * @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) { if(buyer == null) {
setSetting("buy.buyer", null); setSetting("buy.buyer", null);
setSetting("buy.buyerName", null); setSetting("buy.buyerName", null);
@ -159,6 +159,13 @@ public class BuyRegion extends GeneralRegion {
setSetting("buy.price", price); 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 * Set the region into resell mode with the given price
* @param price The price this region should be put up for sale * @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 // Fill the replacements map with things specific to a BuyRegion
HashMap<String, Object> result = new HashMap<String, Object>(); HashMap<String, Object> result = new HashMap<String, Object>();
result.put(AreaShop.tagPrice, getFormattedPrice()); result.put(AreaShop.tagPrice, getFormattedPrice());
result.put(AreaShop.tagRawPrice, getPrice());
result.put(AreaShop.tagPlayerName, getPlayerName()); result.put(AreaShop.tagPlayerName, getPlayerName());
result.put(AreaShop.tagPlayerUUID, getBuyer()); result.put(AreaShop.tagPlayerUUID, getBuyer());
result.put(AreaShop.tagResellPrice, getFormattedResellPrice()); result.put(AreaShop.tagResellPrice, getFormattedResellPrice());
result.put(AreaShop.tagRawResellPrice, getResellPrice());
result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount()); result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount());
result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount());
double moneyBackPercent = getMoneyBackPercentage(); double moneyBackPercent = getMoneyBackPercentage();
if((moneyBackPercent%1.0) == 0.0) { if((moneyBackPercent%1.0) == 0.0) {
result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent); result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent);
@ -307,7 +317,7 @@ public class BuyRegion extends GeneralRegion {
// Run commands // Run commands
this.runEventCommands(RegionEvent.RESELL, true); this.runEventCommands(RegionEvent.RESELL, true);
// Set the owner // Set the owner
setLandlord(player.getUniqueId()); setBuyer(player.getUniqueId());
// Update everything // Update everything
handleSchematicEvent(RegionEvent.RESELL); handleSchematicEvent(RegionEvent.RESELL);
@ -347,7 +357,7 @@ public class BuyRegion extends GeneralRegion {
// Run commands // Run commands
this.runEventCommands(RegionEvent.BOUGHT, true); this.runEventCommands(RegionEvent.BOUGHT, true);
// Set the owner // Set the owner
setLandlord(player.getUniqueId()); setBuyer(player.getUniqueId());
// Update everything // Update everything
handleSchematicEvent(RegionEvent.BOUGHT); handleSchematicEvent(RegionEvent.BOUGHT);
@ -421,7 +431,7 @@ public class BuyRegion extends GeneralRegion {
/* Remove friends and the owner */ /* Remove friends and the owner */
clearFriends(); clearFriends();
setLandlord(null); setBuyer(null);
updateSigns(); updateSigns();

View File

@ -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 * Get the WorldGuard region associated with this AreaShop region
* @return The ProtectedRegion of WorldGuard or null if the region does not exist anymore * @return The ProtectedRegion of WorldGuard or null if the region does not exist anymore

View File

@ -137,6 +137,7 @@ public class RentRegion extends GeneralRegion {
// Fill the replacements map with things specific to a RentRegion // Fill the replacements map with things specific to a RentRegion
HashMap<String, Object> result = new HashMap<String, Object>(); HashMap<String, Object> result = new HashMap<String, Object>();
result.put(AreaShop.tagPrice, getFormattedPrice()); result.put(AreaShop.tagPrice, getFormattedPrice());
result.put(AreaShop.tagRawPrice, getPrice());
result.put(AreaShop.tagDuration, getDurationString()); result.put(AreaShop.tagDuration, getDurationString());
result.put(AreaShop.tagPlayerName, getPlayerName()); result.put(AreaShop.tagPlayerName, getPlayerName());
result.put(AreaShop.tagPlayerUUID, getRenter()); result.put(AreaShop.tagPlayerUUID, getRenter());
@ -148,6 +149,7 @@ public class RentRegion extends GeneralRegion {
result.put(AreaShop.tagRentedUntilShort, dateString); result.put(AreaShop.tagRentedUntilShort, dateString);
result.put(AreaShop.tagTimeLeft, getTimeLeftString()); result.put(AreaShop.tagTimeLeft, getTimeLeftString());
result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount()); result.put(AreaShop.tagMoneyBackAmount, getFormattedMoneyBackAmount());
result.put(AreaShop.tagRawMoneyBackAmount, getMoneyBackAmount());
double moneyBackPercent = getMoneyBackPercentage(); double moneyBackPercent = getMoneyBackPercentage();
if((moneyBackPercent%1.0) == 0.0) { if((moneyBackPercent%1.0) == 0.0) {
result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent); result.put(AreaShop.tagMoneyBackPercentage, (int)moneyBackPercent);
@ -319,6 +321,13 @@ public class RentRegion extends GeneralRegion {
setSetting("rent.price", price); 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 * Set the duration of the rent
* @param duration The duration of the rent (as specified on the documentation pages) * @param duration The duration of the rent (as specified on the documentation pages)