mirror of
https://github.com/NLthijs48/AreaShop.git
synced 2024-11-26 20:26:33 +01:00
Added the '/as stack' command to easily create and register regions
/as stack <amount> <gap> <name> <rent|buy> [group] <amount> Number of regions that will be created <gap> Blocks distance between the regions <name> Name of the regions (number will be behind it) <rent|buy> The type of the region [group] A group to add the created regions to The regions will be created in the direction you are facing
This commit is contained in:
parent
b1be87014f
commit
3bbca11cc9
@ -304,7 +304,7 @@ expireWarning:
|
||||
## The time between checking if expiration warning need to be sent
|
||||
delay: 5
|
||||
## Number of regions to update per tick (there are 20 ticks in a second)
|
||||
regionsPerTick: 1
|
||||
regionsPerTick: 3
|
||||
## Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel')
|
||||
update:
|
||||
## Number of regions to update per tick (there are 20 ticks in a second)
|
||||
@ -321,12 +321,15 @@ signs:
|
||||
## Time between updates of all signs (seconds)
|
||||
delay: 60
|
||||
## Number of regions to update signs for per tick (there are 20 ticks in a second)
|
||||
regionsPerTick: 1
|
||||
regionsPerTick: 3
|
||||
## Number of regions per tick to check when a player joins to see if his name changed for regions he owned (updates the regions when changed)
|
||||
nameupdate:
|
||||
## Number of regions to update signs for per tick (there are 20 ticks in a second)
|
||||
regionsPerTick: 5
|
||||
|
||||
## Timings for adding regions to AreaShop ('/as stack')
|
||||
adding:
|
||||
## Number of regions to add per tick (there are 20 ticks in a second)
|
||||
regionsPerTick: 2
|
||||
|
||||
|
||||
|
||||
|
12
lang/EN.yml
12
lang/EN.yml
@ -60,6 +60,7 @@ help-addFriendAll: "&6/as addfriend &7-&r Add a friend to a region."
|
||||
help-delFriend: "&6/as delfriend &7-&r Delete a friend from your region."
|
||||
help-delFriendAll: "&6/as delfriend &7-&r Delete a friend from a region."
|
||||
help-linksigns: "&6/as linksigns &7-&r Use bulk sign linking mode."
|
||||
help-stack: "&6/as stack &7-&r Create multiple regions and add them."
|
||||
|
||||
rent-help: "/as rent [regionname], the region you stand in will be used if not specified."
|
||||
rent-noPermission: "You don't have permission to rent a region."
|
||||
@ -385,6 +386,17 @@ linksigns-next: "&7Leftclick to select a sign, rightclick to select a region, us
|
||||
linksigns-noPermission: "You don't have permission to enter bulk sign linking mode."
|
||||
linksigns-stopped: "Exited sign linking mode."
|
||||
|
||||
stack-help: "/as stack <amount> <gap> <name> <rent|buy> [group].\n&7 <amount> Number of regions that will be created.\n <gap> Blocks distance between the regions.\n <name> Name of the regions (number will be behind it).\n <rent|buy> Make then rent or buy regions.\n [group] A group to add the created regions to.\n The regions will be created in the direction you are facing."
|
||||
stack-accepted: "Starting to create %0% %1% regions with %2% blocks in between, names start with %3% and have a number behind them.%4%"
|
||||
stack-addToGroup: " Created regions will be added to the group '%0%'."
|
||||
stack-noPermission: "You don't have permission to create and add regions to AreaShop in bulk."
|
||||
stack-wrongAmount: "'%0%' is not a correct amount of regions."
|
||||
stack-wrongGap: "'%0%' is not a correct number for the number of blocks gap between regions."
|
||||
stack-noSelection: "You don't have a selection that indicates where the first region should be created."
|
||||
stack-addStart: "&7Adding %0% regions at %1% per second."
|
||||
stack-addComplete: "&7Adding regions complete."
|
||||
stack-unclearDirection: "Please look clearly in the north, east, south or west direction, currently detected %0%."
|
||||
|
||||
timeleft-years: "%0% years"
|
||||
timeleft-months: "%0% months"
|
||||
timeleft-days: "%0% days"
|
||||
|
@ -50,6 +50,7 @@ permissions:
|
||||
areashop.addfriendall: true
|
||||
areashop.delfriendall: true
|
||||
areashop.notifyupdate: true
|
||||
areashop.stack: true
|
||||
areashop.help:
|
||||
description: Allows you to see the help pages
|
||||
default: true
|
||||
@ -202,4 +203,7 @@ permissions:
|
||||
default: op
|
||||
areashop.linksigns:
|
||||
description: Allows you to enter sign linking mode
|
||||
default: op
|
||||
areashop.stack:
|
||||
description: Allows you to create regions and add them to AreaShop like the WorldEdit //stack command
|
||||
default: op
|
@ -4,6 +4,7 @@ import java.util.Collection;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
@ -78,6 +79,16 @@ public class Utils {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static final BlockFace[] facings = { BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST };
|
||||
/**
|
||||
* Get the facing direction based on the yaw
|
||||
* @param yaw The horizontal angle that for example the player is looking
|
||||
* @return The Block Face of the angle
|
||||
*/
|
||||
public static BlockFace yawToFacing(float yaw) {
|
||||
return facings[Math.round(yaw / 45f) & 0x7];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -47,7 +47,6 @@ public class GroupaddCommand extends CommandAreaShop {
|
||||
if(group == null) {
|
||||
group = new RegionGroup(plugin, args[1]);
|
||||
plugin.getFileManager().addGroup(group);
|
||||
group.saveRequired();
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if(!(sender instanceof Player)) {
|
||||
|
221
src/nl/evolutioncoding/areashop/commands/StackCommand.java
Normal file
221
src/nl/evolutioncoding/areashop/commands/StackCommand.java
Normal file
@ -0,0 +1,221 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
import nl.evolutioncoding.areashop.regions.BuyRegion;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
|
||||
import nl.evolutioncoding.areashop.regions.RegionGroup;
|
||||
import nl.evolutioncoding.areashop.regions.RentRegion;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import com.sk89q.worldedit.BlockVector;
|
||||
import com.sk89q.worldedit.bukkit.selections.Selection;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
|
||||
|
||||
public class StackCommand extends CommandAreaShop {
|
||||
|
||||
public StackCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop stack";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.stack")) {
|
||||
return plugin.getLanguageManager().getLang("help-stack");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
// Check permission
|
||||
if(!sender.hasPermission("areashop.stack")) {
|
||||
plugin.message(sender, "stack-noPermission");
|
||||
return;
|
||||
}
|
||||
// Only from ingame
|
||||
if (!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
final Player player = (Player)sender;
|
||||
// Specify enough arguments
|
||||
if(args.length < 5) {
|
||||
plugin.message(sender, "stack-help");
|
||||
return;
|
||||
}
|
||||
// Check amount
|
||||
int tempAmount = -1;
|
||||
try {
|
||||
tempAmount = Integer.parseInt(args[1]);
|
||||
} catch(NumberFormatException e) {}
|
||||
if(tempAmount <= 0) {
|
||||
plugin.message(player, "stack-wrongAmount", args[1]);
|
||||
return;
|
||||
}
|
||||
// Check gap
|
||||
int gap = -1;
|
||||
try {
|
||||
gap = Integer.parseInt(args[2]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(player, "stack-wrongGap", args[2]);
|
||||
return;
|
||||
}
|
||||
// Check region type
|
||||
if(!"rent".equalsIgnoreCase(args[4]) && !"buy".equalsIgnoreCase(args[4])) {
|
||||
plugin.message(sender, "stack-help");
|
||||
return;
|
||||
}
|
||||
// Get WorldEdit selection
|
||||
final Selection selection = plugin.getWorldEdit().getSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "stack-noSelection");
|
||||
return;
|
||||
}
|
||||
// Get or create group
|
||||
RegionGroup group = null;
|
||||
if(args.length > 5) {
|
||||
group = plugin.getFileManager().getGroup(args[5]);
|
||||
if(group == null) {
|
||||
group = new RegionGroup(plugin, args[5]);
|
||||
plugin.getFileManager().addGroup(group);
|
||||
}
|
||||
}
|
||||
// Get facing of the player (must be clearly one of the four directions to make sure it is no mistake)
|
||||
BlockFace facing = Utils.yawToFacing(player.getLocation().getYaw());
|
||||
if(!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST)) {
|
||||
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
|
||||
return;
|
||||
}
|
||||
final Location shift = new Location(selection.getWorld(), 0, 0, 0);
|
||||
if(facing == BlockFace.SOUTH) {
|
||||
shift.setY(-selection.getLength() - gap);
|
||||
} else if(facing == BlockFace.WEST) {
|
||||
shift.setX(selection.getWidth() + gap);
|
||||
} else if(facing == BlockFace.NORTH) {
|
||||
shift.setY(selection.getLength() + gap);
|
||||
} else if(facing == BlockFace.EAST) {
|
||||
shift.setX(-selection.getWidth() - gap);
|
||||
}
|
||||
AreaShop.debug(" calculated shift vector: " + shift + ", with facing=" + facing);
|
||||
// Create regions and add them to AreaShop
|
||||
final String namePrefix = args[3];
|
||||
final int regionsPerTick = plugin.getConfig().getInt("adding.regionsPerTick");
|
||||
final boolean rentRegions = "rent".equalsIgnoreCase(args[4]);
|
||||
final int amount = tempAmount;
|
||||
final RegionGroup finalGroup = group;
|
||||
String type = null;
|
||||
if(rentRegions) {
|
||||
type = "rent";
|
||||
} else {
|
||||
type = "buy";
|
||||
}
|
||||
String groupsMessage = "";
|
||||
if(group != null) {
|
||||
groupsMessage = plugin.getLanguageManager().getLang("stack-addToGroup", group.getName());
|
||||
}
|
||||
plugin.message(player, "stack-accepted", amount, type, gap, namePrefix, groupsMessage);
|
||||
plugin.message(player, "stack-addStart", amount, regionsPerTick*20);
|
||||
new BukkitRunnable() {
|
||||
private int current = 0;
|
||||
private RegionManager manager = AreaShop.getInstance().getWorldGuard().getRegionManager(selection.getWorld());
|
||||
private int counter = 1;
|
||||
@Override
|
||||
public void run() {
|
||||
for(int i=0; i<regionsPerTick; i++) {
|
||||
if(current < amount) {
|
||||
// Create the region name
|
||||
String regionName = namePrefix + counter;
|
||||
while(manager.getRegion(regionName) != null || AreaShop.getInstance().getFileManager().getRegion(regionName) != null) {
|
||||
counter++;
|
||||
regionName = namePrefix + counter;
|
||||
}
|
||||
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
|
||||
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName,
|
||||
new BlockVector(
|
||||
selection.getMinimumPoint().getBlockX() + shift.getBlockX()*current,
|
||||
selection.getMinimumPoint().getBlockY() + shift.getBlockY()*current,
|
||||
selection.getMinimumPoint().getBlockZ() + shift.getBlockZ()*current
|
||||
),
|
||||
new BlockVector(
|
||||
selection.getMaximumPoint().getBlockX() + shift.getBlockX()*current,
|
||||
selection.getMaximumPoint().getBlockY() + shift.getBlockY()*current,
|
||||
selection.getMaximumPoint().getBlockZ() + shift.getBlockZ()*current
|
||||
)
|
||||
);
|
||||
manager.addRegion(region);
|
||||
// Add the region to AreaShop
|
||||
if(rentRegions) {
|
||||
RentRegion rent = new RentRegion(plugin, region.getId(), selection.getWorld());
|
||||
if(finalGroup != null) {
|
||||
finalGroup.addMember(rent);
|
||||
}
|
||||
rent.runEventCommands(RegionEvent.CREATED, true);
|
||||
plugin.getFileManager().addRent(rent);
|
||||
rent.handleSchematicEvent(RegionEvent.CREATED);
|
||||
rent.updateRegionFlags();
|
||||
rent.runEventCommands(RegionEvent.CREATED, false);
|
||||
rent.saveRequired();
|
||||
} else {
|
||||
BuyRegion buy = new BuyRegion(plugin, region.getId(), selection.getWorld());
|
||||
if(finalGroup != null) {
|
||||
finalGroup.addMember(buy);
|
||||
}
|
||||
buy.runEventCommands(RegionEvent.CREATED, true);
|
||||
plugin.getFileManager().addBuy(buy);
|
||||
buy.handleSchematicEvent(RegionEvent.CREATED);
|
||||
buy.updateRegionFlags();
|
||||
buy.runEventCommands(RegionEvent.CREATED, false);
|
||||
buy.saveRequired();
|
||||
}
|
||||
current++;
|
||||
}
|
||||
}
|
||||
if(current >= amount) {
|
||||
if(player.isOnline()) {
|
||||
plugin.message(player, "stack-addComplete");
|
||||
}
|
||||
this.cancel();
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(plugin, 1, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
if(toComplete == 5) {
|
||||
result.add("rent");
|
||||
result.add("buy");
|
||||
} else if(toComplete == 6) {
|
||||
result.addAll(plugin.getFileManager().getGroupNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -21,6 +21,7 @@ import nl.evolutioncoding.areashop.commands.GroupinfoCommand;
|
||||
import nl.evolutioncoding.areashop.commands.GrouplistCommand;
|
||||
import nl.evolutioncoding.areashop.commands.HelpCommand;
|
||||
import nl.evolutioncoding.areashop.commands.InfoCommand;
|
||||
import nl.evolutioncoding.areashop.commands.LinksignsCommand;
|
||||
import nl.evolutioncoding.areashop.commands.MeCommand;
|
||||
import nl.evolutioncoding.areashop.commands.ReloadCommand;
|
||||
import nl.evolutioncoding.areashop.commands.RentCommand;
|
||||
@ -32,6 +33,7 @@ import nl.evolutioncoding.areashop.commands.SetownerCommand;
|
||||
import nl.evolutioncoding.areashop.commands.SetpriceCommand;
|
||||
import nl.evolutioncoding.areashop.commands.SetrestoreCommand;
|
||||
import nl.evolutioncoding.areashop.commands.SetteleportCommand;
|
||||
import nl.evolutioncoding.areashop.commands.StackCommand;
|
||||
import nl.evolutioncoding.areashop.commands.StopresellCommand;
|
||||
import nl.evolutioncoding.areashop.commands.TeleportCommand;
|
||||
import nl.evolutioncoding.areashop.commands.UnrentCommand;
|
||||
@ -82,7 +84,8 @@ public class CommandManager implements CommandExecutor, TabCompleter {
|
||||
commands.add(new DelCommand(plugin));
|
||||
commands.add(new AddsignCommand(plugin));
|
||||
commands.add(new DelsignCommand(plugin));
|
||||
//commands.add(new LinksignsCommand(plugin));
|
||||
commands.add(new LinksignsCommand(plugin));
|
||||
commands.add(new StackCommand(plugin));
|
||||
|
||||
/* Register commands in bukkit */
|
||||
plugin.getCommand("AreaShop").setExecutor(this);
|
||||
|
@ -243,7 +243,8 @@ public class FileManager {
|
||||
|
||||
/**
|
||||
* Remove a rent from the list
|
||||
* @param regionName
|
||||
* @param rent The region to remove
|
||||
* @param giveMoneyBack use true to give money back to the player if someone is currently renting this region, otherwise false
|
||||
*/
|
||||
public boolean removeRent(RentRegion rent, boolean giveMoneyBack) {
|
||||
boolean result = false;
|
||||
@ -903,6 +904,7 @@ public class FileManager {
|
||||
* @return true
|
||||
*/
|
||||
public boolean loadRegionFiles() {
|
||||
regions.clear();
|
||||
File file = new File(regionsPath);
|
||||
if(!file.exists()) {
|
||||
file.mkdirs();
|
||||
|
@ -63,6 +63,10 @@ public class LanguageManager {
|
||||
OutputStream output = null;
|
||||
try {
|
||||
input = plugin.getResource(AreaShop.languageFolder + "/" + languages[i] + ".yml");
|
||||
if(input == null) {
|
||||
plugin.getLogger().warning("Could not save default language to the '" + AreaShop.languageFolder + "' folder: " + languages[i] + ".yml");
|
||||
continue;
|
||||
}
|
||||
output = new FileOutputStream(langFile);
|
||||
|
||||
int read = 0;
|
||||
|
@ -156,11 +156,11 @@ public abstract class GeneralRegion {
|
||||
this.plugin = plugin;
|
||||
this.config = config;
|
||||
|
||||
if(getWorld() == null
|
||||
|| plugin.getWorldGuard().getRegionManager(getWorld()) == null
|
||||
|| plugin.getWorldGuard().getRegionManager(getWorld()).getRegion(getName()) == null) {
|
||||
|
||||
throw new RegionCreateException("Region of " + getName() + " does not exist anymore");
|
||||
if(getWorld() == null) {
|
||||
throw new RegionCreateException("World '"+ getWorldName() +"' of region '" + getName() + "' does not exist anymore, removed region from AreaShop");
|
||||
} else if(plugin.getWorldGuard().getRegionManager(getWorld()) == null
|
||||
|| plugin.getWorldGuard().getRegionManager(getWorld()).getRegion(getName()) == null) {
|
||||
throw new RegionCreateException("WorldGuard region '" + getName() + "' does not exist anymore, removed region from AreaShop");
|
||||
}
|
||||
}
|
||||
|
||||
@ -307,11 +307,7 @@ public abstract class GeneralRegion {
|
||||
* @return The name of the world of the region
|
||||
*/
|
||||
public String getWorldName() {
|
||||
String world = getStringSetting("general.world");
|
||||
if(world == null) {
|
||||
return null;
|
||||
}
|
||||
return world;
|
||||
return getStringSetting("general.world");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -890,6 +886,7 @@ public abstract class GeneralRegion {
|
||||
}
|
||||
// Get the origin and size of the region
|
||||
Vector origin = new Vector(region.getMinimumPoint().getBlockX(), region.getMinimumPoint().getBlockY(), region.getMinimumPoint().getBlockZ());
|
||||
AreaShop.debug("origin of restoreoperation: " + origin);
|
||||
|
||||
// The path to save the schematic
|
||||
File restoreFile = new File(plugin.getFileManager().getSchematicFolder() + File.separator + fileName + AreaShop.schematicExtension);
|
||||
@ -909,6 +906,7 @@ public abstract class GeneralRegion {
|
||||
WorldData worldData = world.getWorldData();
|
||||
LocalSession session = new LocalSession(plugin.getWorldEdit().getLocalConfiguration());
|
||||
Clipboard clipboard = reader.read(worldData);
|
||||
clipboard.setOrigin(clipboard.getMinimumPoint());
|
||||
ClipboardHolder clipboardHolder = new ClipboardHolder(clipboard, worldData);
|
||||
session.setBlockChangeLimit(plugin.getConfig().getInt("maximumBlocks"));
|
||||
session.setClipboard(clipboardHolder);
|
||||
|
Loading…
Reference in New Issue
Block a user