rebased on branch command_rewrite

This commit is contained in:
Vlammar 2021-02-11 22:03:07 +01:00
commit a2be7dc1e4
17 changed files with 225 additions and 160 deletions

View File

@ -93,7 +93,7 @@
<dependency>
<groupId>fr.zcraft</groupId>
<artifactId>quartzlib</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>0.0.2</version>
</dependency>
<dependency>
<groupId>org.bstats</groupId>

View File

@ -83,32 +83,49 @@ public abstract class IoMCommand extends Command {
//name_here; "name here"
int state = 0;
StringBuilder s = new StringBuilder();
for (String arg : args) {
switch (state) {
case 0:
if (arg.startsWith("\"")) {
state = 1;
arg = arg.substring(1);
s = s.append(arg);
} else {
arguments.add(arg.toString());
}
break;
case 1:
if (arg.endsWith("\"")) {
arg = arg.substring(0, arg.length() - 1);
s = s.append(" " + arg);
arguments.add(s.toString());
s = new StringBuilder();
state = 0;
} else {
s = s.append(" " + arg);
}
break;
default:
throw new IllegalStateException("Unexpected value: " + state);
for (String arg : args) {
if (arg.startsWith("http:") || arg.startsWith("https:")) {
arguments.add(arg);
continue;
}
if (state == 0) {
s = new StringBuilder();
} else {
s.append(" ");
}
for (char c : arg.toCharArray()) {
switch (state) {
case 0:
if (c == '\"') {
state = 1;
} else {
//If we read a : that means that we are on a new argument example:"hello"
if (c == ':') {
arguments.add(s.toString());
s = new StringBuilder();
} else {
s = s.append(c);
}
}
break;
case 1:
if (c == '\"') {
arguments.add(s.toString());
s = new StringBuilder();
state = 0;
} else {
s = s.append(c);
}
break;
default:
throw new IllegalStateException("Unexpected value: " + state);
}
}
if (s.length() > 0 && state != 1) {
arguments.add(s.toString());
}
}
return arguments;
}

View File

@ -55,11 +55,11 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "delete", usageParameters = "<map name> [--confirm]")
@CommandInfo(name = "delete", usageParameters = "[player name]:<map name> [--confirm]")
@WithFlags({"confirm"})
public class DeleteCommand extends IoMCommand {
private static RawText deleteMsg(Class klass, Player sender, ImageMap map) {
private static RawText deleteMsg(Class klass, String playerName, ImageMap map) {
return new RawText(I.t("You are going to delete") + " ")
.then(map.getId())
.color(ChatColor.GOLD)
@ -68,7 +68,7 @@ public class DeleteCommand extends IoMCommand {
.then(I.t("[Confirm]"))
.color(ChatColor.GREEN)
.hover(new RawText(I.t("{red}This map will be deleted {bold}forever{red}!")))
.command(klass, sender.getName(), map.getId(), "--confirm")
.command(klass, playerName + ":" + "\"" + map.getId() + "\"", "--confirm")
.build();
}
@ -78,21 +78,20 @@ public class DeleteCommand extends IoMCommand {
final boolean confirm = hasFlag("confirm");
if (arguments.size() > 3 || (arguments.size() > 2 && !confirm)) {
warning(I.t("Too many parameters! Usage: /maptool delete [playername] <mapname>"));
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.size() < 1) {
warning(I.t("Too few parameters! Usage: /maptool delete [playername] <mapname>"));
throwInvalidArgument(I.t("Too few parameters!"));
return;
}
final String playerName;
final String mapName;
final Player sender = playerSender();
info(sender, "" + arguments.size());
if (arguments.size() == 2 || arguments.size() == 3) {
if (!Permissions.DELETEOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
throwNotAuthorized();
return;
}
@ -106,33 +105,33 @@ public class DeleteCommand extends IoMCommand {
//TODO passer en static
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(playerName, uuid -> {
if (uuid == null) {
info(sender, I.t("The player {0} does not exist.", playerName));
warning(sender, I.t("The player {0} does not exist.", playerName));
return;
}
ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {
info(sender, I.t("This map does not exist."));
warning(sender, I.t("This map does not exist."));
return;
}
if (!confirm) {
RawText msg = deleteMsg(getClass(), sender, map);
RawText msg = deleteMsg(getClass(), playerName, map);
RawMessage.send(sender, msg);
} else {
MapManager.clear(sender.getInventory(), map);
if (sender != null && sender.isOnline() && sender.getInventory() != null) {
MapManager.clear(sender.getInventory(), map);
}
try {
MapManager.deleteMap(map);
info(sender, I.t("Map successfully deleted."));
success(sender, I.t("Map successfully deleted."));
} catch (MapManagerException ex) {
PluginLogger.warning(I.t("A non-existent map was requested to be deleted", ex));
warning(sender, I.t("This map does not exist."));
}
}
});

View File

@ -52,13 +52,13 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "explore")
@CommandInfo(name = "explore",usageParameters = "[player name]")
public class ExploreCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 1) {
warning(I.t("Too many parameters! Usage: /maptool explore [playername]"));
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
final String playerName;
@ -66,7 +66,7 @@ public class ExploreCommand extends IoMCommand {
final Player sender = playerSender();
if (arguments.size() == 1) {
if (!Permissions.LISTOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
throwNotAuthorized();
return;
}
playerName = arguments.get(0);
@ -77,11 +77,13 @@ public class ExploreCommand extends IoMCommand {
//TODO passer en static
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(playerName, uuid -> {
if (uuid == null) {
info(sender, I.t("The player {0} does not exist.", playerName));
warning(sender, I.t("The player {0} does not exist.", playerName));
return;
}
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
Gui.open(sender, new MapListGui(offlinePlayer));
if (sender.isOnline()) {
Gui.open(sender, new MapListGui(offlinePlayer,playerName));
}
});

View File

@ -49,66 +49,53 @@ import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "get")
@CommandInfo(name = "get",usageParameters = "[player name]:<map name>")
public class GetCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 1) {
warning(I.t("Too many parameters! Usage: /maptool get [playername]:<mapname>"));
if (arguments.size() > 2) {
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.size() < 1) {
warning(I.t("Too few parameters! Usage: /maptool get [playername]:<mapname>"));
throwInvalidArgument(I.t("Too few parameters!"));
return;
}
final String playerName;
final String mapName;
final Player sender = playerSender();
String[] prefixes = arguments.get(0).split(":");
switch (prefixes.length) {
case 1:
playerName = sender.getName();
mapName = prefixes[0];
break;
case 2:
if (!Permissions.GETOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
return;
}
playerName = prefixes[0];
mapName = prefixes[1];
break;
case 3:
if (prefixes[0].equals("p")) {
if (!Permissions.GETOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
return;
}
playerName = prefixes[1];
mapName = prefixes[2];
}
//insert bank support after
info(sender, I.t("Error in the prefix used, valid ones are ['p:']"));
if (arguments.size() == 1) {
playerName = sender.getName();
mapName = arguments.get(0);
} else {
if (!Permissions.GETOTHER.grantedTo(sender)) {
throwNotAuthorized();
return;
//break;
default:
playerName = "Error found";
mapName = "Error found";
}
playerName = arguments.get(0);
mapName = arguments.get(1);
}
//TODO passer en static
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(playerName, uuid -> {
if (!sender.isOnline()) {
return;
}
if (uuid == null) {
info(sender, I.t("The player {0} does not exist.", playerName));
warning(sender, I.t("The player {0} does not exist.", playerName));
return;
}
ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {
info(sender, I.t("This map does not exist."));
warning(sender, I.t("This map does not exist."));
return;
}

View File

@ -53,7 +53,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "give", usageParameters = "[playerFrom] <playername> <mapname>")
@CommandInfo(name = "give", usageParameters = "<player name> [playerFrom]:<map name>")
public class GiveCommand extends IoMCommand {
@Override
@ -61,29 +61,41 @@ public class GiveCommand extends IoMCommand {
if (args.length < 2) {
throwInvalidArgument(I.t("You must give a valid player name and a map name."));
return;
}
ArrayList<String> arguments = getArgs();
if (arguments.size() > 3) {
warning(I.t("Too many parameters! Usage: /maptool give [playerFrom] <playername> <mapname>"));
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.size() < 1) {
warning(I.t("Too few parameters! Usage: /maptool give [playerFrom] <playername> <mapname>"));
throwInvalidArgument(I.t("Too few parameters!"));
return;
}
final String mapName;
final String from;
final String playerName;
final Player sender = playerSender();
final Player playerSender;
Player playerSender1;
try {
playerSender1 = playerSender();
} catch (CommandException ignored) {
if (arguments.size() == 2) {
throwInvalidArgument(I.t("Player name is required from the console"));
}
playerSender1 = null;
}
playerSender = playerSender1;
if (arguments.size() == 2) {
from = sender.getName();
from = playerSender.getName();
playerName = arguments.get(0);
mapName = arguments.get(1);
} else {
if (arguments.size() == 3) {
from = arguments.get(0);
playerName = arguments.get(1);
from = arguments.get(1);
playerName = arguments.get(0);
mapName = arguments.get(2);
} else {
from = "";
@ -92,31 +104,42 @@ public class GiveCommand extends IoMCommand {
}
}
final Player sender = playerSender();
//TODO passer en static
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(from, uuid -> {
if (uuid == null) {
info(sender, I.t("The player {0} does not exist.", from));
warning(sender, I.t("The player {0} does not exist.", from));
return;
}
final ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {
info(sender, I.t("This map does not exist."));
warning(sender, I.t("This map does not exist."));
return;
}
try {
UUID uuid2 = UUIDFetcher.fetch(playerName);
if (uuid2 == null) {
info(sender, I.t("The player {0} does not exist.", playerName));
warning(sender, I.t("The player {0} does not exist.", playerName));
return;
}
if (map.give(Bukkit.getPlayer(uuid2))) {
if (Bukkit.getPlayer((uuid2)) == null || !Bukkit.getPlayer((uuid2)).isOnline()) {
warning(sender, I.t("The player {0} is not connected.", playerName));
return;
}
if (Bukkit.getPlayer((uuid2)) != null && Bukkit.getPlayer((uuid2)).isOnline()
&& map.give(Bukkit.getPlayer(uuid2))) {
info(I.t("The requested map was too big to fit in your inventory."));
info(I.t("Use '/maptool getremaining' to get the remaining maps."));
}
} catch (IOException | InterruptedException e) {
info(sender, I.t("The player {0} does not exist.", playerName));
try {
throwInvalidArgument(I.t("The player {0} does not exist.", playerName));
} catch (CommandException ex) {
ex.printStackTrace();
}
return;
}
});

View File

@ -54,20 +54,20 @@ import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "list")
@CommandInfo(name = "list", usageParameters = "[player name]")
public class ListCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 1) {
warning(I.t("Too many parameters! Usage: /maptool list [playername]"));
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
String playerName;
if (arguments.size() == 1) {
if (!Permissions.LISTOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
throwNotAuthorized();
return;
}
@ -82,7 +82,11 @@ public class ListCommand extends IoMCommand {
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(playerName, uuid -> {
List<ImageMap> mapList = MapManager.getMapList(uuid);
if (uuid == null) {
info(sender, I.t("Player {} not found.", playerName));
try {
throwInvalidArgument(I.t("Player {} not found.", playerName));
} catch (CommandException e) {
e.printStackTrace();
}
return;
}
if (mapList.isEmpty()) {
@ -98,6 +102,7 @@ public class ListCommand extends IoMCommand {
RawTextPart rawText = new RawText("");
rawText = addMap(rawText, mapList.get(0));
//TODO pagination chat
for (int i = 1, c = mapList.size(); i < c; i++) {
rawText = rawText.then(", ").color(ChatColor.GRAY);
rawText = addMap(rawText, mapList.get(i));

View File

@ -48,7 +48,6 @@ public class RenameCommand extends IoMCommand {
return;
}
map.rename(argList.get(1));
}
@Override

View File

@ -53,27 +53,26 @@ import fr.zcraft.quartzlib.tools.text.MessageSender;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "update", usageParameters = "[playername] <new url> [stretched|covered] <map name to update>")
@CommandInfo(name = "update", usageParameters = "[player name]:<map name> <new url> [stretched|covered] ")
public class UpdateCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
//TODO fix the issue where to many quick usage of offlineNameFetch will return null
ArrayList<String> arguments = getArgs();
String warningMsg;
if (arguments.size() > 4) {
warningMsg = "Too many parameters!"
+ " Usage: /maptool update [playername] <new url> [stretched|covered] <mapname>";
+ " Usage: /maptool update [player name]:<map name> <new url> [stretched|covered]";
warning(I.t(warningMsg));
return;
}
if (arguments.size() < 2) {
warningMsg =
"Too few parameters! Usage: /maptool update [playername] <new url> [stretched|covered] <mapname>";
"Too few parameters! Usage: /maptool update [player name]:<map name> <new url> [stretched|covered]";
warning(I.t(warningMsg));
return;
}
@ -81,43 +80,56 @@ public class UpdateCommand extends IoMCommand {
final String mapName;
final String url;
final String resize;
final Player sender = playerSender();
final Player playerSender;
Player playerSender1;
try {
playerSender1 = playerSender();
} catch (CommandException ignored) {
if (arguments.size() == 2) {
throwInvalidArgument(
I.t("Usage: /maptool update [player name]:<map name> <new url> [stretched|covered]"));
}
playerSender1 = null;
}
playerSender = playerSender1;
//Sent by a non player and not enough arguments
if (arguments.size() == 2 && playerSender == null) {
throwInvalidArgument("Usage: /maptool update [player name]:<map name> <new url> [stretched|covered]");
return;
}
if (arguments.size() == 2) {
resize = "";
playerName = sender.getName();
mapName = arguments.get(1);
url = arguments.get(0);
playerName = playerSender.getName();
mapName = arguments.get(0);
url = arguments.get(1);
} else {
if (arguments.size() == 4) {
if (!Permissions.UPDATEOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
throwNotAuthorized();
return;
}
playerName = arguments.get(0);
url = arguments.get(1);
resize = arguments.get(2);
mapName = arguments.get(3);
mapName = arguments.get(1);
url = arguments.get(2);
resize = arguments.get(3);
} else {
if (arguments.size() == 3) {
if (arguments.get(1).equals("covered") || arguments.get(1).equals("stretched")) {
playerName = sender.getName();
url = arguments.get(0);
resize = arguments.get(1);
mapName = arguments.get(2);
if (arguments.get(2).equals("covered") || arguments.get(2).equals("stretched")) {
playerName = playerSender.getName();
mapName = arguments.get(0);
url = arguments.get(1);
resize = arguments.get(2);
} else {
if (!Permissions.UPDATEOTHER.grantedTo(sender)) {
info(sender, I.t("You can't use this command"));
throwNotAuthorized();
return;
}
playerName = arguments.get(0);
url = arguments.get(1);
mapName = arguments.get(1);
url = arguments.get(2);
resize = "";
mapName = arguments.get(2);
}
} else {
resize = "";
@ -128,10 +140,8 @@ public class UpdateCommand extends IoMCommand {
}
}
final ImageUtils.ScalingType scaling;
switch (resize) {
case "stretched":
@ -144,61 +154,68 @@ public class UpdateCommand extends IoMCommand {
scaling = ImageUtils.ScalingType.CONTAINED;
}
//TODO passer en static
ImageOnMap.getPlugin().getCommandWorker().offlineNameFetch(playerName, uuid -> {
if (uuid == null) {
info(sender, I.t("The player {0} does not exist.", playerName));
warning(sender, I.t("The player {0} does not exist.", playerName));
return;
}
ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {
info(sender, I.t("This map does not exist."));
warning(sender, I.t("This map does not exist."));
return;
}
URL url1;
try {
url1 = new URL(url);
MapManager.load();
//TODO replace by a check of the load status.(if not loaded load the mapmanager)
MapManager.load(false);//we don't want to spam the console each time we reload the mapManager
Integer[] size = {1, 1};
if (map.getType() == ImageMap.Type.POSTER) {
size = map.getSize(new HashMap<String, Object>(), map.getUserUUID(), map.getId());
size = map.getSize(map.getUserUUID(), map.getId());
}
//assert size != null;
int width = size[0];
int height = size[1];
try {
ActionBar.sendPermanentMessage(sender, ChatColor.DARK_GREEN + I.t("Updating..."));
if (playerSender != null) {
ActionBar.sendPermanentMessage(playerSender, ChatColor.DARK_GREEN + I.t("Updating..."));
}
ImageRendererExecutor
.update(url1, scaling, uuid, map, width, height, new WorkerCallback<ImageMap>() {
@Override
public void finished(ImageMap result) {
ActionBar.removeMessage(sender);
MessageSender.sendActionBarMessage(sender,
ChatColor.DARK_GREEN + I.t("The map was updated using the new image!"));
if (playerSender != null) {
ActionBar.removeMessage(playerSender);
MessageSender.sendActionBarMessage(playerSender,
ChatColor.DARK_GREEN + I.t("The map was updated using the new image!"));
}
}
@Override
public void errored(Throwable exception) {
sender.sendMessage(I.t("{ce}Map rendering failed: {0}", exception.getMessage()));
if (playerSender != null) {
playerSender
.sendMessage(
I.t("{ce}Map rendering failed: {0}", exception.getMessage()));
}
PluginLogger.warning("Rendering from {0} failed: {1}: {2}",
sender.getName(),
playerSender.getName(),
exception.getClass().getCanonicalName(),
exception.getMessage());
}
});
} finally {
ActionBar.removeMessage(sender);
if (playerSender != null) {
ActionBar.removeMessage(playerSender);
}
}
} catch (MalformedURLException ex) {
warning(sender, I.t("Invalid URL."));
}
});

View File

@ -123,9 +123,8 @@ public class ConfirmDeleteMapGui extends ActionGui {
.lore(I.t(getPlayerLocale(), "{gray}Name: {white}{0}", mapToDelete.getName()))
.lore(I.t(getPlayerLocale(), "{gray}Map ID: {white}{0}", mapToDelete.getId()))
.lore(I.t(getPlayerLocale(), "{gray}Maps inside: {white}{0}", mapToDelete.getMapsIDs().length))
.hideAllAttributes()
);
//.hideAllAttributes()
/* ** Buttons ** */

View File

@ -227,7 +227,7 @@ public class MapListGui extends ExplorerGui<ImageMap> {
mapPartLeft));
}
//statistics.hideAllAttributes();
statistics.hideAllAttributes();
action("", getSize() - 5, statistics);
}

View File

@ -108,7 +108,7 @@ public abstract class ImageMap implements ConfigurationSerializable {
}
}
public static Integer[] getSize(Map<String, Object> map, UUID playerUUID, String id) {
public static Integer[] getSize(UUID playerUUID, String id) {
ConfigurationSection section =
MapManager.getPlayerMapStore(playerUUID).getToolConfig().getConfigurationSection("PlayerMapStore");

View File

@ -260,7 +260,13 @@ public abstract class MapManager {
}
}
//Silent load
public static void load() {
load(true);
}
//Loading
public static void load(boolean verbose) {
int loadedFilesCount = 0;
for (File file : ImageOnMap.getPlugin().getMapsDirectory().listFiles()) {
UUID uuid = getUUIDFromFile(file);
@ -271,7 +277,9 @@ public abstract class MapManager {
++loadedFilesCount;
}
PluginLogger.info("Loaded {0} player map files.", loadedFilesCount);
if (verbose) {
PluginLogger.info("Loaded {0} player map files.", loadedFilesCount);
}
}
public static void save() {

View File

@ -166,12 +166,12 @@ public class MapItemManager implements Listener {
if (goldTitle) {
mapItem = new ItemStackBuilder(Material.FILLED_MAP)
.title(ChatColor.GOLD, text)
//.hideAllAttributes()
.hideAllAttributes()
.item();
} else {
mapItem = new ItemStackBuilder(Material.FILLED_MAP)
.title(text)
//.hideAllAttributes()
.hideAllAttributes()
.item();
}
final MapMeta meta = (MapMeta) mapItem.getItemMeta();
@ -325,7 +325,7 @@ public class MapItemManager implements Listener {
frame.setItem(new ItemStackBuilder(item)
.title(getMapTitle(item))
//.hideAllAttributes()
.hideAllAttributes()
.item());
}

View File

@ -96,7 +96,7 @@ public abstract class SplatterMapManager {
.loreLine()
.longLore(ChatColor.GRAY
+ I.t("Shift-click one of the placed maps to remove the whole poster in one shot."), 40)
//.hideAllAttributes()
.hideAllAttributes()
.craftItem();
final MapMeta meta = (MapMeta) splatter.getItemMeta();
@ -168,7 +168,7 @@ public abstract class SplatterMapManager {
}
/**
* Return true if it is a platter map
* Return true if it is a splatter map
*
* @param itemStack The item to check.
* @return True if is a splatter map
@ -181,7 +181,13 @@ public abstract class SplatterMapManager {
}
//TODO doc a faire
/**
* Return true if it has a specified splatter map
*
* @param player The player to check.
* @param map The map to check.
* @return True if the player has this map
*/
public static boolean hasSplatterMap(Player player, PosterMap map) {
Inventory playerInventory = player.getInventory();

View File

@ -10,5 +10,8 @@ list: Lists all the map you currently have.
listother: list all the map of another player.
explore: Opens a GUI to see and manage your maps.
exploreother: Opens a GUI to see and manage another player maps.
give: Give a specified player a map
rename: Rename an ImageOnMap
update: Update a specified ImageOnMap
migrate: Lauches the migration process from V2.7 to V3.x.
help : Use help for more information about a command.

View File

@ -24,19 +24,19 @@ permissions:
imageonmap.userender: true
imageonmap.new: true
imageonmap.list: true
imageonmap.listother: true
imageonmap.listother: false
imageonmap.get: true
imageonmap.getother: true
imageonmap.getother: false
imageonmap.explore: true
imageonmap.exploreother: true
imageonmap.exploreother: false
imageonmap.rename: true
imageonmap.removesplattermap: true
imageonmap.delete: true
imageonmap.deleteother: true
imageonmap.deleteother: false
imageonmap.bypasssize: false
imageonmap.give: false
imageonmap.update: true
imageonmap.updateother: true
imageonmap.updateother: false
imageonmap.userender:
description: "Allows you to use /tomap and related commands (/maptool getremaining). Alias of imageonmap.new."
@ -52,7 +52,7 @@ permissions:
imageonmap.listother:
description: "Allows you to list the images a player have rendered."
default: false
default: op
imageonmap.get:
description: "Allows you to get a new map among the ones you already rendered, and related commands (/maptool getremaining)."
@ -60,7 +60,7 @@ permissions:
imageonmap.getother:
description: "Allows you to get a new map among the ones a player have already rendered."
default: false
default: op
imageonmap.explore:
description: "Allows you to open a GUI with all your maps."
@ -68,7 +68,7 @@ permissions:
imageonmap.exploreother:
description: "Allows you to open a GUI with all of the player maps."
default: false
default: op
imageonmap.rename:
description: "Allows you to rename a map you rendered in the past."
@ -84,7 +84,7 @@ permissions:
imageonmap.deleteother:
description: "Allows you to delete a map a player rendered in the past."
default: false
default: op
imageonmap.removesplattermap:
description: "Allows you to remove a splatter map from a wall by sneaking and breaking a map."