Compare commits

...

2 Commits

Author SHA1 Message Date
Vlammar 05fbb6b416 refactor ... 2022-07-26 04:28:04 +02:00
Vlammar b3411f89a8 added a new command and refactored the other one 2022-07-26 04:27:37 +02:00
17 changed files with 237 additions and 79 deletions

View File

@ -44,6 +44,7 @@ import fr.moribus.imageonmap.commands.maptool.GetRemainingCommand;
import fr.moribus.imageonmap.commands.maptool.GiveCommand;
import fr.moribus.imageonmap.commands.maptool.ListCommand;
import fr.moribus.imageonmap.commands.maptool.NewCommand;
import fr.moribus.imageonmap.commands.maptool.RemotePlacingCommand;
import fr.moribus.imageonmap.commands.maptool.RenameCommand;
import fr.moribus.imageonmap.commands.maptool.UpdateCommand;
import fr.moribus.imageonmap.image.ImageIOExecutor;
@ -158,12 +159,14 @@ public final class ImageOnMap extends QuartzPlugin {
GetRemainingCommand.class,
ExploreCommand.class,
//MigrateCommand.class,//Removed for now doesn't work nor is useful, maybe useful later on
UpdateCommand.class
UpdateCommand.class,
RemotePlacingCommand.class
);
Commands.registerShortcut(commandGroupName, NewCommand.class, "tomap");
Commands.registerShortcut(commandGroupName, ExploreCommand.class, "maps");
Commands.registerShortcut(commandGroupName, GiveCommand.class, "givemap");
Commands.registerShortcut(commandGroupName, RemotePlacingCommand.class, "placemap");
if (PluginConfiguration.CHECK_FOR_UPDATES.get()) {
UpdateChecker.boot("imageonmap.26585");

View File

@ -63,7 +63,8 @@ public enum Permissions {
BYPASS_IMAGE_LIMIT("imageonmap.bypassimagelimit"),
BYPASS_MAP_LIMIT("imageonmap.bypassmaplimit"),
GIVE("imageonmap.give"),
BYPASS_WHITELIST("imageonmap.bypasswhitelist");
BYPASS_WHITELIST("imageonmap.bypasswhitelist"),
REMOTE_PLACING("imageonmap.remoteplacing");
private final String permission;
private final String[] aliases;

View File

@ -37,6 +37,7 @@
package fr.moribus.imageonmap.commands;
import fr.moribus.imageonmap.PluginConfiguration;
import fr.moribus.imageonmap.image.ImageUtils;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager;
import fr.zcraft.quartzlib.components.commands.Command;
@ -49,11 +50,32 @@ import java.util.UUID;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
public abstract class IoMCommand extends Command {
protected UUID getPlayerUUID(String playerName) {
return Bukkit.getOfflinePlayer(playerName).getUniqueId();
}
private boolean checkTooArguments(boolean bool, String msg) throws CommandException {
if (bool) {
throwInvalidArgument(msg);
}
return bool;
}
protected boolean checkTooManyArguments(boolean bool) throws CommandException {
return checkTooArguments(bool, I.t("Too many parameters!"));
}
protected boolean checkTooFewArguments(boolean bool) throws CommandException {
return checkTooArguments(bool, I.t("Too few parameters!"));
}
protected boolean checkArguments(boolean bool1, boolean bool2) throws CommandException {
return !(checkTooManyArguments(bool1) || checkTooFewArguments(bool2));
}
protected boolean checkHostnameWhitelist(final URL url) {
final List<String> hostnames = PluginConfiguration.IMAGES_HOSTNAMES_WHITELIST.get()
@ -175,4 +197,5 @@ public abstract class IoMCommand extends Command {
return matches;
}
}

View File

@ -51,7 +51,6 @@ import fr.zcraft.quartzlib.tools.text.RawMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -78,12 +77,9 @@ public class DeleteCommand extends IoMCommand {
ArrayList<String> arguments = getArgs();
final boolean confirm = hasFlag("confirm");
if (arguments.size() > 3 || (arguments.size() > 2 && !confirm)) {
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.size() < 1) {
throwInvalidArgument(I.t("Too few parameters!"));
boolean isTooMany = arguments.size() > 3 || (arguments.size() > 2 && !confirm);
boolean isTooFew = arguments.isEmpty();
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
@ -113,8 +109,7 @@ public class DeleteCommand extends IoMCommand {
playerName = sender.getName();
mapName = arguments.get(0);
}
UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId();
PluginLogger.info("UUID " + uuid.toString());
UUID uuid = getPlayerUUID(playerName);
ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {
final String msg = "This map does not exist.";
@ -136,7 +131,7 @@ public class DeleteCommand extends IoMCommand {
RawMessage.send(sender, msg);
}
} else {
if (sender != null && sender.isOnline() && sender.getInventory() != null) {
if (sender != null && sender.isOnline()) {
MapManager.clear(sender.getInventory(), map);
}
try {

View File

@ -56,13 +56,14 @@ public class ExploreCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 1) {
throwInvalidArgument(I.t("Too many parameters!"));
boolean isTooMany = arguments.size() > 1;
boolean isTooFew = false;
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
final String playerName;
final Player sender = playerSender();
if (arguments.size() == 1) {
if (!Permissions.LISTOTHER.grantedTo(sender)) {
throwNotAuthorized();

View File

@ -46,24 +46,21 @@ import fr.zcraft.quartzlib.components.i18n.I;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@CommandInfo(name = "get",usageParameters = "[player name]:<map name>")
@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() > 2) {
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.isEmpty()) {
throwInvalidArgument(I.t("Too few parameters!"));
boolean isTooMany = arguments.size() > 2;
boolean isTooFew = arguments.isEmpty();
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
final String playerName;
final String mapName;
final Player sender = playerSender();
@ -80,7 +77,7 @@ public class GetCommand extends IoMCommand {
mapName = arguments.get(1);
}
UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId();
UUID uuid = getPlayerUUID(playerName);
if (!sender.isOnline()) {
return;
}

View File

@ -63,14 +63,13 @@ public class GiveCommand extends IoMCommand {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 3) {
throwInvalidArgument(I.t("Too many parameters!"));
return;
}
if (arguments.isEmpty()) {
throwInvalidArgument(I.t("Too few parameters!"));
boolean isTooMany = arguments.size() > 3;
boolean isTooFew = arguments.isEmpty();
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
final String mapName;
final String from;
final String playerName;
@ -102,8 +101,8 @@ public class GiveCommand extends IoMCommand {
}
final Player sender = playerSender();
UUID uuid = Bukkit.getOfflinePlayer(from).getUniqueId();
UUID uuid2 = Bukkit.getOfflinePlayer(playerName).getUniqueId();
UUID uuid = getPlayerUUID(from);
UUID uuid2 = getPlayerUUID(playerName);
final ImageMap map = MapManager.getMap(uuid, mapName);

View File

@ -51,7 +51,6 @@ import fr.zcraft.quartzlib.tools.text.RawMessage;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -61,8 +60,11 @@ public class ListCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
if (arguments.size() > 1) {
throwInvalidArgument(I.t("Too many parameters!"));
boolean isTooMany = arguments.size() > 1;
boolean isTooFew = false;
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
@ -89,7 +91,7 @@ public class ListCommand extends IoMCommand {
} else {
playerSender = null;
}
UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId();
UUID uuid = getPlayerUUID(playerName);
List<ImageMap> mapList = MapManager.getMapList(uuid);
if (mapList.isEmpty()) {
String msg = I.t("No map found.");

View File

@ -81,6 +81,7 @@ public class NewCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
//TODO check if not too many args
final Player player = playerSender();
ImageUtils.ScalingType scaling = ImageUtils.ScalingType.NONE;
URL url;

View File

@ -0,0 +1,21 @@
package fr.moribus.imageonmap.commands.maptool;
import fr.moribus.imageonmap.Permissions;
import fr.moribus.imageonmap.commands.IoMCommand;
import fr.zcraft.quartzlib.components.commands.CommandException;
import fr.zcraft.quartzlib.components.commands.CommandInfo;
import org.bukkit.command.CommandSender;
@CommandInfo(name = "RemotePlacing", usageParameters = "[player name]:map name position rotation")
public class RemotePlacingCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
//if wall => need position and direction N/S/E/W
//else if floor or ceiling => same + rotation
}
@Override
public boolean canExecute(CommandSender sender) {
return Permissions.REMOTE_PLACING.grantedTo(sender);
}
}

View File

@ -70,20 +70,21 @@ public class RenameCommand extends IoMCommand {
@Override
protected void run() throws CommandException {
ArrayList<String> arguments = getArgs();
ArrayList<String> argList = getArgs();
if (argList.size() != 2) {
warning(I.t("Not enough or too many arguments! Usage: /maptool rename <map name> <new map name>"));
boolean isTooMany = arguments.size() > 2;
boolean isTooFew = arguments.size() < 2;
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
ImageMap map = MapManager.getMap(playerSender().getUniqueId(), argList.get(0));
String oldName = arguments.get(0);
ImageMap map = MapManager.getMap(playerSender().getUniqueId(), oldName);
if (map == null) {
error(I.t("This map does not exist."));
return;
}
map.rename(argList.get(1));
String newName = arguments.get(1);
map.rename(newName);
}
@Override

View File

@ -53,7 +53,6 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -64,17 +63,10 @@ public class UpdateCommand extends IoMCommand {
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 [player name]:<map name> <new url> [stretched|covered]";
warning(I.t(warningMsg));
return;
}
if (arguments.size() < 2) {
warningMsg =
"Too few parameters! Usage: /maptool update [player name]:<map name> <new url> [stretched|covered]";
warning(I.t(warningMsg));
boolean isTooMany = arguments.size() > 4;
boolean isTooFew = arguments.size() < 2;
if (!checkArguments(isTooMany, isTooFew)) {
return;
}
final String playerName;
@ -141,22 +133,10 @@ public class UpdateCommand extends IoMCommand {
}
}
final ImageUtils.ScalingType scaling;
final ImageUtils.ScalingType scaling = ImageUtils.scalingTypeFromName(resize);//TODO test if nothing broke
// because I went from 3 to 4 by adding the none as default instead of the contained one.
switch (resize) {
case "stretched":
scaling = ImageUtils.ScalingType.STRETCHED;
break;
case "covered":
scaling = ImageUtils.ScalingType.COVERED;
break;
default:
scaling = ImageUtils.ScalingType.CONTAINED;
}
UUID uuid = Bukkit.getOfflinePlayer(playerName).getUniqueId();
UUID uuid = getPlayerUUID(playerName);
ImageMap map = MapManager.getMap(uuid, mapName);
if (map == null) {

View File

@ -125,6 +125,29 @@ public class ImageUtils {
}
public static ScalingType scalingTypeFromName(String resize) {
switch (resize) {
case "stretch":
case "stretched":
case "resize-stretched":
return ScalingType.STRETCHED;
case "cover":
case "covered":
case "resize-covered":
return ScalingType.COVERED;
case "contain":
case "contained":
case "resize-contained":
case "resize":
return ScalingType.CONTAINED;
default:
return ScalingType.NONE;
}
}
public enum ScalingType {
NONE,
CONTAINED,

View File

@ -0,0 +1,20 @@
package fr.moribus.imageonmap.map;
public class MapIndexes {
private final int columnIndex;
private final int rowIndex;
public MapIndexes(int rowIndex, int columnIndex) {
this.rowIndex = rowIndex;
this.columnIndex = columnIndex;
}
public int getColumnIndex() {
return columnIndex;
}
public int getRowIndex() {
return rowIndex;
}
}

View File

@ -36,11 +36,20 @@
package fr.moribus.imageonmap.map;
import fr.zcraft.quartzlib.tools.PluginLogger;
import fr.zcraft.quartzlib.tools.world.WorldUtils;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import jdk.internal.net.http.common.Pair;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
public class PosterMap extends ImageMap {
protected final int[] mapsIDs;
@ -206,4 +215,84 @@ public class PosterMap extends ImageMap {
throw new IllegalArgumentException("Invalid map ID");
}
public int getSortedIndex(int mapID) {
int[] ids = mapsIDs.clone();
Arrays.sort(ids);
for (int i : ids) {
PluginLogger.info("" + i);
}
for (int i = 0; i < mapsIDs.length; i++) {
if (ids[i] == mapID) {
return i;
}
}
throw new IllegalArgumentException("Invalid map ID");
}
public MapIndexes getIndexes(int mapID) {
int index = getSortedIndex(mapID);
PluginLogger.info(rowCount + " " + columnCount + " " + index);
return new MapIndexes(index / columnCount, index % columnCount);
}
public Location findLocationFirstFrame(ItemFrame frame, Player player) {
final ImageMap map = MapManager.getMap(frame.getItem());
if (!(map instanceof PosterMap)) {
return null;
}
PosterMap poster = (PosterMap) map;
if (!poster.hasColumnData()) {
return null;
}
int mapID = MapManager.getMapIdFromItemStack(frame.getItem());
BlockFace bf = WorldUtils.get4thOrientation(player.getLocation());
MapIndexes mapindexes = getIndexes(mapID);
int row = mapindexes.getRowIndex();
int column = mapindexes.getColumnIndex();
Location loc = frame.getLocation();
PluginLogger.info("\n\nlocalization of the initial clicked frame " + loc);
PluginLogger.info("row " + row + " col " + column);
switch (frame.getFacing().getOppositeFace()) {
case UP:
case DOWN:
switch (bf) {
case NORTH:
loc.add(-row, 0, column);
break;
case SOUTH:
loc.add(row, 0, -column);
break;
case WEST:
loc.add(row, 0, column);
break;
case EAST:
loc.add(-row, 0, -column);
break;
default:
throw new IllegalStateException("Unexpected value: " + bf);
}
break;
case EAST:
loc.add(0, -row, -column);
break;
case WEST:
loc.add(0, -row, column);
break;
case NORTH:
loc.add(-column, -row, 0);
break;
case SOUTH:
loc.add(column, -row, 0);
break;
default:
throw new IllegalStateException("Unexpected value: " + bf);
}
PluginLogger.info("\n\nlocalization of the first frame " + loc);
return loc;
}
}

View File

@ -36,7 +36,6 @@
package fr.moribus.imageonmap.ui;
import fr.moribus.imageonmap.map.PosterMap;
import fr.zcraft.quartzlib.tools.PluginLogger;
import fr.zcraft.quartzlib.tools.world.FlatLocation;
import fr.zcraft.quartzlib.tools.world.WorldUtils;
@ -49,7 +48,6 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
public class PosterOnASurface {
public FlatLocation loc1;
@ -164,11 +162,14 @@ public class PosterOnASurface {
boolean isFloor = facing.equals(BlockFace.DOWN);
boolean isCeiling = facing.equals(BlockFace.UP);
Location loc = startingLocation;
int x = 0;
int z = 0;
PluginLogger.info(loc.toString()); //TODO to delete
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
PluginLogger.info("column " + c);
PluginLogger.info("row " + r);
itemFramesLocationMap.put(loc.clone(), getFrameAt(loc, facing));
//do a row
if (isWall || isFloor) {
@ -219,7 +220,6 @@ public class PosterOnASurface {
}
itemFramesLocationMap.put(loc.clone(), getFrameAt(loc, facing));
if (isWall) {
loc = loc.add(-x, 1, -z);
} else if (isFloor || isCeiling) {

View File

@ -43,7 +43,6 @@ import fr.moribus.imageonmap.map.MapManager;
import fr.moribus.imageonmap.map.PosterMap;
import fr.zcraft.quartzlib.components.i18n.I;
import fr.zcraft.quartzlib.tools.PluginLogger;
import fr.zcraft.quartzlib.tools.items.GlowEffect;
import fr.zcraft.quartzlib.tools.items.ItemStackBuilder;
import fr.zcraft.quartzlib.tools.runners.RunTask;
import fr.zcraft.quartzlib.tools.text.MessageSender;
@ -127,7 +126,7 @@ public abstract class SplatterMapManager {
* @return The modified item stack. The instance may be different if the passed item stack is not a craft itemstack.
*/
public static ItemStack addSplatterAttribute(final ItemStack itemStack) {
itemStack.addUnsafeEnchantment(Enchantment.LURE,1);
itemStack.addUnsafeEnchantment(Enchantment.LURE, 1);
//TODO check if safe guard for duplication XP still works
return itemStack;
}
@ -330,13 +329,16 @@ public abstract class SplatterMapManager {
return null;
}
Location startingLocation = poster.findLocationFirstFrame(startFrame,player);
Map<Location, ItemFrame>
itemFrameLocations =
PosterOnASurface.getItemFramesLocation(player, startFrame.getLocation(), startFrame.getFacing(),
PosterOnASurface.getItemFramesLocation(player, startingLocation, startFrame.getFacing(),
poster.getRowCount(), poster.getColumnCount());
//TODO check if it is the correct map id and check the why it delete more than it should and out of place
for (Map.Entry<Location, ItemFrame> entry : itemFrameLocations.entrySet()) {
ItemFrame frame = itemFrameLocations.get(entry.getKey());
PluginLogger.info("Frame to delete " + frame);
if (frame != null) {
removePropertiesFromFrames(player, frame);
frame.setItem(null);