diff --git a/paper/build.gradle b/paper/build.gradle index 727f5cac..f002a897 100644 --- a/paper/build.gradle +++ b/paper/build.gradle @@ -1,8 +1,8 @@ plugins { id 'java' id 'com.gradleup.shadow' version '8.3.3' - id 'org.jetbrains.kotlin.jvm' version '2.0.21' - id 'io.papermc.paperweight.userdev' version '2.0.0-beta.14' + id 'org.jetbrains.kotlin.jvm' version '2.1.20' + id "io.papermc.paperweight.userdev" version "2.0.0-beta.14" id 'maven-publish' } @@ -91,6 +91,9 @@ dependencies { // Lombok compileOnly 'org.projectlombok:lombok:1.18.36' annotationProcessor 'org.projectlombok:lombok:1.18.36' + + // Json? + implementation 'org.json:json:20250107' } tasks.withType(JavaCompile).configureEach { diff --git a/paper/src/main/java/com/al3x/housing2/Action/Action.java b/paper/src/main/java/com/al3x/housing2/Action/Action.java index 2f9b5886..b0a5565c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Action.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Action.java @@ -1,8 +1,6 @@ package com.al3x.housing2.Action; -import com.al3x.housing2.Action.Actions.CancelAction; -import com.al3x.housing2.Condition.Condition; -import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Action.Properties.ExpandableProperty; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.Locations; import com.al3x.housing2.Enums.PushDirection; @@ -10,14 +8,22 @@ import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; +import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.HandlePlaceholders; import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.Serialization; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import java.lang.reflect.Field; @@ -29,72 +35,113 @@ /** * Represents an action that can be executed by a player. */ +@Getter +@RequiredArgsConstructor public abstract class Action { - private static final Gson gson = new Gson(); - protected String name; - private String comment = ""; + public static Gson gson = new GsonBuilder() + .create(); - public Action(String name) { - this.name = name; - } + private final ActionEnum id; + private final String name; + private final String description; + private final Material icon; + private final List scriptingKeywords; - public String getName() { - return name; - } + @Setter + private String comment; - public abstract String toString(); + private final List> properties = new ArrayList<>(); - public abstract void createDisplayItem(ItemBuilder builder); + // --- Methods --- - public void createDisplayItem(ItemBuilder builder, HousingWorld house) { - createDisplayItem(builder); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return execute(player, house, event); } - - public abstract void createAddDisplayItem(ItemBuilder builder); - - public ActionEditor editorMenu(HousingWorld house) { - return null; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event) { + return execute(player, house); } + public abstract OutputType execute(Player player, HousingWorld house); public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - return editorMenu(house, backMenu); - } + return new ActionEditor(4, "§e" + name + " Settings", properties); + } + + public ItemBuilder createDisplayItem() { + ItemBuilder builder = new ItemBuilder() + .material(icon) + .name("" + name) + .info("&eSettings", "") + + .lClick(ItemBuilder.ActionType.EDIT_YELLOW) + .rClick(ItemBuilder.ActionType.REMOVE_YELLOW) + .shiftClick(); + properties.forEach(property -> { + if (property.getVisible() != null && property.getVisible().apply() && property.displayValue() != null) { + if (property instanceof ExpandableProperty expandable) { + for (Duple info : expandable.getInfo()) { + builder.info(info.getFirst(), info.getSecond()); + } + return; + } - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - return editorMenu(house); - } + builder.info(property.getName(), property.displayValue()); + } + }); - public abstract OutputType execute(Player player, HousingWorld house); + if (comment != null && !comment.isEmpty()) builder.extraLore(comment); - public OutputType execute(Player player, HousingWorld house, CancellableEvent event) { - return execute(player, house); + return builder; } - public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - return execute(player, house, event); + public String getId() { + if (this instanceof InternalAction internalAction) { + return internalAction.getId(); + } + return id != null ? id.getId() : "null"; } - public abstract LinkedHashMap data(); - - public String getComment() { - return this.comment; + public void createAddDisplayItem(ItemBuilder builder) { + builder.material(icon); + builder.name("" + name); + builder.description(description); + builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); } - public void setComment(String value) { - this.comment = value; + public LinkedHashMap data() { + LinkedHashMap propertiesData = new LinkedHashMap<>(); + properties.forEach(property -> { + if (property instanceof ActionProperty.PropertySerializer) { + propertiesData.put(property.getId(), ((ActionProperty.PropertySerializer) property).serialize()); + } else { + propertiesData.put(property.getId(), property.getValue()); + } + }); + return propertiesData; } - public abstract boolean requiresPlayer(); + public V getValue(String id, Class clazz) { + if (clazz.isNestmateOf(ActionProperty.class)) { + throw new IllegalArgumentException("Cannot use an ActionProperty as a class type"); + } + for (ActionProperty property : properties) { + if (property.getId().equals(id)) { + return (V) property.getValue(); + } + } + return null; + } - public Object getField(String name) throws NoSuchFieldException, IllegalAccessException, NumberFormatException { - Field field = this.getClass().getDeclaredField(name.split(" ")[0]); - field.setAccessible(true); - if (field.getType() == List.class && name.contains(" ")) { - return ((List) field.get(this)).get(Integer.parseInt(name.split(" ")[1])); + public > V getProperty(String id, Class clazz) { + for (ActionProperty property : properties) { + if (property.getId().equals(id) && property.getClass() == clazz) { + return (V) property; + } } - return field.get(this); + return null; } + public abstract boolean requiresPlayer(); + public int limit() { return -1; } @@ -117,186 +164,33 @@ public List disallowedEvents() { return null; } - public boolean mustBeSync() { - return false; - } - - public void fromData(HashMap data, Class actionClass) { - for (String key : data.keySet()) { - try { - Field field = actionClass.getDeclaredField(key); - field.setAccessible(true); - if (field.getType().isEnum() && data.get(key) != null) { - if (data.get(key) instanceof String) { - field.set(this, Enum.valueOf((Class) field.getType(), (String) data.get(key))); - continue; - } else if (data.get(key) instanceof Enum) { - field.set(this, data.get(key)); - continue; - } - } - field.set(this, data.get(key)); - } catch (Exception ignored) { - } - } - } - - protected List dataToList(JsonArray jsonArray, Class clazz) { - ArrayList actions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - actions.add(gson.fromJson(jsonObject, clazz)); - } - return actions; - } - - protected boolean getDirection(InventoryClickEvent event, Object obj, HousingWorld house, Menu editMenu, BiConsumer consumer) { - if (obj instanceof PushDirection direction && direction == PushDirection.CUSTOM) { - event.getWhoClicked().sendMessage(colorize("&ePlease enter the custom direction in the chat. (pitch,yaw)")); - editMenu.openChat(Main.getInstance(), (message) -> { - //pitch,yaw - String[] split = message.split(","); - if (split.length != 2) { - event.getWhoClicked().sendMessage(colorize("&cInvalid format! Please use: ,")); - return; - } - - try { - //Check if the placeholders are valid - Float.parseFloat(HandlePlaceholders.parsePlaceholders((Player) event.getWhoClicked(), house, split[0])); - Float.parseFloat(HandlePlaceholders.parsePlaceholders((Player) event.getWhoClicked(), house, split[1])); - consumer.accept(message, PushDirection.CUSTOM); - } catch (NumberFormatException e) { - event.getWhoClicked().sendMessage(colorize("&cInvalid format! Please use: ,")); - } - }); - } - - if ((obj instanceof PushDirection direction) && direction != PushDirection.CUSTOM) { - consumer.accept(null, direction); - } - return false; - } - - protected boolean getCoordinate(InventoryClickEvent event, Object obj, String current, HousingWorld house, Menu editMenu, BiConsumer consumer) { - if (obj instanceof Locations location && location == Locations.CUSTOM) { - event.getWhoClicked().sendMessage(colorize("&ePlease enter the custom location in the chat. (x,y,z) or (x,y,z,yaw,pitch)")); - editMenu.openChat(Main.getInstance(), (current == null ? "" : current), (message) -> { - String oldMessage = message; - message = HandlePlaceholders.parsePlaceholders((Player) event.getWhoClicked(), house, message); - String[] split = message.split(","); - if (split.length != 3 && split.length != 5) { - event.getWhoClicked().sendMessage(colorize("&cInvalid format! Please use: ,, or ,,,,")); - return; - } - - try { - for (int i = 0; i < split.length; i++) { - if (split[i].startsWith("~")) { - split[i] = split[i].substring(1); + public void fromData(HashMap data, HousingWorld house) { + house.runOnLoadOrNow((h) -> { + for (String key : data.keySet()) { + ActionProperty property = properties.stream() + .filter(p -> p.getId().equals(key)) + .findFirst() + .orElse(null); + if (property != null) { + if (property instanceof ActionProperty.PropertyUpdater updater) { + Object value = updater.update(data, house); + if (value != null) { + property.setValue(value); + continue; } - - if (split[i].startsWith("^")) { - split[i] = split[i].substring(1); - } - - if (split[i].isEmpty()) continue; - if (split[i].equalsIgnoreCase("null")) { - split[i] = "0"; + } + if (property instanceof ActionProperty.PropertySerializer serializer) { + Object value = serializer.deserialize(gson.toJsonTree(data.get(key)), house); + if (value == null) { + value = serializer.deserialize(data.get(key), house); } - - Float.parseFloat(split[i]); + property.setValue(value); + } else { + property.setValue(data.get(key)); } - consumer.accept(oldMessage, Locations.CUSTOM); - } catch (NumberFormatException e) { - event.getWhoClicked().sendMessage(colorize("&cInvalid format! Please use: ,, or ,,,,")); - return; - } - }); - } - - if ((obj instanceof Locations direction) && direction != Locations.CUSTOM) { - consumer.accept(null, direction); - } - return false; - } - - protected Location getLocationFromString(Player player, HousingWorld house, String message) { - return getLocationFromString(player, player.getLocation(), player.getEyeLocation(), house, message); - } - - protected Location getLocationFromString(Player player, Location baseLocation, Location eyeLocation, HousingWorld house, String message) { - message = HandlePlaceholders.parsePlaceholders(player, house, message); - String[] split = message.split(","); - if (split.length != 3 && split.length != 5) { - player.sendMessage(colorize("&cInvalid format! Please use: ,, or ,,,,")); - return null; - } - - try { - if (message.contains("^")) { - String x = split[0]; - String y = split[1]; - String z = split[2]; - - double xV = (x.startsWith("^")) ? Double.parseDouble(x.substring(1)) : Double.parseDouble(x); - double yV = (y.startsWith("^")) ? Double.parseDouble(y.substring(1)) : Double.parseDouble(y); - double zV = (z.startsWith("^")) ? Double.parseDouble(z.substring(1)) : Double.parseDouble(z); - - //forward - Vector forward = eyeLocation.getDirection().clone().multiply(zV); - //right - Vector right = eyeLocation.getDirection().clone().crossProduct(new Vector(0, 1, 0)).normalize().multiply(xV); - //up - Vector up = new Vector(0, yV, 0); - - return baseLocation.clone().add(forward).add(right).add(up); - } - - double x = 0, y = 0, z = 0, yaw = baseLocation.getYaw(), pitch = baseLocation.getPitch(); - - for (int i = 0; i < split.length; i++) { - double handledValue = handleRelative(i, split[i], baseLocation, eyeLocation); - if (i == 0) { - x = handledValue; - } else if (i == 1) { - y = handledValue; - } else if (i == 2) { - z = handledValue; - } else if (i == 3) { - yaw = handledValue; - } else { - pitch = handledValue; } } - - return new Location(baseLocation.getWorld(), x, y, z, (float) yaw, (float) pitch); - } catch (NumberFormatException e) { - e.printStackTrace(); - player.sendMessage(colorize("&cInvalid format! Please use: ,,")); - return null; - } - } - - private double handleRelative(int index, String part, Location baseLocation, Location eyeLocation) { - //Sorry if this looks like a mess :( - double value = (part.startsWith("~")) ? - (part.length() == 1 ? 0 : Double.parseDouble(part.substring(1))) : - Double.parseDouble(part); - - double base = switch (index) { - case 0 -> baseLocation.getX(); - case 1 -> baseLocation.getY(); - case 2 -> baseLocation.getZ(); - case 3 -> baseLocation.getYaw(); - case 4 -> baseLocation.getPitch(); - default -> 0; - }; - - if (part.startsWith("~")) { - return base + value; - } - return value; + }); } @Override @@ -312,10 +206,11 @@ public int hashCode() { return Objects.hashCode(getName()); } - public Action clone() { + public Action clone(HousingWorld house) { Action action; - ActionEnum actionEnum = ActionEnum.getActionByName(getName()); + ActionEnum actionEnum = ActionEnum.getActionById(getId()); if (actionEnum == null) { + Main.getInstance().getLogger().warning("Action " + getId() + " not found"); return null; } HashMap data = data(); @@ -324,19 +219,21 @@ public Action clone() { data.put(key, ((Enum) data.get(key)).name()); } } - action = actionEnum.getActionInstance(data, this.comment); + action = actionEnum.getActionInstance(data, this.comment, house); return action; } - // I couldnt figure this out :( -// private static final Gson exportGson = new GsonBuilder().setPrettyPrinting().create(); -// -// public void export(Player player) { -// ByteArrayDataOutput out = ByteStreams.newDataOutput(); -// out.writeUTF("export"); -// out.writeUTF(exportGson.toJson(ActionData.Companion.toData(this))); -// player.sendPluginMessage(Main.getInstance(), "housing:export", -// out.toByteArray() -// ); -// } + public static abstract class InternalAction extends Action { + String id; + public InternalAction(String id, String name, String description, Material icon, List scriptingKeywords) { + super(null, name, description, icon, scriptingKeywords); + this.id = id; + } + + @Override + public String getId() { + return this.id; + } + } } + diff --git a/paper/src/main/java/com/al3x/housing2/Action/ActionEditor.java b/paper/src/main/java/com/al3x/housing2/Action/ActionEditor.java index 331b219e..375a68ee 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/ActionEditor.java +++ b/paper/src/main/java/com/al3x/housing2/Action/ActionEditor.java @@ -1,191 +1,32 @@ package com.al3x.housing2.Action; -import com.al3x.housing2.Utils.ItemBuilder; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.event.inventory.InventoryClickEvent; +import lombok.Getter; +import lombok.Setter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; +import java.util.stream.Collectors; +@Setter +@Getter public class ActionEditor { private int rows = 4; private String title = "Action Settings"; - private List items = new ArrayList<>(); + private List> properties = new ArrayList<>(); public ActionEditor() { } - public ActionEditor(int rows, String title, List items) { + public ActionEditor(int rows, String title, List> properties) { this.rows = rows; this.title = title; - this.items = items; + this.properties = properties.stream().filter(actionProperty -> actionProperty.getVisible().apply()).collect(Collectors.toList()); } - public ActionEditor(int rows, String title, ActionItem... items) { + public ActionEditor(int rows, String title, ActionProperty... properties) { this.rows = rows; this.title = title; - this.items = Arrays.asList(items); + this.properties = Arrays.stream(properties).filter(actionProperty -> actionProperty.getVisible().apply()).collect(Collectors.toList());; } - - public int getRows() { - return rows; - } - - public void setRows(int rows) { - this.rows = rows; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } - - public static class ActionItem { - private ItemBuilder builder; - private ActionType type; - private int slot = -1; - private double min = 0; - private double max = Double.MAX_VALUE; - private Enum[] enumClass; - private Material enumMaterial; - private String varName; - private BiFunction customRunnable; - - public ActionItem(String varName, ItemBuilder builder, ActionType type) { - this.varName = varName; - this.builder = builder; - this.type = type; - - if (type == ActionType.ENUM) { - Bukkit.getLogger().warning(varName + " is an enum type, but no enum class was provided."); - } - } - - public ActionItem(String varName, ItemBuilder builder, ActionType type, BiFunction runnable) { - this.varName = varName; - this.builder = builder; - this.type = type; - this.customRunnable = runnable; - - if (type == ActionType.ENUM) { - Bukkit.getLogger().warning(varName + " is an enum type, but no enum class was provided."); - } - } - - public ActionItem(ItemBuilder builder, ActionType type, int slot, BiFunction consumer) { - this.builder = builder; - this.type = type; - this.slot = slot; - this.customRunnable = consumer; - - if (type != ActionType.CUSTOM) { - Bukkit.getLogger().warning("Slot provided for non-custom action item."); - } - } - - public ActionItem(String varName, ItemBuilder builder, ActionType type, double min, double max) { - this.varName = varName; - this.builder = builder; - this.type = type; - this.min = min; - this.max = max; - - if (type != ActionType.DOUBLE && type != ActionType.INT) { - Bukkit.getLogger().warning(varName + " is not a number type, but min and max values were provided."); - } - } - - public ActionItem(String varName, ItemBuilder builder, ActionType type, Enum[] enumClass, Material enumMaterial) { - this.varName = varName; - this.builder = builder; - this.type = type; - this.enumClass = enumClass; - this.enumMaterial = enumMaterial; - } - - public ActionItem(String varName, ItemBuilder builder, ActionType type, Enum[] enumClass, Material enumMaterial, BiFunction customRunnable) { - this.varName = varName; - this.builder = builder; - this.type = type; - this.enumClass = enumClass; - this.enumMaterial = enumMaterial; - this.customRunnable = customRunnable; - } - - public ActionItem(String varName, ItemBuilder builder, BiFunction customRunnable) { - this.varName = varName; - this.builder = builder; - this.customRunnable = customRunnable; - } - - public ItemBuilder getBuilder() { - return builder; - } - - public ActionType getType() { - return type; - } - - public Enum[] getEnumClass() { - return enumClass; - } - - public int getSlot() { - return slot; - } - - public Material getEnumMaterial() { - return enumMaterial; - } - - public String getVarName() { - return varName; - } - - public BiFunction getCustomRunnable() { - return customRunnable; - } - - public double getMin() { - return min; - } - - public double getMax() { - return max; - } - - public void setCustomRunnable(BiFunction customRunnable) { - this.customRunnable = customRunnable; - } - - public void setType(ActionType type) { - this.type = type; - } - - public void setBuilder(ItemBuilder builder) { - this.builder = builder; - } - - public enum ActionType { - STRING, INT, DOUBLE, BOOLEAN, ENUM, ITEM, NPC, HOUSE, REGION, ACTION, ACTION_SETTING, FUNCTION, GROUP, TEAM, LAYOUT, MENU, CONDITION, CUSTOM - } - } - - } diff --git a/paper/src/main/java/com/al3x/housing2/Action/ActionEnum.java b/paper/src/main/java/com/al3x/housing2/Action/ActionEnum.java index fe5b2468..8f0bf36e 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/ActionEnum.java +++ b/paper/src/main/java/com/al3x/housing2/Action/ActionEnum.java @@ -1,10 +1,14 @@ package com.al3x.housing2.Action; import com.al3x.housing2.Action.Actions.*; +import com.al3x.housing2.Action.Actions.AttackEntityAction; +import com.al3x.housing2.Instances.HousingWorld; +import lombok.Getter; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; +@Getter public enum ActionEnum { CONDITIONAL("Conditional Action", ConditionalAction.class), CANCEL("Cancel Action", CancelAction.class), @@ -43,7 +47,7 @@ public enum ActionEnum { PARTICLE("Particle Action", ParticleAction.class), CHANGE_NPC_NAVIGATION("Change Npc Navigation Action", NpcPathAction.class), CHANGE_PLAYER_DISPLAYNAME("Change Player Display Name Action", ChangePlayerDisplayNameAction.class), - CHANGE_NAMETAG("NameTag Action", NameTagAction.class), + CHANGE_PLAYER_NAMETAG("NameTag Action", NameTagAction.class), REPEAT("Repeat Action", RepeatAction.class), CLEAR_BOSSBAR("Clear Bossbars Action", ClearBossbarAction.class), CLEAR_PLAYERSTATS("Clear Player Stats Action", ClearPlayerStatsAction.class), @@ -75,28 +79,19 @@ public enum ActionEnum { SPAWN_GHOST_BLOCK("Spawn Ghost Block", SpawnGhostBlock.class), SET_PLAYER_SLOT("Set Player Slot Action", SetPlayerSlotAction.class); // Add new actions here - // Name of the action and the class that has the name of the action need to be the exact same ; - private String name; - private Class action; + private final String id; + private final Class action; - ActionEnum(String name, Class action) { + ActionEnum(String id, Class action) { + this.id = id; this.action = action; - this.name = name; } - public Class getAction() { - return action; - } - - public String getName() { - return name; - } - - public Action getActionInstance(HashMap data, String comment) { + public Action getActionInstance(HashMap data, String comment, HousingWorld house) { try { Action action = this.action.getDeclaredConstructor().newInstance(); - action.fromData(data, this.action); + action.fromData(data, house); action.setComment(comment); return action; } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { @@ -114,9 +109,9 @@ public Action getActionInstance() { return null; } - public static ActionEnum getActionByName(String name) { + public static ActionEnum getActionById(String id) { for (ActionEnum action : ActionEnum.values()) { - if (action.name.equals(name)) { + if (action.getId().equals(id)) { return action; } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/ActionExecutor.java b/paper/src/main/java/com/al3x/housing2/Action/ActionExecutor.java index 759bb96a..413956db 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/ActionExecutor.java +++ b/paper/src/main/java/com/al3x/housing2/Action/ActionExecutor.java @@ -4,27 +4,23 @@ import com.al3x.housing2.Action.Actions.ContinueAction; import com.al3x.housing2.Action.Actions.ExitAction; import com.al3x.housing2.Action.Actions.PauseAction; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Instances.Stat; import com.al3x.housing2.Main; import com.al3x.housing2.Placeholders.custom.Placeholder; import com.al3x.housing2.Utils.NumberUtilsKt; -import de.maxhenkel.voicechat.api.events.Event; -import lombok.Setter; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; import org.bukkit.scheduler.BukkitScheduler; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import static com.al3x.housing2.Action.OutputType.*; @@ -111,18 +107,14 @@ public OutputType execute(Entity entity, Player player, HousingWorld house, Canc Action action = queue.removeFirst(); int global = Main.getInstance().getConfig().getInt("globalLimits", 2000); - int actionLimit = Main.getInstance().getConfig().getInt("actionLimits." + action.name.replace(" ", "_").toLowerCase(), global); - if (limits.containsKey(action.name) && limits.get(action.name) >= actionLimit) { + int actionLimit = Main.getInstance().getConfig().getInt("actionLimits." + action.getId().replace(" ", "_").toLowerCase(), global); + if (limits.containsKey(action.getName()) && limits.get(action.getName()) >= actionLimit) { return EXIT; } - limits.put(action.name, limits.getOrDefault(action.name, 0) + 1); + limits.put(action.getId(), limits.getOrDefault(action.getId(), 0) + 1); if (action instanceof PauseAction pauseAction) { - String dur = Placeholder.handlePlaceholders(pauseAction.getDuration(), house, player); - if (!NumberUtilsKt.isInt(dur)) { - continue; - } - double duration = Integer.parseInt(dur); + double duration = pauseAction.getProperty("duration", NumberProperty.class).parsedValue(house, player); scheduler.runTaskLater(Main.getInstance(), () -> { execute(entity, player, house, event); }, (long) duration); @@ -170,7 +162,7 @@ public OutputType execute(Entity entity, Player player, HousingWorld house, Canc npcAction.npcExecute(player, npc, house, event, this); } } catch (Exception e) { - player.sendMessage("An error occurred while executing the action: " + action.name + " in the context: " + context); + player.sendMessage("An error occurred while executing the action: " + action.getName() + " in the context: " + context); //take error and put it in the hover event e.printStackTrace(); } diff --git a/paper/src/main/java/com/al3x/housing2/Action/ActionProperty.java b/paper/src/main/java/com/al3x/housing2/Action/ActionProperty.java new file mode 100644 index 00000000..294abe52 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/ActionProperty.java @@ -0,0 +1,153 @@ +package com.al3x.housing2.Action; + +import com.al3x.housing2.Action.Properties.*; +import com.al3x.housing2.Enums.Locations; +import com.al3x.housing2.Enums.StatOperation; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.Menu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.Returnable; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; + +import static com.al3x.housing2.Action.Action.gson; +import static com.al3x.housing2.Utils.Color.colorize; + +@Getter +@Setter +@ToString +public abstract class ActionProperty { + protected Main main = Main.getInstance(); + + private final String id; + private final String name; + private final String description; + private final Material icon; + + private ItemBuilder.ActionType rClick = null; + private ItemBuilder.ActionType mClick = null; + + @Getter + public V value; + private Returnable visible = () -> true; + private final ItemBuilder builder; + + public ActionProperty(String id, String name, String description, Material icon) { + this.id = id; + this.name = name; + this.description = description; + this.icon = icon; + + this.builder = new ItemBuilder() + .material(icon) + .name("" + name); + + if (description != null) { + builder.description(description); + } + + builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); + } + + public ActionProperty setValue(Object value) { + this.value = (V) value; + return this; + } + + public ActionProperty setValue(V value, Player player) { + this.value = value; + player.sendMessage(colorize("&a" + name + " set to: " + value)); + return this; + } + + protected String displayValue() { + if (value == null) { + return "&cNone"; + } + return getValue().toString(); + } + + public abstract void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu); + + public ItemBuilder getDisplayItem() { + ItemBuilder builder = getBuilder().clone(); + if (displayValue() != null) { + builder.info("Current value", "") + .info(null, "§a" + displayValue()); + } + return builder; + } + + public ActionProperty showIf(Returnable condition) { + this.visible = condition; + return this; + } + + public ActionProperty mClick(ItemBuilder.ActionType action) { + this.mClick = action; + return this; + } + + public ActionProperty rClick(ItemBuilder.ActionType action) { + this.rClick = action; + return this; + } + + protected List dataToList(JsonArray jsonArray, Class clazz) { + ArrayList actions = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); + actions.add(gson.fromJson(jsonObject, clazz)); + } + return actions; + } + + public T dataToObject(JsonElement jsonElement, Class clazz) { + return gson.fromJson(jsonElement, clazz); + } + + public interface PropertySerializer { + S serialize(); + + default T deserialize(Object value, HousingWorld house) { + return null; + } + + default T deserialize(JsonElement value, HousingWorld house) { + return null; + } + } + + public interface PropertyUpdater { + V update(HashMap properties, HousingWorld house); + } + + public static class Constant { + + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ActionbarAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ActionbarAction.java index b1f58f71..dc6e7011 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ActionbarAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ActionbarAction.java @@ -1,113 +1,51 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.ItemBuilder.ActionType; import com.al3x.housing2.Utils.StringUtilsKt; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; -import static com.al3x.housing2.Utils.Color.colorizeLegacyText; - +@Setter +@Getter +@ToString public class ActionbarAction extends HTSLImpl { - private String message; - public ActionbarAction() { - super("Actionbar Action"); - this.message = "&aHello World!"; - } - - public ActionbarAction(String message) { - super("Actionbar Action"); - this.message = message; - } - - @Override - public String keyword() { - return "actionBar"; - } - - @Override - public String toString() { - return "ActionBar (Message: " + message + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.WRITABLE_BOOK); - builder.name("&eDisplay Action Bar"); - builder.info("&eSettings", "").info("Message", message); - builder.lClick(ActionType.EDIT_YELLOW).rClick(ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.WRITABLE_BOOK); - builder.name("&aDisplay Action Bar"); - builder.lClick(ActionType.ADD_YELLOW); - } + super( + ActionEnum.ACTIONBAR, + "Display Actionbar", + "Displays a message in the action bar.", + Material.WRITABLE_BOOK, + List.of("actionbar") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionItem("message", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aMessage") - .info("&7Current Value", "") - .info(null, message) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.STRING - ) + getProperties().add( + new StringProperty( + "message", + "Message", + "The message to display." + ).setValue("&eHello World!") ); - return new ActionEditor(4, "&eActionbar Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - player.sendActionBar(StringUtilsKt.housingStringFormatter(message, house, player)); + player.sendActionBar(getProperty("message", StringProperty.class).component(house, player)); return OutputType.SUCCESS; } - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("message", message); - return data; - } - @Override public boolean requiresPlayer() { return true; } - -// @Override -// public void fromData(HashMap data) { -// if (!data.containsKey("message")) { -// return; -// } -// message = (String) data.get("message"); -// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyInventoryLayoutAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyInventoryLayoutAction.java index d3be7ff5..0032a156 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyInventoryLayoutAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyInventoryLayoutAction.java @@ -1,63 +1,36 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.GenericPagination.LayoutProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Layout; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; import java.util.List; +@ToString public class ApplyInventoryLayoutAction extends HTSLImpl { String layout; public ApplyInventoryLayoutAction() { - super("Apply Inventory Layout Action"); - } - - public ApplyInventoryLayoutAction(String layout, boolean runForAllPlayers) { - super("Apply Inventory Layout Action"); - this.layout = layout; - } - - @Override - public String toString() { - return "ApplyInventoryLayoutAction (function: " + (layout == null ? "&cNone" : "&6" + layout) + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_AXE); - builder.name("&eApply Inventory Layout"); - builder.info("&eSettings", ""); - builder.info("Inventory Layout", (layout == null ? "&cNone" : "&6" + layout)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_AXE); - builder.name("&aApply Inventory Layout"); - builder.description("Applies an inventory layout to the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("layout", ItemBuilder.create(Material.FILLED_MAP) - .name("&aLayout") - .info("&7Current Value", "") - .info(null, (layout == null ? "&cNone" : "&6" + layout)), - ActionEditor.ActionItem.ActionType.LAYOUT - ) + super( + ActionEnum.APPLY_INVENTORY_LAYOUT, + "Apply Inventory Layout", + "Applies an inventory layout to the player.", + Material.IRON_AXE, + List.of("layout") ); - return new ActionEditor(4, "&eInv Layout Action Settings", items); + + getProperties().add(new LayoutProperty( + "layout", + "Layout", + "The layout to apply." + )); } @Override @@ -65,7 +38,7 @@ public OutputType execute(Player player, HousingWorld house) { if (layout == null) { return OutputType.SUCCESS; } - Layout layout = house.getLayout(this.layout); + Layout layout = getValue("layout", Layout.class); if (layout == null) { return OutputType.SUCCESS; } @@ -73,20 +46,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("layout", layout); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "applyLayout"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyPotionEffectAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyPotionEffectAction.java index ec714ec9..d0d72792 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyPotionEffectAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ApplyPotionEffectAction.java @@ -1,185 +1,93 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.CustomProperty; +import com.al3x.housing2.Action.Properties.IntegerProperty; +import com.al3x.housing2.Action.Properties.PotionProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Menus.PaginationMenu; import com.al3x.housing2.Utils.Duple; -import com.al3x.housing2.Utils.HandlePlaceholders; import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.ItemBuilder.ActionType; -import com.al3x.housing2.Utils.NumberUtilsKt; -import kotlin.NumbersKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +import java.util.function.BiFunction; -import static com.al3x.housing2.Utils.Color.colorize; -import static com.al3x.housing2.Utils.Color.colorizeLegacyText; - +@Getter +@Setter +@ToString public class ApplyPotionEffectAction extends HTSLImpl implements NPCAction { - - private PotionEffectType potionEffectType; - private int level; - private int duration; - private boolean hideParticles; - public ApplyPotionEffectAction() { - super("Apply Potion Effect Action"); - this.potionEffectType = PotionEffectType.SPEED; - this.level = 1; - this.duration = 60; - this.hideParticles = false; - } - - public ApplyPotionEffectAction(PotionEffectType potionEffectType, int level, int duration) { - super("Apply Potion Effect Action"); - this.potionEffectType = potionEffectType; - this.level = level; - this.duration = duration; - } - - @Override - public String toString() {return "ApplyPotionEffectAction{" + "potionEffectType=" + potionEffectType + ", level=" + level + ", duration=" + duration + '}';} - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.POTION); - builder.name("&eApply Potion Effect"); - builder.info("&eSettings", ""); - builder.info("Potion", "&a" + potionEffectType.getName()); - builder.info("Level", "&a" + level); - builder.info("Duration", "&a" + duration + " ticks"); - builder.lClick(ActionType.EDIT_YELLOW).rClick(ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.POTION); - builder.name("&eApply Potion Effect"); - builder.description("Applies a potion effect to the player"); - builder.lClick(ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = List.of( - new ActionItem("potion", - ItemBuilder.create(Material.POTION) - .name("&aPotion") - .info("&7Current Value", "") - .info(null, "&6" + potionEffectType.getName()) - .lClick(ActionType.CHANGE_YELLOW), - (event, obj) -> { - //Create a list of all the potion effects - List> potions = new ArrayList<>(); - for (PotionEffectType type : PotionEffectType.values()) { - potions.add(new Duple<>(type, ItemBuilder.create(Material.POTION).name("&6" + type.getName()))); - } - //Basically because PotionEffectType isnt a ENUM we cant just use the enum class - new PaginationMenu<>(Main.getInstance(), - "&eSelect a Potion Effect", potions, - player, house, backMenu, (potion) -> { - potionEffectType = potion; - backMenu.open(); - }).open(); - - return true; - } - ), - new ActionItem("level", - ItemBuilder.create(Material.POTION) - .name("&aLevel") - .info("&7Current Value", "") - .info(null, level) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.INT, 1, 100 //Pretty easy way to do min and max - ), - new ActionItem("duration", - ItemBuilder.create(Material.POTION) - .name("&aDuration") - .info("&7Current Value", "") - .info(null, duration) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.INT, -1, 2000000 //Pretty easy way to do min and max - ), - new ActionItem("hideParticles", - ItemBuilder.create(Material.POTION) - .name("&aHide Particles") - .info("&7Current Value", "") - .info(null, "&a" + (hideParticles ? "Yes" : "No")) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.BOOLEAN - ) + super( + ActionEnum.APPLY_POTION, + "Apply Potion Effect", + "Applies a potion effect to the player.", + Material.POTION, + List.of("applyEffect") ); - return new ActionEditor(4, "&ePotion Effect Action Settings", items); + + getProperties().addAll(List.of( + new PotionProperty( + "potion", + "Potion", + "The potion effect to apply." + ).setValue(PotionEffectType.GLOWING), + new IntegerProperty( + "level", + "Level", + "The level of the potion effect." + ).setValue(1), + new IntegerProperty( + "duration", + "Duration", + "The duration of the potion effect in ticks." + ).setValue(20*30), + new BooleanProperty( + "hideParticles", + "Hide Particles", + "Whether to hide the potion effect particles." + ).setValue(false) + )); } @Override public OutputType execute(Player player, HousingWorld house) { + PotionEffectType potionEffectType = getValue("potion", PotionEffectType.class); + int level = getValue("level", Integer.class); + int duration = getValue("duration", Integer.class); + boolean hideParticles = getValue("hideParticles", Boolean.class); player.addPotionEffect(new PotionEffect(potionEffectType, duration, level - 1, true, !hideParticles)); return OutputType.SUCCESS; } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - + PotionEffectType potionEffectType = getValue("potion", PotionEffectType.class); + int level = getValue("level", Integer.class); + int duration = getValue("duration", Integer.class); + boolean hideParticles = getValue("hideParticles", Boolean.class); if (!(npc.getEntity() instanceof LivingEntity le)) return; le.addPotionEffect(new PotionEffect(potionEffectType, duration, level - 1, true, !hideParticles)); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("potion", potionEffectType == null ? PotionEffectType.SPEED.getName() : potionEffectType.getName()); - data.put("duration", duration); - data.put("level", level); - data.put("hideParticles", hideParticles); - return data; - } @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - if (!data.containsKey("potion")) return; - potionEffectType = PotionEffectType.getByName(data.get("potion").toString()); - if (!data.containsKey("duration")) return; - duration = NumberUtilsKt.toInt(Double.parseDouble(data.get("duration").toString())); - if (!data.containsKey("level")) return; - if (NumberUtilsKt.isDouble(data.get("level").toString())) { - level = NumberUtilsKt.toInt(Double.parseDouble(data.get("level").toString())); - } else { - level = Integer.parseInt(data.get("level").toString()); - } - if (!data.containsKey("hideParticles")) { - hideParticles = false; - return; - }; - hideParticles = (Boolean) data.get("hideParticles"); - } - - @Override - public String keyword() { - return "applyPotion"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/AttackEntityAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/AttackEntityAction.java index bd74957e..ba37f30b 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/AttackEntityAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/AttackEntityAction.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.*; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; import com.al3x.housing2.Condition.ConditionEnum; @@ -10,13 +11,16 @@ import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Data.ConditionalData; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.*; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -24,88 +28,45 @@ import java.util.*; +@ToString public class AttackEntityAction extends HTSLImpl implements NPCAction { - private AttackEntityEnum mode; - private String range; - private List conditions; - private String value; - private static Gson gson = new Gson(); - - public AttackEntityAction() { - super("Attack Entity Action"); - mode = AttackEntityEnum.NEAREST; - range = "10"; - conditions = new ArrayList<>(); - value = "2"; - } - - @Override - public String toString() { - return "AttackEntityAction (mode: " + mode + ", range: " + range + ", value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_SWORD); - builder.name("&eAttack Entity"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Range", range); - builder.info("Value", value); - builder.info("Conditions", conditions.size()); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_SWORD); - builder.name("&eAttack Entity"); - builder.description("Attack the nearest entity within the specified range."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eAttack Entity Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.IRON_SWORD) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, AttackEntityEnum.values(), null)); - items.add(new ActionEditor.ActionItem("range", - ItemBuilder.create(Material.SNOWBALL) - .name("&eRange") - .info("&7Current Value", "") - .info(null, "&a" + range) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.NETHERITE_SWORD) - .name("&eDamage") - .info("&7Current Value", "") - .info(null, "&a" + value) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - if (mode == AttackEntityEnum.CONDITION) { - items.add(new ActionEditor.ActionItem("conditions", - ItemBuilder.create(Material.REDSTONE) - .name("&eConditions") - .info("&7Current Value", "") - .info(null, (conditions.isEmpty() ? "&cNo Conditions" : "&a" + conditions.size() + " Conditions")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.CONDITION)); - } - return new ActionEditor(6, "&eAttack Entity Settings", items); + super( + ActionEnum.ATTACK_ENTITY, + "Attack Entity", + "Attacks an entity.", + Material.IRON_SWORD, + List.of("attackEntity") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode of the attack.", + AttackEntityEnum.class + ).setValue(AttackEntityEnum.NEAREST), + new NumberProperty( + "range", + "Range", + "The range of the attack." + ).setValue("10"), + new ConditionsProperty( + "conditions", + "Conditions", + "The conditions to check before attacking." + ).setValue(new ArrayList<>()), + new NumberProperty( + "value", + "Value", + "The value of the attack." + ).setValue("1"), + new BooleanProperty( + "includeExecutor", + "Include Executor", + "Includes the executor in the attack." + ).setValue(false) + )); } @Override @@ -115,82 +76,35 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - String range = HandlePlaceholders.parsePlaceholders(player, house, this.range); - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value) || !NumberUtilsKt.isDouble(range)) { - return OutputType.ERROR; - } - double rangeValue = Double.parseDouble(range); - double damageValue = Double.parseDouble(value); - List entities = new ArrayList<>(player.getWorld().getEntities()); - switch (mode) { - case NEAREST: - entities.sort(Comparator.comparing((Entity entity) -> entity.getLocation().distance(player.getLocation()))); - break; - case PLAYER: - entities.removeIf(entity -> !(entity instanceof Player) || CitizensAPI.getNPCRegistry().isNPC(entity)); - break; - case NPC: - entities.removeIf(entity -> !CitizensAPI.getNPCRegistry().isNPC(entity)); - break; - case MOB: - entities.removeIf(entity -> entity instanceof Player || CitizensAPI.getNPCRegistry().isNPC(entity)); - break; - case ALL: - break; - case CONDITION: - for (Entity entity : entities) { - if (entity instanceof Player) { - Player target = (Player) entity; - if (conditions.stream().allMatch(condition -> condition.execute(target, house, null, executor))) { - target.damage(damageValue); - } - } else if (CitizensAPI.getNPCRegistry().isNPC(entity)) { - NPC target = CitizensAPI.getNPCRegistry().getNPC(entity); - if (conditions.stream().filter(condition -> condition instanceof NPCCondition).allMatch(condition -> ((NPCCondition) condition).npcExecute(player, target, house, null, executor))) { - if (entity instanceof LivingEntity le) { - le.damage(damageValue); - } - } - } - } - return OutputType.SUCCESS; - } + Double range = getProperty("range", NumberProperty.class).parsedValue(house, player); + List entities = new ArrayList<>(player.getNearbyEntities(range, range, range)); + entities.removeIf(entity -> entity.getLocation().distance(player.getLocation()) > range); - for (Entity entity : entities) { - if (entity instanceof LivingEntity le) { - le.damage(damageValue); - } + if (entities.isEmpty()) { + return OutputType.SUCCESS; } - + damageEntities(entities, player.getLocation(), house, player, executor); return OutputType.SUCCESS; } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - - String range = HandlePlaceholders.parsePlaceholders(player, house, this.range); - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value) || !NumberUtilsKt.isDouble(range)) { + Double range = getProperty("range", NumberProperty.class).parsedValue(house, player); + List entities = new ArrayList<>(npc.getEntity().getNearbyEntities(range, range, range)); + if (entities.isEmpty()) { return; } - double rangeValue = Double.parseDouble(range); - double damageValue = Double.parseDouble(value); - List entities = new ArrayList<>(npc.getEntity().getNearbyEntities(rangeValue, rangeValue, rangeValue)); + damageEntities(entities, player.getLocation(), house, player, executor); + } + + public void damageEntities(List entities, Location location, HousingWorld house, Player player, ActionExecutor executor) { + AttackEntityEnum mode = getValue("mode", AttackEntityEnum.class); + List conditions = getProperty("conditions", ConditionsProperty.class).getValue(); + Double damage = getProperty("value", NumberProperty.class).parsedValue(house, player); switch (mode) { case NEAREST: - entities.sort(Comparator.comparing((Entity entity) -> entity.getLocation().distance(npc.getEntity().getLocation()))); - - if (entities.isEmpty()) { - return; - } - - Entity e = entities.getFirst(); - if (e instanceof LivingEntity le) { - le.damage(damageValue); - } - - return; + entities.sort(Comparator.comparing((Entity entity) -> entity.getLocation().distance(location))); + break; case PLAYER: entities.removeIf(entity -> !(entity instanceof Player) || CitizensAPI.getNPCRegistry().isNPC(entity)); break; @@ -206,14 +120,14 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv for (Entity entity : entities) { if (entity instanceof Player) { Player target = (Player) entity; - if (conditions.stream().allMatch(condition -> condition.execute(target, house, null, executor))) { - target.damage(damageValue); + if (conditions.stream().allMatch(condition -> condition.execute(target, house, null, executor) == OutputType.TRUE)) { + target.damage(damage); } } else if (CitizensAPI.getNPCRegistry().isNPC(entity)) { NPC target = CitizensAPI.getNPCRegistry().getNPC(entity); if (conditions.stream().filter(condition -> condition instanceof NPCCondition).allMatch(condition -> ((NPCCondition) condition).npcExecute(player, target, house, null, executor))) { if (entity instanceof LivingEntity le) { - le.damage(damageValue); + le.damage(damage); } } } @@ -223,119 +137,59 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv for (Entity entity : entities) { if (entity instanceof LivingEntity le) { - le.damage(damageValue); + le.damage(damage); } } } - public AttackEntityEnum getMode() { - return mode; - } - - public void setMode(AttackEntityEnum mode) { - this.mode = mode; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("range", range); - data.put("value", value); - data.put("conditions", ConditionalData.fromList(conditions)); - return data; - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public void fromData(HashMap data, Class actionClass) { - mode = AttackEntityEnum.valueOf((String) data.get("mode")); - range = (String) data.get("range"); - value = (String) data.get("value"); - if (!data.containsKey("conditions")) return; - // I don't know how this works lol - Object subActions = data.get("conditions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList conditionalData = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ConditionalData condition = gson.fromJson(jsonObject, ConditionalData.class); - conditionalData.add(condition); - } - conditions = ConditionalData.toList(conditionalData); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Condition condition : conditions) { - if (condition instanceof CHTSLImpl c) { - builder.append(c.export()).append(", "); - } - } - String conditionString = builder.toString(); - if (!conditionString.isEmpty()) { - conditionString = conditionString.substring(0, conditionString.length() - 2); - } - return " ".repeat(indent) + keyword() + " " + mode + " " + range + " " + value + "(" + conditionString + ")"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - LinkedHashMap actionData = data(); - - if (AttackEntityEnum.fromString(parts[0]) != null) { - actionData.put("mode", AttackEntityEnum.fromString(parts[0])); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("range", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("value", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - - List conditions = new ArrayList<>(); - String conditionString = String.join(" ", parts); - - if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { - throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception - } - conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); - String[] conditionParts = conditionString.split(","); - - List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); - - for (String conditionPart : conditionParts) { - for (CHTSLImpl condition : defaultConditions) { - if (conditionPart.startsWith(condition.keyword())) { - CHTSLImpl c = (CHTSLImpl) condition.clone(); - c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); - conditions.add(c); - break; - } - } - } - - actionData.put("conditions", ConditionalData.fromList(conditions)); - - this.conditions = conditions; - return nextLines; - } - - @Override - public String keyword() { - return "attackEntity"; - } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// LinkedHashMap actionData = data(); +// +// if (AttackEntityEnum.fromString(parts[0]) != null) { +// actionData.put("mode", AttackEntityEnum.fromString(parts[0])); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("range", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("value", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// +// List conditions = new ArrayList<>(); +// String conditionString = String.join(" ", parts); +// +// if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { +// throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception +// } +// conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); +// String[] conditionParts = conditionString.split(","); +// +// List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); +// +// for (String conditionPart : conditionParts) { +// for (CHTSLImpl condition : defaultConditions) { +// if (conditionPart.startsWith(condition.keyword())) { +// CHTSLImpl c = (CHTSLImpl) condition.clone(); +// c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); +// conditions.add(c); +// break; +// } +// } +// } +// +// actionData.put("conditions", ConditionalData.fromList(conditions)); +// +// this.conditions = conditions; +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/BreakAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/BreakAction.java index 1024eaf8..c898f992 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/BreakAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/BreakAction.java @@ -1,44 +1,27 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.NPCAction; import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; -import net.citizensnpcs.api.npc.NPC; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class BreakAction extends HTSLImpl implements NPCAction { public BreakAction() { - super("Break Action"); - } - - @Override - public String toString() { - return "BreakAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.STONE_PICKAXE); - builder.name("&eBreak"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.STONE_PICKAXE); - builder.name("&aBreak"); - builder.description("Stops executing any remaining actions inside of a loop."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.BREAK, + "Break Loop", + "Breaks a repeat action.", + Material.STONE_PICKAXE, + List.of("breakBlock") + ); } @Override @@ -46,11 +29,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; //it isnt used so :shrug: } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public int limit() { return 1; @@ -60,15 +38,4 @@ public int limit() { public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "break"; - } - - @Override - public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - - // Do nothing - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/CancelAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/CancelAction.java index adad64b4..93432fd6 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/CancelAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/CancelAction.java @@ -4,48 +4,28 @@ import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; -import de.maxhenkel.voicechat.api.events.Event; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; import static com.al3x.housing2.Action.OutputType.SUCCESS; import static com.al3x.housing2.Enums.EventType.*; -import static com.al3x.housing2.Utils.Color.colorize; +@ToString public class CancelAction extends HTSLImpl implements NPCAction { public CancelAction() { - super("Cancel Action"); - } - - @Override - public String toString() { - return "CancelAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.TNT); - builder.name("&eCancel Event"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.changeOrderLore(true); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.TNT); - builder.name("&aCancel Event"); - builder.description("Cancels the event from running."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CANCEL, + "Cancel", + "Cancels the event from running.", + Material.TNT, + List.of("cancel") + ); } @Override @@ -68,21 +48,11 @@ public List allowedEvents() { PLAYER_CREATE_VOICE_GROUP, PLAYER_JOIN_VOICE_GROUP, SPLASH_POTION); } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "cancelEvent"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { event.setCancelled(true); diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHealthAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHealthAction.java index 25bf409c..097a5d0c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHealthAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHealthAction.java @@ -1,142 +1,84 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.*; +import com.al3x.housing2.Utils.Color; +import com.al3x.housing2.Utils.HandlePlaceholders; +import com.al3x.housing2.Utils.NumberUtilsKt; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; - public class ChangeHealthAction extends HTSLImpl implements NPCAction { - private StatOperation mode; - private String value; public ChangeHealthAction() { - super("Change Health Action"); - mode = StatOperation.SET; - value = "20"; - } - - @Override - public String toString() { - return "PlayerStatAction (mode: " + mode + ", value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.APPLE); - builder.name("&eChange Health"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Value", value); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.APPLE); - builder.name("&eChange Health"); - builder.description("Change the player's health by a specified amount."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eChange Health Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.APPLE) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatOperation.values(), null)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.APPLE) - .name("&eValue") - .info("&7Current Value", "") - .info(null, "&a" + value.toString()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.CHANGE_HEALTH, + "Change Health", + "Changes the player's health.", + Material.APPLE, + List.of("health") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + StatOperation.class + ).setValue(StatOperation.SET), + new NumberProperty( + "value", + "Value", + "The value to use." + ).setValue("20") )); - return new ActionEditor(6, "&eChange Health Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value)) { - return OutputType.ERROR; - } - double result = Double.parseDouble(value); + double value = getProperty("value", NumberProperty.class).parsedValue(house, player); + player.setHealth(handleHealth(value, player)); + return OutputType.SUCCESS; + } + + private Double handleHealth(double result, LivingEntity le) { + StatOperation mode = getValue("mode", StatOperation.class); switch (mode) { case INCREASE: - result += player.getHealth(); + result += le.getHealth(); break; case DECREASE: - result = player.getHealth() - result; + result = le.getHealth() - result; break; case MULTIPLY: - result = player.getHealth() * result; + result = le.getHealth() * result; break; case DIVIDE: - result = player.getHealth() / result; + result = le.getHealth() / result; break; case MOD: - result = player.getHealth() % result; + result = le.getHealth() % result; break; case FLOOR: - result = Math.floor(player.getHealth()); + result = Math.floor(le.getHealth()); break; case ROUND: - result = Math.round(player.getHealth()); + result = Math.round(le.getHealth()); break; case SET: break; } - player.setHealth(result); - return OutputType.SUCCESS; - } - - - - public StatOperation getMode() { - return mode; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("value", value); - return data; + return result; } @Override @@ -144,59 +86,19 @@ public boolean requiresPlayer() { return true; } - @Override - public void fromData(HashMap data, Class actionClass) { - mode = StatOperation.valueOf((String) data.get("mode")); - value = (String) data.get("value"); - } - - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + mode.getAlternative() + " " + Color.removeColor(value.toString()); - } - - @Override - public String keyword() { - return "changeHealth"; - } +// @Override +// public String export(int indent) { +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " " + mode.getAlternative() + " " + Color.removeColor(value.toString()); +// } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value)) { - return; - } - double result = Double.parseDouble(value); + double value = getProperty("value", NumberProperty.class).parsedValue(house, player); if (!(npc.getEntity() instanceof LivingEntity le)) { return; } - switch (mode) { - case INCREASE: - result += le.getHealth(); - break; - case DECREASE: - result = le.getHealth() - result; - break; - case MULTIPLY: - result = le.getHealth() * result; - break; - case DIVIDE: - result = le.getHealth() / result; - break; - case MOD: - result = le.getHealth() % result; - break; - case FLOOR: - result = Math.floor(le.getHealth()); - break; - case ROUND: - result = Math.round(le.getHealth()); - break; - case SET: - break; - } - le.setHealth(result); + le.setHealth(handleHealth(value, le)); } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHungerAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHungerAction.java index bafbe9c4..0f090fcf 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHungerAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeHungerAction.java @@ -1,134 +1,82 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.*; +import com.al3x.housing2.Utils.Color; +import com.al3x.housing2.Utils.HandlePlaceholders; +import com.al3x.housing2.Utils.NumberUtilsKt; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; - +@Getter public class ChangeHungerAction extends HTSLImpl { - private StatOperation mode; - private String value; - public ChangeHungerAction() { - super("Change Hunger Action"); - mode = StatOperation.SET; - value = "20"; - } - - @Override - public String toString() { - return "PlayerStatAction (mode: " + mode + ", value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.COOKED_BEEF); - builder.name("&eChange Hunger Level"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Value", value); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.COOKED_BEEF); - builder.name("&eChange Hunger Level"); - builder.description("Change the player's hunger."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eChange Hunger Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.APPLE) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatOperation.values(), null)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.APPLE) - .name("&eValue") - .info("&7Current Value", "") - .info(null, "&a" + value.toString()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.CHANGE_HUNGER, + "Change Hunger Level", + "Changes the player's hunger level.", + Material.COOKED_BEEF, + List.of("hunger") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + StatOperation.class + ).setValue(StatOperation.SET), + new NumberProperty( + "value", + "Value", + "The value to use." + ).setValue("20") )); - return new ActionEditor(6, "&eChange Hunger Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value)) { - return OutputType.ERROR; + Double val = getProperty("value", NumberProperty.class).parsedValue(house, player); + StatOperation mode = getValue("mode", StatOperation.class); + switch (mode) { + case INCREASE: + val += player.getFoodLevel(); + break; + case DECREASE: + val = player.getFoodLevel() - val; + break; + case MULTIPLY: + val = player.getFoodLevel() * val; + break; + case DIVIDE: + val = player.getFoodLevel() / val; + break; + case MOD: + val = player.getFoodLevel() % val; + break; + case FLOOR: + val = Math.floor(player.getFoodLevel()); + break; + case ROUND: + break; + case SET: + break; } - int val = Integer.parseInt(value); - player.setFoodLevel(val); + player.setFoodLevel(val.intValue()); return OutputType.SUCCESS; } - public StatOperation getMode() { - return mode; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("value", value); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - mode = StatOperation.valueOf((String) data.get("mode")); - value = (String) data.get("value"); - } - - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + mode.getAlternative() + " " + Color.removeColor(value); - } - - @Override - public String keyword() { - return "hungerLevel"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeMaxHealthAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeMaxHealthAction.java index dbdb9364..1f83d503 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeMaxHealthAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeMaxHealthAction.java @@ -1,110 +1,60 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Instances.Stat; -import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.ScaledMaxHealthTrait; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.Arrays; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; - public class ChangeMaxHealthAction extends HTSLImpl implements NPCAction { - - private double health; - private StatOperation mode; - private boolean healOnChange; - public ChangeMaxHealthAction() { - super("Change Max Health Action"); - this.health = 20.0; - this.mode = StatOperation.INCREASE; - this.healOnChange = true; - } - - public ChangeMaxHealthAction(double health, StatOperation operation, boolean healOnChange) { - super("Change Max Health Action"); - this.health = health; - this.mode = operation; - this.healOnChange = healOnChange; - } - - @Override - public String toString() { - return "ChangeMaxHealthAction (Health: " + this.health + " Mode: " + this.mode + " HealOnChange: " + this.healOnChange + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.DANDELION); - builder.name("&eChange Max Health"); - builder.info("&eSettings", ""); - builder.info("Health", "&a" + health); - builder.info("Operation", "&a" + mode.toString()); - builder.info("Heal On Change", (healOnChange) ? "&aYes" : "&cNo"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DANDELION); - builder.name("&aChange Max Health Action"); - builder.description("Set the user's maximum health."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionItem("health", - ItemBuilder.create(Material.BOOK) - .name("&aHealth") - .info("&7Current Value", "") - .info(null, health) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionItem.ActionType.DOUBLE - ), - new ActionItem("mode", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatOperation.values(), null - ), - new ActionItem("healOnChange", - ItemBuilder.create((this.healOnChange ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aHeal On Change") - .description("Should the player be fully healed when this action is ran") - .info("&7Current Value", "") - .info(null, healOnChange ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) + super( + ActionEnum.CHANGE_MAX_HEALTH, + "Change Max Health", + "Adjusts the player's maximum health.", + Material.DANDELION, + List.of("maxHealth") ); - return new ActionEditor(4, "&eMax Health Action Settings", items); + + getProperties().addAll(List.of( + new DoubleProperty( + "health", + "Health", + "The amount to change the max health by." + ).setValue(20.0), + new EnumProperty<>( + "operation", + "Operation", + "The operation to use.", + StatOperation.class + ).setValue(StatOperation.INCREASE), + new BooleanProperty( + "healOnChange", + "Heal On Change", + "Should the player be fully healed when this action is ran" + ).setValue(true) + )); } @Override public OutputType execute(Player player, HousingWorld house) { + double health = getValue("health", Double.class); + StatOperation operation = getValue("operation", StatOperation.class); + boolean healOnChange = getValue("healOnChange", Boolean.class); if (player != null) { double currentMax = player.getMaxHealth(); - switch (mode) { + switch (operation) { case INCREASE: currentMax += health; break; @@ -126,31 +76,20 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("health", health); - data.put("mode", mode); - data.put("healOnChange", healOnChange); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "maxHealth"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + double health = getValue("health", Double.class); + StatOperation operation = getValue("operation", StatOperation.class); + boolean healOnChange = getValue("healOnChange", Boolean.class); if (npc != null) { double currentMax = npc.getOrAddTrait(ScaledMaxHealthTrait.class).getMaxHealth(); - switch (mode) { + switch (operation) { case INCREASE: currentMax += health; break; @@ -170,10 +109,4 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv } } } - -// @Override -// public void fromData(HashMap data) { -// if (!data.containsKey("message")) return; -// message = (String) data.get("message"); -// } -} +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeNPCAttributeAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeNPCAttributeAction.java index 6a593d76..c8a66a32 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeNPCAttributeAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeNPCAttributeAction.java @@ -1,87 +1,52 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.AttributeType; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Placeholders.custom.Placeholder; import com.al3x.housing2.Utils.Color; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.AttributeTrait; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeInstance; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@Getter +@Setter +@ToString public class ChangeNPCAttributeAction extends HTSLImpl implements NPCAction { - - private AttributeType attribute; - private String value; - public ChangeNPCAttributeAction() { - super("Change NPC Attribute Action"); - attribute = AttributeType.ARMOR; - value = "1"; - } - - @Override - public String toString() { - return "ChangeNPCAttributeAction (mode: " + attribute + " value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.HOPPER); - builder.name("&eChange NPC Attribute"); - builder.info("&eSettings", ""); - builder.info("Mode", attribute.name()); - builder.info("Value", value); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.HOPPER); - builder.name("&aChange NPC Attribute"); - builder.description("Adjust the NPC's attributes."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eChange NPC Attribute Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("attribute", - ItemBuilder.create(Material.REPEATING_COMMAND_BLOCK) - .name("&eAttribute") - .info("&7Current Value", "") - .info(null, "&a" + attribute.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, AttributeType.values(), null)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.HOPPER) - .name("&eValue") - .info("&7Current Value", "") - .info(null, "&a" + value) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.CHANGE_NPC_ATTRIBUTE, + "Change NPC Attribute", + "Changes the NPC's attribute.", + Material.HOPPER, + List.of("npcAttribute") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "attribute", + "Attribute", + "The attribute to change.", + AttributeType.class + ).setValue(AttributeType.ARMOR), + new NumberProperty( + "value", + "Value", + "The value to set the attribute to." + ).setValue("1") )); - return new ActionEditor(6, "&eChange Attribute Settings", items); } @Override @@ -89,57 +54,23 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - public AttributeType getAttribute() { - return attribute; - } - - public void setAttribute(AttributeType attribute) { - this.attribute = attribute; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("attribute", attribute == null ? AttributeType.ARMOR.name() : attribute.name()); - data.put("value", value); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public void fromData(HashMap data, Class actionClass) { - attribute = AttributeType.valueFrom((String) data.get("attribute")) == null ? AttributeType.ARMOR : AttributeType.valueFrom((String) data.get("attribute")); - value = (String) data.get("value"); - } - - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + attribute.name() + " " + Color.removeColor(value); - } - - @Override - public String keyword() { - return "npcAttribute"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Double value = getProperty("value", NumberProperty.class).parsedValue(house, player); + AttributeType attribute = getValue("attribute", AttributeType.class); try { if (attribute.getAttribute().equals(Attribute.FLYING_SPEED)) { - npc.getNavigator().getDefaultParameters().baseSpeed(Float.parseFloat(Placeholder.handlePlaceholders(value, house, player))); + npc.getNavigator().getDefaultParameters().baseSpeed(value.floatValue()); return; } AttributeTrait attributeTrait = npc.getOrAddTrait(AttributeTrait.class); - attributeTrait.setAttributeValue(attribute.getAttribute(), Double.parseDouble(Placeholder.handlePlaceholders(value, house, player))); + attributeTrait.setAttributeValue(attribute.getAttribute(), value.floatValue()); } catch (Exception e) { Bukkit.getLogger().warning("Failed to change NPC attribute: " + e.getMessage()); } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerAttributeAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerAttributeAction.java index 6e8d3dfd..1acdbd06 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerAttributeAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerAttributeAction.java @@ -1,149 +1,76 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Enums.AttributeType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Placeholders.custom.Placeholder; -import com.al3x.housing2.Utils.*; -import com.google.gson.Gson; +import com.al3x.housing2.Utils.Color; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.Registry; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; -import org.bukkit.attribute.AttributeModifier; import org.bukkit.entity.Player; -import org.checkerframework.checker.units.qual.A; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +@Getter +@ToString public class ChangePlayerAttributeAction extends HTSLImpl { - private AttributeType attribute; - private String value; public ChangePlayerAttributeAction() { - super("Change Player Attribute Action"); - attribute = AttributeType.ARMOR; - value = "1"; - } - - @Override - public String toString() { - return "ChangePlayerAttributeAction (mode: " + attribute + " value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.HOPPER); - builder.name("&eChange Player Attribute"); - builder.info("&eSettings", ""); - builder.info("Mode", attribute.name()); - builder.info("Value", value); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.HOPPER); - builder.name("&aChange Player Attribute"); - builder.description("Adjust the player's attributes."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eChange Player Attribute Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("attribute", - ItemBuilder.create(Material.REPEATING_COMMAND_BLOCK) - .name("&eAttribute") - .info("&7Current Value", "") - .info(null, "&a" + attribute.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, AttributeType.values(), null)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.HOPPER) - .name("&eValue") - .info("&7Current Value", "") - .info(null, "&a" + value) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.CHANGE_PLAYER_ATTRIBUTE, + "Change Player Attribute", + "Changes the player's attribute.", + Material.HOPPER, + List.of("playerAttribute") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "attribute", + "Attribute", + "The attribute to change.", + AttributeType.class + ).setValue(AttributeType.ARMOR), + new NumberProperty( + "value", + "Value", + "The value to set the attribute to." + ).setValue("1") )); - return new ActionEditor(6, "&eChange Attribute Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { + Double value = getProperty("value", NumberProperty.class).parsedValue(house, player); + AttributeType attribute = getValue("attribute", AttributeType.class); try { if (attribute.getAttribute().equals(Attribute.FLYING_SPEED)) { - player.setFlySpeed(Float.parseFloat(Placeholder.handlePlaceholders(value, house, player))); + player.setFlySpeed(value.floatValue()); return OutputType.SUCCESS; } AttributeInstance attributeInstance = player.getAttribute(attribute.getAttribute()); if (attributeInstance == null) return OutputType.SUCCESS; - attributeInstance.setBaseValue(Double.parseDouble(Placeholder.handlePlaceholders(value, house, player))); + attributeInstance.setBaseValue(value.floatValue()); } catch (Exception e) { Bukkit.getLogger().warning("Failed to change player attribute: " + e.getMessage()); } return OutputType.SUCCESS; } - public AttributeType getAttribute() { - return attribute; - } - - public void setAttribute(AttributeType attribute) { - this.attribute = attribute; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("attribute", attribute == null ? AttributeType.ARMOR.name() : attribute.name()); - data.put("value", value); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - attribute = AttributeType.valueFrom((String) data.get("attribute")) == null ? AttributeType.ARMOR : AttributeType.valueFrom((String) data.get("attribute")); - value = (String) data.get("value"); - } - - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + attribute.name() + " " + Color.removeColor(value); - } - - @Override - public String keyword() { - return "attribute"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerDisplayNameAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerDisplayNameAction.java index f5cb3d95..80dd9719 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerDisplayNameAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerDisplayNameAction.java @@ -1,79 +1,45 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.StringUtilsKt; -import net.kyori.adventure.text.Component; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; -import static com.al3x.housing2.Utils.HandlePlaceholders.parsePlaceholders; - +@Getter +@Setter +@ToString public class ChangePlayerDisplayNameAction extends HTSLImpl { - - private String name; - public ChangePlayerDisplayNameAction() { - super("Change Player Display Name Action"); - this.name = "%player.name%"; - } - - @Override - public String keyword() { - return "displayName"; - } - - @Override - public String toString() { - return "ChangePlayerDisplayNameAction (Name: " + name + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eChange Player Display Name"); - builder.info("&eSettings", ""); - builder.info("Name", name); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&aChange Player Display Name"); - builder.description("Changes the display name of the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.CHANGE_PLAYER_DISPLAYNAME, + "Change Player Display Name", + "Changes the display name of the player.", + Material.PLAYER_HEAD, + List.of("displayName") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionItem("name", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aDisplay Name") - .info("&7Current Value", "") - .info(null, name) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionItem.ActionType.STRING - ) + getProperties().add( + new StringProperty("name", + "Name", + "The name to set." + ).setValue("%player.name%") ); - return new ActionEditor(4, "&eDisplay Name Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { + String name = getProperty("name", StringProperty.class).parsedValue(house, player); if (house.getWorld().getPlayers().contains(player)) { MiniMessage miniMessage = MiniMessage.miniMessage(); if (miniMessage.stripTags(miniMessage.serialize(StringUtilsKt.housingStringFormatter(name, house, player))).length() > 64) { @@ -85,21 +51,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("name", name); - return data; - } - @Override public boolean requiresPlayer() { return true; } - -// @Override -// public void fromData(HashMap data) { -// if (!data.containsKey("message")) return; -// message = (String) data.get("message"); -// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerGroupAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerGroupAction.java index beaf6059..e46769a6 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerGroupAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerGroupAction.java @@ -1,77 +1,41 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.GenericPagination.GroupProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Group; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.SlotSelectMenu; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.Serialization; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.inventory.ItemStack; -import java.io.IOException; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@ToString public class ChangePlayerGroupAction extends HTSLImpl { - String group = null; - boolean demotionProtection = false; public ChangePlayerGroupAction() { - super("Change Player Group"); - } - - @Override - public String toString() { - return "ChangePlayerGroup{" + - "group=" + group + - ", demotionProtection=" + demotionProtection + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eChange Player Group"); - builder.info("&eSettings", ""); - builder.info("Group", (group == null ? "&aNot Set" : "&6" + group)); - builder.info("Demotion Protection", (demotionProtection ? "&aEnabled" : "&cDisabled")); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eChange Player Group"); - builder.description("Change the player's group."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.CHANGE_PLAYER_GROUP, + "Change Player Group", + "Changes the player's group.", + Material.PLAYER_HEAD, + List.of("group") + ); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = List.of( - new ActionEditor.ActionItem("group", ItemBuilder.create(Material.PLAYER_HEAD) - .name("&aGroup") - .description("The group to change the player to.") - .info("&7Current Value", "") - .info(null, (group == null ? "&aNot Set" : "&6" + group)), - ActionEditor.ActionItem.ActionType.GROUP + getProperties().addAll(List.of( + new GroupProperty( + "group", + "Group", + "The group to change the player to." ), - new ActionEditor.ActionItem("demotionProtection", ItemBuilder.create((demotionProtection ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aDemotion Protection") - .info("&7Current Value", "") - .info(null, demotionProtection ? "&aEnabled" : "&cDisabled"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "&eChange Player Group", items); + new BooleanProperty( + "demotionProtection", + "Demotion Protection", + "If enabled, the player cannot be demoted if their priority is higher than the group they are being changed to." + ).setValue(false) + )); } @Override @@ -81,13 +45,14 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Group group = getValue("group", Group.class); + boolean demotionProtection = getValue("demotionProtection", Boolean.class); if (group == null) { return OutputType.ERROR; } if (house.getOwnerUUID() == player.getUniqueId()) { return OutputType.ERROR; } - Group group = house.getGroup(this.group); if (house.loadOrCreatePlayerData(player).getGroupInstance(house).getPriority() > group.getPriority() && demotionProtection) { return OutputType.ERROR; } @@ -95,27 +60,8 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("group", group); - data.put("demotionProtection", demotionProtection); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - group = (String) data.get("group"); - demotionProtection = (boolean) data.get("demotionProtection"); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "changePlayerGroup"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerTeamAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerTeamAction.java index d51cc37a..51b0222b 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerTeamAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangePlayerTeamAction.java @@ -1,101 +1,48 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Instances.Team; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.GenericPagination.TeamProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.SlotSelectMenu; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.Serialization; +import com.al3x.housing2.Instances.Team; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import java.io.IOException; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@ToString public class ChangePlayerTeamAction extends HTSLImpl { - String team = null; public ChangePlayerTeamAction() { - super("Change Player Team"); - } - - @Override - public String toString() { - return "ChangePlayerTeam{" + - "team=" + team + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eChange Player Team"); - builder.description("Change the player's team."); - builder.info("&eSettings", ""); - builder.info("Team", (team == null ? "&aNot Set" : "&6" + team)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eChange Player Team"); - builder.description("Change the player's team."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.CHANGE_PLAYER_TEAM, + "Change Player Team", + "Changes the player's team.", + Material.PLAYER_HEAD, + List.of("team") + ); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = List.of( - new ActionEditor.ActionItem("team", ItemBuilder.create(Material.PLAYER_HEAD) - .name("&aTeam") - .description("The team to change the player to.") - .info("&7Current Value", "") - .info(null, (team == null ? "&aNot Set" : "&6" + team)), - ActionEditor.ActionItem.ActionType.TEAM + getProperties().add( + new TeamProperty( + "team", + "Team", + "The team to change the player to." ) ); - return new ActionEditor(4, "&eChange Player Team", items); } @Override public OutputType execute(Player player, HousingWorld house) { + Team team = getValue("team", Team.class); if (team == null) { return OutputType.ERROR; } - Team team = house.getTeam(this.team); house.loadOrCreatePlayerData(player).setTeam(team.getName()); return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("team", team); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - team = (String) data.get("team"); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "changePlayerTeam"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeTimeAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeTimeAction.java index f9e19b8c..3689839a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeTimeAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChangeTimeAction.java @@ -1,161 +1,84 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.Color; import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@Getter +@ToString public class ChangeTimeAction extends HTSLImpl { - private StatOperation mode; - private String value; public ChangeTimeAction() { - super("Change Time Action"); - mode = StatOperation.SET; - value = "6000"; - } - - @Override - public String toString() { - return "ChangeTimeAction (mode: " + mode + ", value: " + value + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&eChange Time"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Value", value); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&aChange Time"); - builder.description("Changes the time in the house."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eChange Time Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.CLOCK) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatOperation.values(), null)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create(Material.CLOCK) - .name("&eValue") - .info("&7Current Value", "") - .info(null, "&a" + value.toString()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.CHANGE_TIME, + "Change Time", + "Changes the time in the house.", + Material.CLOCK, + List.of("time") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + StatOperation.class + ).setValue(StatOperation.SET), + new NumberProperty( + "value", + "Value", + "The value to use." + ).setValue("6000") )); - return new ActionEditor(6, "&eChange Time Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String value = HandlePlaceholders.parsePlaceholders(player, house, this.value); - if (!NumberUtilsKt.isDouble(value)) { - return OutputType.ERROR; - } - double result = Double.parseDouble(value); + Double value = getProperty("value", NumberProperty.class).parsedValue(house, player); - switch (mode) { + switch (getValue("mode", StatOperation.class)) { case INCREASE: - result += house.getWorld().getTime(); + value += house.getWorld().getTime(); break; case DECREASE: - result = house.getWorld().getTime() - result; + value = house.getWorld().getTime() - value; break; case MULTIPLY: - result = house.getWorld().getTime() * result; + value = house.getWorld().getTime() * value; break; case DIVIDE: - result = house.getWorld().getTime() / result; + value = house.getWorld().getTime() / value; break; case MOD: - result = house.getWorld().getTime() % result; + value = house.getWorld().getTime() % value; break; case FLOOR: - result = Math.floor(house.getWorld().getTime()); - break; - case ROUND: - result = Math.round(house.getWorld().getTime()); + value = Math.floor(house.getWorld().getTime()); break; case SET: break; } - house.getWorld().setTime((long) result); + house.getWorld().setTime(value.longValue()); return OutputType.SUCCESS; } - public StatOperation getMode() { - return mode; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public String getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("value", value); - return data; - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public void fromData(HashMap data, Class actionClass) { - mode = StatOperation.valueOf((String) data.get("mode")); - value = (String) data.get("value"); - } - - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + mode.getAlternative() + " " + Color.removeColor(value.toString()); - } - - @Override - public String keyword() { - return "changeTime"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChatAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChatAction.java index ef19a1c7..0ab21500 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ChatAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ChatAction.java @@ -1,112 +1,52 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.StringUtilsKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; -import static com.al3x.housing2.Utils.HandlePlaceholders.parsePlaceholders; +@Getter +@Setter +@ToString public class ChatAction extends HTSLImpl { - private String message; - public ChatAction() { - super("Chat Action"); - this.message = "&eHello World!"; - } - - public ChatAction(String message) { - super("Chat Action"); - this.message = message; - } - - @Override - public String keyword() { - return "chat"; - } - - @Override - public String toString() { - return "ChatAction (Message: " + message + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PAPER); - builder.name("&eDisplay Chat Message"); - builder.info("&eSettings", ""); - builder.info("Message", message); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PAPER); - builder.name("&aDisplay Chat Message"); - builder.description("Sends a chat message to the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionItem("message", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aMessage") - .info("&7Current Value", "") - .info(null, message) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionItem.ActionType.STRING - ) + super( + ActionEnum.CHAT, + "Display Chat Message", + "Displays a chat message to the player.", + Material.PAPER, + List.of("chat") ); - return new ActionEditor(4, "&eChat Action Settings", items); + + getProperties().add(new StringProperty( + "message", + "Message", + "The message to display." + ).setValue("&eHello, world!")); } @Override public OutputType execute(Player player, HousingWorld house) { - player.sendMessage(StringUtilsKt.housingStringFormatter(message, house, player)); + Component message = getProperty("message", StringProperty.class).component(house, player); + player.sendMessage(message); return OutputType.SUCCESS; } - public String getMessage() { - return message; - } - public void setMessage(String message) { - this.message = message; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("message", message); - return data; - } - @Override public boolean requiresPlayer() { return true; } - -// @Override -// public void fromData(HashMap data) { -// if (!data.containsKey("message")) return; -// message = (String) data.get("message"); -// } -} +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearBossbarAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearBossbarAction.java index 5c549bea..a9b74556 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearBossbarAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearBossbarAction.java @@ -1,54 +1,28 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import net.kyori.adventure.bossbar.BossBar; -import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.KeyedBossBar; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import java.util.*; - -import static com.al3x.housing2.Utils.Color.colorize; -import static com.al3x.housing2.Utils.Color.fromColor; +import java.util.ArrayList; +import java.util.List; +@ToString public class ClearBossbarAction extends HTSLImpl { public ClearBossbarAction() { - super("Clear Bossbars Action"); - } - - - @Override - public String toString() { - return "ClearBossbarAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.WITHER_SKELETON_SKULL); - builder.name("&eClear Bossbars"); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.WITHER_SKELETON_SKULL); - builder.name("&aClear Bossbars"); - builder.description("Clears all bossbars from the player's screen."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CLEAR_BOSSBAR, + "Clear Bossbars", + "Clears all bossbars from the player's screen.", + Material.WITHER_SKELETON_SKULL, + List.of("clearBossbars") + ); } @Override @@ -59,18 +33,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "clearBossbar"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearEnderChestAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearEnderChestAction.java index f7a4f58d..49a67704 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearEnderChestAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearEnderChestAction.java @@ -1,40 +1,26 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class ClearEnderChestAction extends HTSLImpl { public ClearEnderChestAction() { - super("Clear Enderchest Action"); - } - - @Override - public String toString() { - return "ClearEnderChestAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_CHEST); - builder.name("&eClear Ender Chest"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_CHEST); - builder.name("&aClear Ender Chest"); - builder.description("Clears the player's ender chest."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CLEAR_ENDERCHEST, + "Clear Enderchest", + "Clears the player's ender chest.", + Material.ENDER_CHEST, + List.of("clearEnderChest") + ); } @Override @@ -43,18 +29,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "clearEnderChest"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearGlobalStatsAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearGlobalStatsAction.java index f915dbcf..bfec23c7 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearGlobalStatsAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearGlobalStatsAction.java @@ -1,40 +1,25 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.LinkedHashMap; - +import java.util.List; +@ToString public class ClearGlobalStatsAction extends HTSLImpl { public ClearGlobalStatsAction() { - super("Clear Global Stats Action"); - } - - @Override - public String toString() { - return "ClearGlobalStatsAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.BARRIER); - builder.name("&eClear Global Stats"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.BARRIER); - builder.name("&aClear Global Stats"); - builder.description("Resets all global stats."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CLEAR_GLOBALSTATS, + "Clear Global Stats", + "Clears all global stats.", + Material.BARRIER, + List.of("clearGlobalStats") + ); } @Override @@ -43,18 +28,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "clearGlobalStats"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPlayerStatsAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPlayerStatsAction.java index 9e716dc1..52dbff76 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPlayerStatsAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPlayerStatsAction.java @@ -1,40 +1,26 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class ClearPlayerStatsAction extends HTSLImpl { public ClearPlayerStatsAction() { - super("Clear Player Stats Action"); - } - - @Override - public String toString() { - return "ClearPlayerStatsAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.BARRIER); - builder.name("&eClear Player Stats"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.BARRIER); - builder.name("&aClear Player Stats"); - builder.description("Clears all of the player's stats."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CLEAR_PLAYERSTATS, + "Clear Player Stats", + "Clears all of the player's stats.", + Material.BARRIER, + List.of("clearPlayerStats") + ); } @Override @@ -43,18 +29,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "clearPlayerStats"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPotionEffectAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPotionEffectAction.java index 61c0ec33..e0853520 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPotionEffectAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ClearPotionEffectAction.java @@ -1,7 +1,9 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.CustomProperty; +import com.al3x.housing2.Action.Properties.PotionProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; @@ -10,119 +12,59 @@ import com.al3x.housing2.Menus.PaginationMenu; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.ItemBuilder.ActionType; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.potion.PotionEffect; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.potion.PotionEffectType; -import org.bukkit.potion.PotionType; import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +import java.util.function.BiFunction; +@ToString public class ClearPotionEffectAction extends HTSLImpl implements NPCAction { - - private PotionEffectType potionEffectType; - private boolean clearAll; - public ClearPotionEffectAction() { - super("Clear Potion Effect Action"); - this.potionEffectType = PotionEffectType.SPEED; - this.clearAll = false; - } - - public ClearPotionEffectAction(PotionEffectType potionEffectType, boolean clearAll) { - super("Clear Potion Effect Action"); - this.potionEffectType = potionEffectType; - this.clearAll = clearAll; - } - - @Override - public String toString() { - return "ApplyPotionEffectAction{" + "potionEffectType=" + potionEffectType + ", clearAll=" + clearAll + '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GLASS_BOTTLE); - builder.name("&eClear Potion Effect"); - builder.info("&eSettings", ""); - builder.info("Potion", "&a" + potionEffectType.getName()); - builder.info("Clear All", ((clearAll) ? "&aYes" : "&cNo")); - builder.lClick(ActionType.EDIT_YELLOW).rClick(ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GLASS_BOTTLE); - builder.name("&eClear Potion Effect"); - builder.description("Clears all or a specific potion effect"); - builder.lClick(ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = List.of( - new ActionItem("potion", - ItemBuilder.create(Material.POTION) - .name("&aPotion") - .info("&7Current Value", "") - .info(null, "&6" + potionEffectType.getName()) - .lClick(ActionType.CHANGE_YELLOW), - (event, obj) -> { - //Create a list of all the potion effects - List> potions = new ArrayList<>(); - for (PotionEffectType type : PotionEffectType.values()) { - potions.add(new Duple<>(type, ItemBuilder.create(Material.POTION).name("&6" + type.getName()))); - } - //Basically because PotionEffectType isnt a ENUM we cant just use the enum class - new PaginationMenu<>(Main.getInstance(), - "&eSelect a Potion Effect", potions, - player, house, backMenu, (potion) -> { - potionEffectType = potion; - backMenu.open(); - }).open(); - return true; - } - ), - new ActionItem("clearAll", //Needs to be the exact same as the variable name - ItemBuilder.create(Material.POTION) - .name("&aClear All") - .description("If toggled on, this will clear all potion effects except the one selected") - .info("&7Current Value", "") - .info(null, ((clearAll) ? "&aYes" : "&cNo")) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.BOOLEAN - ) + super( + ActionEnum.CLEAR_POTION, + "Clear Potion Effect", + "Clears a potion effect from the player.", + Material.GLASS_BOTTLE, + List.of("clearEffect") ); - return new ActionEditor(4, "&ePotion Effect Action Settings", items); + + getProperties().addAll(List.of( + new PotionProperty( + "potion", + "Potion", + "The potion effect to apply." + ).setValue(PotionEffectType.GLOWING), + new BooleanProperty( + "clearall", + "Clear All", + "If true, this will clear all potion effects except the one selected." + ).setValue(false) + )); } @Override public OutputType execute(Player player, HousingWorld house) { - if (clearAll) { - player.getActivePotionEffects().forEach(potionEffect -> { - if (potionEffect.getType() != potionEffectType) { - player.removePotionEffect(potionEffect.getType()); - } - }); - } else { - player.removePotionEffect(potionEffectType); - } + combinedExecute(player); return OutputType.SUCCESS; } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (!(npc.getEntity() instanceof LivingEntity le)) return; - if (clearAll) { + combinedExecute(le); + } + + private void combinedExecute(LivingEntity le) { + PotionEffectType potionEffectType = getValue("potion", PotionEffectType.class); + if (getValue("clearall", Boolean.class)) { le.getActivePotionEffects().forEach(potionEffect -> { if (potionEffect.getType() != potionEffectType) { le.removePotionEffect(potionEffect.getType()); @@ -133,30 +75,8 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv } } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("potion", potionEffectType == null ? PotionEffectType.SPEED.getName() : potionEffectType.getName()); - data.put("clearall", clearAll); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - //Bunch of errors coming from PotionEffectType so I needed to add this - if (!data.containsKey("potion")) return; - potionEffectType = PotionEffectType.getByName((String) data.get("potion")); - if (!data.containsKey("clearall")) return; - clearAll = (boolean) data.get("clearall"); - } - - @Override - public String keyword() { - return "clearEffect"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/CloseMenuAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/CloseMenuAction.java index 1f41f5e8..6d8cb78a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/CloseMenuAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/CloseMenuAction.java @@ -1,42 +1,27 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.LinkedHashMap; import java.util.List; +@ToString public class CloseMenuAction extends HTSLImpl { public CloseMenuAction() { - super("Close Menu Action"); - } - - @Override - public String toString() { - return "CloseMenuAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&eClose Menu"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&aClose Menu"); - builder.description("Closes the player's currently open menu."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CLOSE_MENU, + "Close Menu", + "Closes the player's currently open menu.", + Material.CHEST, + List.of("closeMenu") + ); } @Override @@ -45,11 +30,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public List allowedEvents() { return List.of(EventType.INVENTORY_CLICK); @@ -59,9 +39,4 @@ public List allowedEvents() { public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "closeMenu"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ConditionalAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ConditionalAction.java index 6312a769..6e525f43 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ConditionalAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ConditionalAction.java @@ -1,20 +1,25 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ActionsProperty; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.ConditionsProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; -import com.al3x.housing2.Events.CancellableEvent; -import com.al3x.housing2.Instances.HTSLHandler; import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Data.ConditionalData; +import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Instances.HTSLHandler; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.StringUtilsKt; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; @@ -23,110 +28,45 @@ import java.util.*; - +@ToString public class ConditionalAction extends HTSLImpl implements NPCAction { - private static final Gson gson = new Gson(); - private List conditions; - private boolean matchAnyCondition; - private boolean not; - private List ifActions; - private List elseActions; - - public ConditionalAction(ArrayList conditions, boolean matchAnyCondition, ArrayList ifActions, ArrayList elseActions) { - super("Conditional Action"); - this.not = false; - this.conditions = conditions; - this.matchAnyCondition = matchAnyCondition; - this.ifActions = ifActions; - this.elseActions = elseActions; - } public ConditionalAction() { - super("Conditional Action"); - this.conditions = new ArrayList<>(); - this.not = false; - this.matchAnyCondition = false; - this.ifActions = new ArrayList<>(); - this.elseActions = new ArrayList<>(); - } - - @Override - public String toString() { - return "ConditionalAction(conditions=" + this.conditions + ", matchAnyCondition=" + this.matchAnyCondition + ", ifActions=" + this.ifActions + ", elseActions=" + this.elseActions + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.REDSTONE); - builder.name("&eConditional"); - builder.info("&eSettings", ""); - builder.info("Conditions", conditions.size()); - builder.info("If Actions", ifActions.size()); - builder.info("Else Actions", elseActions.size()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.REDSTONE); - builder.name("&aConditional"); - builder.description("Executes actions based on certain conditions."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - public List getItems(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("conditions", - ItemBuilder.create(Material.COMPARATOR) - .name("&aConditions") - .info("&7Current Value", "") - .info(null, (conditions.isEmpty() ? "&cNo Actions" : "&a" + conditions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.CONDITION - ), - new ActionEditor.ActionItem("not", ItemBuilder.create((not ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aNot") - .description("When enabled the conditions will be inverted.") - .info("&7Current Value", "") - .info(null, not ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("matchAnyCondition", ItemBuilder.create((matchAnyCondition ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aMatch Any Condition") - .description("When enabled ony one condition needs to match, otherwise all conditions must match.") - .info("&7Current Value", "") - .info(null, matchAnyCondition ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("ifActions", - ItemBuilder.create(Material.LIGHT_WEIGHTED_PRESSURE_PLATE) - .name("&aIf Actions") - .description("Actions to execute if the conditions &nare&r&7 met.") - .info("&7Current Value", "") - .info(null, (ifActions.isEmpty() ? "&cNo Actions" : "&a" + ifActions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ACTION - ), - new ActionEditor.ActionItem("elseActions", - ItemBuilder.create(Material.LIGHT_WEIGHTED_PRESSURE_PLATE) - .name("&aElse Actions") - .description("Actions to execute if the conditions are &nnot&r&7 met.") - .info("&7Current Value", "") - .info(null, (elseActions.isEmpty() ? "&cNo Actions" : "&a" + elseActions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ACTION - ) - + super( + ActionEnum.CONDITIONAL, + "Conditional", + "Executes actions based on certain conditions.", + Material.REDSTONE, + List.of("if") ); - return items; - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - return new ActionEditor(4, "&eConditional Settings", getItems(house)); + getProperties().addAll(List.of( + new ConditionsProperty( + "conditions", + "Conditions", + "The conditions to check." + ).setValue(new ArrayList<>()), + new BooleanProperty( + "matchAnyCondition", + "Match Any Condition", + "When enabled only one condition needs to match, otherwise all conditions must match." + ).setValue(false), + new BooleanProperty( + "not", + "Not", + "When enabled the conditions will be inverted." + ).setValue(false), + new ActionsProperty( + "ifActions", + "If Actions", + "The actions to execute if the conditions are met." + ).setValue(new ArrayList<>()), + new ActionsProperty( + "elseActions", + "Else Actions", + "The actions to execute if the conditions are not met." + ).setValue(new ArrayList<>()) + )); } @Override @@ -135,6 +75,12 @@ public OutputType execute(Player player, HousingWorld house) { } public OutputType execute(Entity entity, Player player, HousingWorld house, CancellableEvent event, ActionExecutor oldExecutor) { + List conditions = getProperty("conditions", ConditionsProperty.class).getValue(); + List ifActions = getProperty("ifActions", ActionsProperty.class).getValue(); + List elseActions = getProperty("elseActions", ActionsProperty.class).getValue(); + boolean matchAnyCondition = getProperty("matchAnyCondition", BooleanProperty.class).getValue(); + boolean not = getProperty("not", BooleanProperty.class).getValue(); + boolean result = conditions.isEmpty(); for (Condition condition : conditions) { @@ -143,11 +89,14 @@ public OutputType execute(Entity entity, Player player, HousingWorld house, Canc continue; } + boolean inverted = condition.getValue("inverted", Boolean.class); + boolean conditionResult = (entity == player) - ? condition.execute(player, house, event, oldExecutor) != not + ? (condition.execute(player, house, event, oldExecutor) == OutputType.TRUE) != not : (condition instanceof NPCCondition npcCondition) && npcCondition.npcExecute(player, CitizensAPI.getNPCRegistry().getNPC(entity), house, event, oldExecutor) != not; + conditionResult = (inverted != conditionResult); if (conditionResult) { result = true; if (matchAnyCondition) break; @@ -178,41 +127,6 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv execute(npc.getEntity(), player, house, event, executor); } - public List getConditions() { - return conditions; - } - - public void setConditions(ArrayList conditions) { - this.conditions = conditions; - } - - public List getIfActions() { - return ifActions; - } - - public void setIfActions(List ifActions) { - this.ifActions = ifActions; - } - - public List getElseActions() { - return elseActions; - } - - public void setElseActions(List elseActions) { - this.elseActions = elseActions; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("conditions", ConditionalData.fromList(conditions)); - data.put("matchAnyCondition", matchAnyCondition); - data.put("not", not); - data.put("ifActions", ActionData.fromList(ifActions)); - data.put("elseActions", ActionData.fromList(elseActions)); - return data; - } - @Override public boolean requiresPlayer() { return false; @@ -228,166 +142,121 @@ public int limit() { return 40; } - @Override - public void fromData(HashMap data, Class actionClass) { - if (data.containsKey("conditions")) { - //Imma just assume this will work - conditions = conditionDataToList(gson.toJsonTree(data.get("conditions")).getAsJsonArray()); - } - if (data.containsKey("matchAnyCondition")) { - matchAnyCondition = (boolean) data.get("matchAnyCondition"); - } - if (data.containsKey("not")) { - not = (boolean) data.get("not"); - } else { - not = false; - } - if (data.containsKey("ifActions")) { - ifActions = dataToList(gson.toJsonTree(data.get("ifActions")).getAsJsonArray()); - } - if (data.containsKey("elseActions")) { - elseActions = dataToList(gson.toJsonTree(data.get("elseActions")).getAsJsonArray()); - } - } - - private List conditionDataToList(JsonArray jsonArray) { - ArrayList conditions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - conditions.add(gson.fromJson(jsonObject, ConditionalData.class)); - } - return ConditionalData.toList(conditions); - } - - private List dataToList(JsonArray jsonArray) { - ArrayList actions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - actions.add(gson.fromJson(jsonObject, ActionData.class)); - } - return ActionData.toList(actions); - } - - @Override - public String keyword() { - return "if"; - } - @Override public String syntax() { - return "if () {\\n\\n} else {\\n\\n}"; - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Condition condition : conditions) { - if (condition instanceof CHTSLImpl c) { - builder.append(c.export()).append(", "); - } - } - String conditionString = builder.toString(); - if (!conditionString.isEmpty()) { - conditionString = conditionString.substring(0, conditionString.length() - 2); - } - - String ifString = ""; - for (Action action : ifActions) { - if (action instanceof HTSLImpl impl) { - ifString += impl.export(indent + 4) + "\n"; - } - } - - String elseString = ""; - for (Action action : elseActions) { - if (action instanceof HTSLImpl impl) { - elseString += impl.export(indent + 4) + "\n"; - } - } - - return " ".repeat(indent) + keyword() + " (" + conditionString + ") {\n" + ifString + " ".repeat(indent) + "} else {\n" + elseString + " ".repeat(indent) + "}"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - if (indent.length() > 4*5) { - throw new IllegalArgumentException("Nesting limit reached"); //TODO: change this to a proper exception - } - - String[] parts = action.split(" "); - LinkedHashMap actionData = data(); - - if ((parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("false")) || parts[0].equalsIgnoreCase("and") || parts[0].equalsIgnoreCase("or")) { - actionData.put("matchAnyCondition", parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("or")); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("false")) { - actionData.put("not", parts[0].equalsIgnoreCase("true")); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - - List conditions = new ArrayList<>(); - List ifActions = new ArrayList<>(); - List elseActions = new ArrayList<>(); - - String conditionString = String.join(" ", parts); - - if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { - throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception - } - conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); - String[] conditionParts = conditionString.split(","); - - List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); - - for (String conditionPart : conditionParts) { - for (CHTSLImpl condition : defaultConditions) { - if (conditionPart.startsWith(condition.keyword())) { - CHTSLImpl c = (CHTSLImpl) condition.clone(); - c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); - conditions.add(c); - break; - } - } - } - - actionData.put("conditions", ConditionalData.fromList(conditions)); - - ArrayList ifLines = new ArrayList<>(); - ArrayList elseLines = new ArrayList<>(); - boolean isElse = false; - int ifStart = -1; - for (int i = 0; i < nextLines.size(); i++) { - String line = nextLines.get(i); - if (line.startsWith(indent + "} else {")) { - ifLines = new ArrayList<>(nextLines.subList(0, i)); - isElse = true; - ifStart = i + 1; - continue; - } - - if (line.startsWith(indent + "}")) { - if (isElse) { - elseLines = new ArrayList<>(nextLines.subList(ifStart, i)); - } else { - ifLines = new ArrayList<>(nextLines.subList(0, i)); - } - - nextLines = new ArrayList<>(nextLines.subList(i + 1, nextLines.size())); - break; - } - } - - ifActions = HTSLHandler.importActions(String.join("\n", ifLines), indent + " ".repeat(4)); - if (!elseLines.isEmpty()) { - elseActions = HTSLHandler.importActions(String.join("\n", elseLines), indent + " ".repeat(4)); - } - - actionData.put("ifActions", ActionData.fromList(ifActions)); - actionData.put("elseActions", ActionData.fromList(elseActions)); - - fromData(actionData, ConditionalAction.class); - - return nextLines; + return getScriptingKeywords().getFirst() + " () {\\n\\n} else {\\n\\n}"; } +// +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Condition condition : conditions) { +// if (condition instanceof CHTSLImpl c) { +// builder.append(c.export()).append(", "); +// } +// } +// String conditionString = builder.toString(); +// if (!conditionString.isEmpty()) { +// conditionString = conditionString.substring(0, conditionString.length() - 2); +// } +// +// String ifString = ""; +// for (Action action : ifActions) { +// if (action instanceof HTSLImpl impl) { +// ifString += impl.export(indent + 4) + "\n"; +// } +// } +// +// StringBuilder elseString = new StringBuilder(); +// for (Action action : elseActions) { +// if (action instanceof HTSLImpl impl) { +// elseString.append(impl.export(indent + 4)).append("\n"); +// } +// } +// +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " (" + conditionString + ") {\n" + ifString + " ".repeat(indent) + "} else {\n" + elseString + " ".repeat(indent) + "}"; +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// if (indent.length() > 4*5) { +// throw new IllegalArgumentException("Nesting limit reached"); //TODO: change this to a proper exception +// } +// +// String[] parts = action.split(" "); +// LinkedHashMap actionData = data(); +// +// if ((parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("false")) || parts[0].equalsIgnoreCase("and") || parts[0].equalsIgnoreCase("or")) { +// actionData.put("matchAnyCondition", parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("or")); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts[0].equalsIgnoreCase("true") || parts[0].equalsIgnoreCase("false")) { +// actionData.put("not", parts[0].equalsIgnoreCase("true")); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// +// List conditions = new ArrayList<>(); +// List ifActions = new ArrayList<>(); +// List elseActions = new ArrayList<>(); +// +// String conditionString = String.join(" ", parts); +// +// if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { +// throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception +// } +// conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); +// String[] conditionParts = conditionString.split(","); +// +// List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); +// +// for (String conditionPart : conditionParts) { +// for (CHTSLImpl condition : defaultConditions) { +// if (conditionPart.startsWith(condition.keyword())) { +// CHTSLImpl c = (CHTSLImpl) condition.clone(); +// c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); +// conditions.add(c); +// break; +// } +// } +// } +// +// actionData.put("conditions", ConditionalData.fromList(conditions)); +// +// ArrayList ifLines = new ArrayList<>(); +// ArrayList elseLines = new ArrayList<>(); +// boolean isElse = false; +// int ifStart = -1; +// for (int i = 0; i < nextLines.size(); i++) { +// String line = nextLines.get(i); +// if (line.startsWith(indent + "} else {")) { +// ifLines = new ArrayList<>(nextLines.subList(0, i)); +// isElse = true; +// ifStart = i + 1; +// continue; +// } +// +// if (line.startsWith(indent + "}")) { +// if (isElse) { +// elseLines = new ArrayList<>(nextLines.subList(ifStart, i)); +// } else { +// ifLines = new ArrayList<>(nextLines.subList(0, i)); +// } +// +// nextLines = new ArrayList<>(nextLines.subList(i + 1, nextLines.size())); +// break; +// } +// } +// +// ifActions = HTSLHandler.importActions(String.join("\n", ifLines), indent + " ".repeat(4)); +// if (!elseLines.isEmpty()) { +// elseActions = HTSLHandler.importActions(String.join("\n", elseLines), indent + " ".repeat(4)); +// } +// +// actionData.put("ifActions", ActionData.fromList(ifActions)); +// actionData.put("elseActions", ActionData.fromList(elseActions)); +// +// fromData(actionData, ConditionalAction.class); +// +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ContinueAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ContinueAction.java index fbe5556b..836f5107 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ContinueAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ContinueAction.java @@ -1,44 +1,27 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.NPCAction; import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; -import net.citizensnpcs.api.npc.NPC; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class ContinueAction extends HTSLImpl implements NPCAction { public ContinueAction() { - super("Continue Action"); - } - - @Override - public String toString() { - return "ContinueAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.HAY_BLOCK); - builder.name("&eContinue"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.HAY_BLOCK); - builder.name("&aContinue"); - builder.description("Skips the current remaining actions and continues to the next action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.CONTINUE, + "Continue", + "Skips the current remaining actions and continues to the next action.", + Material.HAY_BLOCK, + List.of("continue") + ); } @Override @@ -46,11 +29,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.CONTINUE; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public int limit() { return 10; @@ -61,13 +39,4 @@ public boolean requiresPlayer() { return false; } - @Override - public String keyword() { - return "continue"; - } - - @Override - public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - //Do nothing - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/DisplayMenuAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/DisplayMenuAction.java index 1070fef7..b5005779 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/DisplayMenuAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/DisplayMenuAction.java @@ -1,100 +1,56 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Instances.Function; +import com.al3x.housing2.Action.Properties.GenericPagination.MenuProperty; +import com.al3x.housing2.Instances.CustomMenu; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Instances.Layout; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.CustomMenuViewer; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@ToString public class DisplayMenuAction extends HTSLImpl { - String menu; public DisplayMenuAction() { - super("Display Menu Action"); - } - - public DisplayMenuAction(String menu) { - super("Display Menu Action"); - this.menu = menu; - } - - @Override - public String keyword() { - return "displayMenu"; - } - - @Override - public String toString() { - return "DisplayMenu Action{" + - "layout=" + menu + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&eDisplay Menu"); - builder.info("&eSettings", ""); - builder.info("Custom Menu", (menu == null ? "&cNone" : "&6" + menu)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&aDisplay Menu"); - builder.description("Displays a menu to the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.DISPLAY_MENU, + "Display Menu", + "Displays a custom menu to the player.", + Material.CHEST, + List.of("displayMenu") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("menu", ItemBuilder.create(Material.FILLED_MAP) - .name("&aMenu") - .info("&7Current Value", "") - .info(null, (menu == null ? "&cNone" : "&6" + menu)), - ActionEditor.ActionItem.ActionType.MENU + getProperties().add( + new MenuProperty( + "menu", + "Menu", + "The menu to display." ) ); - return new ActionEditor(4, "&eDisplay Menu Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - if (menu == null) { - return OutputType.ERROR; - } - house.getCustomMenus().stream().filter(customMenu -> customMenu.getTitle().equals(menu)).findFirst().ifPresent(customMenu -> { - Bukkit.getScheduler().runTask(Main.getInstance(), () -> { //Make sure it runs on the main thread - new CustomMenuViewer(player, customMenu).open(); - }); + if (getValue("menu", CustomMenu.class) != null) return OutputType.ERROR; + + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + // this might cause an error if it doesn't exist? + new CustomMenuViewer(player, getValue("menu", CustomMenu.class)).open(); }); - return OutputType.SUCCESS; - } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("menu", menu); - return data; + return OutputType.SUCCESS; } @Override public boolean requiresPlayer() { return true; } + } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/DropItemAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/DropItemAction.java index 008241fc..7357ee3f 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/DropItemAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/DropItemAction.java @@ -1,295 +1,145 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.ActionProperty; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.IntegerProperty; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.LocationProperty; import com.al3x.housing2.Enums.Locations; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.NbtItemBuilder; import com.al3x.housing2.Utils.Serialization; -import com.al3x.housing2.Utils.StackUtils; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import java.io.IOException; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; -import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiFunction; import static com.al3x.housing2.Enums.Locations.CUSTOM; import static com.al3x.housing2.Enums.Locations.PLAYER_LOCATION; +@Getter +@Setter +@ToString public class DropItemAction extends Action { - private ItemStack item; - private String customLocation; - private Locations location; - private boolean dropNaturally; - private boolean itemMerging; - private boolean prioritizePlayer; - private boolean fallbackToInventory; - private boolean showName; - private int pickupDelay; - public DropItemAction() { - super("Drop Item Action"); - this.item = null; - this.customLocation = null; - this.location = Locations.INVOKERS_LOCATION; - this.dropNaturally = true; - this.itemMerging = true; - this.prioritizePlayer = false; - this.fallbackToInventory = false; - this.showName = false; - this.pickupDelay = 20; - } - - @Override - public String toString() { - return "DropItemAction{" + - "item=" + item + - ", customLocation='" + customLocation + '\'' + - ", location=" + location + - ", dropNaturally=" + dropNaturally + - ", itemMerging=" + itemMerging + - ", prioritizePlayer=" + prioritizePlayer + - ", fallbackToInventory=" + fallbackToInventory + - ", showName=" + showName + - ", pickupDelay=" + pickupDelay + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.DROPPER); - builder.name("&eDrop Item"); - builder.info("&eSettings", ""); - builder.info("Item", (item == null ? "&cNone" : "&6" + item.getType())); - builder.info("Location", "&a" + (location == CUSTOM ? customLocation : location)); - builder.info("Drop Naturally", "&a" + dropNaturally); - builder.info("Item Merging", "&a" + itemMerging); - builder.info("Prioritize Player", "&a" + prioritizePlayer); - builder.info("Fallback to Inventory", "&a" + fallbackToInventory); - builder.info("Show Name", "&a" + showName); - builder.info("Pickup Delay", "&a" + pickupDelay); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DROPPER); - builder.name("&aDrop Item"); - builder.description("Drop an item at a specified location"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.DROP_ITEM, + "Drop Item", + "Drops an item at a specified location.", + Material.DROPPER, + List.of("dropItem") + ); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = List.of( - new ActionEditor.ActionItem("item", ItemBuilder.create((item == null ? Material.BOOK : item.getType())) - .name("&aItem") - .description("Select a item to drop") - .info("&7Current Value", "") - .info(null, (item == null ? "&cNone" : "&6" + StackUtils.getDisplayName(item))), - ActionEditor.ActionItem.ActionType.ITEM - ), - new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + (location == CUSTOM ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, backMenu, - (coords, location) -> { - if (location == CUSTOM) { - customLocation = coords; - } else { - customLocation = null; - } - this.location = location; - if (location == PLAYER_LOCATION) { - customLocation = player.getLocation().getX() + "," + player.getLocation().getY() + "," + player.getLocation().getZ(); - } - backMenu.open(); - } - ) - ), - new ActionEditor.ActionItem("dropNaturally", - ItemBuilder.create((this.dropNaturally ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aDrop Naturally") - .description("When enabled, the item will be dropped naturally in the world, having some slight randomness to its location") - .info("&7Current Value", "") - .info(null, dropNaturally ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("itemMerging", - ItemBuilder.create((this.itemMerging ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aDisable Item Merging") - .description("When enabled, the item will not merge with other items on the ground immediately.") - .info("&7Current Value", "") - .info(null, itemMerging ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("prioritizePlayer", - ItemBuilder.create((this.prioritizePlayer ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aDrop Naturally") - .description("When enabled, the player the action is executed on will be prioritized for picking up the item") - .info("&7Current Value", "") - .info(null, prioritizePlayer ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("fallbackToInventory", - ItemBuilder.create((this.fallbackToInventory ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aFallback to Inventory") - .description("When enabled, items will be put into the player's inventory if they cannot be dropped in the world") - .info("&7Current Value", "") - .info(null, fallbackToInventory ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("showName", - ItemBuilder.create((this.showName ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aShow Name") - .description("When enabled, the item will display its name above it") - .info("&7Current Value", "") - .info(null, showName ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN + getProperties().addAll(List.of( + new ItemStackProperty( + "item", + "Item", + "The item to drop" ), - new ActionEditor.ActionItem("pickupDelay", - ItemBuilder.create(Material.CLOCK) - .name("&aPickup Delay") - .description("The amount of time in ticks before the item can be picked up") - .info("&7Current Value", "") - .info(null, "&a" + pickupDelay) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT - ) - - ); - return new ActionEditor(4, "&eDrop Item Action Settings", items); + new LocationProperty( + "location", + "Location", + "The location to drop the item at" + ).setValue("INVOKERS_LOCATION"), + new BooleanProperty( + "drop_naturally", + "Drop Naturally", + "When enabled, the item will be dropped naturally in the world, having some slight randomness to its location" + ).setValue(true), + new BooleanProperty( + "item_merging", + "Item Merging", + "When enabled, the item will not merge with other items on the ground immediately" + ).setValue(true), + new BooleanProperty( + "prioritize_player", + "Prioritize Player", + "When enabled, the player the action is executed on will be prioritized for picking up the item" + ).setValue(false), + new BooleanProperty( + "fallback_to_inventory", + "Fallback to Inventory", + "When enabled, items will be put into the player's inventory if they cannot be dropped in the world" + ).setValue(false), + new BooleanProperty( + "display_name", + "Display Name", + "When enabled, the item will display its name above it" + ).setValue(false), + new IntegerProperty( + "pickup_delay", + "Pickup Delay", + "The delay in ticks before the item can be picked up by players" + ).setValue(20) + )); } @Override public OutputType execute(Player player, HousingWorld house) { - if (item == null || location == null) return OutputType.ERROR; + ItemStack stack = getValue("item", ItemStack.class); - Location loc = null; - switch (location) { - case INVOKERS_LOCATION -> - loc = player.getLocation(); - case HOUSE_SPAWN -> - loc = house.getSpawn(); - case CUSTOM, PLAYER_LOCATION -> { - loc = getLocationFromString(player, house, customLocation); - if (loc == null) { - return OutputType.ERROR; - } + if (stack == null) return OutputType.ERROR; - if (loc.getX() > 255) { - loc.setX(255); - } - if (loc.getZ() > 255) { - loc.setY(255); - } - if (loc.getY() > 255) { - loc.setY(255); - } - } - } + Location loc = getProperty("location", LocationProperty.class).getLocation(player, house, player.getLocation(), player.getEyeLocation()); AtomicBoolean executed = new AtomicBoolean(false); AtomicInteger dropppedItems = new AtomicInteger(); List entities = house.getWorld().getEntities(); + boolean itemMerging = getValue("item_merging", Boolean.class); entities.stream().filter(entity -> entity instanceof Item).forEach(entity -> { dropppedItems.getAndIncrement(); + Item item = (Item) entity; + if (item.getItemStack().isSimilar(stack) && itemMerging && !executed.get()) { + ItemStack newItemStack = stack.clone(); + newItemStack.setAmount(item.getItemStack().getAmount() + stack.getAmount()); + item.setItemStack(newItemStack); + executed.set(true); + } }); if (executed.get()) { return OutputType.ERROR; } - if (dropppedItems.get() > Main.getInstance().getConfig().getInt("droppedItemLimit", 200)) { - if (fallbackToInventory && player.getInventory().firstEmpty() != -1) { - player.getInventory().addItem(item); + if (dropppedItems.get() > 200) { + if (player.getInventory().firstEmpty() != -1) { + player.getInventory().addItem(stack); } return OutputType.ERROR; } - ItemStack item = this.item.clone(); - if (itemMerging) { - NbtItemBuilder nbt = new NbtItemBuilder(item); - nbt.setString("droppedItem", UUID.randomUUID().toString()); - nbt.build(); - } - Item itemEntity = null; + boolean dropNaturally = getValue("drop_naturally", Boolean.class); if (dropNaturally) - itemEntity = house.getWorld().dropItemNaturally(loc, item); + itemEntity = house.getWorld().dropItemNaturally(loc, stack); else - itemEntity = house.getWorld().dropItem(loc, item); + itemEntity = house.getWorld().dropItem(loc, stack); + int pickupDelay = getValue("pickup_delay", Integer.class); + boolean showName = getValue("display_name", Boolean.class); itemEntity.setPickupDelay(pickupDelay); itemEntity.setCustomNameVisible(showName); return OutputType.SUCCESS; } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("item", Serialization.itemStackToBase64(item)); - data.put("customLocation", customLocation); - data.put("location", location.name()); - data.put("dropNaturally", dropNaturally); - data.put("itemMerging", itemMerging); - data.put("prioritizePlayer", prioritizePlayer); - data.put("fallbackToInventory", fallbackToInventory); - data.put("showName", showName); - data.put("pickupDelay", pickupDelay); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (IOException e) { - e.printStackTrace(); - Main.getInstance().getLogger().warning("Failed to load item from base64 string"); - } - customLocation = (String) data.get("customLocation"); - try { - location = Locations.valueOf((String) data.get("location")); - } catch (IllegalArgumentException e) { - location = Locations.INVOKERS_LOCATION; - } - dropNaturally = (boolean) data.get("dropNaturally"); - itemMerging = (boolean) data.get("itemMerging"); - prioritizePlayer = (boolean) data.get("prioritizePlayer"); - fallbackToInventory = (boolean) data.get("fallbackToInventory"); - showName = (boolean) data.get("showName"); - - // ender dont look at this!! - Object o = data.get("pickupDelay"); - if (o instanceof Double) { - pickupDelay = ((Double) o).intValue(); - } else { - pickupDelay = (int) data.get("pickupDelay"); - } - } - @Override public boolean requiresPlayer() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditAudibilityAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditAudibilityAction.java index cb777a18..10e4d701 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditAudibilityAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditAudibilityAction.java @@ -1,119 +1,62 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.ConditionsProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Condition.Condition; -import com.al3x.housing2.Condition.ConditionEnum; -import com.al3x.housing2.Enums.AttackEntityEnum; import com.al3x.housing2.Enums.EditVisibilityEnum; import com.al3x.housing2.Events.CancellableEvent; -import com.al3x.housing2.Data.ActionData; -import com.al3x.housing2.Data.ConditionalData; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.*; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; +import com.al3x.housing2.Utils.VoiceChat; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import java.util.*; +@ToString public class EditAudibilityAction extends HTSLImpl { - private EditVisibilityEnum mode; - private String range; - private List conditions; - private String limit; - private boolean value; - private static Gson gson = new Gson(); - - public EditAudibilityAction() { - super("Edit Audibility Action"); - mode = EditVisibilityEnum.NEAREST; - range = "10"; - conditions = new ArrayList<>(); - limit = "1"; - value = false; - } - - @Override - public String toString() { - return "EditAudibilityAction (mode: " + mode + ", range: " + range + ", value: " + value + ", limit: " + limit + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.SCULK_SENSOR); - builder.name("&eEdit Audibility"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Range", range); - builder.info("Limit", limit); - builder.info("Value", String.valueOf(value)); - builder.info("Conditions", conditions.size()); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.SCULK_SENSOR); - builder.name("&eEdit Audibility"); - builder.description("Change the Audibility of players."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eEdit Audibility Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.IRON_SWORD) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, EditVisibilityEnum.values(), null)); - items.add(new ActionEditor.ActionItem("range", - ItemBuilder.create(Material.SNOWBALL) - .name("&eRange") - .info("&7Current Value", "") - .info(null, "&a" + range) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create((value ? Material.LIME_DYE : Material.GRAY_DYE)) - .name("&eMake player audible") - .info("&7Current Value", "") - .info(null, "&a" + value) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN)); - items.add(new ActionEditor.ActionItem("limit", - ItemBuilder.create(Material.COMMAND_BLOCK) - .name("&eLimit") - .info("&7Current Value", "") - .info(null, "&a" + limit) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - if (mode == EditVisibilityEnum.CONDITION) { - items.add(new ActionEditor.ActionItem("conditions", - ItemBuilder.create(Material.REDSTONE) - .name("&eConditions") - .info("&7Current Value", "") - .info(null, (conditions.isEmpty() ? "&cNo Conditions" : "&a" + conditions.size() + " Conditions")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.CONDITION)); - } - return new ActionEditor(6, "&eEdit Audibility Settings", items); + super( + ActionEnum.EDIT_AUDIBILITY, + "Edit Audibility", + "Edit the audibility of players.", + Material.SCULK_SENSOR, + List.of("audibility") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + EditVisibilityEnum.class + ).setValue(EditVisibilityEnum.NEAREST), + new NumberProperty( + "range", + "Range", + "The range to use." + ).setValue("10"), + new BooleanProperty( + "value", + "Value", + "If the player can be heard or not." + ).setValue(false), + new NumberProperty( + "limit", + "Limit", + "The amount of players to be edited." + ).setValue("1"), + new ConditionsProperty( + "conditions", + "Conditions", + "The conditions to use." + ).setValue(new ArrayList<>()).showIf(() -> getValue("mode", EditVisibilityEnum.class) == EditVisibilityEnum.CONDITION) + )); } @Override @@ -123,16 +66,13 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - String range = HandlePlaceholders.parsePlaceholders(player, house, this.range); - String limit = HandlePlaceholders.parsePlaceholders(player, house, this.limit); - if (!NumberUtilsKt.isDouble(limit) || !NumberUtilsKt.isDouble(range)) { - return OutputType.ERROR; - } - double rangeValue = Double.parseDouble(range); - double limitValue = Double.parseDouble(limit); + Double range = getProperty("range", NumberProperty.class).parsedValue(house, player); + Double limit = getProperty("limit", NumberProperty.class).parsedValue(house, player); List players = new ArrayList<>(player.getWorld().getPlayers()); Main main = house.getPlugin(); - switch (mode) { + List conditions = getProperty("conditions", ConditionsProperty.class).getValue(); + boolean value = getValue("value", Boolean.class); + switch (getValue("mode", EditVisibilityEnum.class)) { case NEAREST: players.sort(Comparator.comparing((Entity entity) -> entity.getLocation().distance(player.getLocation()))); break; @@ -141,10 +81,10 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev case CONDITION: int count = 0; for (Player onlinePlayer : players) { - if (conditions.stream().allMatch(condition -> condition.execute(onlinePlayer, house, null, executor))) { + if (conditions.stream().allMatch(condition -> condition.execute(onlinePlayer, house, null, executor) == OutputType.TRUE)) { VoiceChat.editAudibility(player, onlinePlayer, value); count++; - if (count > limitValue) return OutputType.SUCCESS; + if (count > limit) return OutputType.SUCCESS; } } return OutputType.SUCCESS; @@ -152,130 +92,85 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev int count = 0; for (Player onlinePlayer : players) { - if (onlinePlayer.getLocation().distance(player.getLocation()) > rangeValue) continue; + if (onlinePlayer.getLocation().distance(player.getLocation()) > range) continue; VoiceChat.editAudibility(player, onlinePlayer, value); count++; - if (count > limitValue) return OutputType.SUCCESS; + if (count > limit) return OutputType.SUCCESS; } return OutputType.SUCCESS; } - public EditVisibilityEnum getMode() { - return mode; - } - - public void setMode(EditVisibilityEnum mode) { - this.mode = mode; - } - - public boolean getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("range", range); - data.put("value", value); - data.put("limit", limit); - data.put("conditions", ConditionalData.fromList(conditions)); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public void fromData(HashMap data, Class actionClass) { - mode = EditVisibilityEnum.valueOf((String) data.get("mode")); - range = (String) data.get("range"); - limit = (String) data.get("limit"); - value = (boolean) data.get("value"); - if (!data.containsKey("conditions")) return; - Object subActions = data.get("conditions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList conditionalData = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ConditionalData condition = gson.fromJson(jsonObject, ConditionalData.class); - conditionalData.add(condition); - } - conditions = ConditionalData.toList(conditionalData); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Condition condition : conditions) { - if (condition instanceof CHTSLImpl c) { - builder.append(c.export()).append(", "); - } - } - String conditionString = builder.toString(); - if (!conditionString.isEmpty()) { - conditionString = conditionString.substring(0, conditionString.length() - 2); - } - return " ".repeat(indent) + keyword() + " " + mode + " " + range + " " + value + " " + limit + "(" + conditionString + ")"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - LinkedHashMap actionData = data(); - - if (AttackEntityEnum.fromString(parts[0]) != null) { - actionData.put("mode", AttackEntityEnum.fromString(parts[0])); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("range", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("value", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("limit", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - - List conditions = new ArrayList<>(); - String conditionString = String.join(" ", parts); - - if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { - throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception - } - conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); - String[] conditionParts = conditionString.split(","); - - List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); - - for (String conditionPart : conditionParts) { - for (CHTSLImpl condition : defaultConditions) { - if (conditionPart.startsWith(condition.keyword())) { - CHTSLImpl c = (CHTSLImpl) condition.clone(); - c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); - conditions.add(c); - break; - } - } - } - - actionData.put("conditions", ConditionalData.fromList(conditions)); - - this.conditions = conditions; - return nextLines; - } - - @Override - public String keyword() { - return "editAudibility"; - } +// +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Condition condition : conditions) { +// if (condition instanceof CHTSLImpl c) { +// builder.append(c.export()).append(", "); +// } +// } +// String conditionString = builder.toString(); +// if (!conditionString.isEmpty()) { +// conditionString = conditionString.substring(0, conditionString.length() - 2); +// } +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " " + mode + " " + range + " " + value + " " + limit + "(" + conditionString + ")"; +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// LinkedHashMap actionData = data(); +// +// if (AttackEntityEnum.fromString(parts[0]) != null) { +// actionData.put("mode", AttackEntityEnum.fromString(parts[0])); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("range", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("value", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("limit", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// +// List conditions = new ArrayList<>(); +// String conditionString = String.join(" ", parts); +// +// if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { +// throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception +// } +// conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); +// String[] conditionParts = conditionString.split(","); +// +// List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); +// +// for (String conditionPart : conditionParts) { +// for (CHTSLImpl condition : defaultConditions) { +// if (conditionPart.startsWith(condition.keyword())) { +// CHTSLImpl c = (CHTSLImpl) condition.clone(); +// c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); +// conditions.add(c); +// break; +// } +// } +// } +// +// actionData.put("conditions", ConditionalData.fromList(conditions)); +// +// this.conditions = conditions; +// return nextLines; +// } } \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVisibilityAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVisibilityAction.java index b9729766..c8f023cf 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVisibilityAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVisibilityAction.java @@ -1,121 +1,77 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.ConditionsProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Data.ConditionalData; import com.al3x.housing2.Enums.AttackEntityEnum; import com.al3x.housing2.Enums.EditVisibilityEnum; import com.al3x.housing2.Events.CancellableEvent; -import com.al3x.housing2.Data.ConditionalData; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; import com.al3x.housing2.Utils.StringUtilsKt; +import com.al3x.housing2.Utils.VoiceChat; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import java.util.*; +@ToString public class EditVisibilityAction extends HTSLImpl { - private EditVisibilityEnum mode; - private String range; - private List conditions; - private String limit; - private boolean value; - private static Gson gson = new Gson(); - + private static final Gson gson = new Gson(); public EditVisibilityAction() { - super("Edit Visibility Action"); - mode = EditVisibilityEnum.NEAREST; - range = "10"; - conditions = new ArrayList<>(); - limit = "1"; - value = false; - } - - @Override - public String toString() { - return "EditVisibilityAction (mode: " + mode + ", range: " + range + ", value: " + value + ", limit: " + limit + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_EYE); - builder.name("&eEdit Visibility"); - builder.info("&eSettings", ""); - builder.info("Mode", mode.name()); - builder.info("Range", range); - builder.info("Limit", limit); - builder.info("Value", String.valueOf(value)); - builder.info("Conditions", conditions.size()); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_EYE); - builder.name("&eEdit Visibility"); - builder.description("Change the visibility of players."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eEdit Visibility Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.IRON_SWORD) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, EditVisibilityEnum.values(), null)); - items.add(new ActionEditor.ActionItem("range", - ItemBuilder.create(Material.SNOWBALL) - .name("&eRange") - .info("&7Current Value", "") - .info(null, "&a" + range) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - items.add(new ActionEditor.ActionItem("value", - ItemBuilder.create((value ? Material.LIME_DYE : Material.GRAY_DYE)) - .name("&eShow player") - .info("&7Current Value", "") - .info(null, "&a" + value) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN)); - items.add(new ActionEditor.ActionItem("limit", - ItemBuilder.create(Material.COMMAND_BLOCK) - .name("&eLimit") - .info("&7Current Value", "") - .info(null, "&a" + limit) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - if (mode == EditVisibilityEnum.CONDITION) { - items.add(new ActionEditor.ActionItem("conditions", - ItemBuilder.create(Material.REDSTONE) - .name("&eConditions") - .info("&7Current Value", "") - .info(null, (conditions.isEmpty() ? "&cNo Conditions" : "&a" + conditions.size() + " Conditions")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.CONDITION)); - } - return new ActionEditor(6, "&eEdit Visibility Settings", items); + super( + ActionEnum.EDIT_VISIBILITY, + "Edit Visibility", + "Edit the visibility of players.", + Material.ENDER_EYE, + List.of("visibility") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + EditVisibilityEnum.class + ).setValue(EditVisibilityEnum.NEAREST), + new NumberProperty( + "range", + "Range", + "The range to use." + ).setValue("10"), + new BooleanProperty( + "value", + "Value", + "Whether the player is visible or not." + ).setValue(false), + new NumberProperty( + "limit", + "Limit", + "How many players should it select?" + ).setValue("1"), + new ConditionsProperty( + "conditions", + "Conditions", + "The conditions to use." + ).setValue(new ArrayList<>()).showIf(() -> getValue("mode", EditVisibilityEnum.class) == EditVisibilityEnum.CONDITION) + )); } @Override @@ -125,16 +81,13 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - String range = HandlePlaceholders.parsePlaceholders(player, house, this.range); - String limit = HandlePlaceholders.parsePlaceholders(player, house, this.limit); - if (!NumberUtilsKt.isDouble(limit) || !NumberUtilsKt.isDouble(range)) { - return OutputType.ERROR; - } - double rangeValue = Double.parseDouble(range); - double limitValue = Double.parseDouble(limit); + Double range = getProperty("range", NumberProperty.class).parsedValue(house, player); + Double limit = getProperty("limit", NumberProperty.class).parsedValue(house, player); List players = new ArrayList<>(player.getWorld().getPlayers()); Main main = house.getPlugin(); - switch (mode) { + List conditions = getProperty("conditions", ConditionsProperty.class).getValue(); + boolean value = getValue("value", Boolean.class); + switch (getValue("mode", EditVisibilityEnum.class)) { case NEAREST: players.sort(Comparator.comparing((Entity entity) -> entity.getLocation().distance(player.getLocation()))); break; @@ -143,11 +96,11 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev case CONDITION: int count = 0; for (Player onlinePlayer : players) { - if (conditions.stream().allMatch(condition -> condition.execute(onlinePlayer, house, null, executor))) { + if (conditions.stream().allMatch(condition -> condition.execute(onlinePlayer, house, null, executor) == OutputType.TRUE)) { if (!value) player.hidePlayer(main, onlinePlayer); else player.showPlayer(main, onlinePlayer); count++; - if (count > limitValue) return OutputType.ERROR; + if (count > limit) return OutputType.ERROR; } } return OutputType.SUCCESS; @@ -155,131 +108,85 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev int count = 0; for (Player onlinePlayer : players) { - if (onlinePlayer.getLocation().distance(player.getLocation()) > rangeValue) continue; + if (onlinePlayer.getLocation().distance(player.getLocation()) > range) continue; if (!value) player.hidePlayer(main, onlinePlayer); else player.showPlayer(main, onlinePlayer); count++; - if (count > limitValue) return OutputType.SUCCESS; + if (count > limit) return OutputType.SUCCESS; } return OutputType.SUCCESS; } - - public EditVisibilityEnum getMode() { - return mode; - } - - public void setMode(EditVisibilityEnum mode) { - this.mode = mode; - } - - public boolean getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("mode", mode.name()); - data.put("range", range); - data.put("value", value); - data.put("limit", limit); - data.put("conditions", ConditionalData.fromList(conditions)); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public void fromData(HashMap data, Class actionClass) { - mode = EditVisibilityEnum.valueOf((String) data.get("mode")); - range = (String) data.get("range"); - limit = (String) data.get("limit"); - value = (boolean) data.get("value"); - if (!data.containsKey("conditions")) return; - Object subActions = data.get("conditions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList conditionalData = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ConditionalData condition = gson.fromJson(jsonObject, ConditionalData.class); - conditionalData.add(condition); - } - conditions = ConditionalData.toList(conditionalData); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Condition condition : conditions) { - if (condition instanceof CHTSLImpl c) { - builder.append(c.export()).append(", "); - } - } - String conditionString = builder.toString(); - if (!conditionString.isEmpty()) { - conditionString = conditionString.substring(0, conditionString.length() - 2); - } - return " ".repeat(indent) + keyword() + " " + mode + " " + range + " " + value + " " + limit + "(" + conditionString + ")"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - LinkedHashMap actionData = data(); - - if (AttackEntityEnum.fromString(parts[0]) != null) { - actionData.put("mode", AttackEntityEnum.fromString(parts[0])); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("range", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("value", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - if (parts.length > 0) { - actionData.put("limit", parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - } - - List conditions = new ArrayList<>(); - String conditionString = String.join(" ", parts); - - if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { - throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception - } - conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); - String[] conditionParts = conditionString.split(","); - - List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); - - for (String conditionPart : conditionParts) { - for (CHTSLImpl condition : defaultConditions) { - if (conditionPart.startsWith(condition.keyword())) { - CHTSLImpl c = (CHTSLImpl) condition.clone(); - c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); - conditions.add(c); - break; - } - } - } - - actionData.put("conditions", ConditionalData.fromList(conditions)); - - this.conditions = conditions; - return nextLines; - } - - @Override - public String keyword() { - return "editVisibility"; - } +// +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Condition condition : conditions) { +// if (condition instanceof CHTSLImpl c) { +// builder.append(c.export()).append(", "); +// } +// } +// String conditionString = builder.toString(); +// if (!conditionString.isEmpty()) { +// conditionString = conditionString.substring(0, conditionString.length() - 2); +// } +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " " + mode + " " + range + " " + value + " " + limit + "(" + conditionString + ")"; +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// LinkedHashMap actionData = data(); +// +// if (AttackEntityEnum.fromString(parts[0]) != null) { +// actionData.put("mode", AttackEntityEnum.fromString(parts[0])); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("range", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("value", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// if (parts.length > 0) { +// actionData.put("limit", parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// } +// +// List conditions = new ArrayList<>(); +// String conditionString = String.join(" ", parts); +// +// if (!(conditionString.trim().startsWith("(") && conditionString.trim().contains(")") && conditionString.trim().endsWith("{"))) { +// throw new IllegalArgumentException("Invalid conditional action"); //TODO: change this to a proper exception +// } +// conditionString = conditionString.trim().substring(1, conditionString.trim().length() - 1).replace(")", "").trim(); +// String[] conditionParts = conditionString.split(","); +// +// List defaultConditions = List.of(Arrays.stream(ConditionEnum.values()).map(ConditionEnum::getConditionInstance).filter(a -> a instanceof CHTSLImpl).map(a -> (CHTSLImpl) a).toArray(CHTSLImpl[]::new)); +// +// for (String conditionPart : conditionParts) { +// for (CHTSLImpl condition : defaultConditions) { +// if (conditionPart.startsWith(condition.keyword())) { +// CHTSLImpl c = (CHTSLImpl) condition.clone(); +// c.importCondition(StringUtilsKt.substringAfter(conditionPart, c.keyword() + " "), nextLines); +// conditions.add(c); +// break; +// } +// } +// } +// +// actionData.put("conditions", ConditionalData.fromList(conditions)); +// +// this.conditions = conditions; +// return nextLines; +// } } \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVoiceGroupAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVoiceGroupAction.java index 9e965d6a..64894e82 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVoiceGroupAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/EditVoiceGroupAction.java @@ -1,132 +1,67 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Enums.StatOperation; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.VoiceGroupTypes; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.*; +import com.al3x.housing2.Utils.HandlePlaceholders; +import com.al3x.housing2.Utils.VoiceChat; import de.maxhenkel.voicechat.api.Group; -import net.citizensnpcs.api.npc.NPC; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; +@Getter +@ToString public class EditVoiceGroupAction extends HTSLImpl { - private VoiceGroupTypes type; - private String groupName; - public EditVoiceGroupAction() { - super("Edit Voice Group Action"); - type = VoiceGroupTypes.NORMAL; - groupName = "Cool group"; - } - - @Override - public String toString() { - return "EditVoiceGroupAction (type: " + type + ", " + groupName + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_WAIT); - builder.name("&eEdit Voice Group"); - builder.info("&eSettings", ""); - builder.info("Type", type.name()); - builder.info("Group Name", groupName); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_WAIT); - builder.name("&eEdit Voice Group"); - builder.description("Change a voice group's type."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eEdit Voice Group Action Settings", new ArrayList<>()); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("type", - ItemBuilder.create(Material.NOTE_BLOCK) - .name("&eType") - .info("&7Current Value", "") - .info(null, "&a" + type.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, VoiceGroupTypes.values(), null)); - items.add(new ActionEditor.ActionItem("groupName", - ItemBuilder.create(Material.PAPER) - .name("&eGroup Name") - .info("&7Current Value", "") - .info(null, "&a" + groupName) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.EDIT_VOICE_GROUP, + "Edit Voice Group", + "Edits a voice group's type.", + Material.MUSIC_DISC_WAIT, + List.of("editVoiceGroup") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "type", + "Type", + "The type of the voice group.", + VoiceGroupTypes.class + ).setValue(VoiceGroupTypes.NORMAL), + new StringProperty( + "groupName", + "Group Name", + "The name of the voice group." + ) )); - return new ActionEditor(6, "&eEdit Voice Group Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String groupName = HandlePlaceholders.parsePlaceholders(player, house, this.groupName); + String groupName = getProperty("groupName", StringProperty.class).parsedValue(house, player); Group group = VoiceChat.getGroup(house.getWorld(), groupName); - switch (type) { + if (group == null) return OutputType.ERROR; + + switch (getValue("type", VoiceGroupTypes.class)) { case VoiceGroupTypes.ISOLATED -> VoiceChat.setGroupType(group, Group.Type.ISOLATED); case VoiceGroupTypes.NORMAL -> VoiceChat.setGroupType(group, Group.Type.NORMAL); case VoiceGroupTypes.OPEN -> VoiceChat.setGroupType(group, Group.Type.OPEN); } - return OutputType.SUCCESS; - } - - - - public VoiceGroupTypes getType() { - return type; - } - - public void setType(VoiceGroupTypes type) { - this.type = type; - } - - public String getGroupName() { - return groupName; - } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("type", type.name()); - data.put("groupName", groupName); - return data; + return OutputType.SUCCESS; } @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - type = VoiceGroupTypes.valueOf((String) data.get("type")); - groupName = (String) data.get("groupName"); - } - - @Override - public String keyword() { - return "editVoiceGroup"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ExitAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ExitAction.java index 05b4e992..f89bfed0 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ExitAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ExitAction.java @@ -1,46 +1,27 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.*; -import com.al3x.housing2.Enums.EventType; -import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Action.ActionEnum; +import com.al3x.housing2.Action.HTSLImpl; +import com.al3x.housing2.Action.NPCAction; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; -import net.citizensnpcs.api.npc.NPC; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Enums.EventType.*; - +@ToString public class ExitAction extends HTSLImpl implements NPCAction { public ExitAction() { - super("Exit Action"); - } - - @Override - public String toString() { - return "ExitAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.BEDROCK); - builder.name("&eExit"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.BEDROCK); - builder.name("&aExit"); - builder.description("Stops executing any remaining actions."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.EXIT, + "Exit", + "Stops executing any remaining actions.", + Material.BEDROCK, + List.of("exit", "stop", "return") + ); } @Override @@ -48,11 +29,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.EXIT; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public int limit() { return 1; @@ -63,13 +39,4 @@ public boolean requiresPlayer() { return false; } - @Override - public String keyword() { - return "exit"; - } - - @Override - public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - //Do nothing - } -} +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ExplosionAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ExplosionAction.java index fd2e3d33..d7b467ef 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ExplosionAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ExplosionAction.java @@ -1,104 +1,53 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.LocationProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Enums.Locations; -import com.al3x.housing2.Enums.PushDirection; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.Duple; -import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import java.util.*; +import java.util.function.BiFunction; -import static com.al3x.housing2.Enums.Locations.CUSTOM; -import static com.al3x.housing2.Enums.Locations.PLAYER_LOCATION; +import static com.al3x.housing2.Enums.Locations.*; import static com.al3x.housing2.Utils.Color.colorize; public class ExplosionAction extends HTSLImpl { - private String customLocation; - private Locations location; - private double power; //Ints are not storeable anywhere - public static HashMap amountDone = new HashMap<>(); public ExplosionAction() { - super("Explosion Action"); - this.customLocation = null; - this.location = Locations.INVOKERS_LOCATION; - this.power = 4; - } - - @Override - public String toString() { - return "Explosion Action (Location: " + (location == CUSTOM ? customLocation : location) + ", Power: " + power + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.TNT_MINECART); - builder.name("&eExplosion"); - builder.info("&eSettings", ""); - builder.info("Location", "&a" + (location == CUSTOM ? customLocation : location)); - builder.info("Power", "&a" + power); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.TNT_MINECART); - builder.name("&aExplosion"); - builder.description("Create an explosion at a set location."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = Arrays.asList( - new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + (location == CUSTOM ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, backMenu, - (coords, location) -> { - customLocation = coords; - this.location = location; - if (location == PLAYER_LOCATION) { - Location loc = player.getLocation(); - this.customLocation = loc.getX() + " " + loc.getY() + " " + loc.getZ(); - } - backMenu.open(); - } - ) - ), - new ActionEditor.ActionItem("power", - ItemBuilder.create(Material.BOOK) - .name("&aPower") - .info("&7Current Value", "") - .info(null, power) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT, 0, 20 - ) + super( + ActionEnum.EXPLOSION, + "Explosion", + "Creates an explosion at a set location.", + Material.TNT_MINECART, + List.of("explosion") ); - return new ActionEditor(4, "&eExplosion Action Settings", items); + getProperties().addAll(List.of( + new LocationProperty( + "location", + "Location", + "The location to create the explosion at." + ).setValue("INVOKERS_LOCATION"), + new NumberProperty( + "power", + "Power", + "The power of the explosion.", + 0, 20 + ).setValue("4") + )); } - @Override public OutputType execute(Player player, HousingWorld house) { - World world = house.getWorld(); + Double power = getProperty("power", NumberProperty.class).parsedValue(house, player); if (player != null) { if (amountDone.containsKey(player.getUniqueId())) { @@ -126,31 +75,11 @@ public OutputType execute(Player player, HousingWorld house) { } } - if (power < 0) { - power = 0; - } - - if (power > 20) { - power = 20; - } - - switch (location) { - case INVOKERS_LOCATION -> { - if (player == null) return OutputType.ERROR; - world.createExplosion(player.getLocation(), (float) power, false, false); - } - case HOUSE_SPAWN -> { - if (house.getSpawn() == null) return OutputType.ERROR; - world.createExplosion(house.getSpawn(), (float) power, false, false); - } - case CUSTOM, PLAYER_LOCATION -> { - if (customLocation == null) return OutputType.ERROR; - Location loc = getLocationFromString(player, house, customLocation); - if (loc != null) { - world.createExplosion(loc, (float) power, false, false); - } - } + Location loc = getProperty("location", LocationProperty.class).getLocation(player, house, player.getLocation(), player.getEyeLocation()); + if (loc == null) { + return OutputType.ERROR; } + player.getWorld().createExplosion(loc, power.floatValue(), false, false); return OutputType.ERROR; } @@ -159,65 +88,8 @@ public int limit() { return 1; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("location", location.name()); - data.put("customLocation", customLocation); - data.put("power", power); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - customLocation = (String) data.get("customLocation"); - location = Locations.valueOf((String) data.get("location")); - power = (double) data.get("power"); - } - - @Override - public String export(int indent) { - String loc = (location == CUSTOM || location == PLAYER_LOCATION) ? customLocation : location.name(); - return " ".repeat(indent) + keyword() + " " + loc + " " + power; - } - - @Override - public String syntax() { - return keyword() + " "; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] args = action.split(" "); - if (args.length < 2) return nextLines; - - Duple locationArg = handleArg(args, 0); - if (Locations.fromString(locationArg.getSecond()) == null) { - location = CUSTOM; - customLocation = locationArg.getSecond(); - } else { - location = Locations.fromString(locationArg.getSecond()); - } - args = locationArg.getFirst(); - - if (args.length == 0) return nextLines; - - try { - power = Double.parseDouble(args[0]); - } catch (NumberFormatException e) { - return nextLines; - } - - return nextLines; - } - - @Override - public String keyword() { - return "explosion"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/FullHealAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/FullHealAction.java index eb84bc07..419f12ee 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/FullHealAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/FullHealAction.java @@ -3,45 +3,25 @@ import com.al3x.housing2.Action.*; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import java.util.Arrays; -import java.util.LinkedHashMap; - -import static com.al3x.housing2.Utils.Color.colorize; +import java.util.List; +@ToString public class FullHealAction extends HTSLImpl implements NPCAction { public FullHealAction() { - super("Full Heal Action"); - } - - @Override - public String toString() { - return "FullHealAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GOLDEN_APPLE); - builder.name("&eFull Heal"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GOLDEN_APPLE); - builder.name("&aFull Heal"); - builder.description("Fully heals the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.FULL_HEAL, + "Full Heal", + "Fully heals the player.", + Material.GOLDEN_APPLE, + List.of("fullHeal") + ); } @Override @@ -56,18 +36,8 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv le.setHealth(le.getMaxHealth()); } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "fullHeal"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/FunctionAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/FunctionAction.java index ee677cb7..37e7e917 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/FunctionAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/FunctionAction.java @@ -1,138 +1,90 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ArgumentsProperty; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.CustomSlotProperty; +import com.al3x.housing2.Action.Properties.GenericPagination.FunctionProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Function; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.ItemBuilder; -import com.google.gson.internal.LinkedTreeMap; -import org.bukkit.Bukkit; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import java.util.*; -import static com.al3x.housing2.Action.ActionEditor.ActionItem.ActionType.CUSTOM; import static com.al3x.housing2.Utils.Color.colorize; +@ToString public class FunctionAction extends HTSLImpl { - String function; - boolean await; - boolean runForAllPlayers; - - LinkedHashMap arguments = new LinkedHashMap<>(); public FunctionAction() { - super("Function Action"); - } - - public FunctionAction(String function, boolean runForAllPlayers) { - super("Function Action"); - this.function = function; - this.runForAllPlayers = runForAllPlayers; - } - - @Override - public String toString() { - return "FunctionAction (function: " + (function == null ? "&cNone" : "&6" + function) + ", runForAllPlayers: " + runForAllPlayers + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ACTIVATOR_RAIL); - builder.name("&eTrigger Function"); - builder.info("&eSettings", ""); - builder.info("Function", (function == null ? "&cNone" : "&6" + function)); - builder.info("Run for all players", runForAllPlayers ? "&aYes" : "&cNo"); - builder.info("Await", await ? "&aYes" : "&cNo"); - builder.info("Arguments", "&e" + arguments.size()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ACTIVATOR_RAIL); - builder.name("&aTrigger Function"); - builder.description("Executes a given function"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = new ArrayList<>(List.of( - new ActionEditor.ActionItem("function", ItemBuilder.create(Material.ACTIVATOR_RAIL) - .name("&aFunction") - .description("Select a function to run") - .info("&7Current Value", "") - .info(null, (function == null ? "&cNone" : "&6" + function)), - ActionEditor.ActionItem.ActionType.FUNCTION + super( + ActionEnum.FUNCTION, + "Function Action", + "Executes a function.", + Material.ACTIVATOR_RAIL, + List.of("function") + ); + + getProperties().addAll(List.of( + new FunctionProperty( + "function", + "Function", + "The function to execute." ), - new ActionEditor.ActionItem("runForAllPlayers", ItemBuilder.create((runForAllPlayers ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aRun for all players") - .description("Run the function for all players in the world") - .info("&7Current Value", "") - .info(null, runForAllPlayers ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("await", ItemBuilder.create((await ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aAwait") - .description("Wait for the function to finish before continuing") - .info("&7Current Value", "") - .info(null, await ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - )); - - ArrayList argKeys = new ArrayList<>(arguments.keySet()); - for (String argKey : argKeys) { - String argument = arguments.get(argKey); - items.add(new ActionEditor.ActionItem("null", - ItemBuilder.create(Material.PAPER) - .name("&aArgument: &6" + argKey) - .description("Edit the argument") - .info("&7Current Value", "") - .info(null, "&6" + argument) - .lClick(ItemBuilder.ActionType.EDIT_YELLOW) - .rClick(ItemBuilder.ActionType.REMOVE_YELLOW), - (event, obj) -> { - if (event.isLeftClick()) { - - backMenu.getOwner().sendMessage(colorize("&eEnter the new argument value.")); - backMenu.openChat(Main.getInstance(), (message) -> { - arguments.put(argKey, message); - backMenu.open(); - }); - return true; - } else if (event.isRightClick()) { - arguments.remove(argKey); - backMenu.open(); - return true; + new BooleanProperty( + "run_for_all_players", + "Run for all players", + "Run the function for all players in the sandbox." + ).setValue(false), + new BooleanProperty( + "await", + "Await", + "Wait for the function to finish before continuing." + ).setValue(false), + new CustomSlotProperty( + "add_argument", + "Add Argument", + "Add a argument to be passed into the function.", + Material.PAPER, + 32 + ) { + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + List arguments = getProperty("arguments", ArgumentsProperty.class).getValue(); + if (arguments.size() >= 6) { + player.sendMessage(colorize("&cYou can only have a maximum of 6 arguments.")); + return; } - return false; + player.sendMessage(colorize("&eEnter the argument value.")); + menu.openChat(main, (message) -> { + if (message.length() > 16) { + player.sendMessage(colorize("&cThe argument name cannot be longer than 16 characters.")); + return; + } + if (message.isEmpty()) { + player.sendMessage(colorize("&cThe argument name cannot be empty.")); + return; + } + if (arguments.stream().anyMatch(arg -> arg.getName().equalsIgnoreCase(message))) { + player.sendMessage(colorize("&cThe argument name already exists.")); + return; + } + arguments.add(new ArgumentsProperty.Argument(message, "%stat.player/" + message + "%")); + menu.open(); + }); } - )); - } - - items.add(new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&aAdd Argument") - .description("Add a argument to be passed into the function."), - CUSTOM, 50, (event, obj) -> { - if (arguments.size() >= 6) { - backMenu.getOwner().sendMessage(colorize("&cYou can only have a maximum of 6 arguments.")); - return false; - } - arguments.put("name", "%player.name%"); - backMenu.open(); - return true; - } + }, + new ArgumentsProperty( + "arguments" + ).setValue(new ArrayList<>()) )); - - return new ActionEditor(6, "&eFunction Action Settings", items); } @Override @@ -140,10 +92,6 @@ public int limit() { return 10; } - public void setFunction(String function) { - this.function = function; - } - @Override public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; // Not used @@ -151,45 +99,17 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Function function = getValue("function", Function.class); if (function == null) { + player.sendMessage(colorize("&cThe function is not set.")); return OutputType.ERROR; } - Function functionData = house.getFunction(function); - if (functionData == null) { - return OutputType.ERROR; - } - if (runForAllPlayers) { - return functionData.execute(Main.getInstance(), null, null, house, false, await, executor, arguments); - } else { - return functionData.execute(Main.getInstance(), player, player, house, false, await, executor, arguments); - } - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("function", function == null ? null : function); - data.put("runForAllPlayers", runForAllPlayers); - data.put("await", await); - data.put("arguments", arguments); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - function = (String) data.get("function"); - runForAllPlayers = (boolean) data.get("runForAllPlayers"); - if (data.get("await") == null) { - await = false; + boolean await = getValue("await", Boolean.class); + List arguments = getProperty("arguments", ArgumentsProperty.class).getValue(); + if (getValue("run_for_all_players", Boolean.class)) { + return function.execute(Main.getInstance(), null, null, house, false, await, executor, arguments); } else { - await = (boolean) data.get("await"); - } - arguments = new LinkedHashMap<>(); - if (data.get("arguments") == null) { - return; - } - for (Map.Entry entry : ((LinkedTreeMap) data.get("arguments")).entrySet()) { - arguments.put(entry.getKey(), (String) entry.getValue()); + return function.execute(Main.getInstance(), player, player, house, false, await, executor, arguments); } } @@ -197,9 +117,4 @@ public void fromData(HashMap data, Class actio public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "function"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/GiveItemAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/GiveItemAction.java index 23d76534..0a6c5ec7 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/GiveItemAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/GiveItemAction.java @@ -1,8 +1,9 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.SlotProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; @@ -10,132 +11,60 @@ import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.Serialization; import com.al3x.housing2.Utils.StackUtils; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.io.IOException; -import java.util.*; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +@ToString public class GiveItemAction extends Action { - ItemStack item; - boolean allowMultiple; - double slot = -1; - boolean replaceExistingSlot; public GiveItemAction() { - super("Give Item Action"); - } - - @Override - public String toString() { - return "GiveItemAction{" + - "item=" + item + - ", allowMultiple=" + allowMultiple + - ", slot=" + slot + - ", replaceExistingSlot=" + replaceExistingSlot + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&eGive Item"); - builder.info("&eSettings", ""); - builder.info("Item", (item == null ? "&cNone" : "&6" + item.getType())); - builder.info("Allow Multiple", allowMultiple ? "&aYes" : "&cNo"); - builder.info("Slot", slotIndexToName((int) slot)); - builder.info("Replace Existing Slot", replaceExistingSlot ? "&aEnabled" : "&cDisabled"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&aGive Item"); - builder.description("Gives an item to the player"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.GIVE_ITEM, + "Give Item", + "Gives an item to the player.", + Material.CHEST, + List.of("giveItem") + ); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = List.of( - new ActionEditor.ActionItem("item", ItemBuilder.create((item == null ? Material.BOOK : item.getType())) - .name("&aItem") - .description("Select a item to give") - .info("&7Current Value", "") - .info(null, (item == null ? "&cNone" : "&6" + StackUtils.getDisplayName(item))), - ActionEditor.ActionItem.ActionType.ITEM - ), - new ActionEditor.ActionItem("allowMultiple", ItemBuilder.create((allowMultiple ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aAllow Multiple") - .info("&7Current Value", "") - .info(null, allowMultiple ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN + getProperties().addAll(List.of( + new ItemStackProperty( + "item", + "Item", + "The item to give" ), - new ActionEditor.ActionItem("slot", ItemBuilder.create(Material.CHEST) - .name("&aSlot") - .description("Select a slot to give the item to") - .info("&7Current Value", "") - .info(null, slotIndexToName((int) slot)), - (e, slot) -> { - SlotSelectMenu menu = new SlotSelectMenu((Player) e.getWhoClicked(), Main.getInstance(), backMenu, (selectedSlot) -> { - this.slot = selectedSlot; - }); - menu.open(); - return true; - } - ), - new ActionEditor.ActionItem("replaceExistingSlot", ItemBuilder.create((replaceExistingSlot ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aReplace Existing Slot") - .description("When enabled, if an item currently occupies the inventory slot it will be replaced with the new item.") - .info("&7Current Value", "") - .info(null, replaceExistingSlot ? "&aEnabled" : "&cDisabled"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "&eGive Item Action Settings", items); + new BooleanProperty( + "allowMultiple", + "Allow Multiple", + "If true, the player can have multiple copies of the item." + ).setValue(true), + new SlotProperty( + "slot", + "Slot", + "The slot to give the item to. -1 for first available slot, -2 for hand slot, -3 for offhand slot." + ).setValue(-1), + new BooleanProperty( + "replaceExistingSlot", + "Replace Existing Slot", + "If true, the item will replace any existing item in the slot." + ).setValue(false) + )); } - private String slotIndexToName(int index) { - if (index == -1) { - return "First Available Slot"; - } - if (index == -2) { - return "Hand Slot"; - } - if (index == -3 || index == -106) { - return "Offhand Slot"; - } - if (index < 9 && index >= 0) { - return "Hotbar Slot " + (index + 1); - } - if (index < 36 && index >= 9) { - return "Inventory Slot " + (index - 8); - } - if (index == 103) { - return "Helmet"; - } - if (index == 102) { - return "Chestplate"; - } - if (index == 101) { - return "Leggings"; - } - if (index == 100) { - return "Boots"; - } - if (index >= 80 && index <= 83) { - return "Crafting Slot " + (index - 79); - } - return "Unknown Slot"; - } @Override public OutputType execute(Player player, HousingWorld house) { + ItemStack item = getProperty("item", ItemStackProperty.class).getValue(); + boolean allowMultiple = getProperty("allowMultiple", BooleanProperty.class).getValue(); + int slot = getProperty("slot", SlotProperty.class).getValue(); + boolean replaceExistingSlot = getProperty("replaceExistingSlot", BooleanProperty.class).getValue(); + if (item == null) return OutputType.ERROR; - int slot = (int) this.slot; if (player.getInventory().contains(item) && !allowMultiple) { return OutputType.ERROR; @@ -204,29 +133,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("item", Serialization.itemStackToBase64(item)); - data.put("allowMultiple", allowMultiple); - data.put("slot", slot); - data.put("replaceExistingSlot", replaceExistingSlot); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (IOException e) { - e.printStackTrace(); - Main.getInstance().getLogger().warning("Failed to load item from base64 string"); - } - allowMultiple = (boolean) data.get("allowMultiple"); - slot = (double) data.get("slot"); - replaceExistingSlot = (boolean) data.get("replaceExistingSlot"); - } - @Override public boolean requiresPlayer() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/GlobalStatAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/GlobalStatAction.java index a0f8bf64..d865796a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/GlobalStatAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/GlobalStatAction.java @@ -1,227 +1,59 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Data.StatActionData; -import com.al3x.housing2.Enums.StatOperation; +import com.al3x.housing2.Action.Properties.AddStatInstanceProperty; +import com.al3x.housing2.Action.Properties.StatInstanceProperty; +import com.al3x.housing2.Action.Properties.StringProperty; +import com.al3x.housing2.Action.Properties.VersionProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Stat; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Actions.ActionEditMenu; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.PaginationMenu; -import com.al3x.housing2.Utils.Color; -import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; -import com.google.gson.Gson; -import org.bukkit.Bukkit; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; import java.util.*; +import java.util.function.BiFunction; import static com.al3x.housing2.Utils.Color.colorize; +@ToString +@Getter +@Setter public class GlobalStatAction extends HTSLImpl { - - private static final Gson gson = new Gson(); - private String statName; - - private List statInstances = new ArrayList<>(); - - private StatOperation mode; - private StatValue value; - public GlobalStatAction() { - super("Global Stat Action"); - this.statName = "Kills"; - - this.statInstances.add(new StatInstance("global")); - } - - @Override - public String toString() { - // add the first 3 statinstances then do ... more - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - sb.append(statInstances.get(i).mode).append(" ").append(statInstances.get(i).value); - if (i != Math.min(3, statInstances.size()) - 1) { - sb.append(", "); - } - } - if (statInstances.size() > 3) { - sb.append("... ").append(statInstances.size() - 3).append(" more"); - } - - return "GlobalStatAction (StatName: " + statName + ", StatInstances: " + sb.toString() + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("cf40942f364f6cbceffcf1151796410286a48b1aeba77243e218026c09cd1"); - builder.name("&eChange Global Stat"); - builder.info("&eSettings", ""); - builder.info("Stat", "&a" + statName); - if (statInstances.size() > 3) { - builder.info("Stat Changes", "&a" + statInstances.size()); - for (int i = 0; i < 3; i++) { - builder.info("Mode", "&6" + statInstances.get(i).mode); - builder.info("Value", "&a" + statInstances.get(i).value); - } - builder.info("", "&7&l+ " + (statInstances.size() - 3) + " more"); - } else { - builder.info("&eStat Changes", ""); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - builder.info("Mode", "&6" + statInstances.get(i).mode); - builder.info("Value", "&a" + statInstances.get(i).value); - } - } - - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("cf40942f364f6cbceffcf1151796410286a48b1aeba77243e218026c09cd1"); - builder.name("&aChange Global Stat"); - builder.description("Modify a stat of the player who triggered the action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&eGlobal Stat Action Settings"); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("statName", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + statName) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.GLOBAL_STAT, + "Global Stat", + "Modifies a global stat.", + Material.PLAYER_HEAD, + List.of("globalStat") + ); + + getProperties().addAll(List.of( + new StringProperty( + "statName", + "Stat Name", + "The name of the stat to modify." + ).setValue("Kills"), + new StatInstanceProperty( + ).setValue(new ArrayList<>(List.of( + new StatInstance() + ))), + new AddStatInstanceProperty(32), + new VersionProperty().setValue(0) )); - - for (int i = 0; i < statInstances.size(); i++) { - StatInstance instance = statInstances.get(i); - ItemBuilder modeItem = ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + instance.mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - if (i > 0) { - modeItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - int finalI = i; - items.add(new ActionEditor.ActionItem("mode", - modeItem, - (event, obj) -> { - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - List> modes = new ArrayList<>(); - for (StatOperation mode : StatOperation.values()) { - if (mode.expressionOnly()) continue; - modes.add(new Duple<>(mode, ItemBuilder.create(mode.getMaterial()).name("&a" + mode))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect a mode", modes, backMenu.getOwner(), house, backMenu, (mode) -> { - instance.mode = mode; - backMenu.open(); - }).open(); - - return true; - } - )); - - ItemBuilder valueItem = ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + instance.value) - .info(null, "") - .info("Expression", (instance.value.isExpression() ? "&aEnabled" : "&cDisabled")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); - - if (i > 0) { - valueItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - items.add(new ActionEditor.ActionItem("value", - valueItem, - ActionEditor.ActionItem.ActionType.CUSTOM, (event, obj) -> { - if (event.getClick() == ClickType.MIDDLE) { - instance.value.setExpression(!instance.value.isExpression()); - backMenu.open(); - return true; - } - - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - if (instance.value.isExpression()) { - new ActionEditMenu(instance.value, Main.getInstance(), backMenu.getOwner(), house, backMenu).open(); - } else { - backMenu.getOwner().sendMessage(colorize("&ePlease enter the text you wish to set in chat!")); - backMenu.openChat(Main.getInstance(), instance.value.getLiteralValue(), (value) -> { - instance.value.setLiteralValue(value); - backMenu.getOwner().sendMessage(colorize("&aValue set to: &e" + value)); - Bukkit.getScheduler().runTaskLater(Main.getInstance(), backMenu::open, 1L); - }); - } - return true; - } - )); - } - - items.add(new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&aAdd Stat Expression") - .description("Add a new stat expression instance.\n\nBasically adds a new mode and value to the expression."), - ActionEditor.ActionItem.ActionType.CUSTOM, 50, (event, obj) -> { - if (statInstances.size() >= 6) { - backMenu.getOwner().sendMessage(colorize("&cYou can only have a maximum of 6 stat instances.")); - return false; - } - statInstances.add(new StatInstance("global")); - backMenu.open(); - return true; - } - )); - - return new ActionEditor(6, "&ePlayer Stat Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String name = HandlePlaceholders.parsePlaceholders(player, house, statName); - - if (name.contains(" ")) { - player.sendMessage(colorize("&cStat name cannot contain spaces!")); - return OutputType.ERROR; - } + String name = getProperty("statName", StringProperty.class).parseNoSpace(house, player); + if (name == null) return OutputType.ERROR; Stat stat = house.getStatManager().getGlobalStatByName(name); - + List statInstances = getProperty("statInstances", StatInstanceProperty.class).getValue(); for (StatInstance instance : statInstances) { if (stat.modifyStat(instance.mode, HandlePlaceholders.parsePlaceholders(player, house, instance.value.calculate(player, house))) == null) { player.sendMessage(colorize("&cFailed to modify stat: " + name + " with mode: " + instance.mode + " and value: " + instance.value)); @@ -242,102 +74,53 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - public String getStatName() { - return statName; - } - - public StatOperation getMode() { - return mode; - } - - public void setStatName(String name) { - this.statName = name; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public StatValue getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("statName", statName); - data.put("statInstances", statInstances); - return data; - } - @Override public boolean requiresPlayer() { return false; } - @Override - public void fromData(HashMap data, Class actionClass) { - statName = (String) data.get("statName"); - - if (data.containsKey("statInstances")) { - this.statInstances = dataToList(gson.toJsonTree(data.get("statInstances")).getAsJsonArray(), StatInstance.class); - } else { - statInstances = new ArrayList<>(); - StatInstance statInstance = new StatInstance("global"); - mode = StatOperation.valueOf((String) data.get("mode")); - value = gson.fromJson(gson.toJson(data.get("value")), StatActionData.MoreStatData.class).toStatValue(); - - statInstance.value = value; - statInstance.mode = mode; - } - } - - @Override - public String export(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < statInstances.size(); i++) { - sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); - if (i != statInstances.size() - 1) { - sb.append(" "); - } - } - return " ".repeat(indent) + keyword() + " \"" + statName + "\" " + sb; - } - - @Override - public String keyword() { - return "globalstat"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - - Duple statArg = handleArg(parts, 0); - this.statName = statArg.getSecond(); - parts = statArg.getFirst(); - - ArrayList statInstances = new ArrayList<>(); - - StatInstance instance = new StatInstance("global"); - while (parts.length > 0) { - if (StatOperation.getOperation(parts[0]) != null) { - instance.mode = StatOperation.getOperation(parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - continue; - } else { - instance.value = new StatValue("global"); - parts = instance.value.importValue(parts); - } - if (instance.mode != null && instance.value != null) { - statInstances.add(instance); - instance = new StatInstance("global"); - } - } - - this.statInstances = statInstances; - - return nextLines; - } +// @Override +// public String export(int indent) { +// StringBuilder sb = new StringBuilder(); +// for (int i = 0; i < statInstances.size(); i++) { +// sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); +// if (i != statInstances.size() - 1) { +// sb.append(" "); +// } +// } +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " \"" + statName + "\" " + sb; +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// +// Duple statArg = handleArg(parts, 0); +// this.statName = statArg.getSecond(); +// parts = statArg.getFirst(); +// +// ArrayList statInstances = new ArrayList<>(); +// +// StatInstance instance = new StatInstance(); +// while (parts.length > 0) { +// if (StatOperation.getOperation(parts[0]) != null) { +// instance.mode = StatOperation.getOperation(parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// continue; +// } else { +// instance.value = new StatValue(); +// parts = instance.value.importValue(parts); +// } +// +// if (instance.mode != null && instance.value != null) { +// statInstances.add(instance); +// instance = new StatInstance(); +// } +// } +// +// this.statInstances = statInstances; +// +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/HideNPCAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/HideNPCAction.java index a3662119..70dc68f1 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/HideNPCAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/HideNPCAction.java @@ -1,46 +1,28 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionExecutor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.NPCAction; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.trait.PlayerFilter; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class HideNPCAction extends HTSLImpl implements NPCAction { public HideNPCAction() { - super("Hide NPC Action"); - } - - @Override - public String toString() { - return "HideNPCAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GRAY_DYE); - builder.name("&eHide NPC"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GRAY_DYE); - builder.name("&aHide NPC"); - builder.description("Hides the NPC from the player who triggered the action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.HIDE_NPC, + "Hide NPC", + "Hides the NPC from the player that triggered the action.", + Material.GRAY_DYE, + List.of("hideNPC") + ); } @Override @@ -48,21 +30,11 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "hideNPC"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { PlayerFilter filter = npc.getTraitNullable(PlayerFilter.class); diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/KillNPCAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/KillNPCAction.java index 62425f80..e29c4018 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/KillNPCAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/KillNPCAction.java @@ -1,45 +1,27 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionExecutor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.NPCAction; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.util.LinkedHashMap; +import java.util.List; +@ToString public class KillNPCAction extends HTSLImpl implements NPCAction { public KillNPCAction() { - super("Kill NPC Action"); - } - - @Override - public String toString() { - return "KillNPCAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&eKill NPC"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&aKill NPC"); - builder.description("Kills the NPC"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.KILL_NPC, + "Kill NPC" + , "Kills the NPC.", + Material.IRON_BARS, + List.of("killNPC") + ); } @Override @@ -47,21 +29,11 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "killNPC"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (npc.getEntity() instanceof LivingEntity le) { diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/KillPlayerAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/KillPlayerAction.java index 0fba4939..255931ac 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/KillPlayerAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/KillPlayerAction.java @@ -1,45 +1,26 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import java.util.Arrays; -import java.util.LinkedHashMap; - -import static com.al3x.housing2.Utils.Color.colorize; +import java.util.List; +@ToString public class KillPlayerAction extends HTSLImpl { public KillPlayerAction() { - super("Kill Player Action"); - } - - @Override - public String toString() { - return "KillPlayerAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&eKill Player"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&aKill Player"); - builder.description("Kills the player"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.KILL_PLAYER, + "Kill Player", + "Kills the player.", + Material.IRON_BARS, + List.of("killPlayer") + ); } @Override @@ -48,18 +29,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "kill"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/LaunchProjectileAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/LaunchProjectileAction.java index e1dd5329..80109249 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/LaunchProjectileAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/LaunchProjectileAction.java @@ -1,152 +1,80 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.Projectile; import com.al3x.housing2.Enums.PushDirection; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.*; -import net.kyori.adventure.text.Component; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.HandlePlaceholders; +import com.al3x.housing2.Utils.NumberUtilsKt; +import com.al3x.housing2.Utils.Serialization; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.entity.ThrownPotion; -import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.Vector; -import java.util.*; - -import static com.al3x.housing2.Utils.Color.colorize; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.function.BiFunction; +@ToString public class LaunchProjectileAction extends HTSLImpl { - private Projectile projectile; - private PushDirection direction; - private String customDirection; - private String amount; - - //Custom Data - private ItemStack item = null; - public LaunchProjectileAction() { - super("Launch Projectile Action"); - this.projectile = Projectile.ARROW; - this.direction = PushDirection.FORWARD; - this.amount = "1.5"; - } - - public LaunchProjectileAction(Projectile projectile, String amount, PushDirection direction) { - super("Launch Projectile Action"); - this.projectile = projectile; - this.direction = direction; - this.amount = amount; - } - - @Override - public String toString() { - return "LaunchProjectileAction (Projectile: " + projectile + ", Direction: " + direction + ", Amount: " + amount + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ARROW); - builder.name("&eLaunch Projectile Action"); - builder.info("&eSettings", ""); - builder.info("Projectile", "&a" + projectile); - builder.info("Direction", "&a" + (direction == PushDirection.CUSTOM ? customDirection : direction)); - builder.info("Velocity", "&a" + amount); - - if (item != null) { - builder.info("Item", "&6" + item.getType()); - } - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ARROW); - builder.name("&aLaunch Projectile Action"); - builder.description("Launches a projectile in a direction."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu editMenu) { - List items = new ArrayList<>(); - items.addAll(Arrays.asList( - new ActionEditor.ActionItem("projectile", - ItemBuilder.create(Material.ARROW) - .name("&eProjectile") - .info("&7Current Value", "") - .info(null, "&a" + projectile) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Projectile.values(), null - ), - new ActionEditor.ActionItem("direction", - ItemBuilder.create(Material.COMPASS) - .name("&eDirection") - .info("&7Current Value", "") - .info(null, "&a" + direction) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, PushDirection.values(), Material.COMPASS, - (event, obj) -> getDirection(event, obj, house, editMenu, (str, dir) -> { - customDirection = str; - direction = dir; - }) - ), - new ActionEditor.ActionItem("amount", - ItemBuilder.create(Material.SLIME_BALL) - .name("&eVelocity") - .info("&7Current Value", "") - .info(null, "&a" + amount) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) + super( + ActionEnum.LAUNCH_PROJECTILE, + "Launch Projectile", + "Launches a projectile in a direction.", + Material.ARROW, + List.of("launchProjectile") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "projectile", + "Projectile", + "The projectile to launch.", + Projectile.class + ).setValue(Projectile.ARROW), + new EnumProperty<>( + "direction", + "Direction", + "The direction to launch the projectile.", + PushDirection.class + ).setValue(PushDirection.FORWARD), + new NumberProperty( + "velocity", + "Velocity", + "The velocity of the projectile.", + 0.1, 5 + ).setValue("1.5"), + new ItemStackProperty( + "item", + "Item", + "The item to launch." + ).showIf(() -> getValue("projectile", Projectile.class) == Projectile.SPLASH_POTION).setValue(new ItemStack(Material.SPLASH_POTION, 1)) )); - - if (projectile.getProjectile() == ThrownPotion.class) { - items.add(new ActionEditor.ActionItem("item", - ItemBuilder.create(Material.POTION) - .name("&eItem") - .info("&7Current Value", "") - .info(null, (item == null ? "§cNone" : "&6" + StackUtils.getDisplayName(item))) - .lClick(ItemBuilder.ActionType.SELECT_YELLOW), - ActionEditor.ActionItem.ActionType.ITEM - )); - } - - return new ActionEditor(4, "&eLaunch Projectile Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - org.bukkit.entity.Projectile proj = player.launchProjectile(projectile.getProjectile()); + org.bukkit.entity.Projectile proj = player.launchProjectile(getValue("projectile", Projectile.class).getProjectile()); proj.setMetadata("projectile", new FixedMetadataValue(Main.getInstance(), 10)); - String amountParsed = HandlePlaceholders.parsePlaceholders(player, house, this.amount); - - if (!NumberUtilsKt.isDouble(amountParsed)) { - return OutputType.ERROR; - } - double amount = Double.parseDouble(amountParsed); - - if (amount < 0) { - return OutputType.ERROR; - } - - if (amount > 10) { - amount = 10; - } + double amount = getProperty("velocity", NumberProperty.class).parsedValue(house, player); Vector velocity = player.getEyeLocation().getDirection().normalize().multiply(amount); - switch (direction) { + switch (getValue("direction", PushDirection.class)) { case UP: velocity.setY(amount); break; @@ -176,35 +104,15 @@ public OutputType execute(Player player, HousingWorld house) { case SOUTH: velocity = new Vector(0, 0, amount); break; - case CUSTOM: - String[] split = customDirection.split(","); - if (split.length != 2) { - return OutputType.ERROR; - } - - try { - float pitch = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[0])); - float yaw = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[1])); - Vector custom = player.getEyeLocation().getDirection().setY(0).normalize().multiply(amount); - custom = custom.setX(custom.getX() * Math.cos(Math.toRadians(yaw))); - custom = custom.setY(Math.sin(Math.toRadians(pitch)) * amount); - custom = custom.setZ(custom.getZ() * Math.sin(Math.toRadians(yaw))); - velocity = custom; - } catch (NumberFormatException e) { - return OutputType.ERROR; - } - break; } - if (proj instanceof ThrownPotion) { - ThrownPotion potion = (ThrownPotion) proj; - if (item != null) { - potion.setItem(item); - } + + if (proj instanceof ThrownPotion potion) { + potion.setItem(getProperty("item", ItemStackProperty.class).getValue()); potion.setVelocity(velocity); potion.setShooter(player); - return OutputType.SUCCESS; } + proj.setVelocity(velocity); proj.setShooter(player); return OutputType.SUCCESS; @@ -215,72 +123,8 @@ public int limit() { return 5; } - @Override - public boolean mustBeSync() { - return true; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("projectile", projectile); - data.put("amount", amount); - data.put("direction", direction); - if (projectile == Projectile.SPLASH_POTION) { - data.put("item", Serialization.itemStackToBase64(item)); - } - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - projectile = (data.get("projectile") instanceof String) ? Projectile.valueOf((String) data.get("projectile")) : (Projectile) data.get("projectile"); - amount = data.get("amount").toString(); - direction = (data.get("direction") instanceof String) ? PushDirection.valueOf((String) data.get("direction")) : (PushDirection) data.get("direction"); - if (projectile == Projectile.SPLASH_POTION) { - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (Exception e) { - e.printStackTrace(); - Main.getInstance().getLogger().warning("Failed to load item from base64 string"); - } - } - - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] split = action.split(" "); - if (split.length < 3) { - return nextLines; - } - - try { - projectile = Projectile.getProjectile(split[0]); - Duple arg = handleArg(split, 1); - if (arg == null) { - return nextLines; - } - amount = arg.getSecond(); - split = arg.getFirst(); - if (split.length < 1) { - return nextLines; - } - direction = PushDirection.valueOf(split[0]); - } catch (IllegalArgumentException e) { - return nextLines; - } - - return nextLines; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "launchProjectile"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/NPCStatAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/NPCStatAction.java index 2d23ed61..5a16d71a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/NPCStatAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/NPCStatAction.java @@ -1,210 +1,55 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Data.StatActionData; +import com.al3x.housing2.Action.Properties.AddStatInstanceProperty; +import com.al3x.housing2.Action.Properties.StatInstanceProperty; +import com.al3x.housing2.Action.Properties.StringProperty; +import com.al3x.housing2.Action.Properties.VersionProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingNPC; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Stat; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Actions.ActionEditMenu; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.PaginationMenu; import com.al3x.housing2.Utils.Color; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; import com.google.gson.Gson; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; import java.util.*; import static com.al3x.housing2.Utils.Color.colorize; +@ToString public class NPCStatAction extends HTSLImpl implements NPCAction { - private static final Gson gson = new Gson(); - private String statName; - - private List statInstances = new ArrayList<>(); - - private StatOperation mode; - private StatValue value; - public NPCStatAction() { - super("NPC Stat Action"); - this.statName = "Kills"; - - this.statInstances.add(new StatInstance("npc")); - } - - @Override - public String toString() { - // add the first 3 statinances then do ... more - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - sb.append(statInstances.get(i).mode).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); - if (i != Math.min(3, statInstances.size()) - 1) { - sb.append(", "); - } - } - if (statInstances.size() > 3) { - sb.append("... ").append(statInstances.size() - 3).append(" more"); - } - - return "PlayerStatAction (StatName: " + statName + ", StatInstances: " + sb.toString() + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ZOMBIE_SPAWN_EGG); - builder.name("&eChange NPC Stat"); - builder.info("&eSettings", ""); - builder.info("Stat", "&a" + statName); - if (statInstances.size() > 3) { - - } else { - builder.info("&eStat Changes", ""); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - builder.info("Mode", "&6" + statInstances.get(i).mode); - builder.info("Value", "&a" + statInstances.get(i).value); - } - } - - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ZOMBIE_SPAWN_EGG); - builder.name("&aChange NPC Stat"); - builder.description("Modify a stat of the player who triggered the action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&ePlayer Stat Action Settings"); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("statName", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + statName) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.NPC_STAT, + "NPC Stat", + "Changes the stat of an NPC.", + Material.ZOMBIE_SPAWN_EGG, + List.of("npcStat") + ); + + getProperties().addAll(List.of( + new StringProperty( + "statName", + "Stat Name", + "The name of the stat to modify." + ).setValue("Kills"), + new StatInstanceProperty( + ).setValue(new ArrayList<>(List.of( + new StatInstance() + ))), + new AddStatInstanceProperty(32), + new VersionProperty().setValue(0) )); - - for (int i = 0; i < statInstances.size(); i++) { - StatInstance instance = statInstances.get(i); - ItemBuilder modeItem = ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + instance.mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - if (i > 0) { - modeItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - int finalI = i; - items.add(new ActionEditor.ActionItem("mode", - modeItem, - (event, obj) -> { - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - List> modes = new ArrayList<>(); - for (StatOperation mode : StatOperation.values()) { - if (mode.expressionOnly()) continue; - modes.add(new Duple<>(mode, ItemBuilder.create(mode.getMaterial()).name("&a" + mode))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect a mode", modes, backMenu.getOwner(), house, backMenu, (mode) -> { - instance.mode = mode; - backMenu.open(); - }).open(); - - return true; - } - )); - - ItemBuilder valueItem = ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + instance.value) - .info(null, "") - .info("Expression", (instance.value.isExpression() ? "&aEnabled" : "&cDisabled")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); - - if (i > 0) { - valueItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - items.add(new ActionEditor.ActionItem("value", - valueItem, - ActionEditor.ActionItem.ActionType.CUSTOM, (event, obj) -> { - if (event.getClick() == ClickType.MIDDLE) { - instance.value.setExpression(!instance.value.isExpression()); - backMenu.open(); - return true; - } - - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - if (instance.value.isExpression()) { - new ActionEditMenu(instance.value, Main.getInstance(), backMenu.getOwner(), house, backMenu).open(); - } else { - backMenu.getOwner().sendMessage(colorize("&ePlease enter the text you wish to set in chat!")); - backMenu.openChat(Main.getInstance(), instance.value.getLiteralValue(), (value) -> { - instance.value.setLiteralValue(value); - backMenu.getOwner().sendMessage(colorize("&aValue set to: &e" + value)); - Bukkit.getScheduler().runTaskLater(Main.getInstance(), backMenu::open, 1L); - }); - } - return true; - } - )); - } - - items.add(new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&aAdd Stat Expression") - .description("Add a new stat expression instance.\n\nBasically adds a new mode and value to the expression."), - ActionEditor.ActionItem.ActionType.CUSTOM, 50, (event, obj) -> { - if (statInstances.size() >= 6) { - backMenu.getOwner().sendMessage(colorize("&cYou can only have a maximum of 6 stat instances.")); - return false; - } - statInstances.add(new StatInstance("npc")); - backMenu.open(); - return true; - } - )); - - return new ActionEditor(6, "&ePlayer Stat Action Settings", items); } @Override @@ -212,112 +57,64 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - public String getStatName() { - return statName; - } - - public StatOperation getMode() { - return mode; - } - - public void setStatName(String name) { - this.statName = name; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public StatValue getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("statName", statName); - data.put("statInstances", statInstances); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - statName = (String) data.get("statName"); - - if (data.containsKey("statInstances")) { - this.statInstances = dataToList(gson.toJsonTree(data.get("statInstances")).getAsJsonArray(), StatInstance.class); - } else { - statInstances = new ArrayList<>(); - StatInstance statInstance = new StatInstance("npc"); - mode = StatOperation.valueOf((String) data.get("mode")); - value = gson.fromJson(gson.toJson(data.get("value")), StatActionData.MoreStatData.class).toStatValue(); - - statInstance.value = value; - statInstance.mode = mode; - } - } - - @Override - public String export(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < statInstances.size(); i++) { - sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); - if (i != statInstances.size() - 1) { - sb.append(" "); - } - } - return " ".repeat(indent) + keyword() + " \"" + statName + "\" " + sb.toString(); - } - - @Override - public String keyword() { - return "npcstat"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - - Duple statArg = handleArg(parts, 0); - this.statName = statArg.getSecond(); - parts = statArg.getFirst(); - - ArrayList statInstances = new ArrayList<>(); - - StatInstance instance = new StatInstance("npc"); - while (parts.length > 0) { - if (StatOperation.getOperation(parts[0]) != null) { - instance.mode = StatOperation.getOperation(parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - continue; - } else { - instance.value = new StatValue("npc"); - parts = instance.value.importValue(parts); - } - - if (instance.mode != null && instance.value != null) { - statInstances.add(instance); - instance = new StatInstance("npc"); - } - } - - this.statInstances = statInstances; - - return nextLines; - } +// +// @Override +// public String export(int indent) { +// StringBuilder sb = new StringBuilder(); +// for (int i = 0; i < statInstances.size(); i++) { +// sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); +// if (i != statInstances.size() - 1) { +// sb.append(" "); +// } +// } +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " \"" + statName + "\" " + sb.toString(); +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// +// Duple statArg = handleArg(parts, 0); +// this.statName = statArg.getSecond(); +// parts = statArg.getFirst(); +// +// ArrayList statInstances = new ArrayList<>(); +// +// StatInstance instance = new StatInstance(); +// while (parts.length > 0) { +// if (StatOperation.getOperation(parts[0]) != null) { +// instance.mode = StatOperation.getOperation(parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// continue; +// } else { +// instance.value = new StatValue(); +// parts = instance.value.importValue(parts); +// } +// +// if (instance.mode != null && instance.value != null) { +// statInstances.add(instance); +// instance = new StatInstance(); +// } +// } +// +// this.statInstances = statInstances; +// +// return nextLines; +// } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (player == null) return; - String name = HandlePlaceholders.parsePlaceholders(player, house, statName); + String name = getProperty("statName", StringProperty.class).parseNoSpace(house, player); + if (name == null) return; HousingNPC housingNPC = house.getNPCByCitizensID(npc.getId()); Stat stat = housingNPC.getStats().stream().filter(s -> s.getStatName().equals(name)).findFirst().orElse(new Stat(name, "0")); + List statInstances = getProperty("statInstances", StatInstanceProperty.class).getValue(); for (StatInstance instance : statInstances) { if (stat.modifyStat(instance.mode, HandlePlaceholders.parsePlaceholders(player, house, instance.value.calculate(player, house))) == null) { player.sendMessage(colorize("&cFailed to modify stat: " + name + " with mode: " + instance.mode + " and value: " + instance.value)); diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/NameTagAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/NameTagAction.java index ba3f2e54..30cc3e9c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/NameTagAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/NameTagAction.java @@ -1,18 +1,12 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Placeholders.custom.Placeholder; -import com.al3x.housing2.Utils.HypixelLoreFormatter; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.ItemBuilder.ActionType; import com.al3x.housing2.Utils.NameTag; import com.al3x.housing2.Utils.StringUtilsKt; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -22,54 +16,23 @@ import java.util.LinkedHashMap; import java.util.List; +//Todo: Ability to set multiple lines, and if its visible in third person or not (aka visible to the player or not) public class NameTagAction extends HTSLImpl { - - private String nametag; - public NameTagAction() { - super("NameTag Action"); - this.nametag = "%player.name%"; - } - - @Override - public String keyword() { - return "nametag"; - } - - @Override - public String toString() { - return "NameTag (Message: " + nametag + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.NAME_TAG); - builder.name("&eChange Name Tag"); - builder.info("&eSettings", "").info("Name Tag", nametag); - builder.lClick(ActionType.EDIT_YELLOW).rClick(ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.NAME_TAG); - builder.name("&aChange Name Tag"); - builder.lClick(ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionItem("nametag", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aName Tag") - .info("&7Current Value", "") - .info(null, nametag) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.STRING - ) + super( + ActionEnum.CHANGE_PLAYER_NAMETAG, + "Change Player Name Tag", + "Changes the player's name tag.", + Material.NAME_TAG, + List.of("nametag") + ); + getProperties().add( + new StringProperty( + "nametag", + "Name Tag", + "The name tag to set." + ).setValue("%player.name%") ); - return new ActionEditor(4, "&eNametag Action Settings", items); } @Override @@ -81,19 +44,12 @@ public OutputType execute(Player player, HousingWorld house) { } team.setOption(Team.Option.NAME_TAG_VISIBILITY, Team.OptionStatus.NEVER); - new NameTag(player, StringUtilsKt.housingStringFormatter(nametag, house, player)); + new NameTag(player, getProperty("nametag", StringProperty.class).component(house, player)); team.addPlayer(player); return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("nametag", nametag); - return data; - } - @Override public boolean requiresPlayer() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/NpcPathAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/NpcPathAction.java index 90749037..06407536 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/NpcPathAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/NpcPathAction.java @@ -1,16 +1,19 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.*; import com.al3x.housing2.Enums.NavigationType; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Data.LocationData; import com.al3x.housing2.Instances.HousingNPC; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Listeners.NpcItems; -import com.al3x.housing2.Menus.Menu; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NbtItemBuilder; import com.google.gson.Gson; +import lombok.Getter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.trait.waypoint.LinearWaypointProvider; import net.citizensnpcs.trait.waypoint.WanderWaypointProvider; @@ -20,233 +23,98 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import java.util.*; -import static com.al3x.housing2.Action.ActionEditor.ActionItem.ActionType.CUSTOM; +// TODO: look at old display item lore +@ToString public class NpcPathAction extends Action implements NPCAction { - int npcId; - NavigationType mode; - Double speed = null; - Double delay = null; - Double xRange = null; - Double yRange = null; - List path = null; - boolean loop = false; - boolean pauseUntilComplete = false; - public NpcPathAction() { - super("Change Npc Navigation Action"); - npcId = -1; - mode = NavigationType.STATIONARY; - } - - @Override - public String toString() { - return "NpcPathAction{" + - "npcId=" + npcId + - ", mode=" + mode + - ", speed=" + speed + - ", delay=" + delay + - ", xRange=" + xRange + - ", yRange=" + yRange + - ", path=" + path + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - //Do nothing - } - - public List getPath() { - return path; - } - - @Override - public void createDisplayItem(ItemBuilder builder, HousingWorld house) { - builder.material(Material.DIAMOND_AXE); - builder.name("&eChange NPC Navigation"); - builder.info("&eSettings", ""); - builder.info("NPC", (npcId == -1 ? "&cNone" : "&6" + (house.getNPC(npcId) == null ? "Unknown NPC" : house.getNPC(npcId).getName()))); - builder.info("Mode", mode.name()); - if (mode != NavigationType.STATIONARY) { - if (speed == null) { - speed = 1.0; - } - builder.info("Speed", speed); - } - if (mode == NavigationType.WANDER) { - if (delay == null) { - delay = -1.0; - } - if (xRange == null) { - xRange = 25.0; - } - if (yRange == null) { - yRange = 3.0; - } - builder.info("Delay", delay); - builder.info("X Range", xRange); - builder.info("Y Range", yRange); - } - if (mode == NavigationType.PATH) { - if (path == null) { - path = new ArrayList<>(); - } - builder.info("Path", path.size() + " points"); - builder.info("Loop", loop ? "&aYes" : "&cNo"); - builder.info("Pause Until Complete", pauseUntilComplete ? "&aYes" : "&cNo"); - } - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DIAMOND_AXE); - builder.name("&aChange NPC Navigation"); - builder.description("Change the navigation of a given NPC."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - HousingNPC npc = house.getNPC(npcId); - - ItemBuilder itemBuilder = ItemBuilder.create(Material.PLAYER_HEAD) - .name("&aNPC") - .description("Select a NPC to change the navigation of\n\nIf you are running this within a run as npc action, the npc will be the npc that the action is running as") - .info("&7Current Value", "") - .info(null, (npc == null ? "&cNone" : "&6" + npc.getName())); - - List items = new ArrayList<>(); - items.add(new ActionEditor.ActionItem("npcId", itemBuilder, - ActionEditor.ActionItem.ActionType.NPC - )); - - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, NavigationType.values(), null - )); - - if (mode != NavigationType.STATIONARY) { - if (speed == null) { - speed = 1.0; - } - items.add(new ActionEditor.ActionItem("speed", - ItemBuilder.create(Material.SUGAR) - .name("&eSpeed") - .info("&7Current Value", "") - .info(null, speed) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE, 0.1, 10.0 - )); - } - - if (mode == NavigationType.WANDER) { - if (delay == null) { - delay = -1.0; - } - if (xRange == null) { - xRange = 25.0; - } - if (yRange == null) { - yRange = 3.0; - } - items.add(new ActionEditor.ActionItem("delay", - ItemBuilder.create(Material.CLOCK) - .name("&eDelay") - .info("&7Current Value", "") - .info(null, delay) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE, -1.0, 100.0 - )); - - items.add(new ActionEditor.ActionItem("xRange", - ItemBuilder.create(Material.COMPASS) - .name("&eX Range") - .info("&7Current Value", "") - .info(null, xRange) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE, 0.0, 100.0 - )); - - items.add(new ActionEditor.ActionItem("yRange", - ItemBuilder.create(Material.COMPASS) - .name("&eY Range") - .info("&7Current Value", "") - .info(null, yRange) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE, 0.0, 20.0 - )); - } - - if (mode == NavigationType.PATH) { - if (path == null) { - path = new ArrayList<>(); - } - items.add(new ActionEditor.ActionItem("path", - ItemBuilder.create(Material.DIAMOND_AXE) - .name("&aPath") - .description("&bRight click &7a block too add a point\n\n&bRight click &7air to remove last point\n\n&bShift right click &7to clear the path\n\n&bShift left click &7to cancel") - .lClick(ItemBuilder.ActionType.GIVE_ITEM), - (e, o) -> { + super( + ActionEnum.CHANGE_NPC_NAVIGATION, + "Change Npc Navigation", + "Change the navigation of a given NPC.", + Material.DIAMOND_AXE, + List.of("npcNav") + ); + + getProperties().addAll(List.of( + new NPCProperty( + "npcId", + "NPC", + "The NPC to change the navigation of." + ), + new EnumProperty<>( + "mode", + "Mode", + "The mode to use.", + NavigationType.class + ).setValue(NavigationType.STATIONARY), + new DoubleProperty( + "speed", + "Speed", + "The speed of the NPC.", 0.0, 10.0 + ).showIf(() -> getValue("mode", NavigationType.class) != NavigationType.STATIONARY).setValue(1.0), + new DoubleProperty( + "delay", + "Delay", + "The stationary time between wandering.", -1.0, 100.0 + ).showIf(() -> getValue("mode", NavigationType.class) == NavigationType.WANDER).setValue(-1.0), + new DoubleProperty( + "xRange", + "X Range", + "The x range of the NPC.", 0.0, 100.0 + ).showIf(() -> getValue("mode", NavigationType.class) == NavigationType.WANDER).setValue(42.0), + new DoubleProperty( + "yRange", + "Y Range", + "The y range of the NPC.", 0.0, 20.0 + ).showIf(() -> getValue("mode", NavigationType.class) == NavigationType.WANDER).setValue(4.0), + new CustomProperty( + "yes", + "Path", + "The path of the NPC.", + Material.DIAMOND_AXE + ) { + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { ItemBuilder pathItem = ItemBuilder.create(Material.DIAMOND_AXE) .name("&aPath") .description("&bRight click &7a block too add a point\n\n&bRight click &7air to remove last point\n\n&bShift right click &7to clear the path\n\n&bShift left click &7to cancel"); ItemStack itemStack = pathItem.build(); NbtItemBuilder nbtItem = new NbtItemBuilder(itemStack); nbtItem.setBoolean("isPathForAction", true); - nbtItem.setInt("npcId", npcId); + nbtItem.setInt("npcId", NpcPathAction.this.getValue("npcId", Integer.class)); nbtItem.build(); player.getInventory().addItem(itemStack); - NpcItems.npcPathActionHashMap.put(player.getUniqueId(), this); - return true; + NpcItems.npcPathActionHashMap.put(player.getUniqueId(), NpcPathAction.this); } - )); - items.add(new ActionEditor.ActionItem("loop", - ItemBuilder.create(Material.REDSTONE_TORCH) - .name("&eLoop") - .info("&7Current Value", "") - .info(null, loop ? "&aYes" : "&cNo") - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - )); - items.add(new ActionEditor.ActionItem("pauseUntilComplete", - ItemBuilder.create(Material.REDSTONE_TORCH) - .name("&ePause Until Complete") - .info("&7Current Value", "") - .info(null, pauseUntilComplete ? "&aYes" : "&cNo") - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - )); - - ItemBuilder paths = ItemBuilder.create(Material.PAPER) - .name("&aPath Locations") - .description("All the locations in the path") - .rClick(ItemBuilder.ActionType.CLEAR); - for (int i = 0; i < path.size(); i++) { - LocationData locationData = path.get(i); - paths.info(null, "&8" + (i + 1) + ". &a" + locationData.getX() + ", " + locationData.getY() + ", " + locationData.getZ()); - } - items.add(new ActionEditor.ActionItem(paths, CUSTOM, 32, (e, o) -> { - if (e.getClick().isRightClick()) { - path.clear(); - return true; - } - return false; - })); - } + }.showIf(() -> getValue("mode", NavigationType.class) == NavigationType.PATH), + new BooleanProperty( + "loop", + "Loop", + "If true, the path will loop." + ).showIf(() -> getValue("mode", NavigationType.class) == NavigationType.PATH), + new BooleanProperty( + "pauseUntilComplete", + "Pause Until Complete", + "If true, the action will pause until the path is complete." + ).showIf(() -> getValue("mode", NavigationType.class) == NavigationType.PATH), + new ListProperty( + "path", + "Path", + "The path of the NPC.", + Material.PAPER, + 36 + ).setValue(new ArrayList<>()) + )); + } - return new ActionEditor(4, "&eNpc Path Action Settings", items); + public List getPath() { + return (List) getProperty("path", ListProperty.class).getValue(); } @Override @@ -256,15 +124,20 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Integer npcId = NpcPathAction.this.getValue("npcId", Integer.class); + if (npcId == null) { + return OutputType.ERROR; + } return execute(house.getNPC(npcId), player, house, event, executor); } public OutputType execute(HousingNPC npc, Player player, HousingWorld house, CancellableEvent cancellable, ActionExecutor actionExecutor) { + NavigationType mode = getValue("mode", NavigationType.class); npc.setNavigationType(mode); if (mode == NavigationType.WANDER) { + Double speed = getValue("speed", Double.class); npc.setSpeed(speed); npc.getCitizensNPC().getNavigator().getDefaultParameters().speedModifier(speed.floatValue()); - Waypoints waypoints = npc.getCitizensNPC().getOrAddTrait(Waypoints.class); if (npc.getPreviousNavigationType() != NavigationType.WANDER) { npc.setNavigationType(NavigationType.WANDER); @@ -272,6 +145,9 @@ public OutputType execute(HousingNPC npc, Player player, HousingWorld house, Can waypoints.getCurrentProvider().setPaused(false); } + Double delay = getValue("delay", Double.class); + Double xRange = getValue("xRange", Double.class); + Double yRange = getValue("yRange", Double.class); WanderWaypointProvider wander = (WanderWaypointProvider) waypoints.getCurrentProvider(); wander.setDelay(delay.intValue()); wander.setXYRange(xRange.intValue(), yRange.intValue()); @@ -297,9 +173,12 @@ public OutputType execute(HousingNPC npc, Player player, HousingWorld house, Can LinearWaypointProvider provider = (LinearWaypointProvider) waypoints.getCurrentProvider(); List path = (AbstractList) provider.waypoints(); path.clear(); - for (LocationData locationData : this.path) { + + boolean pauseUntilComplete = getValue("pauseUntilComplete", Boolean.class); + boolean loop = getValue("loop", Boolean.class); + for (LocationData locationData: (List) getProperty("path", ListProperty.class).getValue()) { Waypoint waypoint = new Waypoint(locationData.toLocation()); - if (!this.loop) { + if (!loop) { waypoint.addTrigger(new WaypointTrigger() { @Override public String description() { @@ -339,59 +218,6 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv execute(house.getNPC(npc.getId()), player, house, event, executor); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("npcId", npcId); - data.put("mode", mode.name()); - if (mode != NavigationType.STATIONARY) { - data.put("speed", speed); - } - if (mode == NavigationType.WANDER) { - data.put("delay", delay); - data.put("xRange", xRange); - data.put("yRange", yRange); - } - if (mode == NavigationType.PATH) { - data.put("path", path); - data.put("loop", loop); - data.put("pauseUntilComplete", pauseUntilComplete); - } - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - npcId = ((Double)data.get("npcId")).intValue(); - mode = NavigationType.valueOf((String) data.get("mode")); - if (data.containsKey("speed")) { - speed = (Double) data.get("speed"); - } - if (data.containsKey("delay")) { - delay = (Double) data.get("delay"); - } - if (data.containsKey("xRange")) { - xRange = (Double) data.get("xRange"); - } - if (data.containsKey("yRange")) { - yRange = (Double) data.get("yRange"); - } - if (data.containsKey("path")) { - for (Object locationData : (List) data.get("path")) { - if (path == null) { - path = new ArrayList<>(); - } - path.add(new Gson().fromJson(locationData.toString(), LocationData.class)); - } - } - if (data.containsKey("loop")) { - loop = (boolean) data.get("loop"); - } - if (data.containsKey("pauseUntilComplete")) { - pauseUntilComplete = (boolean) data.get("pauseUntilComplete"); - } - } - @Override public boolean requiresPlayer() { return false; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ParticleAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ParticleAction.java index a0904ffb..115a57ed 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ParticleAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ParticleAction.java @@ -1,437 +1,124 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.*; import com.al3x.housing2.Action.Actions.Utils.ParticleUtils; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Enums.*; +import com.al3x.housing2.Action.Properties.*; +import com.al3x.housing2.Enums.Locations; +import com.al3x.housing2.Enums.ParticleType; +import com.al3x.housing2.Enums.Particles; +import com.al3x.housing2.Enums.PushDirection; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Actions.ActionEnumMenu; import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Menus.PaginationMenu; -import com.al3x.housing2.Utils.*; -import com.comphenix.packetwrapper.wrappers.play.clientbound.WrapperPlayServerWorldParticles; -import com.comphenix.protocol.wrappers.WrappedParticle; -import com.google.gson.internal.LinkedTreeMap; -import org.bukkit.*; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.HandlePlaceholders; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.NumberUtilsKt; +import lombok.ToString; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.util.Vector; import java.util.*; +import java.util.function.BiFunction; import static com.al3x.housing2.Enums.Locations.*; -import static com.al3x.housing2.Enums.Particles.ParticleData.COLOR; import static com.al3x.housing2.Utils.Color.colorize; import static com.al3x.housing2.Utils.ItemBuilder.ActionType.SELECT_YELLOW; +@ToString public class ParticleAction extends HTSLImpl { - private Particles particle; - private Locations location = null; - private String customLocation = null; - private Locations location2 = null; - private String customLocation2 = null; - private PushDirection direction = null; - private String customDirection = null; - private boolean isLineRange = false; - private ParticleType type; - private Double radius; - private Double amount; - private boolean globallyVisible = false; - - // Custom data for particles - private Double speed = null; - private Float size = null; - private String color1 = null; - private String color2 = null; - public static HashMap> particlesCooldownMap = new HashMap<>(); public ParticleAction() { - super("Particle Action"); - this.particle = Particles.WHITE_SMOKE; - this.direction = PushDirection.FORWARD; - this.type = ParticleType.LINE; - this.location = INVOKERS_LOCATION; - this.location2 = INVOKERS_LOCATION; - this.isLineRange = true; - this.radius = 8D; - this.amount = 20D; - } - - @Override - public String toString() { - return "ParticleAction (Particle: " + particle + ", Type: " + type + ", Radius: " + radius + ", Direction: " + direction + ", Amount: " + amount + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("4461d9d06c0bf4a7af4b16fd12831e2be0cf42e6e55e9c0d311a2a8965a23b34"); - builder.name("&eDisplay Particles"); - builder.info("&eSettings", ""); - builder.info("Particle&6", particle.name()); - builder.info("Type&6", type.name()); - if ((type != ParticleType.CURVE && type != ParticleType.LINE) || isLineRange) { - builder.info("Radius", "&6" + radius); - } - if (type != ParticleType.DOT) { - builder.info("Amount", "&a" + amount); - } - builder.info("Location&a", ((location == Locations.CUSTOM || location == PLAYER_LOCATION) ? customLocation : location.name())); - if ((type == ParticleType.LINE || type == ParticleType.CURVE) && !isLineRange) { - builder.info("Location 2&a", ((location2 == Locations.CUSTOM || location2 == PLAYER_LOCATION) ? customLocation2 : location2.name())); - } - if (type == ParticleType.CURVE || type == ParticleType.LINE) { - builder.info("Direction&a", direction.name()); - } - - if (particle.getData() != null) { - for (String key : ParticleUtils.keys(particle)) { - switch (key) { - case "size" -> { - if (size == null) { - size = 1F; - } - builder.info("Size", "&6" + size); - } - case "color" -> { - if (color1 == null) { - color1 = "255,255,255"; - } - builder.info("Color 1", "&6" + color1); - } - case "color2" -> { - if (color2 == null) { - color2 = "255,255,255"; - } - builder.info("Color 2", "&6" + color2); - } - case "speed" -> { - if (speed == null) { - speed = 1D; - } - builder.info("Speed", "&6" + speed); - } - } - } - } - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("4461d9d06c0bf4a7af4b16fd12831e2be0cf42e6e55e9c0d311a2a8965a23b34"); - builder.name("&aDisplay Particles"); - builder.description("Do stuff with particles."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu editMenu, Player player) { - List items = new ArrayList<>(); - items.add(new ActionEditor.ActionItem("particle", - ItemBuilder.create(this.particle.getMaterial()) - .name("&eParticle") - .info("&7Current Value", "") - .info(null, "&a" + particle) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Particles.values(), null - )); - items.add(new ActionEditor.ActionItem("type", - ItemBuilder.create(type.getMaterial()) - .name("&eType") - .info("&7Current Value", "") - .info(null, "&a" + type) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, ParticleType.values(), null - )); - items.add(new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + ((location == Locations.CUSTOM || location == PLAYER_LOCATION) ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, editMenu, - (coords, location) -> { - customLocation = coords; - this.location = location; - if (location == PLAYER_LOCATION) { - Location loc = player.getLocation(); - this.customLocation = loc.getX() + "," + loc.getY() + "," + loc.getZ(); - } - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } - ) - )); - if ((type == ParticleType.LINE || type == ParticleType.CURVE) && !isLineRange) { - ActionEditor.ActionItem[] item1 = new ActionEditor.ActionItem[1]; - ActionEditor.ActionItem i = new ActionEditor.ActionItem("location2", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation 2") - .info("&7Current Value", "") - .info(null, "&a" + ((location2 == Locations.CUSTOM || location2 == PLAYER_LOCATION) ? customLocation2 : location2)) - .info(null, "") - .info(null, "&7&lMiddle Click to toggle between") - .info(null, "&7&lline range and location") - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.TOGGLE_RANGE), - (event, notExistant) -> { - if (event.getClick() == ClickType.MIDDLE) { - isLineRange = !isLineRange; - editMenu.setupItems(); - return true; - } - List> locs = new ArrayList<>(); - for (Locations loc : Locations.values()) { - locs.add(new Duple<>(loc, ItemBuilder.create(Material.COMPASS).name("&e" + loc.name()).lClick(SELECT_YELLOW))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect a location type", locs, player, house, editMenu, (o) -> { - getCoordinate(event, o, customLocation2, house, editMenu, - (coords, location) -> { - customLocation2 = coords; - this.location2 = location; - if (location == PLAYER_LOCATION) { - Location loc = player.getLocation(); - this.customLocation2 = loc.getX() + "," + loc.getY() + "," + loc.getZ(); - } - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } - ); - }).open(); - return true; - } - ); - item1[0] = i; - items.add(i); - } - if ((type != ParticleType.CURVE && type != ParticleType.LINE) || isLineRange) { - ItemBuilder itemBuilder = ItemBuilder.create(Material.SLIME_BALL) - .name("&eRadius/Length") - .info("&7Current Value", "") - .info(null, "&a" + radius) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - if (type == ParticleType.CURVE || type == ParticleType.LINE) { - itemBuilder - .info(null, "") - .info(null, "&7&lMiddle Click to toggle between") - .info(null, "&7&lline range and location") - .mClick(ItemBuilder.ActionType.TOGGLE_RANGE); - } - items.add(new ActionEditor.ActionItem("radius", - itemBuilder, - (e, o) -> { - if (e.getClick() == ClickType.MIDDLE) { - isLineRange = !isLineRange; - editMenu.setupItems(); - return true; - } - player.sendMessage(colorize("&ePlease enter the number you wish to see in chat!")); - editMenu.openChat(Main.getInstance(), "" + radius, (s) -> { - if (NumberUtilsKt.isDouble(s)) { - radius = Double.parseDouble(s); - if (radius < 0) { - radius = 0D; - } - if (radius > 40) { - radius = 40D; - } - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } - }); - return true; - } - ) - ); - } - - if (type == ParticleType.LINE || type == ParticleType.CURVE && isLineRange) { - items.add(new ActionEditor.ActionItem("direction", - ItemBuilder.create(Material.COMPASS) - .name("&eDirection") - .info("&7Current Value", "") - .info(null, "&a" + direction) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, PushDirection.values(), Material.COMPASS, - (event, obj) -> getDirection(event, obj, house, editMenu, (str, dir) -> { - customDirection = str; - direction = dir; - editMenu.open(); - })) - ); - } - - //May be deprecating this soon - if (type != ParticleType.DOT) { - items.add(new ActionEditor.ActionItem("amount", - ItemBuilder.create(Material.IRON_BARS) - .name("&eAmount") - .description("Amount of locations to spawn particles at. eg. A line with a radius of 8 and an amount of 8 will have 1 particle every block.") - .info("&7Current Value", "") - .info(null, "&a" + amount) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE, 1, 40 //Pretty easy to change the max value - ) - ); - } - - items.add(new ActionEditor.ActionItem("globallyVisible", - ItemBuilder.create(Material.ENDER_EYE) - .name("&eGlobally Visible") - .info("&7Current Value", "") - .info(null, "&a" + globallyVisible) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - (event, o) -> { - globallyVisible = !globallyVisible; - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - return true; - } + super( + ActionEnum.PARTICLE, + "Display Particle", + "Displays a particle effect.", + Material.FIREWORK_ROCKET, + List.of("particle") + ); + + getProperties().addAll(List.of( + new EnumProperty<>( + "particle", + "Particle", + "The particle to display.", + Particles.class + ).setValue(Particles.WHITE_SMOKE), + new EnumProperty<>( + "type", + "Type", + "The type of particle effect.", + ParticleType.class + ).setValue(ParticleType.LINE), + new LocationProperty( + "location", + "Location", + "The location to display the particle at." + ).setValue("INVOKERS_LOCATION"), + new BooleanProperty( + "isLineRange", + "Is Line Range", + "Used for line and curve types. If true, the particle will be displayed in a line from the location to the direction. If false, the particle will be displayed at the location." + ).setValue(true), + new NumberProperty( + "radius", + "Radius/Length", + "The radius of the circle or length of the line.", + 1.0, 20.0 + ).showIf(() -> (getValue("type", ParticleType.class) == ParticleType.LINE || getValue("type", ParticleType.class) == ParticleType.CURVE) && getValue("isLineRange", Boolean.class)).setValue("8"), + new LocationProperty( + "location2", + "Location 2", + "The second location to display the particle at." + ).showIf(() -> (getValue("type", ParticleType.class) == ParticleType.LINE || getValue("type", ParticleType.class) == ParticleType.CURVE) && !getValue("isLineRange", Boolean.class)).setValue("INVOKERS_LOCATION"), + new EnumProperty<>( + "direction", + "Direction", + "The direction of the particle.", + PushDirection.class + ).showIf(() -> getValue("type", ParticleType.class) == ParticleType.CURVE || (getValue("type", ParticleType.class) == ParticleType.LINE && getValue("isLineRange", Boolean.class))).setValue(PushDirection.FORWARD), + new NumberProperty( + "amount", + "Amount", + "The amount of particles to display.", + 1.0, 100.0 + ).showIf(() -> getValue("type", ParticleType.class) != ParticleType.DOT).setValue("20"), + new BooleanProperty( + "globallyVisible", + "Globally Visible", + "If true, the particle will be visible to all players in the world." + ), + new NumberProperty( + "size", + "Size", + "The size of the particle.", + 1.0, 10.0 + ).setValue("1.0").showIf(() -> getValue("particle", Particles.class).getData() != null && ParticleUtils.keys(getValue("particle", Particles.class)).contains("size")), + new ColorProperty( + "color", + "Color", + "The color of the particle." + ).setValue("FFFFFF").showIf(() -> getValue("particle", Particles.class).getData() != null && ParticleUtils.keys(getValue("particle", Particles.class)).contains("color")), + new ColorProperty( + "color2", + "Color 2", + "The second color of the particle." + ).setValue("FFFFFF").showIf(() -> getValue("particle", Particles.class).getData() != null && ParticleUtils.keys(getValue("particle", Particles.class)).contains("color2")), + new NumberProperty( + "speed", + "Extra", + "The speed of the particle.", + 0.0, 10.0 + ).setValue("1.0").showIf(() -> getValue("particle", Particles.class) != null && ParticleUtils.keys(getValue("particle", Particles.class)).contains("speed")) )); - - for (String key : ParticleUtils.keys(particle)) { - switch (key) { - case "size" -> { - if (size == null) { - size = 1F; - } - items.add(new ActionEditor.ActionItem("size", - ItemBuilder.create(Material.PAPER) - .name("&eSize") - .info("&7Current Value", "") - .info(null, "&a" + size) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, o) -> { - player.sendMessage(colorize("&ePlease enter the number you wish to see in chat!")); - editMenu.openChat(Main.getInstance(), "" + size, (s) -> { - if (NumberUtilsKt.isDouble(s)) { - size = Float.parseFloat(s); - if (size < 0) { - size = 0F; - } - if (size > 10) { - size = 10F; - } - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } - }); - return true; - } - )); - } - case "color" -> { - if (color1 == null) { - color1 = "255,255,255"; - } - items.add(new ActionEditor.ActionItem("color1", - ItemBuilder.create(Material.PINK_DYE) - .name("&eColor 1") - .info("&7Current Value", "") - .info(null, "&a" + color1) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, o) -> { - player.sendMessage(colorize("&ePlease enter the color in RGB format (0-255) separated by commas.")); - editMenu.openChat(Main.getInstance(), "255,255,255", (s) -> { - String[] split = s.split(","); - if (split.length != 3) { - player.sendMessage(colorize("&cInvalid color format!")); - return; - } - try { - int r = Integer.parseInt(split[0]); - int g = Integer.parseInt(split[1]); - int b = Integer.parseInt(split[2]); - if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - player.sendMessage(colorize("&cInvalid color format!")); - return; - } - color1 = s; - player.sendMessage(colorize("&aColor set to " + r + ", " + g + ", " + b + ".")); - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } catch (NumberFormatException e) { - player.sendMessage(colorize("&cInvalid color format!")); - } - }); - return true; - }) - ); - } - case "color2" -> { - if (color2 == null) { - color2 = "255,255,255"; - } - items.add(new ActionEditor.ActionItem("color2", - ItemBuilder.create(Material.PURPLE_DYE) - .name("&eColor 2") - .info("&7Current Value", "") - .info(null, "&a" + color2) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, o) -> { - player.sendMessage(colorize("&ePlease enter the color in RGB format (0-255) separated by commas.")); - editMenu.openChat(Main.getInstance(), "255,255,255", (s) -> { - String[] split = s.split(","); - if (split.length != 3) { - player.sendMessage(colorize("&cInvalid color format!")); - return; - } - try { - int r = Integer.parseInt(split[0]); - int g = Integer.parseInt(split[1]); - int b = Integer.parseInt(split[2]); - if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { - player.sendMessage(colorize("&cInvalid color format!")); - return; - } - color2 = s; - player.sendMessage(colorize("&aColor set to " + r + ", " + g + ", " + b + ".")); - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } catch (NumberFormatException e) { - player.sendMessage(colorize("&cInvalid color format!")); - } - }); - return true; - }) - ); - } - case "speed" -> { - if (speed == null) { - speed = 1D; - } - items.add(new ActionEditor.ActionItem("speed", - ItemBuilder.create(Material.FEATHER) - .name("&eExtra") - .description("This controls some odd properties for some particles, sometimes it controls the speed, other times it controls how they're colored.") - .info("&7Current Value", "") - .info(null, "&a" + speed) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, o) -> { - player.sendMessage(colorize("&ePlease enter the number you wish to see in chat!")); - editMenu.openChat(Main.getInstance(), "" + speed, (s) -> { - if (NumberUtilsKt.isDouble(s)) { - speed = Double.parseDouble(s); - if (speed < 0) { - speed = 0D; - } - if (speed > 10) { - speed = 10D; - } - Bukkit.getScheduler().runTask(Main.getInstance(), editMenu::open); - } - }); - return true; - } - )); - } - } - } - - return new ActionEditor(5, "&eParticle Settings", items); } public List getCircle(Location center, double radius, int amount) { @@ -482,7 +169,7 @@ public List getCurve(Location start, Location end, int amount, Player double increment = distance / amount; Vector direction = end.toVector().subtract(start.toVector()).normalize(); //curve the line in the direction its going - Vector curve = switch (this.direction) { + Vector curve = switch (getValue("direction", PushDirection.class)) { case UP, FORWARD -> new Vector(0, direction.getY(), 0).normalize(); case LEFT -> new Vector(direction.getZ(), 0, -direction.getX()).normalize(); case RIGHT -> new Vector(-direction.getZ(), 0, direction.getX()).normalize(); @@ -491,35 +178,8 @@ public List getCurve(Location start, Location end, int amount, Player case SOUTH -> new Vector(0, 0, direction.getZ()).normalize(); case EAST -> new Vector(direction.getX(), 0, 0).normalize(); case WEST -> new Vector(-direction.getX(), 0, 0).normalize(); - case CUSTOM -> { - if (customDirection == null) { - yield null; - } - String[] split = customDirection.split(","); - if (split.length != 2) { - yield null; - } - - try { - float pitch = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[0])); - float yaw = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[1])); - Vector vector = new Vector(); - double rotX = yaw; - double rotY = pitch; - vector.setY(-Math.sin(Math.toRadians(rotY))); - double xz = Math.cos(Math.toRadians(rotY)); - vector.setX(-xz * Math.sin(Math.toRadians(rotX))); - vector.setZ(xz * Math.cos(Math.toRadians(rotX))); - yield vector; - } catch (NumberFormatException e) { - yield null; - } - } default -> new Vector(0, 0, 0); }; - if (curve == null) { - return locations; - } for (double i = 0; i < distance; i += increment) { Location loc = start.clone().add(direction.clone().multiply(i)).add(curve.clone().multiply(Math.sin(i / distance * Math.PI) * 2)); locations.add(loc); @@ -529,7 +189,8 @@ public List getCurve(Location start, Location end, int amount, Player @Override public OutputType execute(Player player, HousingWorld house) { - Location location = locationFromLocations(player, house, null, this.location, this.customLocation); + Location location = getProperty("location", LocationProperty.class).getLocation(player, house, player.getLocation(), player.getEyeLocation()) + .add(0, player.getEyeHeight(), 0); if (location == null) { return OutputType.ERROR; } @@ -537,27 +198,9 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - private Location locationFromLocations(Player player, HousingWorld house, Location base, Locations location, String customLocation) { - switch (location == null ? INVOKERS_LOCATION : location) { - case INVOKERS_LOCATION -> { - return player.getEyeLocation().clone(); - } - case HOUSE_SPAWN -> { - return house.getSpawn().clone(); - } - case CUSTOM, PLAYER_LOCATION -> { - if (base != null) { - return getLocationFromString(player, base, player.getEyeLocation(), house, customLocation); - } - return getLocationFromString(player, house, customLocation); - } - } - return null; - } - private Location getLocationFromLookingAt(Player player, HousingWorld house, Location base, int range) { Vector direction = base.getDirection(); - switch (this.direction) { + switch (getValue("direction", PushDirection.class)) { case UP -> direction = new Vector(0, 1, 0); case DOWN -> direction = new Vector(0, -1, 0); case NORTH -> direction = new Vector(0, 0, -1); @@ -572,27 +215,6 @@ private Location getLocationFromLookingAt(Player player, HousingWorld house, Loc Vector dir = base.getDirection(); direction = new Vector(dir.getZ(), 0, -dir.getX()).normalize(); } - case CUSTOM -> { - String[] split = customDirection.split(","); - if (split.length != 2) { - return null; - } - //pitch,yaw - try { - float pitch = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[0])); - float yaw = Float.parseFloat(HandlePlaceholders.parsePlaceholders(player, house, split[1])); - Vector vector = new Vector(); - double rotX = yaw; - double rotY = pitch; - vector.setY(-Math.sin(Math.toRadians(rotY))); - double xz = Math.cos(Math.toRadians(rotY)); - vector.setX(-xz * Math.sin(Math.toRadians(rotX))); - vector.setZ(xz * Math.cos(Math.toRadians(rotX))); - direction = vector; - } catch (NumberFormatException e) { - return null; - } - } } Location loc = base.clone(); @@ -607,7 +229,11 @@ private Location getLocationFromLookingAt(Player player, HousingWorld house, Loc private void summonParticles(Player player, HousingWorld house, Location location) { List locations = new ArrayList<>(); - switch (type) { + Double radius = getProperty("radius", NumberProperty.class).parsedValue(house, player); + Double amount = getProperty("amount", NumberProperty.class).parsedValue(house, player); + boolean isLineRange = getValue("isLineRange", Boolean.class); + Particles particle = getValue("particle", Particles.class); + switch (getValue("type", ParticleType.class)) { case CIRCLE -> locations = getCircle(location, radius, amount.intValue()); case CURVE -> { Location loc2; @@ -615,7 +241,7 @@ private void summonParticles(Player player, HousingWorld house, Location locatio //Location loc2 = getLocationFromLookingAt(player, house, location, radius.intValue()); } else { - loc2 = locationFromLocations(player, house, (this.location != INVOKERS_LOCATION) ? location : null, location2, customLocation2); + loc2 = getProperty("location2", LocationProperty.class).getLocation(player, house, location, player.getEyeLocation()); } if (loc2 == null) { @@ -629,7 +255,7 @@ private void summonParticles(Player player, HousingWorld house, Location locatio //Location loc2 = getLocationFromLookingAt(player, house, location, radius.intValue()); } else { - loc2 = locationFromLocations(player, house, (this.location != INVOKERS_LOCATION) ? location : null, location2, customLocation2); + loc2 = getProperty("location2", LocationProperty.class).getLocation(player, house, location, player.getEyeLocation()); } if (loc2 == null) { return; @@ -653,7 +279,11 @@ private void summonParticles(Player player, HousingWorld house, Location locatio } else { particlesCooldownMap.put(player.getUniqueId(), new Duple<>(particle.name(), 0)); } - + String color1 = getProperty("color", ColorProperty.class).getValue(); + String color2 = getProperty("color2", ColorProperty.class).getValue(); + Float size = getProperty("size", NumberProperty.class).parsedValue(house, player).floatValue(); + boolean globallyVisible = getValue("globallyVisible", Boolean.class); + Double speed = getProperty("speed", NumberProperty.class).parsedValue(house, player); Object data = ParticleUtils.output(particle, color1, color2, size); if (globallyVisible) { for (Player p : house.getWorld().getPlayers()) { @@ -676,75 +306,6 @@ private void summonParticles(Player player, HousingWorld house, Location locatio } } - @Override - public boolean mustBeSync() { - return true; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("particle", particle); - data.put("type", type); - data.put("location", location); - data.put("customLocation", customLocation); - data.put("location2", location2); - data.put("customLocation2", customLocation2); - data.put("isLineRange", isLineRange); - data.put("radius", radius); - data.put("amount", amount); - data.put("direction", direction); - data.put("customDirection", customDirection); - data.put("globallyVisible", globallyVisible); - - if (particle.getData() != null) { - for (String key : ParticleUtils.keys(particle)) { - switch (key) { - case "size" -> data.put("size", size); - case "color" -> data.put("color", color1); - case "color2" -> data.put("color2", color2); - case "speed" -> data.put("speed", speed); - } - } - } - - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - particle = Particles.valueOf((String) data.get("particle")); - type = ParticleType.valueOf((String) data.get("type")); - location = Locations.valueOf((String) data.get("location")); - customLocation = (String) data.get("customLocation"); - location2 = Locations.valueOf((String) data.get("location2")); - customLocation2 = (String) data.get("customLocation2"); - isLineRange = (boolean) data.get("isLineRange"); - radius = (Double) data.get("radius"); - amount = (Double) data.get("amount"); - direction = PushDirection.valueOf((String) data.get("direction")); - customDirection = (String) data.get("customDirection"); - if (data.containsKey("globallyVisible")) { - globallyVisible = (boolean) data.get("globallyVisible"); - } - - if (particle.getData() != null) { - for (String key : ParticleUtils.keys(particle)) { - if (!data.containsKey(key)) { - continue; - } - switch (key) { - case "size" -> - size = data.get("size") == null ? 1F : NumberUtilsKt.toFloaT(data.get("size").toString()); - case "color" -> color1 = (String) data.getOrDefault("color", "255,255,255"); - case "color2" -> color2 = (String) data.getOrDefault("color2", "255,255,255"); - case "speed" -> - speed = data.get("speed") == null ? 1F : NumberUtilsKt.toDoublE(data.get("speed").toString()); - } - } - } - } - @Override public int limit() { return 10; @@ -755,101 +316,8 @@ public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "particle"; - } - @Override public String syntax() { - return "particle [customData]"; - } - - @Override - public String export(int indent) { - String loc = (location == CUSTOM || location == Locations.PLAYER_LOCATION) ? customLocation : location.name(); - String loc2 = (location2 == CUSTOM || location2 == Locations.PLAYER_LOCATION) ? customLocation2 : location2.name(); - - if (loc.contains("%")) { - loc = "\"" + loc + "\""; - } - if (loc2.contains("%")) { - loc2 = "\"" + loc2 + "\""; - } - - StringBuilder customData = new StringBuilder(); - List requireNonNull = ParticleUtils.keys(particle); - if (requireNonNull == null) { - return " ".repeat(indent) + keyword() + " " + particle.name() + " " + type.name() + " " + radius + " " + amount + " " + loc + " " + loc2; - } - for (String key : requireNonNull) { - switch (key) { - case "size" -> customData.append(" ").append(size); - case "color" -> customData.append(" ").append(color1); - case "color2" -> customData.append(" ").append(color2); - case "speed" -> customData.append(" ").append(speed); - } - } - - return " ".repeat(indent) + keyword() + " " + particle.name() + " " + type.name() + " " + radius + " " + amount + " " + loc + " " + loc2 + customData; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - particle = Particles.valueOf(parts[0]); - type = ParticleType.valueOf(parts[1]); - radius = Double.parseDouble(parts[2]); - amount = Double.parseDouble(parts[3]); - - Duple locationArg = handleArg(parts, 4); - if (Locations.fromString(locationArg.getSecond()) != null) { - location = Locations.fromString(locationArg.getSecond()); - } else { - location = CUSTOM; - customLocation = locationArg.getSecond(); - } - parts = locationArg.getFirst(); - - if (parts.length == 0) { - return nextLines; - } - - Duple location2Arg = handleArg(parts, 0); - if (Locations.fromString(location2Arg.getSecond()) != null) { - location2 = Locations.fromString(location2Arg.getSecond()); - } else { - location2 = CUSTOM; - customLocation2 = location2Arg.getSecond(); - } - parts = location2Arg.getFirst(); - - if (parts.length == 0) { - return nextLines; - } - - List requireNonNull = ParticleUtils.keys(particle); - if (requireNonNull == null) { - return nextLines; - } - for (int i = 0; i < requireNonNull.size(); i++) { - String key = requireNonNull.get(i); - Duple arg = handleArg(parts, i); - if (arg == null) { - continue; - } - if (key.equals("size")) { - size = Float.parseFloat(arg.getSecond()); - } else if (key.equals("color")) { - color1 = arg.getSecond(); - } else if (key.equals("color2")) { - color2 = arg.getSecond(); - } else if (key.equals("speed")) { - speed = Double.parseDouble(arg.getSecond()); - } - parts = arg.getFirst(); - } - - return nextLines; + return getScriptingKeywords().getFirst() + " [customData]"; } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/PauseAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/PauseAction.java index 84857e00..a038e236 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/PauseAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/PauseAction.java @@ -1,70 +1,38 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Placeholders.custom.Placeholder; import com.al3x.housing2.Utils.Duple; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.NumberUtilsKt; -import net.citizensnpcs.api.npc.NPC; -import org.bukkit.Bukkit; +import lombok.Getter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import java.util.*; - -import static com.al3x.housing2.Utils.Color.colorize; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +@Getter +@ToString public class PauseAction extends HTSLImpl implements NPCAction { - String duration = "5.0"; // in ticks public PauseAction() { - super("Pause Action"); - } - - @Override - public String toString() { - return "PauseAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&ePause Execution"); - builder.info("&eSettings", ""); - builder.info("Duration", "&a" + duration + " ticks"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&aPause Execution"); - builder.description("Pauses execution of the remaining actions for the specified amount of ticks."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("duration", - ItemBuilder.create(Material.CLOCK) - .name("&eTicks To Wait") - .description("The amount of ticks to wait before continuing. 1 second is 20 ticks.") - .info("&7Current Value", "") - .info(null, "&a" + duration) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) + super( + ActionEnum.PAUSE_EXECUTION, + "Pause Action", + "Pauses execution of the remaining actions for the specified amount of ticks.", + Material.CLOCK, + List.of("pause") ); - return new ActionEditor(4, "&ePause Action Settings", items); + getProperties().add( + new NumberProperty( + "duration", + "Duration", + "The amount of ticks to wait before continuing. 1 second is 20 ticks." + ).setValue("5") + ); } @Override @@ -72,48 +40,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.RUNNING; } - public String getDuration() { - return duration; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("duration", duration); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - if (data.containsKey("duration")) { - duration = data.get("duration").toString(); - } - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "pause"; - } - - @Override - public String export(int indent) { - return "pause " + (duration.contains(" ") ? "\"" + duration + "\"" : duration); - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - Duple durationArg = handleArg(action.split(" "), 0); - duration = durationArg.getSecond(); - return nextLines; - } - - @Override - public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/PlaySoundAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/PlaySoundAction.java index 10fc2544..419e1e4a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/PlaySoundAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/PlaySoundAction.java @@ -1,9 +1,9 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.LocationProperty; +import com.al3x.housing2.Action.Properties.SoundProperty; import com.al3x.housing2.Enums.Locations; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; @@ -14,6 +14,8 @@ import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; import com.al3x.housing2.Utils.StringUtilsKt; +import lombok.Getter; +import lombok.ToString; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Registry; @@ -25,145 +27,42 @@ import java.util.*; -import static com.al3x.housing2.Enums.Locations.CUSTOM; -import static com.al3x.housing2.Enums.Locations.PLAYER_LOCATION; +import static com.al3x.housing2.Enums.Locations.*; import static com.al3x.housing2.Utils.Color.colorize; +@Getter +@ToString public class PlaySoundAction extends HTSLImpl { - private Double volume; - private Double pitch; - private Sound sound; - private String customSound; - private String customLocation; - private Locations location; - public PlaySoundAction() { - super("Play Sound Action"); - this.volume = 1.0D; - this.pitch = 1.0D; - this.sound = Sound.ENTITY_EXPERIENCE_ORB_PICKUP; - this.customLocation = null; - this.location = Locations.INVOKERS_LOCATION; - } - - @Override - public String toString() { - return "PlaySoundAction (Volume: " + volume + ", Pitch: " + pitch + ", Sound: " + sound.toString() + ", Location: " + (location == CUSTOM ? customLocation : location) + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.NOTE_BLOCK); - builder.name("&ePlay Sound"); - builder.info("&eSettings", ""); - builder.info("Value", "&a" + (customSound == null ? sound.name(): customSound)); - builder.info("Volume", "&a" + volume); - builder.info("Pitch", "&a" + pitch); - builder.info("Location", "&a" + (location == CUSTOM ? customLocation : location)); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.NOTE_BLOCK); - builder.name("&aPlay Sound"); - builder.description("Play a sound with a custom pitch to the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - @SuppressWarnings("removal") - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = Arrays.asList( - new ActionEditor.ActionItem("sound", - ItemBuilder.create(Material.NOTE_BLOCK) - .name("&eSound") - .info("&7Current Value", "") - .info(null, "&a" + sound) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, obj) -> { - //Create a list of all the potion effects - List> soundDuple = new ArrayList<>(); - for (Sound type : Registry.SOUNDS) { - soundDuple.add(new Duple<>(type, ItemBuilder.create(Material.NOTE_BLOCK).name("&6" + StringUtilsKt.formatCapitalize(type.name())))); - } - //Basically because Sound isnt a ENUM we cant just use the enum class - new PaginationMenu<>(Main.getInstance(), - "&eSelect a Sound", soundDuple, - player, house, backMenu, (e, potion) -> { - if (e.isRightClick()) { - player.playSound(player.getLocation(), potion, this.volume.floatValue(), this.pitch.floatValue()); - } else { - sound = potion; - backMenu.open(); - } - }).open(); - return true; - } - ), - new ActionEditor.ActionItem("volume", - ItemBuilder.create(Material.IRON_BLOCK) - .name("&eVolume") - .info("&7Current Value", "") - .info(null, "&a" + volume) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ), - new ActionEditor.ActionItem("pitch", - ItemBuilder.create(Material.BELL) - .name("&ePitch") - .info("&7Current Value", "") - .info(null, "&a" + pitch) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ), - new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + (location == CUSTOM ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, backMenu, - (coords, location) -> { - if (location == CUSTOM) { - customLocation = coords; - } else { - customLocation = null; - } - this.location = location; - backMenu.open(); - } - ) - ), - new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&eCustom Sound") - .info("&7Current Value", "") - .info(null, "&a" + customSound) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .rClick(ItemBuilder.ActionType.CLEAR), - ActionEditor.ActionItem.ActionType.CUSTOM, 32, (event, o) -> { - if (event.isRightClick()) { - customSound = null; - } - backMenu.openChat(Main.getInstance(), customSound == null ? "" : customSound, (input) -> { - if (input == null || input.isEmpty()) { - player.sendMessage(colorize("&cPlease enter a valid sound name.")); - backMenu.open(); - return; - } - customSound = input; - backMenu.open(); - }); - return true; - }) + super(ActionEnum.PLAY_SOUND, + "Play Sound", + "Plays a sound at the specified location.", + Material.NOTE_BLOCK, + List.of("sound") ); - return new ActionEditor(4, "&ePlay Sound Action Settings", items); + getProperties().addAll(List.of( + new SoundProperty( + "sound", + "Sound", + "The sound to play." + ).setValue(Sound.ENTITY_EXPERIENCE_ORB_PICKUP), + new DoubleProperty( + "volume", + "Volume", + "The volume of the sound." + ).setValue(1.0), + new DoubleProperty( + "pitch", + "Pitch", + "The pitch of the sound." + ).setValue(1.0), + new LocationProperty( + "location", + "Location", + "The location to play the sound at." + ).setValue(INVOKERS_LOCATION) + )); } @Override @@ -173,93 +72,16 @@ public int limit() { @Override public OutputType execute(Player player, HousingWorld house) { - if (customSound == null) { - switch (location) { - case INVOKERS_LOCATION -> - player.playSound(player.getLocation(), sound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - case HOUSE_SPAWN -> - player.playSound(house.getSpawn(), sound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - case CUSTOM -> { - if (customLocation == null) return OutputType.ERROR; - Location loc = getLocationFromString(player, house, customLocation); - if (loc != null) - player.playSound(loc, sound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - } - } - } else { - switch (location) { - case INVOKERS_LOCATION -> - player.playSound(player.getLocation(), customSound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - case HOUSE_SPAWN -> - player.playSound(house.getSpawn(), customSound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - case CUSTOM -> { - if (customLocation == null) return OutputType.ERROR; - Location loc = getLocationFromString(player, house, customLocation); - if (loc != null) - player.playSound(loc, customSound, NumberUtilsKt.toFloat(volume), NumberUtilsKt.toFloat(pitch)); - } - } - } - + player.playSound( + getProperty("location", LocationProperty.class).getLocation(player, house, player.getLocation(), player.getEyeLocation()), + getProperty("sound", SoundProperty.class).getValue(), + NumberUtilsKt.toFloat(getProperty("volume", DoubleProperty.class).getValue()), + NumberUtilsKt.toFloat(getProperty("pitch", DoubleProperty.class).getValue())); return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("volume", volume); - data.put("pitch", pitch); - data.put("sound", sound.name()); - data.put("customSound", customSound); - data.put("location", location.name()); - data.put("customLocation", customLocation); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - volume = (Double) data.get("volume"); - pitch = (Double) data.get("pitch"); - sound = Sound.valueOf((String) data.get("sound")); - customSound = (String) data.get("customSound"); - customLocation = (String) data.get("customLocation"); - location = Locations.valueOf((String) data.get("location")); - } - - @Override - public String export(int indent) { - String loc = (location == CUSTOM || location == PLAYER_LOCATION) ? "\"" + customLocation + "\"" : location.name(); - return " ".repeat(indent) + keyword() + " " + sound.name() + " " + volume + " " + pitch + " " + loc; - } - - @Override - public String syntax() { - return "sound "; - } - - @Override - public String keyword() { - return "sound"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - sound = Sound.valueOf(parts[0]); - volume = Double.parseDouble(parts[1]); - pitch = Double.parseDouble(parts[2]); - if (Locations.fromString(parts[3]) != null) { - location = Locations.fromString(parts[3]); - } else { - location = CUSTOM; - Duple locationArg = handleArg(parts, 3); - customLocation = locationArg.getSecond(); - } - return nextLines; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/PlayerStatAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/PlayerStatAction.java index 34774c6b..56a1730c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/PlayerStatAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/PlayerStatAction.java @@ -1,7 +1,10 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Data.StatActionData; +import com.al3x.housing2.Action.Properties.AddStatInstanceProperty; +import com.al3x.housing2.Action.Properties.StatInstanceProperty; +import com.al3x.housing2.Action.Properties.StringProperty; +import com.al3x.housing2.Action.Properties.VersionProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Stat; @@ -14,6 +17,8 @@ import com.al3x.housing2.Utils.HandlePlaceholders; import com.al3x.housing2.Utils.ItemBuilder; import com.google.gson.Gson; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -24,192 +29,39 @@ import static com.al3x.housing2.Utils.Color.colorize; public class PlayerStatAction extends HTSLImpl { - - private static final Gson gson = new Gson(); - private String statName; - - private List statInstances = new ArrayList<>(); - - private StatOperation mode; - private StatValue value; - public PlayerStatAction() { - super("Player Stat Action"); - this.statName = "Kills"; - - this.statInstances.add(new StatInstance("player")); - } - - @Override - public String toString() { - // add the first 3 statinances then do ... more - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - sb.append(statInstances.get(i).mode).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); - if (i != Math.min(3, statInstances.size()) - 1) { - sb.append(", "); - } - } - if (statInstances.size() > 3) { - sb.append("... ").append(statInstances.size() - 3).append(" more"); - } - - return "PlayerStatAction (StatName: " + statName + ", StatInstances: " + sb.toString() + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eChange Player Stat"); - builder.info("&eSettings", ""); - builder.info("Stat", "&a" + statName); - if (statInstances.size() > 3) { - - } else { - builder.info("&eStat Changes", ""); - for (int i = 0; i < Math.min(3, statInstances.size()); i++) { - builder.info("Mode", "&6" + statInstances.get(i).mode); - builder.info("Value", "&a" + statInstances.get(i).value); - } - } - - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&aChange Player Stat"); - builder.description("Modify a stat of the player who triggered the action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - if (backMenu == null) { - return new ActionEditor(6, "&ePlayer Stat Action Settings"); - } - List items = new ArrayList<>(); - - items.add(new ActionEditor.ActionItem("statName", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + statName) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + super( + ActionEnum.PLAYER_STAT, + "Player Stat", + "Changes the stat of a Player.", + Material.FEATHER, + List.of("stat") + ); + + getProperties().addAll(List.of( + new StringProperty( + "statName", + "Stat Name", + "The name of the stat to modify." + ).setValue("Kills"), + new StatInstanceProperty( + ).setValue(new ArrayList<>(List.of( + new StatInstance() + ))), + new AddStatInstanceProperty(32), + new VersionProperty().setValue(0) )); - for (int i = 0; i < statInstances.size(); i++) { - StatInstance instance = statInstances.get(i); - ItemBuilder modeItem = ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + instance.mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - if (i > 0) { - modeItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - int finalI = i; - items.add(new ActionEditor.ActionItem("mode", - modeItem, - (event, obj) -> { - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - List> modes = new ArrayList<>(); - for (StatOperation mode : StatOperation.values()) { - if (mode.expressionOnly()) continue; - modes.add(new Duple<>(mode, ItemBuilder.create(mode.getMaterial()).name("&a" + mode))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect a mode", modes, backMenu.getOwner(), house, backMenu, (mode) -> { - instance.mode = mode; - backMenu.open(); - }).open(); - - return true; - } - )); - - ItemBuilder valueItem = ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + instance.value) - .info(null, "") - .info("Expression", (instance.value.isExpression() ? "&aEnabled" : "&cDisabled")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); - - if (i > 0) { - valueItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - items.add(new ActionEditor.ActionItem("value", - valueItem, - ActionEditor.ActionItem.ActionType.CUSTOM, (event, obj) -> { - if (event.getClick() == ClickType.MIDDLE) { - instance.value.setExpression(!instance.value.isExpression()); - backMenu.open(); - return true; - } - - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(instance); - backMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - if (instance.value.isExpression()) { - new ActionEditMenu(instance.value, Main.getInstance(), backMenu.getOwner(), house, backMenu).open(); - } else { - backMenu.getOwner().sendMessage(colorize("&ePlease enter the text you wish to set in chat!")); - backMenu.openChat(Main.getInstance(), instance.value.getLiteralValue(), (value) -> { - instance.value.setLiteralValue(value); - backMenu.getOwner().sendMessage(colorize("&aValue set to: &e" + value)); - Bukkit.getScheduler().runTaskLater(Main.getInstance(), backMenu::open, 1L); - }); - } - return true; - } - )); - } - - items.add(new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&aAdd Stat Expression") - .description("Add a new stat expression instance.\n\nBasically adds a new mode and value to the expression."), - ActionEditor.ActionItem.ActionType.CUSTOM, 50, (event, obj) -> { - if (statInstances.size() >= 6) { - backMenu.getOwner().sendMessage(colorize("&cYou can only have a maximum of 6 stat instances.")); - return false; - } - statInstances.add(new StatInstance("player")); - backMenu.open(); - return true; - } - )); - - return new ActionEditor(6, "&ePlayer Stat Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { if (player == null) return OutputType.ERROR; - String name = HandlePlaceholders.parsePlaceholders(player, house, statName); + String name = getProperty("statName", StringProperty.class).parseNoSpace(house, player); + if (name == null) return OutputType.ERROR; Stat stat = house.getStatManager().getPlayerStatByName(player, name); + List statInstances = getProperty("statInstances", StatInstanceProperty.class).getValue(); for (StatInstance instance : statInstances) { if (stat.modifyStat(instance.mode, HandlePlaceholders.parsePlaceholders(player, house, instance.value.calculate(player, house))) == null) { return OutputType.ERROR; @@ -234,102 +86,52 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - public String getStatName() { - return statName; - } - - public StatOperation getMode() { - return mode; - } - - public void setStatName(String name) { - this.statName = name; - } - - public void setMode(StatOperation mode) { - this.mode = mode; - } - - public StatValue getValue() { - return value; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("statName", statName); - data.put("statInstances", statInstances); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - statName = (String) data.get("statName"); - - if (data.containsKey("statInstances")) { - this.statInstances = dataToList(gson.toJsonTree(data.get("statInstances")).getAsJsonArray(), StatInstance.class); - } else { - statInstances = new ArrayList<>(); - StatInstance statInstance = new StatInstance("player"); - mode = StatOperation.valueOf((String) data.get("mode")); - value = gson.fromJson(gson.toJson(data.get("value")), StatActionData.MoreStatData.class).toStatValue(); - - statInstance.value = value; - statInstance.mode = mode; - } - } - - @Override - public String export(int indent) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < statInstances.size(); i++) { - sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); - if (i != statInstances.size() - 1) { - sb.append(" "); - } - } - return " ".repeat(indent) + keyword() + " \"" + statName + "\" " + sb.toString(); - } - - @Override - public String keyword() { - return "stat"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] parts = action.split(" "); - - Duple statArg = handleArg(parts, 0); - this.statName = statArg.getSecond(); - parts = statArg.getFirst(); - - ArrayList statInstances = new ArrayList<>(); - - StatInstance instance = new StatInstance("player"); - while (parts.length > 0) { - if (StatOperation.getOperation(parts[0]) != null) { - instance.mode = StatOperation.getOperation(parts[0]); - parts = Arrays.copyOfRange(parts, 1, parts.length); - continue; - } else { - instance.value = new StatValue("player"); - parts = instance.value.importValue(parts); - } - - if (instance.mode != null && instance.value != null) { - statInstances.add(instance); - instance = new StatInstance("player"); - } - } - - this.statInstances = statInstances; - - return nextLines; - } +// +// @Override +// public String export(int indent) { +// StringBuilder sb = new StringBuilder(); +// for (int i = 0; i < statInstances.size(); i++) { +// sb.append(statInstances.get(i).mode.getAlternative()).append(" ").append(Color.removeColor(statInstances.get(i).value.toString())); +// if (i != statInstances.size() - 1) { +// sb.append(" "); +// } +// } +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " \"" + statName + "\" " + sb.toString(); +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// String[] parts = action.split(" "); +// +// Duple statArg = handleArg(parts, 0); +// this.statName = statArg.getSecond(); +// parts = statArg.getFirst(); +// +// ArrayList statInstances = new ArrayList<>(); +// +// StatInstance instance = new StatInstance(); +// while (parts.length > 0) { +// if (StatOperation.getOperation(parts[0]) != null) { +// instance.mode = StatOperation.getOperation(parts[0]); +// parts = Arrays.copyOfRange(parts, 1, parts.length); +// continue; +// } else { +// instance.value = new StatValue(); +// parts = instance.value.importValue(parts); +// } +// +// if (instance.mode != null && instance.value != null) { +// statInstances.add(instance); +// instance = new StatInstance(); +// } +// } +// +// this.statInstances = statInstances; +// +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ProtoolsAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ProtoolsAction.java index 31070b9a..010dc73d 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ProtoolsAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ProtoolsAction.java @@ -1,6 +1,9 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.ProtoolsCoordsProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.ProtoolsType; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; @@ -27,198 +30,63 @@ @Setter @ToString public class ProtoolsAction extends Action { - String posA = "0,0,0"; - String posB = "0,0,0"; - ProtoolsType mode = ProtoolsType.SELECT; - String blockList = "grass_block"; - String blockList2 = "dirt"; - public ProtoolsAction() { - super("Protools Action"); - } - - @Override - public String toString() { - return "ProtoolsAction (" + "posA='" + posA + ", posB='" + posB + ", mode=" + mode + ", blockList='" + blockList + ", blockList2='" + blockList2 + ')'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - //Do nothing - } - - @Override - public void createDisplayItem(ItemBuilder builder, HousingWorld house) { - builder.material(Material.WOODEN_AXE); - builder.name("&eProtools"); - builder.info("&eSettings", ""); - builder.info("Mode", "&6" + mode.toString()); - if (mode == ProtoolsType.SELECT) { - builder.info("Pos A", "&a" + posA); - builder.info("Pos B", "&a" + posB); - } - if (mode == ProtoolsType.SET) { - builder.info("Block", "&d" + blockList); - } - if (mode == ProtoolsType.REPLACE) { - builder.info("Block", "&d" + blockList); - builder.info("Block 2", "&d" + blockList2); - } - if (mode == ProtoolsType.PASTE) { - builder.info("Paste Location", "&a" + posA); - } - if (mode == ProtoolsType.INSERT) { - builder.info("Insert Location", "&a" + posA); - } - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.WOODEN_AXE); - builder.name("&aProtools"); - builder.description("Execute a protools action"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = new ArrayList<>(); - items.add(new ActionEditor.ActionItem("mode", - ItemBuilder.create(mode.getMaterial()) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, ProtoolsType.values(), null)); - - if (mode == ProtoolsType.SELECT) { - items.add(new ActionEditor.ActionItem("posA", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&ePos A") - .info("&7Current Value", "") - .info(null, "&a" + posA) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.USE_SELECTION), - getPosFunction(backMenu, player, true))); - items.add(new ActionEditor.ActionItem("posB", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&ePos B") - .info("&7Current Value", "") - .info(null, "&a" + posB) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.USE_SELECTION), - getPosFunction(backMenu, player, false))); - } - - if (mode == ProtoolsType.SET) { - items.add(new ActionEditor.ActionItem("blockList", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&eBlock") - .info("&7Current Value", "") - .info(null, "&a" + blockList) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - } - - if (mode == ProtoolsType.REPLACE) { - items.add(new ActionEditor.ActionItem("blockList", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&eBlock 1") - .info("&7Current Value", "") - .info(null, "&a" + blockList) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - items.add(new ActionEditor.ActionItem("blockList2", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&eBlock 2") - .info("&7Current Value", "") - .info(null, "&a" + blockList2) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING)); - } - - if (mode == ProtoolsType.PASTE) { - //start location - items.add(new ActionEditor.ActionItem("posA", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&ePaste Location") - .info("&7Current Value", "") - .info(null, "&a" + posA) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.USE_SELECTION), - getPosFunction(backMenu, player, true))); - } - - if (mode == ProtoolsType.INSERT) { - //start location - items.add(new ActionEditor.ActionItem("posA", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&eInsert Location") - .info("&7Current Value", "") - .info(null, "&a" + posA) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.USE_SELECTION), - getPosFunction(backMenu, player, true))); - } - return new ActionEditor(4, "&eProtools Action Settings", items); - } - - private BiFunction getPosFunction(Menu backMenu, Player player, boolean isA) { - String value = isA ? posA : posB; - return (event, o) -> { - if (event.isLeftClick()) { - backMenu.openChat(Main.getInstance(), value, (s) -> { - if (isA) { - posA = s; - } else { - posB = s; - } - backMenu.open(); - }); - } else if (event.getClick() == ClickType.MIDDLE) { - Duple selection = Main.getInstance().getProtoolsManager().getSelection(player); - if (selection == null || selection.getFirst() == null) { - player.sendMessage("&cYou must select a region first!"); - return null; - } - if (isA) { - posA = String.format( - "%s,%s,%s", - selection.getFirst().getBlockX(), - selection.getFirst().getBlockY(), - selection.getFirst().getBlockZ() - ); - } else { - posB = String.format( - "%s,%s,%s", - selection.getSecond().getBlockX(), - selection.getSecond().getBlockY(), - selection.getSecond().getBlockZ() - ); - } - } - return true; - }; + super(ActionEnum.PROTOOLS_ACTION, + "Protools Action", + "Executes a protools action.", + Material.WOODEN_AXE, + List.of() + ); + + getProperties().addAll( + List.of( + new EnumProperty<>( + "mode", + "Mode", + "The protools action to execute.", + ProtoolsType.class, + Material.WOODEN_AXE + ).setValue(ProtoolsType.SELECT), + new ProtoolsCoordsProperty( + "posA", + "Position A", + "The first position to use for the action." + ).setValue("0,0,0").showIf(() -> getValue("mode", ProtoolsType.class) == ProtoolsType.SELECT || + getValue("mode", ProtoolsType.class) == ProtoolsType.PASTE || + getValue("mode", ProtoolsType.class) == ProtoolsType.INSERT + ), + new ProtoolsCoordsProperty( + "posB", + "Position B", + "The second position to use for the action." + ).setValue("0,0,0").showIf(() -> getValue("mode", ProtoolsType.class) == ProtoolsType.SELECT), + new StringProperty( + "blockList", + "Block List", + "The block list to use for the action." + ).setValue("grass_block").showIf(() -> getValue("mode", ProtoolsType.class) == ProtoolsType.SET || + getValue("mode", ProtoolsType.class) == ProtoolsType.REPLACE + ), + new StringProperty( + "blockList2", + "Block List 2", + "The second block list to use for the action." + ).setValue("dirt").showIf(() -> getValue("mode", ProtoolsType.class) == ProtoolsType.REPLACE) + ) + ); } @Override public OutputType execute(Player player, HousingWorld house) { - return OutputType.SUCCESS; //Not used - } - - @Override - public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + ProtoolsType mode = getValue("mode", ProtoolsType.class); ProtoolsManager protoolsManager = Main.getInstance().getProtoolsManager(); switch (mode) { case SELECT -> { - Location posA = getLocationFromString(player, house, this.posA); - Location posB = getLocationFromString(player, house, this.posB); + Location posA = getProperty("posA", ProtoolsCoordsProperty.class).getLocation(player, house); + Location posB = getProperty("posB", ProtoolsCoordsProperty.class).getLocation(player, house); if (posA == null || posB == null) { - player.sendMessage("&cInvalid positions!"); + player.sendMessage("§cInvalid positions!"); return OutputType.ERROR; } @@ -226,14 +94,14 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev } case SET -> { - protoolsManager.setRegionTo(house, house.getHouseUUID(), BlockList.fromString(blockList)); + protoolsManager.setRegionTo(house, house.getHouseUUID(), BlockList.fromString(getValue("blockList", String.class))); } case REPLACE -> { - BlockList from = BlockList.fromString(blockList); - BlockList to = BlockList.fromString(blockList2); + BlockList from = BlockList.fromString(getValue("blockList", String.class)); + BlockList to = BlockList.fromString(getValue("blockList2", String.class)); if (from == null || to == null) { - player.sendMessage("&cInvalid blocks!"); + player.sendMessage("§cInvalid blocks!"); return OutputType.ERROR; } protoolsManager.setRegionTo(house, house.getHouseUUID(), from, to); @@ -244,18 +112,18 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev } case PASTE -> { - Location posA = getLocationFromString(player, house, this.posA); + Location posA = getProperty("posA", ProtoolsCoordsProperty.class).getLocation(player, house); if (posA == null) { - player.sendMessage("&cInvalid position!"); + player.sendMessage("§cInvalid position!"); return OutputType.ERROR; } protoolsManager.pasteRegion(house, house.getHouseUUID(), posA, false); } case INSERT -> { - Location posA = getLocationFromString(player, house, this.posA); + Location posA = getProperty("posA", ProtoolsCoordsProperty.class).getLocation(player, house); if (posA == null) { - player.sendMessage("&cInvalid position!"); + player.sendMessage("§cInvalid position!"); return OutputType.ERROR; } protoolsManager.pasteRegion(house, house.getHouseUUID(), posA, true); @@ -269,17 +137,6 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("posA", posA); - data.put("posB", posB); - data.put("mode", mode.name()); - data.put("blockList", blockList); - data.put("blockList2", blockList2); - return data; - } - @Override public boolean requiresPlayer() { return false; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/RandomAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/RandomAction.java index 87f09dac..84fb6dad 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/RandomAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/RandomAction.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ActionsProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Instances.HTSLHandler; @@ -9,6 +10,9 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -17,58 +21,23 @@ import static com.al3x.housing2.Utils.Color.colorize; +@ToString +@Getter +@Setter public class RandomAction extends HTSLImpl implements NPCAction { - private static final Gson gson = new Gson(); - private List subActions; - - public RandomAction(ArrayList subactions) { - super("Random Action"); - this.subActions = subactions; - } - public RandomAction() { - super("Random Action"); - this.subActions = new ArrayList<>(); - } - - @Override - public String toString() { - return "RandomAction (SubActions: " + subActions.stream().map(Action::toString).reduce((a, b) -> a + ", " + b).orElse("") + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_CHEST); - builder.name("&eRandom Action"); - builder.description("Change the settings for this action"); - builder.info("&eSettings", ""); - builder.info("Actions", subActions.size()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_CHEST); - builder.name("&aRandom Action"); - builder.description("Executes a single random action form the selected actions."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("subActions", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aActions") - .info("&7Current Value", "") - .info(null, (subActions.isEmpty() ? "&cNo Actions" : "&a" + subActions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ACTION - ) + super(ActionEnum.RANDOM_ACTION, + "Random Action", + "Executes a random action from the list of actions.", + Material.ENDER_CHEST, + List.of("random") ); - return new ActionEditor(4, "&eChat Action Settings", items); + + getProperties().add(new ActionsProperty( + "subActions", + "Actions", + "The actions to execute." + )); } @Override @@ -83,6 +52,7 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + List subActions = getProperty("subActions", ActionsProperty.class).getValue(); if (subActions.isEmpty()) { return OutputType.SUCCESS; } @@ -100,85 +70,47 @@ public OutputType execute(Player player, HousingWorld house, CancellableEvent ev @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - execute(player, house, event, executor); } - public List getSubActions() { - return subActions; - } - - public void setSubActions(ArrayList subActions) { - this.subActions = subActions; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("subActions", ActionData.fromList(subActions)); - return data; - } - @Override public boolean requiresPlayer() { return false; } - - @Override - @SuppressWarnings("unchecked") - public void fromData(HashMap data, Class actionClass) { - if (!data.containsKey("subActions")) return; - // I don't know how this works lol - Object subActions = data.get("subActions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList actions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ActionData action = gson.fromJson(jsonObject, ActionData.class); - actions.add(action); - } - - this.subActions = ActionData.toList(actions); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Action action : subActions) { - if (!(action instanceof HTSLImpl impl)) continue; - builder.append(impl.export(indent + 4)).append("\n"); - } - if (builder.isEmpty()) return " ".repeat(indent) + keyword(); - return " ".repeat(indent) + keyword() + " {\n" + builder + " ".repeat(indent) + "}"; - } - +// +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Action action : subActions) { +// if (!(action instanceof HTSLImpl impl)) continue; +// builder.append(impl.export(indent + 4)).append("\n"); +// } +// if (builder.isEmpty()) return " ".repeat(indent) + getScriptingKeywords().getFirst(); +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " {\n" + builder + " ".repeat(indent) + "}"; +// } +// @Override public String syntax() { - return "random {\\n\\n}"; - } - - @Override - public String keyword() { - return "random"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - ArrayList subactions = new ArrayList<>(); - if (action.startsWith(indent + "{")) { - for (int i = 0; i < nextLines.size(); i++) { - String line = nextLines.get(i); - if (line.startsWith(indent + "}")) { - nextLines = new ArrayList<>(nextLines.subList(i + 1, nextLines.size())); - break; - } - subactions.add(line); - } - } - - ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); - - this.subActions = actions; - return nextLines; - } + return getScriptingKeywords().getFirst() + " {\\n\\n}"; + } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// ArrayList subactions = new ArrayList<>(); +// if (action.startsWith(indent + "{")) { +// for (int i = 0; i < nextLines.size(); i++) { +// String line = nextLines.get(i); +// if (line.startsWith(indent + "}")) { +// nextLines = new ArrayList<>(nextLines.subList(i + 1, nextLines.size())); +// break; +// } +// subactions.add(line); +// } +// } +// +// ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); +// +// this.subActions = actions; +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/RemoveItemAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/RemoveItemAction.java index b6ed48a9..a7334747 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/RemoveItemAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/RemoveItemAction.java @@ -1,9 +1,8 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.SlotProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; @@ -11,6 +10,7 @@ import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.Serialization; import com.al3x.housing2.Utils.StackUtils; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -20,104 +20,38 @@ import java.util.LinkedHashMap; import java.util.List; +@ToString public class RemoveItemAction extends Action { - ItemStack item; - double slot = -1; public RemoveItemAction() { - super("Remove Item Action"); - } - - @Override - public String toString() { - return "RemoveItemAction{" + - "item=" + item + - ", slot=" + slot + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CAULDRON); - builder.name("&eRemove Item"); - builder.info("&eSettings", ""); - builder.info("Item", (item == null ? "&cNone" : "&6" + item.getType())); - builder.info("Slot", slotIndexToName((int) slot)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CAULDRON); - builder.name("&aRemove Item"); - builder.description("Remove an item from the player's inventory."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = List.of( - new ActionEditor.ActionItem("item", ItemBuilder.create((item == null ? Material.BOOK : item.getType())) - .name("&aItem") - .description("Select a item to give") - .info("&7Current Value", "") - .info(null, (item == null ? "&cNone" : "&6" + StackUtils.getDisplayName(item))), - ActionEditor.ActionItem.ActionType.ITEM - ), - new ActionEditor.ActionItem("slot", ItemBuilder.create(Material.CHEST) - .name("&aSlot") - .description("Select a slot to give the item in") - .info("&7Current Value", "") - .info(null, slotIndexToName((int) slot)), - (e, o) -> { - new SlotSelectMenu((Player) e.getWhoClicked(), Main.getInstance(), backMenu, true, (slot) -> { - this.slot = slot; - }).open(); - return true; - } - ) + super(ActionEnum.REMOVE_ITEM, + "Remove Item", + "Removes an item from the player's inventory.", + Material.CAULDRON, + List.of("remove_item") ); - return new ActionEditor(4, "&eFunction Action Settings", items); - } - private String slotIndexToName(int index) { - if (index == -1) { - return "Any Slot"; - } - if (index == -2) { - return "Hand Slot"; - } - if (index == -3 || index == -106) { - return "Offhand Slot"; - } - if (index < 9 && index >= 0) { - return "Hotbar Slot " + (index + 1); - } - if (index < 36 && index >= 9) { - return "Inventory Slot " + (index - 8); - } - if (index == 103) { - return "Helmet"; - } - if (index == 102) { - return "Chestplate"; - } - if (index == 101) { - return "Leggings"; - } - if (index == 100) { - return "Boots"; - } - if (index >= 80 && index <= 83) { - return "Crafting Slot " + (index - 79); - } - return "Unknown Slot"; + getProperties().addAll(List.of( + new ItemStackProperty( + "item", + "Item", + "The item to remove." + ), + new SlotProperty( + "slot", + "Slot", + "The slot to remove the item from." + ).setValue(-1) + )); } @Override public OutputType execute(Player player, HousingWorld house) { - if (item == null) return OutputType.ERROR; + ItemStack item = getProperty("item", ItemStackProperty.class).getValue(); + int slot = getProperty("slot", SlotProperty.class).getValue(); + + if (item == null) { + return OutputType.ERROR; + } if (slot == -1) { player.getInventory().removeItemAnySlot(item); @@ -131,25 +65,6 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("item", Serialization.itemStackToBase64(item)); - data.put("slot", slot); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (IOException e) { - e.printStackTrace(); - Main.getInstance().getLogger().warning("Failed to load item from base64 string"); - } - slot = (double) data.get("slot"); - } - @Override public boolean requiresPlayer() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/RepeatAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/RepeatAction.java index 5baad234..929bd754 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/RepeatAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/RepeatAction.java @@ -1,6 +1,8 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ActionsProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Instances.HTSLHandler; @@ -12,6 +14,8 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -22,71 +26,30 @@ import java.util.List; +@ToString +@Getter public class RepeatAction extends HTSLImpl implements NPCAction { - private static final Gson gson = new Gson(); - private List subActions; - private String times; - - public RepeatAction(ArrayList subactions, String times) { - super("Repeat Action"); - this.subActions = subactions; - this.times = times; - } - public RepeatAction() { - super("Repeat Action"); - this.subActions = new ArrayList<>(); - this.times = "1"; - } - - @Override - public String toString() { - return "RepeatAction (SubActions: " + subActions.stream().map(Action::toString).reduce((a, b) -> a + ", " + b).orElse("") + "times: " + times + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.REPEATER); - builder.name("&eRepeat Action"); - builder.info("&eSettings", ""); - builder.info("Actions", subActions.size()); - builder.info("Times", times); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.REPEATER); - builder.name("&aRepeat Action"); - builder.description("Execute actions in the list multiple times"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ActionEnum.REPEAT, + "Repeat Action", + "Repeats the actions in the list a specified number of times.", + Material.REPEATER, + List.of("repeat") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("subActions", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aActions") - .info("&7Current Value", "") - .info(null, (subActions.isEmpty() ? "&cNo Actions" : "&a" + subActions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ACTION + getProperties().addAll(List.of( + new ActionsProperty( + "subActions", + "Actions", + "The actions to execute." ), - new ActionEditor.ActionItem("times", - ItemBuilder.create(Material.CLOCK) - .name("&aTimes") - .info("&7Current Value", "") - .info(null, "&a" + times) - .info(null, "") - .info(null, "&fMax: &c20 Times") - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) - ); - return new ActionEditor(4, "&eChat Action Settings", items); + new NumberProperty( + "times", + "Times", + "The number of times to repeat the actions.", + 1.0, 20.0 + ).setValue(5.0) + )); } @Override @@ -102,23 +65,12 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor oldExecutor) { + List subActions = getProperty("subActions", ActionsProperty.class).getValue(); if (subActions.isEmpty()) { return OutputType.SUCCESS; } - String times = HandlePlaceholders.parsePlaceholders(player, house, this.times); - - if (!NumberUtilsKt.isInt(times)) { - return OutputType.ERROR; - } - - int timesInt = Integer.parseInt(times); - if (timesInt < 1) { - return OutputType.ERROR; - } - if (timesInt > 20) { - timesInt = 20; - } + int timesInt = getProperty("times", NumberProperty.class).parsedValue(house, player).intValue(); ActionExecutor first = null; ActionExecutor last = null; @@ -154,91 +106,53 @@ public int limit() { return 5; } - public List getSubActions() { - return subActions; - } - - public void setSubActions(ArrayList subActions) { - this.subActions = subActions; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("subActions", ActionData.fromList(subActions)); - data.put("times", times); - return data; - } @Override public boolean requiresPlayer() { return false; } - @Override - @SuppressWarnings("unchecked") - public void fromData(HashMap data, Class actionClass) { - if (!data.containsKey("subActions")) return; - // I don't know how this works lol - Object subActions = data.get("subActions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList actions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ActionData action = gson.fromJson(jsonObject, ActionData.class); - actions.add(action); - } - - this.subActions = ActionData.toList(actions); - this.times = data.get("times").toString(); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Action action : subActions) { - if (!(action instanceof HTSLImpl impl)) continue; - builder.append(impl.export(indent + 4)).append("\n"); - } - if (builder.isEmpty()) return " ".repeat(indent) + keyword(); - return " ".repeat(indent) + keyword() + " " + times + " {\n" + builder + " ".repeat(indent) + "}"; - } +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Action action : subActions) { +// if (!(action instanceof HTSLImpl impl)) continue; +// builder.append(impl.export(indent + 4)).append("\n"); +// } +// if (builder.isEmpty()) return " ".repeat(indent) + getScriptingKeywords().getFirst(); +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " " + times + " {\n" + builder + " ".repeat(indent) + "}"; +// } @Override public String syntax() { - return keyword() + " {\\n\\n}"; - } - - @Override - public String keyword() { - return "repeat"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - if (indent.length() > 4 * 3) { - throw new IllegalArgumentException("Nesting limit reached"); //TODO: change this to a proper exception - } - if (action.contains(" ")) { - Duple timesArg = handleArg(action.split(" "), 0); - this.times = timesArg.getSecond(); - action = String.join(" ", timesArg.getFirst()); - } - ArrayList subactions = new ArrayList<>(); - if (action.startsWith("{")) { - for (int i = 0; i < nextLines.size(); i++) { - String line = nextLines.get(i); - if (line.startsWith(indent + "}")) { - nextLines = new ArrayList<>(nextLines.subList(i, nextLines.size())); - break; - } - subactions.add(line); - } - } - - ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); - - this.subActions = actions; - return nextLines; - } + return getScriptingKeywords().getFirst() + " {\\n\\n}"; + } + +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// if (indent.length() > 4 * 3) { +// throw new IllegalArgumentException("Nesting limit reached"); //TODO: change this to a proper exception +// } +// if (action.contains(" ")) { +// Duple timesArg = handleArg(action.split(" "), 0); +// this.times = timesArg.getSecond(); +// action = String.join(" ", timesArg.getFirst()); +// } +// ArrayList subactions = new ArrayList<>(); +// if (action.startsWith("{")) { +// for (int i = 0; i < nextLines.size(); i++) { +// String line = nextLines.get(i); +// if (line.startsWith(indent + "}")) { +// nextLines = new ArrayList<>(nextLines.subList(i, nextLines.size())); +// break; +// } +// subactions.add(line); +// } +// } +// +// ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); +// +// this.subActions = actions; +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ResetInventoryAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ResetInventoryAction.java index 77faaef4..78ac9ea2 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ResetInventoryAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ResetInventoryAction.java @@ -1,10 +1,12 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -12,34 +14,20 @@ import java.util.Arrays; import java.util.LinkedHashMap; +import java.util.List; import static com.al3x.housing2.Utils.Color.colorize; +@ToString public class ResetInventoryAction extends HTSLImpl { public ResetInventoryAction() { - super("Reset Inventory Action"); - } - - @Override - public String toString() { - return "ResetInventoryAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.STONE); - builder.name("&eReset Inventory"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.changeOrderLore(true); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.STONE); - builder.name("&aReset Inventory"); - builder.description("Resets the player's inventory."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super(ActionEnum.RESET_INVENTORY, + "Reset Inventory", + "Clears the player's inventory.", + Material.STONE, + List.of("clearInventory") + ); } @Override @@ -57,9 +45,4 @@ public LinkedHashMap data() { public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "clearInventory"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/RunAsNPCAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/RunAsNPCAction.java index e963228c..4deba403 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/RunAsNPCAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/RunAsNPCAction.java @@ -1,6 +1,8 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ActionsProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Instances.HTSLHandler; @@ -13,83 +15,44 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.*; - +@ToString +@Getter +@Setter public class RunAsNPCAction extends HTSLImpl { - private static final Gson gson = new Gson(); - private String npcId; - private List subActions; - public RunAsNPCAction(HousingNPC npc) { - super("Run As NPC Action"); - - this.npcId = String.valueOf(npc.getInternalID()); - this.subActions = new ArrayList<>(); - } - - public RunAsNPCAction(ArrayList subactions) { - super("Run As NPC Action"); - this.subActions = subactions; + this(); + getProperty("npcId", NumberProperty.class).setValue(String.valueOf(npc.getInternalID())); } public RunAsNPCAction() { - super("Run As NPC Action"); - this.subActions = new ArrayList<>(); - } - - @Override - public String toString() { - return "RunAsNPCAction{" + - "npcId=" + npcId + - ", subActions=" + subActions + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eRun As NPC Action"); - builder.description("Change the settings for this action"); - builder.info("&eSettings", ""); - builder.info("NPC ID", npcId); - builder.info("Actions", subActions.size()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&aRun As NPC Action"); - builder.description("Executes the action as an NPC"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.RUN_AS_NPC, + "Run As NPC Action", + "Executes the action as an NPC.", + Material.PLAYER_HEAD, + List.of("runAsNPC") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("npcId", - ItemBuilder.create(Material.PLAYER_HEAD) - .name("&aNPC ID") - .info("&7Current Value", "&e" + npcId) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING + getProperties().addAll(List.of( + new NumberProperty( + "npcId", + "NPC ID", + "The ID of the NPC to run the action as." ), - new ActionEditor.ActionItem("subActions", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aActions") - .info("&7Current Value", "") - .info(null, (subActions.isEmpty() ? "&cNo Actions" : "&a" + subActions.size() + " Action")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ACTION + new ActionsProperty( + "subActions", + "Actions", + "The actions to execute." ) - ); - return new ActionEditor(4, "&eChat Action Settings", items); + )); } @Override @@ -109,106 +72,62 @@ public OutputType execute(Player player, HousingWorld house) { @Override public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + List subActions = getProperty("subActions", ActionsProperty.class).getValue(); if (subActions.isEmpty()) { return OutputType.SUCCESS; } - String parsed = Placeholder.handlePlaceholders(npcId, house, player); - String npcId; - if (NumberUtilsKt.isInt(parsed)) { - npcId = parsed; - } else { - return OutputType.ERROR; - } + int npcId = getProperty("npcId", NumberProperty.class).parsedValue(house, player).intValue(); - HousingNPC npc = house.getNPC(Integer.parseInt(npcId)); + HousingNPC npc = house.getNPC(npcId); ActionExecutor executor1 = new ActionExecutor("runAsNPC", subActions); executor1.setLimits(executor.getLimits()); return executor1.execute(npc.getCitizensNPC(), player, house, event); } - public List getSubActions() { - return subActions; - } - - public void setSubActions(ArrayList subActions) { - this.subActions = subActions; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("subActions", ActionData.fromList(subActions)); - data.put("npcId", npcId); - return data; - } - @Override public boolean requiresPlayer() { return false; } - - @Override - @SuppressWarnings("unchecked") - public void fromData(HashMap data, Class actionClass) { - if (!data.containsKey("subActions")) return; - // I don't know how this works lol - Object subActions = data.get("subActions"); - JsonArray jsonArray = gson.toJsonTree(subActions).getAsJsonArray(); - ArrayList actions = new ArrayList<>(); - for (int i = 0; i < jsonArray.size(); i++) { - JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); - ActionData action = gson.fromJson(jsonObject, ActionData.class); - actions.add(action); - } - - this.subActions = ActionData.toList(actions); - this.npcId = String.valueOf(data.get("npcId")); - } - - @Override - public String export(int indent) { - StringBuilder builder = new StringBuilder(); - for (Action action : subActions) { - if (!(action instanceof HTSLImpl impl)) continue; - builder.append(impl.export(indent + 4)).append("\n"); - } - if (builder.isEmpty()) return " ".repeat(indent) + keyword(); - return " ".repeat(indent) + keyword() + " \"" + npcId + "\"" + " {\n" + builder + " ".repeat(indent) + "}"; - } +// +// @Override +// public String export(int indent) { +// StringBuilder builder = new StringBuilder(); +// for (Action action : subActions) { +// if (!(action instanceof HTSLImpl impl)) continue; +// builder.append(impl.export(indent + 4)).append("\n"); +// } +// if (builder.isEmpty()) return " ".repeat(indent) + getScriptingKeywords().getFirst(); +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " \"" + npcId + "\"" + " {\n" + builder + " ".repeat(indent) + "}"; +// } @Override public String syntax() { - return "runAsNPC {\\n\\n}"; - } - - @Override - public String keyword() { - return "runAsNPC"; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - if (action.contains(" ")) { - Duple npcIdArg = handleArg(action.split(" "), 0); - this.npcId = npcIdArg.getSecond(); - action = String.join(" ", npcIdArg.getFirst()); - } - ArrayList subactions = new ArrayList<>(); - if (action.startsWith("{")) { - for (int i = 0; i < nextLines.size(); i++) { - String line = nextLines.get(i); - if (line.startsWith(indent + "}")) { - nextLines = new ArrayList<>(nextLines.subList(i, nextLines.size())); - break; - } - subactions.add(line); - } - } - - ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); - - this.subActions = actions; - return nextLines; - } + return getScriptingKeywords().getFirst() + " {\\n\\n}"; + } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// if (action.contains(" ")) { +// Duple npcIdArg = handleArg(action.split(" "), 0); +// this.npcId = npcIdArg.getSecond(); +// action = String.join(" ", npcIdArg.getFirst()); +// } +// ArrayList subactions = new ArrayList<>(); +// if (action.startsWith("{")) { +// for (int i = 0; i < nextLines.size(); i++) { +// String line = nextLines.get(i); +// if (line.startsWith(indent + "}")) { +// nextLines = new ArrayList<>(nextLines.subList(i, nextLines.size())); +// break; +// } +// subactions.add(line); +// } +// } +// +// ArrayList actions = new ArrayList<>(HTSLHandler.importActions(String.join("\n", subactions), indent + " ")); +// +// this.subActions = actions; +// return nextLines; +// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SendTitleAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SendTitleAction.java index 0d0bf7fd..7bf9804a 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SendTitleAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SendTitleAction.java @@ -1,15 +1,17 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.IntegerProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.HandlePlaceholders; import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; import com.al3x.housing2.Utils.StringUtilsKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.kyori.adventure.text.Component; import net.kyori.adventure.title.Title; import org.bukkit.Material; @@ -24,175 +26,63 @@ import static com.al3x.housing2.Utils.Color.colorize; +@ToString +@Getter +@Setter public class SendTitleAction extends HTSLImpl { - - private String title; - private String subtitle; - private double fadeIn; - private double stay; - private double fadeOut; - public SendTitleAction() { - super("Send Title Action"); - this.title = "Title"; - this.subtitle = "Subtitle"; - this.fadeIn = 20; - this.stay = 20; - this.fadeOut = 20; - } - - public SendTitleAction(String title, String subtitle) { - super("Send Title Action"); - this.title = title; - this.subtitle = subtitle; - this.fadeIn = 20; - this.stay = 20; - this.fadeOut = 20; - } - - public SendTitleAction(String title, String subtitle, int fadeIn, int stay, int fadeOut) { - super("Send Title Action"); - this.title = title; - this.subtitle = subtitle; - this.fadeIn = fadeIn; - this.stay = stay; - this.fadeOut = fadeOut; - } - - @Override - public String toString() { - return "SendTitleAction (Title: " + title + ", Subtitle: " + subtitle + ", FadeIn: " + fadeIn + ", Stay: " + stay + ", FadeOut: " + fadeOut + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.BOOK); - builder.name("&eDisplay Title"); - builder.info("&eSettings", ""); - builder.info("Title", title); - builder.info("Subtitle", subtitle); - builder.info("Fade In Time", "&6" + fadeIn + " ticks"); - builder.info("Stay Time", "&6" + stay + " ticks"); - builder.info("Fade Out Time", "&6" + fadeOut + " ticks"); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.BOOK); - builder.name("&aDisplay Title"); - builder.description("Displays a Title and Subtitle to the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("title", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&eTitle") - .info("&7Current Value", "") - .info(null, "&a" + title) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("subtitle", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&eSubtitle") - .info("&7Current Value", "") - .info(null, "&a" + subtitle) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("fadeIn", - ItemBuilder.create(Material.CLOCK) - .name("&eFade In Time") - .info("&7Current Value", "") - .info(null, "&a" + fadeIn) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT - ), - new ActionEditor.ActionItem("stay", - ItemBuilder.create(Material.CLOCK) - .name("&eStay Time") - .info("&7Current Value", "") - .info(null, "&a" + stay) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT - ), - new ActionEditor.ActionItem("fadeOut", - ItemBuilder.create(Material.CLOCK) - .name("&eFade Out Time") - .info("&7Current Value", "") - .info(null, "&a" + fadeOut) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT - ) + super(ActionEnum.SEND_TITLE, + "Send Title", + "Sends a title and subtitle to the player.", + Material.BOOK, + List.of("title") ); - return new ActionEditor(4, "&eSend Title Action Settings", items); + getProperties().addAll(List.of( + new StringProperty( + "title", + "Title", + "The title to send." + ).setValue("Title"), + new StringProperty( + "subtitle", + "Subtitle", + "The subtitle to send." + ).setValue("Subtitle"), + new IntegerProperty( + "fadeIn", + "Fade In Time", + "The time it takes for the title to fade in.", + 0, 100 + ).setValue(20), + new IntegerProperty( + "stay", + "Stay Time", + "The time the title stays on screen.", + 0, 100 + ).setValue(20), + new IntegerProperty( + "fadeOut", + "Fade Out Time", + "The time it takes for the title to fade out.", + 0, 100 + ).setValue(20) + )); } @Override public OutputType execute(Player player, HousingWorld house) { - Component title = StringUtilsKt.housingStringFormatter(this.title, house, player); - Component subtitle = StringUtilsKt.housingStringFormatter(this.subtitle, house, player); - player.showTitle(Title.title(title, subtitle, Title.Times.times(Duration.ofMillis((long) fadeIn * 50), Duration.ofMillis((long) stay * 50), Duration.ofMillis((long) fadeOut * 50)))); + Component title = getProperty("title", StringProperty.class).component(house, player); + Component subtitle = getProperty("subtitle", StringProperty.class).component(house, player); + player.showTitle(Title.title(title, subtitle, Title.Times.times( + Duration.ofMillis(getProperty("fadeIn", IntegerProperty.class).getValue() * 50), + Duration.ofMillis(getProperty("stay", IntegerProperty.class).getValue() * 50), + Duration.ofMillis(getProperty("fadeOut", IntegerProperty.class).getValue() * 50)))); return OutputType.SUCCESS; } - public String getTitle() { - return title; - } - public String getSubtitle() { - return subtitle; - } - public double getFadeIn() { - return fadeIn; - } - public double getFadeOut() { - return fadeOut; - } - public double getStay() { - return stay; - } - public void setTitle(String title) { - this.title = title; - } - public void setSubtitle(String subtitle) { - this.subtitle = subtitle; - } - public void setFadeIn(int fadeIn) { - this.fadeIn = fadeIn; - } - public void setFadeOut(int fadeOut) { - this.fadeOut = fadeOut; - } - public void setStay(int stay) { - this.stay = stay; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("title", title); - data.put("subtitle", subtitle); - data.put("fadeIn", fadeIn); - data.put("stay", stay); - data.put("fadeOut", fadeOut); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "title"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SendToHouseAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SendToHouseAction.java index bb82a8be..1baaea55 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SendToHouseAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SendToHouseAction.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousesManager; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; @@ -13,62 +14,32 @@ public class SendToHouseAction extends HTSLImpl { - private String housingId; - public SendToHouseAction(String housingId) { - super("Send to House Action"); + this(); - this.housingId = housingId; + getProperty("housingId", StringProperty.class).setValue(housingId); } public SendToHouseAction() { - super("Send to House Action"); - } - - @Override - public String toString() { - return "SendToHouseAction{" + - "housingId=" + housingId + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.SPRUCE_DOOR); - builder.name("&eSend to House Action"); - builder.description("Send the player to a Housing"); - builder.info("&eSettings", ""); - builder.info("Housing ID", housingId); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.SPRUCE_DOOR); - builder.name("&eSend to House Action"); - builder.description("Send the player to a Housing"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ActionEnum.SEND_TO_HOUSE, + "Send to House", + "Sends the player to a housing.", + Material.SPRUCE_DOOR, + List.of("sendToHouse") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("housingId", - ItemBuilder.create(Material.SPRUCE_DOOR) - .name("&eHousing ID") - .info("&7Current Value", "&e" + housingId) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.HOUSE + getProperties().add( + new StringProperty( + "housingId", + "Housing ID", + "The ID of the housing to send the player to." ) ); - - return new ActionEditor(4, "&eSend to House Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { + String housingId = getProperty("housingId", StringProperty.class).getValue(); HousesManager housesManager = house.getPlugin().getHousesManager(); HousingWorld housingWorld = housesManager.getHouse(UUID.fromString(housingId)); @@ -85,31 +56,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; // Not used } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("housingId", housingId); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - @SuppressWarnings("unchecked") - public void fromData(HashMap data, Class actionClass) { - this.housingId = String.valueOf(data.get("housingId")); - } - - @Override - public String syntax() { - return "sendToHouse "; - } - - @Override - public String keyword() { - return "sendToHouse"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetGamemodeAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetGamemodeAction.java index 442b3735..ed83ce53 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetGamemodeAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetGamemodeAction.java @@ -1,9 +1,7 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.Gamemodes; import com.al3x.housing2.Enums.Projectile; @@ -11,6 +9,8 @@ import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.Getter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; @@ -20,92 +20,43 @@ import java.util.LinkedHashMap; import java.util.List; +@ToString +@Getter public class SetGamemodeAction extends HTSLImpl { - private Gamemodes gamemode; - public SetGamemodeAction() { - super("Set Gamemode Action"); - this.gamemode = Gamemodes.SURVIVAL; - } - - public SetGamemodeAction(Gamemodes gamemode) { - super("Launch Projectile Action"); - this.gamemode = Gamemodes.SURVIVAL; - } - - @Override - public String toString() { - return "SetGamemodeAction (Gamemode: " + gamemode + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.DAYLIGHT_DETECTOR); - builder.name("&eSet Gamemode"); - builder.info("&eSettings", ""); - builder.info("Gamemode", "&a" + gamemode.toString()); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DAYLIGHT_DETECTOR); - builder.name("&aSet Gamemode"); - builder.description("Sets a player's gamemode."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("gamemode", - ItemBuilder.create(Material.DAYLIGHT_DETECTOR) - .name("&eGamemode") - .info("&7Current Value", "") - .info(null, "&a" + gamemode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Gamemodes.values(), null - ) + super( + ActionEnum.SET_GAMEMODE, + "Set Gamemode", + "Sets the gamemode of a player.", + Material.DAYLIGHT_DETECTOR, + List.of("gamemode") ); - return new ActionEditor(4, "&eSet Gamemode Settings", items); + getProperties().add( + new EnumProperty<>( + "gamemode", + "Gamemode", + "The gamemode to set.", + Gamemodes.class + ).setValue(Gamemodes.SURVIVAL) + ); } @Override public OutputType execute(Player player, HousingWorld house) { if (player != null) { - player.setGameMode(gamemode.getGameMode()); + player.setGameMode(getValue("gamemode", Gamemodes.class).getGameMode()); } return OutputType.SUCCESS; } - @Override - public boolean mustBeSync() { - return true; - } - @Override public List disallowedEvents() { return Arrays.asList(EventType.PLAYER_QUIT); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("gamemode", gamemode); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "gamemode"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetHitDelayAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetHitDelayAction.java index 198f2b07..b6e9bd21 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetHitDelayAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetHitDelayAction.java @@ -1,116 +1,67 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Action.ActionEditor.ActionItem; -import com.al3x.housing2.Enums.StatOperation; +import com.al3x.housing2.Action.Properties.DoubleProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; +@ToString +@Getter +@Setter public class SetHitDelayAction extends HTSLImpl implements NPCAction { - - private double delay; - public SetHitDelayAction() { - super("Set Hit Delay Action"); - this.delay = 10; - } - - public SetHitDelayAction(int delay) { - super("Set Hit Delay Action"); - this.delay = delay; - } - - @Override - public String toString() { - return "SetHitDelayAction (Delay: " + this.delay + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("564af0db50a03f5d45a0c6dda47928981bf47ad66dd90a4dd7e92317dbe857d1"); - builder.name("&eSet Hit Delay"); - builder.info("&eSettings", ""); - builder.info("Delay", "&a" + delay); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("564af0db50a03f5d45a0c6dda47928981bf47ad66dd90a4dd7e92317dbe857d1"); - builder.name("&aSet Hit Delay"); - builder.description("Set the users hit delay. This is the time in ticks between each hit. Default is 10 ticks (0.5 seconds)"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.SET_HITDELAY, + "Set Hit Delay", + "Sets the hit delay for the player.", + Material.IRON_SWORD, + List.of("hitDelay") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionItem("delay", - ItemBuilder.create(Material.BOOK) - .name("&aDelay") - .info("&7Current Value", "") - .info(null, delay) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionItem.ActionType.INT - ) + getProperties().add( + new DoubleProperty( + "delay", + "Delay", + "The delay in ticks.", + 0.0, 100.0 + ).setValue(10.0) ); - return new ActionEditor(4, "&eHit Delay Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - player.setMaximumNoDamageTicks(NumberUtilsKt.toInt(delay)); + player.setMaximumNoDamageTicks(NumberUtilsKt.toInt(getValue("delay", DoubleProperty.class).getValue())); //This is not super simple to use lol :) - player.setNoDamageTicks(NumberUtilsKt.toInt(delay)); + player.setNoDamageTicks(NumberUtilsKt.toInt(getValue("delay", DoubleProperty.class).getValue())); return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("delay", delay); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "hitDelay"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (npc.getEntity() instanceof LivingEntity le) { - le.setMaximumNoDamageTicks(NumberUtilsKt.toInt(delay)); - le.setNoDamageTicks(NumberUtilsKt.toInt(delay)); + le.setMaximumNoDamageTicks(NumberUtilsKt.toInt(getValue("delay", DoubleProperty.class).getValue())); + le.setNoDamageTicks(NumberUtilsKt.toInt(getValue("delay", DoubleProperty.class).getValue())); } } - -// @Override -// public void fromData(HashMap data) { -// if (!data.containsKey("message")) return; -// message = (String) data.get("message"); -// } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetPlayerSlotAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetPlayerSlotAction.java index a6da805f..ed5cccb6 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetPlayerSlotAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetPlayerSlotAction.java @@ -1,8 +1,10 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; @@ -12,76 +14,32 @@ import java.util.List; public class SetPlayerSlotAction extends HTSLImpl { - private int slot; public SetPlayerSlotAction() { - super("Set Player Slot Action"); - this.slot = 1; - } - - public SetPlayerSlotAction(int slot) { - super("Set Player Slot Action"); - this.slot = slot; - } - - public String toString() { - return "SetPlayerSlotAction (Slot: " + this.slot + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST_MINECART); - builder.name("&eSet Player Slot"); - builder.info("&eSettings", ""); - builder.info("Slot", "&a" + slot); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST_MINECART); - builder.name("&aSet Player Slot"); - builder.description("Set the player's active hotbar slot."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionEditor.ActionItem("slot", - ItemBuilder.create(Material.CHEST) - .name("&aSlot") - .info("&7Current Value", "") - .info(null, slot) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT, 1, 9 - ) + super(ActionEnum.SET_PLAYER_SLOT, + "Set Player Slot", + "Set the player's active hotbar slot.", + Material.CHEST_MINECART, + List.of("playerSlot") ); - return new ActionEditor(4, "&ePlayer Slot Action Settings", items); + getProperties().addAll(List.of( + new NumberProperty( + "slot", + "Slot", + "The slot to set the player to.", + 1, 9 + ).setValue("1") + )); } - @Override public OutputType execute(Player player, HousingWorld house) { + int slot = getProperty("slot", NumberProperty.class).parsedValue(house, player).intValue(); player.getInventory().setHeldItemSlot(slot - 1); return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("slot", slot); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "playerSlot"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVelocityAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVelocityAction.java index f3aaa12a..f209e6c1 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVelocityAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVelocityAction.java @@ -1,6 +1,8 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; import com.al3x.housing2.Enums.PushDirection; import com.al3x.housing2.Enums.VelocityOperation; import com.al3x.housing2.Events.CancellableEvent; @@ -11,6 +13,9 @@ import com.al3x.housing2.Placeholders.custom.Placeholder; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Location; import org.bukkit.Material; @@ -21,103 +26,39 @@ import java.util.*; +@ToString +@Getter +@Setter public class SetVelocityAction extends HTSLImpl implements NPCAction { - - private PushDirection direction; - private VelocityOperation operation; - private String customDirection; - private String amount; - public SetVelocityAction() { - super("Set Velocity Action"); - this.direction = PushDirection.FORWARD; - this.operation = VelocityOperation.SET; - this.amount = "1.5"; - } - - public SetVelocityAction(String amount, PushDirection direction, VelocityOperation operation) { - super("Set Velocity Action"); - this.direction = direction; - this.amount = amount; - this.operation = operation; - } - - @Override - public String toString() { - return "SetVelocityAction (Operation: " + operation.toString() + ", Direction: " + direction.toString() + ", Amount: " + amount + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PISTON) - .name("&eSet Velocity") - .info("&eSettings", "") - .info("Operation", "&a" + operation) - .info("Direction", "&a" + (direction == PushDirection.CUSTOM ? customDirection : direction)) - .info("Power", "&a" + amount) - - .lClick(ItemBuilder.ActionType.EDIT_YELLOW) - .rClick(ItemBuilder.ActionType.REMOVE_YELLOW) - .shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PISTON) - .name("&aSet Velocity") - .description("Propel a player in a direction.") - .lClick(ItemBuilder.ActionType.ADD_YELLOW) - .extraLore("&8&oThank you Home Depot"); //Yes I did add #extraLore just for this joke - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu editMenu) { - List items = Arrays.asList( - new ActionEditor.ActionItem("operation", - ItemBuilder.create(Material.COMPASS) - .name("&eOperation") - .description("How the player's current velocity will be adjusted.") - .info("&7Current Value", "") - .info(null, "&a" + operation) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, obj) -> { - List> operations = new ArrayList<>(); - for (VelocityOperation operation : VelocityOperation.values()) { - operations.add(new Duple<>(operation, ItemBuilder.create(operation.getMaterial()).name("&a" + operation))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect an operation", operations, editMenu.getOwner(), house, editMenu, (operation) -> { - this.operation = operation; - editMenu.open(); - }).open(); - return true; - } - ), - new ActionEditor.ActionItem("direction", - ItemBuilder.create(Material.COMPASS) - .name("&eDirection") - .description("The direction of the velocity adjustment.") - .info("&7Current Value", "") - .info(null, "&a" + direction) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, PushDirection.values(), Material.COMPASS, - (event, obj) -> getDirection(event, obj, house, editMenu, (str, dir) -> { - customDirection = str; - direction = dir; - editMenu.open(); - }) - ), - new ActionEditor.ActionItem("amount", - ItemBuilder.create(Material.SLIME_BALL) - .name("&ePower") - .description("The amount of force to apply to the velocity adjustment.") - .info("&7Current Value", "") - .info(null, "&a" + amount) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) + super( + ActionEnum.SET_VELOCITY, + "Set Velocity", + "Sets the velocity of the player.", + Material.PISTON, + List.of("velocity") ); - return new ActionEditor(4, "&eSet Velocity Action Settings", items); + getProperties().addAll(List.of( + new EnumProperty<>( + "direction", + "Direction", + "The direction of the velocity adjustment.", + PushDirection.class + ).setValue(PushDirection.FORWARD), + new EnumProperty<>( + "operation", + "Operation", + "How the player's current velocity will be adjusted.", + VelocityOperation.class + ).setValue(VelocityOperation.SET), + new NumberProperty( + "amount", + "Power", + "The amount of force to apply to the velocity adjustment.", + 0.0, 100.0 + ).setValue("1.5") + )); } @Override @@ -132,18 +73,8 @@ public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEv public Vector execute(Vector playerVelocity, Location eyeLocation, Player player, HousingWorld house) { Vector velocityAdjustment = new Vector(); - double amount = 1.5; - try { - amount = Double.parseDouble(Placeholder.handlePlaceholders(this.amount, house, player)); - } catch (NumberFormatException e) { - return null; - } - - if (amount == 0) return null; - if (amount > 100) amount = 100; - if (amount < 0) amount = 0; - - switch (direction) { + double amount = getProperty("amount", NumberProperty.class).parsedValue(house, player); + switch (getValue("direction", PushDirection.class)) { case FORWARD -> velocityAdjustment.add(eyeLocation.getDirection().multiply(amount)); case BACKWARD -> velocityAdjustment.add(eyeLocation.getDirection().multiply(-amount)); case UP -> velocityAdjustment.add(new Vector(0, 1, 0).multiply(amount)); @@ -164,29 +95,11 @@ public Vector execute(Vector playerVelocity, Location eyeLocation, Player player Vector right = new Vector(direction.getZ(), 0, -direction.getX()).normalize().multiply(amount); velocityAdjustment.add(right); } - case CUSTOM -> { - if (customDirection == null) return null; - - String[] split = customDirection.split(","); - if (split.length != 2) return null; - - try { - double pitch = Math.toRadians(Float.parseFloat(Placeholder.handlePlaceholders(split[0], house, player))); - double yaw = Math.toRadians(Float.parseFloat(Placeholder.handlePlaceholders(split[1], house, player))); - - velocityAdjustment.add(new Vector() - .setX(Math.cos(pitch) * Math.sin(yaw)) - .setY(Math.sin(pitch)) - .setZ(Math.cos(pitch) * Math.cos(yaw)) - .multiply(amount)); - } catch (NumberFormatException e) { - return null; - } - } } //This way it can get two different velocities at the same time //ex. UP and FORWARD - switch (operation) { + + switch (getValue("operation", VelocityOperation.class)) { case VelocityOperation.SET -> playerVelocity = velocityAdjustment; case VelocityOperation.ADD -> playerVelocity.add(velocityAdjustment); case VelocityOperation.SUBTRACT -> playerVelocity.subtract(velocityAdjustment); @@ -208,41 +121,6 @@ public int limit() { return 10; } - public String getAmount() { - return amount; - } - - public PushDirection getDirection() { - return direction; - } - - //Won't do anything since it doesn't use this function - public void setAmount(String amount) { - this.amount = amount; - } - - public void setDirection(PushDirection direction) { - this.direction = direction; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("amount", amount); - data.put("customDirection", customDirection); - data.put("direction", direction); - data.put("operation", operation); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - this.amount = data.get("amount").toString(); - this.customDirection = (String) data.get("customDirection"); - this.direction = PushDirection.valueOf(data.get("direction").toString()); - this.operation = VelocityOperation.valueOf(data.get("operation").toString()); - } - @Override public boolean requiresPlayer() { return true; @@ -250,43 +128,6 @@ public boolean requiresPlayer() { @Override public String syntax() { - return "velocity "; - } - - @Override - public String export(int indent) { - String dir = direction == PushDirection.CUSTOM ? customDirection : direction.name(); - String operation = this.operation.asString(); - return " ".repeat(indent) + keyword() + " " + operation + " " + dir + " " + amount; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] split = action.split(" "); - - operation = VelocityOperation.fromString(split[0]); - Duple directionArg = handleArg(split, 1); - if (PushDirection.fromString(directionArg.getSecond()) == null) { - customDirection = directionArg.getSecond(); - direction = PushDirection.CUSTOM; - } else { - direction = PushDirection.fromString(directionArg.getSecond()); - } - split = directionArg.getFirst(); - - if (split.length == 0) { - return nextLines; - } - - Duple amountArg = handleArg(directionArg.getFirst(), 0); - amount = amountArg.getSecond(); - split = amountArg.getFirst(); - - return new ArrayList<>(Arrays.asList(split)); - } - - @Override - public String keyword() { - return "velocity"; + return getScriptingKeywords().getFirst() + " "; } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVoiceGroupAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVoiceGroupAction.java index 97424402..27027d6f 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVoiceGroupAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SetVoiceGroupAction.java @@ -1,13 +1,10 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.HandlePlaceholders; import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.StringUtilsKt; import com.al3x.housing2.Utils.VoiceChat; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -15,87 +12,32 @@ import java.util.LinkedHashMap; import java.util.List; -import static com.al3x.housing2.Utils.Color.colorize; - public class SetVoiceGroupAction extends HTSLImpl { - - private String groupName; - public SetVoiceGroupAction() { - super("Set Voice Group Action"); - this.groupName = "Cool group"; - } - - public SetVoiceGroupAction(String groupName) { - super("Set Voice Group Action"); - this.groupName = groupName; - } - - @Override - public String keyword() { - return "setGroup"; - } - - @Override - public String toString() { - return "SetVoiceGroupAction (Group Name: " + groupName + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.JUKEBOX); - builder.name("&eSet Voice Group"); - builder.info("&eSettings", ""); - builder.info("Group Name", groupName); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.JUKEBOX); - builder.name("&aSet Voice Group"); - builder.description("Sets a player's voice group to a named group."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ActionEnum.SET_VOICE_GROUP, + "Set Voice Group", + "Sets the voice group of a player.", + Material.JUKEBOX, + List.of("setGroup") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = List.of( - new ActionItem("groupName", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&aGroup Name") - .info("&7Current Value", "") - .info(null, groupName) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionItem.ActionType.STRING - ) + getProperties().add( + new StringProperty( + "groupName", + "Group Name", + "The name of the voice group." + ).setValue("Cool group") ); - return new ActionEditor(4, "&eSet Voice Group Action Settings", items); } @Override public OutputType execute(Player player, HousingWorld house) { - String groupName = HandlePlaceholders.parsePlaceholders(player, house, this.groupName); + String groupName = getProperty("groupName", StringProperty.class).parsedValue(house, player); VoiceChat.setPlayerGroup(player, groupName); return OutputType.SUCCESS; } - public String getGroupName() { - return groupName; - } - public void setGroupName(String name) { - this.groupName = name; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("groupName", groupName); - return data; - } - @Override public boolean requiresPlayer() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowBossbarAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowBossbarAction.java index bd1297e8..ccfe18b0 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowBossbarAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowBossbarAction.java @@ -1,9 +1,10 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Placeholders.custom.Placeholder; @@ -11,6 +12,9 @@ import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; import com.al3x.housing2.Utils.StringUtilsKt; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.kyori.adventure.bossbar.BossBar; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -23,100 +27,61 @@ import static com.al3x.housing2.Utils.Color.colorize; import static com.al3x.housing2.Utils.Color.fromColor; +@ToString +@Getter +@Setter public class ShowBossbarAction extends HTSLImpl { - - private String title; - private BossBar.Color barColor; - private BossBar.Overlay barStyle; - private String progress; - public ShowBossbarAction() { - super("Show Bossbar Action"); - this.title = "&eHello World!"; - this.barColor = BossBar.Color.WHITE; - this.barStyle = BossBar.Overlay.PROGRESS; - this.progress = "1.0"; - } - - @Override - public String toString() { - return "ShowBossbarAction (Title: " + title + ", BarColor: " + barColor + ", BarStyle: " + barStyle + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.WITHER_SKELETON_SKULL); - builder.name("&eDisplay Bossbar"); - builder.info("&eSettings", ""); - builder.info("Title", title); - builder.info("Color", barColor.name()); - builder.info("Style", barStyle.name()); - builder.info("Progress", progress); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.WITHER_SKELETON_SKULL); - builder.name("&aDisplay Bossbar"); - builder.description("Displays a bossbar for the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("title", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&eTitle") - .info("&7Current Value", "") - .info(null, "&a" + title) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("barColor", - ItemBuilder.create(fromColor(barColor)) - .name("&eBar Color") - .info("&7Current Value", "") - .info(null, "&a" + barColor.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, BossBar.Color.values(), null - ), - new ActionEditor.ActionItem("barStyle", - ItemBuilder.create(Material.FEATHER) - .name("&eBar Style") - .info("&7Current Value", "") - .info(null, "&a" + barStyle.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, BossBar.Overlay.values(), Material.FEATHER - ), - new ActionEditor.ActionItem("progress", - ItemBuilder.create(Material.WRITTEN_BOOK) - .name("&eProgress") - .description("Must be a number between 0.0 and 1.0.") - .info("&7Current Value", "") - .info(null, "&a" + progress) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) + super( + ActionEnum.SHOW_BOSSBAR, + "Show Bossbar", + "Shows a bossbar to the player.", + Material.WITHER_SKELETON_SKULL, + List.of("bossbar") ); - return new ActionEditor(4, "&eShow Bossbar Action Settings", items); + getProperties().addAll(List.of( + new StringProperty( + "title", + "Title", + "The title of the bossbar." + ).setValue("&eHello World!"), + new EnumProperty<>( + "barColor", + "Bar Color", + "The color of the bossbar.", + BossBar.Color.class + ).setValue(BossBar.Color.WHITE), + new EnumProperty<>( + "barStyle", + "Bar Style", + "The style of the bossbar.", + BossBar.Overlay.class + ).setValue(BossBar.Overlay.PROGRESS), + new DoubleProperty( + "progress", + "Progress", + "The progress of the bossbar.", + 0.0, 1.0 + ).setValue(1.0) + )); } @Override public OutputType execute(Player player, HousingWorld house) { try { - float progressFixed = Float.parseFloat(Placeholder.handlePlaceholders(progress, house, player)); + float progressFixed = Float.parseFloat(Placeholder.handlePlaceholders(getProperty("progress", DoubleProperty.class).toString(), house, player)); if (progressFixed > 1) { progressFixed = 1; } else if (progressFixed < 0) { progressFixed = 0; } - BossBar bossBar = BossBar.bossBar(StringUtilsKt.housingStringFormatter(title, house, player), progressFixed, barColor, barStyle); + BossBar bossBar = BossBar.bossBar( + getProperty("title", StringProperty.class).component(house, player), + progressFixed, + getValue("barColor", BossBar.Color.class), + getValue("barStyle", BossBar.Overlay.class) + ); bossBar.addViewer(player); if (!house.bossBars.containsKey(player.getUniqueId())) { house.bossBars.put(player.getUniqueId(), new ArrayList<>()); @@ -135,37 +100,8 @@ public List disallowedEvents() { return Arrays.asList(EventType.PLAYER_QUIT); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("title", title); - data.put("barColor", barColor.name()); - data.put("barStyle", barStyle.name()); - data.put("progress", progress); - return data; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - if (!data.containsKey("title")) return; - title = (String) data.get("title"); - try { - barColor = BossBar.Color.valueOf((String) data.getOrDefault("barColor", "WHITE")); - barStyle = BossBar.Overlay.valueOf((String) data.getOrDefault("barStyle", "PROGRESS")); - } catch (Exception e) { - barColor = BossBar.Color.WHITE; - barStyle = BossBar.Overlay.PROGRESS; - } - progress = data.get("progress").toString(); - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "bossbar"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowNPCAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowNPCAction.java index a6f638a7..53174bf7 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowNPCAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ShowNPCAction.java @@ -1,13 +1,13 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.ActionExecutor; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.NPCAction; -import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.*; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.trait.PlayerFilter; import org.bukkit.Material; @@ -16,32 +16,19 @@ import org.bukkit.event.Cancellable; import java.util.LinkedHashMap; +import java.util.List; +@ToString public class ShowNPCAction extends HTSLImpl implements NPCAction { public ShowNPCAction() { - super("Hide NPC Action"); - } - - @Override - public String toString() { - return "HideNPCAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.LIME_DYE); - builder.name("&eShow NPC"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.LIME_DYE); - builder.name("&aShow NPC"); - builder.description("Shows the NPC from the player who triggered the action."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.SHOW_NPC, + "Show NPC", + "Shows the NPC from the player who triggered the action.", + Material.LIME_DYE, + List.of("showNPC") + ); } @Override @@ -49,21 +36,11 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "showNPC"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { PlayerFilter filter = npc.getTraitNullable(PlayerFilter.class); diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SpawnGhostBlock.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SpawnGhostBlock.java index 5e37f03e..8bedcb6e 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SpawnGhostBlock.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SpawnGhostBlock.java @@ -1,130 +1,43 @@ package com.al3x.housing2.Action.Actions; -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem; -import com.al3x.housing2.Action.HTSLImpl; -import com.al3x.housing2.Action.OutputType; -import com.al3x.housing2.Enums.Locations; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.LocationProperty; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.Serialization; -import com.al3x.housing2.Utils.StackUtils; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.io.IOException; import java.util.*; -import static com.al3x.housing2.Enums.Locations.*; - public class SpawnGhostBlock extends HTSLImpl { - - private String customLocation; - private Locations location; - ItemStack item; - public SpawnGhostBlock() { - super("Spawn Ghost Block"); - this.location = Locations.INVOKERS_LOCATION; - this.customLocation = ""; - - } - - @Override - public String keyword() { - return "spawnGhostBlock"; - } - - @Override - public String toString() { - return "SpawnGhostBlock (" + location + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHAIN_COMMAND_BLOCK); - builder.name("&eSpawn Ghost Block"); - builder.info("&eSettings", ""); - builder.info("Location", (customLocation.isEmpty() ? "&6" + location.name() : "&6" + customLocation)); - builder.info("Item", (item == null ? "&cNone" : "&6" + item.getType())); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHAIN_COMMAND_BLOCK); - builder.name("&aSpawn Ghost Block"); - builder.description("Spawns a client-side block for the player."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ActionEnum.SPAWN_GHOST_BLOCK, + "Spawn Ghost Block", + "Spawns a ghost block for the player.", + Material.CHAIN_COMMAND_BLOCK, + List.of("spawnGhostBlock") + ); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = List.of( - new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + (location == CUSTOM ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, backMenu, - (coords, location) -> { - if (location == CUSTOM) { - customLocation = coords; - } else { - customLocation = null; - } - this.location = location; - if (location == PLAYER_LOCATION) { - customLocation = player.getLocation().getX() + "," + player.getLocation().getY() + "," + player.getLocation().getZ(); - } - Bukkit.getScheduler().runTask(Main.getInstance(), backMenu::open); - } - ) - ), - new ActionEditor.ActionItem("item", ItemBuilder.create((item == null ? Material.STONE : item.getType() == Material.AIR ? Material.WHITE_STAINED_GLASS : item.getType())) - .name("&aItem") - .description("Select a block to set") - .info("&7Current Value", "") - .info(null, (item == null ? "&cNone" : "&6" + StackUtils.getDisplayName(item))), - ActionEditor.ActionItem.ActionType.ITEM + getProperties().addAll(List.of( + new LocationProperty( + "location", + "Location", + "The location to spawn the ghost block at." + ).setValue("INVOKERS_LOCATION"), + new ItemStackProperty( + "item", + "Block", + "The block to spawn as a ghost block." ) - ); - return new ActionEditor(4, "&eSpawn Ghost Block Action Settings", items); + )); } @Override public OutputType execute(Player player, HousingWorld house) { - Location loc = null; - - switch (location) { - case INVOKERS_LOCATION -> loc = player.getLocation(); - case HOUSE_SPAWN -> loc = house.getSpawn(); - case CUSTOM, PLAYER_LOCATION -> { - loc = getLocationFromString(player, house, customLocation); - - System.out.println(loc); - - if (loc == null) { - return OutputType.SUCCESS; - } - loc.setX(Math.max(-255, Math.min(255, loc.getX()))); - loc.setZ(Math.max(-255, Math.min(255, loc.getZ()))); - loc.setY(Math.max(-64, Math.min(320, loc.getY()))); - loc.setYaw(((loc.getYaw() + 180) % 360 + 360) % 360 - 180); - loc.setPitch(Math.max(-90, Math.min(90, loc.getPitch()))); - } - } - + Location loc = getProperty("location", LocationProperty.class).getLocation(player, house); + ItemStack item = getValue("item", ItemStack.class); if (loc == null) { return OutputType.SUCCESS; } @@ -143,50 +56,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("location", location.name()); - data.put("customLocation", customLocation); - data.put("item", Serialization.itemStackToBase64(item)); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - try { - location = valueOf((String) data.get("location")); - } catch (IllegalArgumentException e) { - location = INVOKERS_LOCATION; - } - if (data.get("customLocation") == null && location == CUSTOM) { - customLocation = null; - location = INVOKERS_LOCATION; - return; - } - customLocation = (String) data.get("customLocation"); - - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (IOException e) { - e.printStackTrace(); - Main.getInstance().getLogger().warning("Failed to load item from base64 string"); - } - } - - @Override - public String export(int indent) { - String loc = (location == CUSTOM || location == PLAYER_LOCATION) ? "\"" + customLocation + "\"" : location.name(); - return " ".repeat(indent) + keyword() + " " + loc + " " + item.getItemMeta().getDisplayName(); - } - - @Override - public String syntax() { - return "spawnGhostBlock "; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/StartHouseMusicAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/StartHouseMusicAction.java index df88d04b..1d213eeb 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/StartHouseMusicAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/StartHouseMusicAction.java @@ -1,10 +1,12 @@ package com.al3x.housing2.Action.Actions; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -12,31 +14,17 @@ import java.util.LinkedHashMap; import java.util.List; +@ToString public class StartHouseMusicAction extends HTSLImpl { public StartHouseMusicAction() { - super("Start House Music Action"); - } - - @Override - public String toString() { - return "StartHouseMusicAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_PIGSTEP); - builder.name("&eStart House Music"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_PIGSTEP); - builder.name("&aStart House Music"); - builder.description("Starts the house music."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.START_HOUSE_MUSIC, + "Start House Music", + "Starts the house music.", + Material.MUSIC_DISC_PIGSTEP, + List.of("startHouseMusic") + ); } @Override @@ -50,18 +38,8 @@ public List disallowedEvents() { return Arrays.asList(EventType.PLAYER_QUIT); } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "startHouseMusic"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/StatValue.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/StatValue.java index 770e99d2..7b715a0b 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/StatValue.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/StatValue.java @@ -1,280 +1,62 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.*; +import com.al3x.housing2.Action.Properties.StatValueProperty.StatValueInstance; import com.al3x.housing2.Action.StatInstance; +import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Enums.StatOperation; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Stat; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Actions.ActionEditMenu; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.PaginationMenu; -import com.al3x.housing2.Utils.Duple; -import com.al3x.housing2.Utils.HandlePlaceholders; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.StringUtilsKt; -import kotlin.text.MatchResult; -import kotlin.text.Regex; -import org.bukkit.Bukkit; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import java.util.*; - -import static com.al3x.housing2.Action.HTSLImpl.handleArg; -import static com.al3x.housing2.Utils.Color.colorize; - -public class StatValue extends Action { - private String statType; - private boolean isExpression; - private String literalValue; - private StatValue value; - private List statInstances = new ArrayList<>(); - - public StatValue(String statType) { - super("StatValue"); - this.literalValue = "1.0"; - this.value = null; - this.isExpression = false; - this.statType = statType; - } - - public StatValue(String statType, boolean isExpression, String literalValue, StatValue value, List statInstances) { - super("StatValue"); - this.statType = statType == null ? "stat" : statType; - this.isExpression = isExpression; - this.literalValue = literalValue; - this.value = value; - this.statInstances = statInstances; - } - - public StatValue(boolean isGlobal, boolean isExpression, String literalValue, StatValue value, List statInstances) { - super("StatValue"); - this.statType = isGlobal ? "global" : "player"; - this.isExpression = isExpression; - this.literalValue = literalValue; - this.value = value; - this.statInstances = statInstances; - } - - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu editMenu) { - //If they are somehow seeing it then it's an error - if (editMenu == null) - return new ActionEditor(6, "&e" + StringUtilsKt.formatCapitalize(statType) + " Stat > Value", new ActionEditor.ActionItem( - ItemBuilder.create(Material.BARRIER) - .name("&cError") - .description("There was an error creating this menu, please contact an admin if this issue persists."), - ActionEditor.ActionItem.ActionType.CUSTOM, 5, (event, obj) -> false - )); - ArrayList items = new ArrayList<>(); - if (isExpression) { - literalValue = null; - if (statInstances.isEmpty()) { //contains the mode and second value - value = new StatValue(statType); - statInstances.add(new StatInstance(statType)); - } - - StatValue previousValue = value; - - //If the first mode is not a MODE operation, add a value1 item - if (!statInstances.isEmpty() && statInstances.getFirst().mode.getArgs().indexOf("MODE") != 0) { - ItemBuilder valueItem = ItemBuilder.create(Material.BOOK) - .name("&e" + statInstances.getFirst().mode.getArgs().getFirst()) - .info("&7Current Value", "") - .info(null, "&a" + previousValue.asString()) - .info(null, "") - .info("Expression", (previousValue.isExpression() ? "&aEnabled" : "&cDisabled")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); - - items.add(new ActionEditor.ActionItem("value", - valueItem, - ActionEditor.ActionItem.ActionType.CUSTOM, (event, obj) -> { - if (event.getClick() == ClickType.MIDDLE) { - previousValue.setExpression(!previousValue.isExpression()); - editMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - if (previousValue.isExpression()) { - new ActionEditMenu(previousValue, Main.getInstance(), editMenu.getOwner(), house, editMenu).open(); - } else { - editMenu.getOwner().sendMessage(colorize("&ePlease enter the text you wish to set in chat: ")); - editMenu.openChat(Main.getInstance(), previousValue.getLiteralValue(), (value) -> { - previousValue.setLiteralValue(value); - editMenu.getOwner().sendMessage(colorize("&aValue set to: &e" + value)); - Bukkit.getScheduler().runTaskLater(Main.getInstance(), editMenu::open, 1L); - }); - } - - return true; - } - )); - } - - for (int i = 0; i < statInstances.size(); i++) { - StatInstance statInstance = statInstances.get(i); - StatOperation mode = statInstance.mode; - - int finalI = i; - - ItemBuilder modeItem = ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + statInstance.mode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - if (i > 0) { //Basically if it's not the first item - modeItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - items.add(new ActionEditor.ActionItem("", - modeItem, - ActionEditor.ActionItem.ActionType.CUSTOM, - (event, obj) -> { - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(statInstance); - editMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return true; - - List> modes = new ArrayList<>(); - for (StatOperation statOperation : StatOperation.values()) { - modes.add(new Duple<>(statOperation, ItemBuilder.create(statOperation.getMaterial()).name("&a" + StringUtilsKt.formatCapitalize(statOperation.name())))); - } - new PaginationMenu<>(Main.getInstance(), "&eSelect a mode", modes, editMenu.getOwner(), house, editMenu, (output) -> { - statInstance.mode = output; - editMenu.open(); - }).open(); - return true; - } - )); - - int argIndex = (mode.getArgs().indexOf("MODE") == 0) ? 1 : 2; - ItemBuilder valueItem = ItemBuilder.create(Material.BOOK) - .name("&e" + mode.getArgs().get(argIndex)) - .info("&7Current Value", "") - .info(null, "&a" + statInstance.value.asString()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); - - if (!mode.expressionOnly()) { - valueItem.info(null, ""); - valueItem.info("Expression", (statInstance.value.isExpression() ? "&aEnabled" : "&cDisabled")); - valueItem.mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); - } - - if (i > 0) { //Basically if it's not the first item - valueItem.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - } - - items.add(new ActionEditor.ActionItem("value1", - valueItem, - ActionEditor.ActionItem.ActionType.CUSTOM, - (event, obj) -> { - if (event.getClick() == ClickType.MIDDLE && !mode.expressionOnly()) { - statInstance.value.setExpression(!statInstance.value.isExpression()); - editMenu.open(); - return true; - } - - if (event.getClick() == ClickType.RIGHT && finalI > 0) { - statInstances.remove(statInstance); - editMenu.open(); - return true; - } - - if (event.getClick() != ClickType.LEFT) return false; - - if (statInstance.value.isExpression()) { - new ActionEditMenu(statInstance.value, Main.getInstance(), editMenu.getOwner(), house, editMenu).open(); - } else { - editMenu.getOwner().sendMessage(colorize("&ePlease enter the text you wish to set in chat!")); - editMenu.openChat(Main.getInstance(), statInstance.value.getLiteralValue(), (value) -> { - statInstance.value.setLiteralValue(value); - editMenu.getOwner().sendMessage(colorize("&aValue set to: &e" + value)); - Bukkit.getScheduler().runTaskLater(Main.getInstance(), editMenu::open, 1L); - }); - } - return true; - } - )); - } - } else { - statInstances.clear(); - value = null; - if (literalValue == null) literalValue = "1.0"; - items.addAll(Arrays.asList( - new ActionEditor.ActionItem("literalValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + literalValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ) - )); - } - - items.add(new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&aAdd Stat Expression") - .description("Add a new stat expression instance.\n\nBasically adds a new mode and value to the expression."), - ActionEditor.ActionItem.ActionType.CUSTOM, 50, (event, obj) -> { - if (statInstances.getLast().mode.expressionOnly()) { - editMenu.getOwner().sendMessage(colorize("&cYou can't add another stat change to this expression.")); - return false; - } - if (statInstances.size() >= 6) { - editMenu.getOwner().sendMessage(colorize("&cYou can only have a maximum of 6 stat instances.")); - return false; - } - statInstances.add(new StatInstance(statType)); - editMenu.open(); - return true; - } +import java.util.ArrayList; +import java.util.List; + +@Getter +@Setter +public class StatValue extends Action.InternalAction { + public StatValue() { + super( + "StatValue", + //everything below this doesnt matter + "Stat Value", + "A value for a stat.", + Material.BOOK, + List.of() + ); + + getProperties().addAll(List.of( + new StatValueProperty( + "value" + ), + new StatInstanceProperty() + .setValue(new ArrayList<>(List.of( + new StatInstance() + ))), + new AddStatInstanceProperty(32) )); - - items.remove(null); - return new ActionEditor(6, getTitle((ActionEditMenu) editMenu), items); } public String calculate(Player player, HousingWorld world) throws NumberFormatException { - if (!isExpression) return HandlePlaceholders.parsePlaceholders(player, world, literalValue); + StatValueInstance statValueInstance = getValue("value", StatValueInstance.class); + if (statValueInstance == null) return "0.0"; + //Look for a stat in value1 and modify it with value2 - StatValue value1 = this.value; + StatValue value1 = statValueInstance.getExpressionValue(); - if (value1 == null) return "0.0"; - String result = value1.calculate(player, world); + String result = value1 == null ? + statValueInstance.getLiteralValue() : + value1.calculate(player, world); + + List statInstances = getProperty("statInstances", StatInstanceProperty.class).getValue(); for (StatInstance statInstance : statInstances) { StatOperation mode = statInstance.mode; - StatValue value2 = statInstance.value; - - if (mode == StatOperation.SET) { - if (value1.isExpression) { - Stat stat = world.getStatManager().getPlayerStatByName(player, value1.calculate(player, world)); - if (stat != null) return stat.modifyStat(StatOperation.SET, value2.calculate(player, world)); - } - - Regex statPattern = new Regex("(.+|)%stat\\.player/([a-zA-Z0-9_]+)%(.+?|)"); - MatchResult playerMatch = statPattern.find(value1.literalValue, 0); - if (playerMatch != null && playerMatch.getGroups().size() == 4) { - String prefix = playerMatch.getGroups().get(1).getValue(); - String statName = playerMatch.getGroups().get(2).getValue(); - String suffix = playerMatch.getGroups().get(3).getValue(); - if (prefix.isEmpty() && suffix.isEmpty()) { - Stat stat = world.getStatManager().getPlayerStatByName(player, statName); - if (stat != null) return stat.modifyStat(StatOperation.SET, value2.calculate(player, world)); - } - } - } + StatValueInstance value2 = statInstance.value; if (mode == StatOperation.PLAYER_STAT) { Stat stat = world.getStatManager().getPlayerStatByName(player, value2.calculate(player, world)); @@ -302,165 +84,39 @@ public boolean requiresPlayer() { } public String toString() { - if (isExpression) { - StringBuilder str = new StringBuilder("&7("); - - if (!statInstances.isEmpty() && statInstances.getFirst().mode.getArgs().indexOf("MODE") != 0) { - str.append("&a").append(value).append(" "); - } - - for (StatInstance statInstance : statInstances) { - StatOperation mode = statInstance.mode; - str.append("&6").append(mode.asString()).append(" &a").append(statInstance.value); + StatValueInstance statValueInstance = getValue("value", StatValueInstance.class); + if (statValueInstance == null) return "0.0"; + String value = statValueInstance.isExpression() ? + statValueInstance.getExpressionValue().toString() : + statValueInstance.getLiteralValue(); + List statInstances = getProperty("statInstances", StatInstanceProperty.class).getValue(); + StringBuilder str = new StringBuilder("&7("); + + if (!statInstances.isEmpty() && statInstances.getFirst().mode.getArgs().indexOf("MODE") != 0) { + str.append("&a").append(value).append(" "); + } - if (statInstances.indexOf(statInstance) < statInstances.size() - 1) { - str.append(" "); - } - } - str.append("&7)"); - return str.toString(); - } else return literalValue; - } + for (StatInstance statInstance : statInstances) { + StatOperation mode = statInstance.mode; + str.append("&6").append(mode.asString()).append(" &a").append(statInstance.value); - //This is used for the display item - public String asString() { - if (isExpression) { - StringBuilder str = new StringBuilder(""); - if (!statInstances.isEmpty() && statInstances.getFirst().mode.getArgs().indexOf("MODE") != 0) { - str.append("&f").append(statInstances.getFirst().mode.getArgs().getFirst()).append(": &a").append(value).append("\n"); + if (statInstances.indexOf(statInstance) < statInstances.size() - 1) { + str.append(" "); } - for (StatInstance statInstance : statInstances) { - StatOperation mode = statInstance.mode; - str.append("&fMode: &6").append(mode); - str.append("\n&f").append(mode.getArgs().get((mode.getArgs().indexOf("MODE") == 0 ? 1 : 2))).append(": &a").append(statInstance.value); - } - return str.toString(); - } else return literalValue; - } - - @Override - public void fromData(HashMap data, Class actionClass) { - super.fromData(data, actionClass); - if (data.get("isGlobal") != null) { //Convert from old format - statType = (boolean) data.get("isGlobal") ? "global" : "player"; - } else { - statType = data.get("statType").toString(); } - } - - public void createDisplayItem(ItemBuilder builder) { - } // never in display + str.append("&7)"); + return str.toString(); - public void createAddDisplayItem(ItemBuilder builder) { - } // never created + } public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } // never "executed" - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - - public boolean isExpression() { - return isExpression; - } - - public void setExpression(boolean expression) { - isExpression = expression; - - if (isExpression) { - literalValue = null; - if (statInstances.isEmpty()) { - value = new StatValue(statType); - statInstances.add(new StatInstance(statType)); - } - } else { - statInstances.clear(); - value = null; - if (literalValue == null) literalValue = "1.0"; - } - } - - public String getLiteralValue() { - return literalValue; - } - - public void setLiteralValue(String literalValue) { - this.literalValue = literalValue; - } - - public StatValue getValue() { + public static StatValue fromActionData(ActionData data, HousingWorld house) { + if (data == null) return null; + StatValue value = new StatValue(); + value.fromData(data.getData(), house); return value; } - - public List getStatInstances() { - return statInstances; - } - - public String getStatType() { - return statType; - } - - public String getTitle(ActionEditMenu currentMenu) { - StringBuilder title = new StringBuilder("&e" + StringUtilsKt.formatCapitalize(statType) + " Stat > Value"); - int count = 1; - while (currentMenu.getBackMenu() != null && currentMenu.getBackMenu() instanceof ActionEditMenu back && back.getAction() instanceof StatValue) { - title.append(" > Value"); - count++; - currentMenu = back; - } - if (count > 2) { - title = new StringBuilder("&e" + StringUtilsKt.formatCapitalize(statType) + " Stat > Value > " + (count - 1) + " Values"); - } - return title.toString(); - } - - public String[] importValue(String[] nextParts) { - if (nextParts.length < 1) return new String[0]; - String[] parts = nextParts; - - if (parts[0].startsWith("(")) { - setExpression(true); - parts[0] = parts[0].substring(1); - - List statInstances = new ArrayList<>(); - StatInstance statInstance = new StatInstance(statType); - statInstance.mode = null; - statInstance.value = null; - - value = new StatValue(statType); - parts = value.importValue(parts); - - while (parts.length > 0) { - String part = parts[0]; - if (StatOperation.getOperation(part) != null) { - statInstance.mode = StatOperation.getOperation(part); - parts = new ArrayList<>(Arrays.asList(parts).subList(1, parts.length)).toArray(new String[0]); - continue; - } else { - if (part.endsWith(")")) { - parts[0] = part.substring(0, part.length() - 1); - } - StatValue value = new StatValue(statType); - parts = value.importValue(parts); - statInstance.value = value; - } - - if (statInstance.mode != null && statInstance.value != null) { - statInstances.add(statInstance); - statInstance = new StatInstance(statType); - } - } - - this.statInstances = statInstances; - } else { - setExpression(false); - Duple literalArg = handleArg(parts, 0); - this.literalValue = literalArg.getSecond(); - parts = literalArg.getFirst(); - } - return parts; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/StopHouseMusicAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/StopHouseMusicAction.java index dac5f67a..bf1e9722 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/StopHouseMusicAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/StopHouseMusicAction.java @@ -1,39 +1,27 @@ package com.al3x.housing2.Action.Actions; +import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; +@ToString public class StopHouseMusicAction extends HTSLImpl { - public StopHouseMusicAction() { - super("Stop House Music Action"); - } - - @Override - public String toString() { - return "StopHouseMusicAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_11); - builder.name("&eStop House Music"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.MUSIC_DISC_11); - builder.name("&aStop House Music"); - builder.description("Stops the house music."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.STOP_HOUSE_MUSIC, + "Stop House Music", + "Stops the house music.", + Material.MUSIC_DISC_11, + List.of("stopHouseMusic") + ); } @Override @@ -42,18 +30,8 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "stopHouseMusic"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/StopSoundAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/StopSoundAction.java index 2dbd3273..83a124c5 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/StopSoundAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/StopSoundAction.java @@ -1,7 +1,8 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; -import com.al3x.housing2.Action.ActionEditor.ActionItem; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.SoundProperty; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; @@ -10,165 +11,59 @@ import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.ItemBuilder.ActionType; import com.al3x.housing2.Utils.StringUtilsKt; -import net.citizensnpcs.api.npc.NPC; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.Registry; import org.bukkit.Sound; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.potion.PotionEffectType; import java.util.*; -import static com.al3x.housing2.Utils.Color.colorize; - +@ToString +@Getter +@Setter public class StopSoundAction extends HTSLImpl { - - private Sound sound; - private String customSound; - private boolean clearAll; - public StopSoundAction() { - super("Stop Sound Action"); - this.sound = Sound.MUSIC_CREDITS; - this.clearAll = false; - } - - public StopSoundAction(Sound sound, boolean clearAll) { - super("Stop Sound Action"); - this.sound = sound; - this.clearAll = clearAll; - } - - @Override - public String toString() { - return "StopSoundAction{" + "potionEffectType=" + sound + ", clearAll=" + clearAll + '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.QUARTZ); - builder.name("&eStop Sound"); - builder.info("&eSettings", ""); - builder.info("Sound", "&a" + (customSound == null ? sound.name(): customSound)); - builder.info("Clear Others", ((clearAll) ? "&aYes" : "&cNo")); - builder.lClick(ActionType.EDIT_YELLOW).rClick(ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.QUARTZ); - builder.name("&eStop Sound"); - builder.description("Clears all or a specific sound effect"); - builder.lClick(ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = Arrays.asList( - new ActionEditor.ActionItem("sound", - ItemBuilder.create(Material.NOTE_BLOCK) - .name("&eSound") - .info("&7Current Value", "") - .info(null, "&a" + sound) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (event, obj) -> { - //Create a list of all the potion effects - List> soundDuple = new ArrayList<>(); - for (Sound type : Registry.SOUNDS) { - soundDuple.add(new Duple<>(type, ItemBuilder.create(Material.NOTE_BLOCK).name("&6" + StringUtilsKt.formatCapitalize(type.name())))); - } - //Basically because Sound isnt a ENUM we cant just use the enum class - new PaginationMenu<>(Main.getInstance(), - "&eSelect a Sound", soundDuple, - player, house, backMenu, (e, potion) -> { - if (e.isRightClick()) { - player.playSound(player.getLocation(), potion, 1.0F, 1.0F); - } else { - sound = potion; - backMenu.open(); - } - }).open(); - return true; - } - ), - new ActionItem("clearAll", //Needs to be the exact same as the variable name - ItemBuilder.create((clearAll) ? Material.LIME_DYE : Material.RED_DYE) - .name("&aClear All Sounds") - .description("If toggled on, this will clear all sound effects including the one selected") - .info("&7Current Value", "") - .info(null, ((clearAll) ? "&aYes" : "&cNo")) - .lClick(ActionType.CHANGE_YELLOW), - ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem( - ItemBuilder.create(Material.PAPER) - .name("&eCustom Sound") - .info("&7Current Value", "") - .info(null, "&a" + customSound) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .rClick(ItemBuilder.ActionType.CLEAR), - ActionEditor.ActionItem.ActionType.CUSTOM, 32, (event, o) -> { - if (event.isRightClick()) { - customSound = null; - } - backMenu.openChat(Main.getInstance(), customSound == null ? "" : customSound, (input) -> { - if (input == null || input.isEmpty()) { - player.sendMessage(colorize("&cPlease enter a valid sound name.")); - backMenu.open(); - return; - } - customSound = input; - backMenu.open(); - }); - return true; - }) + super(ActionEnum.STOP_SOUND, + "Stop Sound", + "Stops a sound effect.", + Material.QUARTZ, + List.of("stopSound") ); - return new ActionEditor(4, "&eStop Sound Action Settings", items); + + getProperties().addAll(List.of( + new SoundProperty( + "sound", + "Sound", + "The sound to stop." + ).setValue(Sound.ENTITY_PLAYER_LEVELUP), + new BooleanProperty( + "clearAll", + "Clear All", + "If true, this will clear all sound effects except the one selected." + ) + )); } @Override public OutputType execute(Player player, HousingWorld house) { + boolean clearAll = getValue("clearAll", Boolean.class); + Sound s = getValue("sound", Sound.class); if (clearAll) { - player.stopAllSounds(); - } else { - if (customSound != null && !customSound.isEmpty()) { - player.stopSound(customSound); + for (Sound sound : Sound.values()) { //I don't love this, but its the same implementation as the clear potion effect action + if (sound == s) continue; + player.stopSound(sound); } - player.stopSound(sound); + } else { + player.stopSound(s); } return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("sound", sound.name()); - data.put("customSound", customSound); - data.put("clearall", clearAll); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - //Bunch of errors coming from PotionEffectType so I needed to add this - if (!data.containsKey("sound")) return; - sound = Sound.valueOf((String) data.get("sound")); - if (!data.containsKey("clearall")) return; - clearAll = (boolean) data.get("clearall"); - if (!data.containsKey("customSound")) return; - customSound = (String) data.get("customSound"); - } - - @Override - public String keyword() { - return "clearSound"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/SwimCrawlAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/SwimCrawlAction.java index b2597717..e1d6a2ff 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/SwimCrawlAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/SwimCrawlAction.java @@ -5,6 +5,7 @@ import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.ItemBuilder; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; import org.bukkit.Material; import org.bukkit.entity.LivingEntity; @@ -12,32 +13,18 @@ import org.bukkit.event.Cancellable; import java.util.LinkedHashMap; +import java.util.List; +@ToString public class SwimCrawlAction extends HTSLImpl implements NPCAction { - public SwimCrawlAction() { - super("Swim/Crawl Action"); - } - - @Override - public String toString() { - return "SwimCrawlAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&eSwim/Crawl Action"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_BARS); - builder.name("&aSwim/Crawl Action"); - builder.description("Toggles if the player/npc swim or crawl depending on if they are in water or not."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.SWIM_CRAWL, + "Swim/Crawl Action", + "Toggles if the player/npc swim or crawl depending on if they are in water or not.", + Material.IRON_BARS, + List.of("swimCrawl") + ); } @Override @@ -46,21 +33,11 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "swimCrawl"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (npc.getEntity() instanceof LivingEntity) { diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/TeleportAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/TeleportAction.java index e0f10f26..812ecd51 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/TeleportAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/TeleportAction.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Action.Actions; import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.LocationProperty; import com.al3x.housing2.Enums.Locations; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; @@ -8,268 +9,87 @@ import com.al3x.housing2.Menus.Menu; import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.NumberUtilsKt; -import io.papermc.paper.entity.TeleportFlag; +import lombok.ToString; import net.citizensnpcs.api.npc.NPC; -import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; -import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket; -import net.minecraft.world.entity.PositionMoveRotation; -import net.minecraft.world.entity.Relative; -import net.minecraft.world.phys.Vec3; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; -import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerTeleportEvent; -import org.jetbrains.annotations.NotNull; import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiFunction; import static com.al3x.housing2.Enums.Locations.*; +@ToString public class TeleportAction extends HTSLImpl implements NPCAction { - // Unique teleport ID counter - private static final AtomicInteger teleportIdCounter = new AtomicInteger(0); - - private String customLocation; - private Locations location; - boolean keepVelocity; - public TeleportAction() { - super("Teleport Action"); - this.customLocation = null; - this.location = Locations.INVOKERS_LOCATION; - this.keepVelocity = false; - } - - public TeleportAction(boolean houseSpawn) { - super("Teleport Action"); - this.customLocation = null; - this.location = Locations.HOUSE_SPAWN; - this.keepVelocity = false; - } - - @Override - public String toString() { - return "Teleport Action (Location: " + (location == CUSTOM ? customLocation : location) + " Keep Velocity: " + (keepVelocity ? "Yes" : "No") + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_PEARL); - builder.name("&eTeleport Player"); - builder.info("&eSettings", ""); - builder.info("Location", "&a" + (location == CUSTOM ? customLocation : location)); - builder.info("Keep Velocity", keepVelocity ? "&aYes" : "&cNo"); - - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ENDER_PEARL); - builder.name("&aTeleport Player"); - builder.description("Teleports the player to a location."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu, Player player) { - List items = List.of( - new ActionEditor.ActionItem("location", - ItemBuilder.create(Material.COMPASS) - .name("&eLocation") - .info("&7Current Value", "") - .info(null, "&a" + (location == CUSTOM ? customLocation : location)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Locations.values(), Material.COMPASS, - (event, o) -> getCoordinate(event, o, customLocation, house, backMenu, - (coords, location) -> { - if (location == CUSTOM) { - customLocation = coords; - } else { - customLocation = null; - } - this.location = location; - if (location == PLAYER_LOCATION) { - customLocation = player.getLocation().getX() + "," + player.getLocation().getY() + "," + player.getLocation().getZ(); - } - Bukkit.getScheduler().runTask(Main.getInstance(), backMenu::open); - } - ) - ), - new ActionEditor.ActionItem("keepVelocity", ItemBuilder.create((keepVelocity ? Material.LIME_DYE : Material.RED_DYE)) - .name("&aKeep Velocity") - .info("&7Current Value", "") - .info(null, keepVelocity ? "&aYes" : "&cNo"), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) + super( + ActionEnum.TELEPORT, + "Teleport Player", + "Teleports the player to a location.", + Material.ENDER_PEARL, + List.of("teleport") ); - return new ActionEditor(4, "&eTeleport Action Settings", items); + getProperties().addAll(List.of( + new LocationProperty( + "location", + "Location", + "The location to teleport the player to." + ).setValue("INVOKERS_LOCATION") + )); } - @Override - public OutputType execute(Player player, HousingWorld house) { - Location loc = null; - - switch (location) { - case INVOKERS_LOCATION -> loc = player.getLocation(); - case HOUSE_SPAWN -> loc = house.getSpawn(); - case CUSTOM, PLAYER_LOCATION -> { - loc = getLocationFromString(player, house, customLocation); - - System.out.println(loc); - - if (loc == null) { - return OutputType.SUCCESS; - } - loc.setX(Math.max(-255, Math.min(255, loc.getX()))); - loc.setZ(Math.max(-255, Math.min(255, loc.getZ()))); - loc.setY(Math.max(-64, Math.min(320, loc.getY()))); - loc.setYaw(((loc.getYaw() + 180) % 360 + 360) % 360 - 180); - loc.setPitch(Math.max(-90, Math.min(90, loc.getPitch()))); - } - } - - if (keepVelocity) { - Location current = player.getLocation(); - double deltaX = loc.getX() - current.getX(); - double deltaY = loc.getY() - current.getY(); - double deltaZ = loc.getZ() - current.getZ(); - - float deltaYaw = loc.getYaw() - current.getYaw(); - float deltaPitch = loc.getPitch() - current.getPitch(); - - Vec3 delta = new Vec3(deltaX, deltaY, deltaZ); - - PositionMoveRotation change = new PositionMoveRotation(delta, Vec3.ZERO, deltaYaw, deltaPitch); - - // Generate a unique teleport ID for this packet - int teleportId = teleportIdCounter.getAndIncrement(); - ClientboundPlayerPositionPacket posPacket = new ClientboundPlayerPositionPacket( - teleportId, - change, - Set.of(Relative.X, Relative.Y, Relative.Z, - Relative.DELTA_X, Relative.DELTA_Y, Relative.DELTA_Z, - Relative.X_ROT, Relative.Y_ROT) - ); - - // Update the server's notion of the player's position. - ((CraftPlayer) player).getHandle().setPos(loc.getX(), loc.getY(), loc.getZ()); - ((CraftPlayer) player).getHandle().setRot(deltaYaw, deltaPitch); - - // Send the teleport packet using the player's connection. - ((CraftPlayer) player).getHandle().connection.send(posPacket); - } else { - player.teleport(loc); + public TeleportAction(boolean houseSpawn) { + this(); + if (houseSpawn) { + getProperty("location", LocationProperty.class).setValue("HOUSE_SPAWN"); } - - return OutputType.SUCCESS; } @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("location", location.name()); - data.put("customLocation", customLocation); - data.put("keepVelocity", keepVelocity); - return data; + public OutputType execute(Player player, HousingWorld house) { + player.teleport(getProperty("location", LocationProperty.class).getLocation(player, house)); + return OutputType.SUCCESS; } - @Override public boolean requiresPlayer() { return true; } - - @Override - public void fromData(HashMap data, Class actionClass) { - try { - location = valueOf((String) data.get("location")); - } catch (IllegalArgumentException e) { - location = INVOKERS_LOCATION; - } - if (data.get("customLocation") == null && location == CUSTOM) { - customLocation = null; - location = INVOKERS_LOCATION; - return; - } - customLocation = (String) data.get("customLocation"); - keepVelocity = (boolean) data.getOrDefault("keepVelocity", false); - } - - @Override - public String export(int indent) { - String loc = (location == CUSTOM || location == PLAYER_LOCATION) ? "\"" + customLocation + "\"" : location.name(); - return " ".repeat(indent) + keyword() + " " + loc + " " + keepVelocity; - } - - @Override - public String keyword() { - return "teleport"; - } - - @Override - public String syntax() { - return "teleport "; - } - - @Override - public ArrayList importAction(String action, String indent, ArrayList nextLines) { - String[] split = action.split(" "); - - location = fromString(split[0]); - - if (location != null) { - if (location == PLAYER_LOCATION) { - customLocation = "0,0,0"; - } - } else { - location = CUSTOM; - customLocation = action; - } - - split = Arrays.copyOfRange(split, 1, split.length); - - if (split.length > 0) { - keepVelocity = Boolean.parseBoolean(split[0]); - split = Arrays.copyOfRange(split, 1, split.length); - } else { - keepVelocity = false; - } - - return nextLines; - } +// +// @Override +// public String export(int indent) { +// String loc = (location == CUSTOM || location == PLAYER_LOCATION) ? "\"" + customLocation + "\"" : location.name(); +// return " ".repeat(indent) + getScriptingKeywords().getFirst() + " " + loc; +// } +// +// @Override +// public String syntax() { +// return getScriptingKeywords().getFirst() + " "; +// } +// +// @Override +// public ArrayList importAction(String action, String indent, ArrayList nextLines) { +// if (Locations.fromString(action) != null) { +// location = Locations.fromString(action); +// if (location == PLAYER_LOCATION) { +// customLocation = "0,0,0"; +// } +// } else { +// location = CUSTOM; +// customLocation = action; +// } +// return nextLines; +// } @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - Location loc = null; - - switch (location) { - case INVOKERS_LOCATION -> loc = player.getLocation(); - case HOUSE_SPAWN -> loc = house.getSpawn(); - case CUSTOM, PLAYER_LOCATION -> { - if (customLocation == null) { - return; - } - loc = getLocationFromString(player, house, customLocation); - if (loc == null) { - return; - } - - loc.setX(Math.max(-255, Math.min(255, loc.getX()))); - loc.setZ(Math.max(-255, Math.min(255, loc.getZ()))); - loc.setY(Math.max(-64, Math.min(320, loc.getY()))); - loc.setYaw(((loc.getYaw() + 180) % 360 + 360) % 360 - 180); - loc.setPitch(Math.max(-90, Math.min(90, loc.getPitch()))); - } - } - - npc.teleport(loc, PlayerTeleportEvent.TeleportCause.PLUGIN); + npc.teleport(getProperty("location", LocationProperty.class).getLocation(player,house, npc.getEntity().getLocation(), null), PlayerTeleportEvent.TeleportCause.PLUGIN); } } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Actions/ToggleSitAction.java b/paper/src/main/java/com/al3x/housing2/Action/Actions/ToggleSitAction.java index e802ca80..7046511c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/Actions/ToggleSitAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/Actions/ToggleSitAction.java @@ -13,32 +13,18 @@ import org.bukkit.event.Cancellable; import java.util.LinkedHashMap; +import java.util.List; public class ToggleSitAction extends HTSLImpl implements NPCAction { public ToggleSitAction() { - super("Toggle Sit Action"); - } - - @Override - public String toString() { - return "ToggleSitAction"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.SPRUCE_STAIRS); - builder.name("&eToggle Sit Action"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.SPRUCE_STAIRS); - builder.name("&aToggle Sit Action"); - builder.description("Toggles if the sit sitting down."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + super( + ActionEnum.TOGGLE_SIT, + "Toggle Sit", + "Toggles if the player is sitting down.", + Material.SPRUCE_STAIRS, + List.of("sit") + ); } @Override @@ -48,22 +34,11 @@ public OutputType execute(Player player, HousingWorld house) { return OutputType.SUCCESS; } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "sit"; - } - @Override public void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { SeatManager seatManager = house.getPlugin().getSeatManager(); diff --git a/paper/src/main/java/com/al3x/housing2/Action/HTSLImpl.java b/paper/src/main/java/com/al3x/housing2/Action/HTSLImpl.java index 81002c04..d2fb4393 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/HTSLImpl.java +++ b/paper/src/main/java/com/al3x/housing2/Action/HTSLImpl.java @@ -3,18 +3,16 @@ import com.al3x.housing2.Enums.EnumHTSLAlternative; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.NumberUtilsKt; -import org.jetbrains.annotations.NotNull; +import org.bukkit.Material; import java.lang.reflect.Field; import java.util.*; public abstract class HTSLImpl extends Action { - public HTSLImpl(String name) { - super(name); + public HTSLImpl(ActionEnum id, String name, String description, Material icon, List scriptingKeywords) { + super(id, name, description, icon, scriptingKeywords); } - public abstract String keyword(); - public String syntax() { HashMap actionData = data(); StringBuilder builder = new StringBuilder(); @@ -23,7 +21,7 @@ public String syntax() { builder.append("<").append(key).append(">"); if (actionData.get(key) != keys.getLast()) builder.append(" "); } - return keyword() + (!builder.isEmpty() ? " " + builder : ""); + return getScriptingKeywords().getFirst() + (!builder.isEmpty() ? " " + builder : ""); } public String export() { @@ -60,7 +58,7 @@ public String export(int indent) { } String output = builder.toString(); if (output.endsWith(" ")) output = output.substring(0, output.length() - 1); - return " ".repeat(indent) + keyword() + (!output.isEmpty() ? " " + output: ""); + return " ".repeat(indent) + getScriptingKeywords().getFirst() + (!output.isEmpty() ? " " + output: ""); } public ArrayList importAction(String action, String indent, ArrayList nextLines) { diff --git a/paper/src/main/java/com/al3x/housing2/Action/NPCAction.java b/paper/src/main/java/com/al3x/housing2/Action/NPCAction.java index 62352bdd..6dbf1ecd 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/NPCAction.java +++ b/paper/src/main/java/com/al3x/housing2/Action/NPCAction.java @@ -7,7 +7,9 @@ import org.bukkit.event.Cancellable; public interface NPCAction { - void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor); + default void npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + // Do nothing + } //Hide from non npc actions default boolean hide() { diff --git a/paper/src/main/java/com/al3x/housing2/Action/OutputType.java b/paper/src/main/java/com/al3x/housing2/Action/OutputType.java index 9bcd5ef5..9431fc3c 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/OutputType.java +++ b/paper/src/main/java/com/al3x/housing2/Action/OutputType.java @@ -7,5 +7,8 @@ public enum OutputType { SUCCESS, PAUSE, CONTINUE, - BREAK + BREAK, + + TRUE, + FALSE } diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionSettingProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionSettingProperty.java new file mode 100644 index 00000000..d02b3be4 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionSettingProperty.java @@ -0,0 +1,36 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.Actions.ActionsMenu; +import com.google.gson.JsonElement; +import lombok.extern.slf4j.Slf4j; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; + +public class ActionSettingProperty extends ActionProperty implements ActionProperty.PropertySerializer { + public ActionSettingProperty(String id, String name, String description) { + super(id, name, description, Material.COMPARATOR); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new ActionEditMenu(getValue(), main, player, house, menu).open(); + } + + @Override + public ActionData serialize() { + return ActionData.toData(getValue()); + } + + @Override + public Action deserialize(JsonElement value, HousingWorld housingWorld) { + ActionData data = dataToObject(value, ActionData.class); + return ActionData.fromData(data, housingWorld); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionsProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionsProperty.java new file mode 100644 index 00000000..19ad6295 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ActionsProperty.java @@ -0,0 +1,46 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.Actions.ActionsMenu; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +public class ActionsProperty extends ActionProperty> implements ActionProperty.PropertySerializer, List> { + public ActionsProperty(String id, String name, String description) { + super(id, name, description, Material.PISTON); + + setValue(new ArrayList<>()); + } + + @Override + protected String displayValue() { + if (getValue() == null || getValue().isEmpty()) { + return "&cNo actions"; + } + return "&a" + getValue().size() + " actions"; + } + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new ActionsMenu(main, player, house, getValue(), menu, getId()).open(); + } + + @Override + public List serialize() { + return ActionData.fromList(getValue()); + } + + @Override + public List deserialize(JsonElement value, HousingWorld housingWorld) { + List data = dataToList(value.getAsJsonArray(), ActionData.class); + return ActionData.toList(data, housingWorld); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/AddStatInstanceProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/AddStatInstanceProperty.java new file mode 100644 index 00000000..47c8a0eb --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/AddStatInstanceProperty.java @@ -0,0 +1,35 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.StatInstance; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class AddStatInstanceProperty extends CustomSlotProperty { + public AddStatInstanceProperty(int customSlot) { + super( + "addStatInstance", + "Add Stat Instance", + "Add a new stat expression instance.\n\nBasically adds a new mode and value to the expression.", + Material.PAPER + , customSlot); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + Action action = menu.getAction(); + StatInstanceProperty property = action.getProperty("statInstances", StatInstanceProperty.class); + if (property != null) { + if (property.getValue().size() >= 6) { + player.sendMessage("§cYou can only have 6 stat instances."); + return; + } + property.getValue().add(new StatInstance()); + menu.open(); + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ArgumentsProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ArgumentsProperty.java new file mode 100644 index 00000000..43414801 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ArgumentsProperty.java @@ -0,0 +1,138 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.Returnable; +import com.google.gson.JsonElement; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class ArgumentsProperty extends ExpandableProperty> implements ActionProperty.PropertySerializer, List> { + + public ArgumentsProperty(String id) { + super(id); + } + + @Override + public List> getInfo() { + List> info = new ArrayList<>(); + info.add(new Duple<>("Arguments", getValue().size() + "")); + return info; + } + + @Override + public Returnable getVisible() { + return () -> false; + } + + @Override + public List> getProperties() { + List> properties = new ArrayList<>(); + for (int i = 0; i < getValue().size(); i++) { + Argument argument = getValue().get(i); + properties.add( + new CustomProperty( + "arg_" + i, + "Argument: " + argument.name, + "The argument to pass to the function.", + Material.BOOK + ) { + @Override + public ItemBuilder getDisplayItem() { + return super.getDisplayItem() + .mClick(ItemBuilder.ActionType.EDIT_KEY) + .rClick(ItemBuilder.ActionType.REMOVE_YELLOW); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + if (event.isLeftClick()) { + menu.openChat(main, argument.value, (message -> { + argument.value = message; + menu.open(); + })); + } else if (event.isRightClick()) { + ArgumentsProperty.this.getValue().remove(argument); + menu.open(); + } else if (event.getClick() == ClickType.MIDDLE) { + menu.openChat(main, argument.name, (message -> { + if (message.length() > 16) { + player.sendMessage(colorize("&cThe argument name cannot be longer than 16 characters.")); + return; + } + if (message.isEmpty()) { + player.sendMessage(colorize("&cThe argument name cannot be empty.")); + return; + } + if (ArgumentsProperty.this.getValue().stream().anyMatch(arg -> arg.name.equals(argument.name))) { + player.sendMessage(colorize("&cYou already have an argument with that name.")); + return; + } + argument.name = message; + menu.open(); + })); + } + } + } + ); + } + + return properties; + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + + } + + @Override + public List serialize() { + return getValue(); + } + + @Override + public List deserialize(Object value, HousingWorld house) { + if (value instanceof JsonElement element) { + return dataToList(element.getAsJsonArray(), Argument.class); + } + if (value instanceof List list) { + List arguments = new ArrayList<>(); + for (Object object : list) { + if (object instanceof JsonElement element) { + arguments.add(new Argument(element.getAsJsonObject().get("name").getAsString(), element.getAsJsonObject().get("value").getAsString())); + } else if (object instanceof Argument argument) { + arguments.add(argument); + } + } + return arguments; + } + return null; + } + + @Getter + public static class Argument { + String name; + String value; + + public Argument(String name, String value) { + this.name = name; + this.value = value; + } + + @Override + public String toString() { + return value; + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/BooleanProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/BooleanProperty.java new file mode 100644 index 00000000..84b3b279 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/BooleanProperty.java @@ -0,0 +1,35 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class BooleanProperty extends ActionProperty { + public BooleanProperty(String id, String name, String description) { + super(id, name, description, Material.RED_DYE); + + getBuilder().lClick(ItemBuilder.ActionType.TOGGLE_YELLOW); + setValue(false); + } + + @Override + protected String displayValue() { + return getValue() ? "§aEnabled" : "§cDisabled"; + } + + @Override + public ItemBuilder getDisplayItem() { + return super.getDisplayItem().clone() + .material(getValue() ? Material.LIME_DYE : Material.RED_DYE); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + setValue(!getValue()); + menu.open(); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ColorProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ColorProperty.java new file mode 100644 index 00000000..b98f6e3f --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ColorProperty.java @@ -0,0 +1,43 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class ColorProperty extends ActionProperty { + public ColorProperty(String id, String name, String description) { + super(id, name, description, Material.PAINTING); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + player.sendMessage(colorize("&ePlease enter the color in RGB format (0-255) separated by commas.")); + menu.openChat(main, getValue(), (s) -> { + String[] split = s.split(","); + if (split.length != 3) { + player.sendMessage(colorize("&cInvalid color format!")); + return; + } + try { + int r = Integer.parseInt(split[0]); + int g = Integer.parseInt(split[1]); + int b = Integer.parseInt(split[2]); + if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) { + player.sendMessage(colorize("&cInvalid color format!")); + return; + } + setValue(s); + player.sendMessage(colorize("&aColor set to " + r + ", " + g + ", " + b + ".")); + Bukkit.getScheduler().runTask(main, menu::open); + } catch (NumberFormatException e) { + player.sendMessage(colorize("&cInvalid color format!")); + } + }); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ConditionsProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ConditionsProperty.java new file mode 100644 index 00000000..a291d292 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ConditionsProperty.java @@ -0,0 +1,45 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Data.ConditionalData; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.Actions.ActionsMenu; +import com.google.gson.JsonElement; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; + +public class ConditionsProperty extends ActionProperty> implements ActionProperty.PropertySerializer, List> { + public ConditionsProperty(String id, String name, String description) { + super(id, name, description, Material.REDSTONE); + } + + @Override + protected String displayValue() { + if (getValue() == null || getValue().isEmpty()) { + return "&cNo conditions"; + } + return "&a" + getValue().size() + " conditions"; + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new ActionsMenu(main, player, house, getValue(), menu, true).open(); + } + + @Override + public List serialize() { + return ConditionalData.fromList(getValue()); + } + + @Override + public List deserialize(JsonElement value, HousingWorld housingWorld) { + List data = dataToList(value.getAsJsonArray(), ConditionalData.class); + return ConditionalData.toList(data, housingWorld); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomProperty.java new file mode 100644 index 00000000..23dce950 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomProperty.java @@ -0,0 +1,14 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public abstract class CustomProperty extends ActionProperty { + public CustomProperty(String id, String name, String description, Material icon) { + super(id, name, description, icon); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomSlotProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomSlotProperty.java new file mode 100644 index 00000000..6f53271e --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/CustomSlotProperty.java @@ -0,0 +1,22 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Utils.Returnable; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; + +@Setter +@Getter +public abstract class CustomSlotProperty extends ActionProperty { + protected int customSlot = -1; + public CustomSlotProperty(String id, String name, String description, Material icon, int customSlot) { + super(id, name, description, icon); + this.customSlot = customSlot; + } + + @Override + protected String displayValue() { + return null; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/DoubleProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/DoubleProperty.java new file mode 100644 index 00000000..8b234360 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/DoubleProperty.java @@ -0,0 +1,43 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +@Getter +public class DoubleProperty extends ActionProperty { + private final double min; + private final double max; + + public DoubleProperty(String id, String name, String description) { + this(id, name, description, 0, Double.MAX_VALUE); + } + + public DoubleProperty(String id, String name, String description, double min, double max) { + super(id, name, description, Material.REPEATER); + this.min = min; + this.max = max; + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + player.sendMessage("§eEnter a double between " + getMin() + " and " + getMax() + ":"); + menu.openChat(main, getValue().toString(), (message) -> { + try { + double value = Double.parseDouble(message); + if (value < getMin() || value > getMax()) { + player.sendMessage("§cValue must be between " + getMin() + " and " + getMax()); + return; + } + setValue(value, player); + } catch (NumberFormatException e) { + player.sendMessage("§cInvalid number format."); + return; + } + }); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/EnumProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/EnumProperty.java new file mode 100644 index 00000000..9b0f894c --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/EnumProperty.java @@ -0,0 +1,66 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Enums.EnumMaterial; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.EnumMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.StringUtilsKt; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class EnumProperty> extends ActionProperty implements ActionProperty.PropertySerializer { + private final Class enumClass; + + public EnumProperty(String id, String name, String description, Class enumClass, Material material) { + super(id, name, description, material); + this.enumClass = enumClass; + + getBuilder().lClick(ItemBuilder.ActionType.CHANGE_YELLOW); + } + + @Override + protected String displayValue() { + if (getValue() == null) { + return "&cNo value"; + } + return "&a" + StringUtilsKt.formatCapitalize(getValue().name()); + } + + public EnumProperty(String id, String name, String description, Class enumClass) { + this(id, name, description, enumClass, Material.COMPASS); + } + + @Override + public ItemBuilder getDisplayItem() { + ItemBuilder builder = super.getDisplayItem(); + if (getValue() instanceof EnumMaterial material) { + builder.material(material.getMaterial()); + } + return builder; + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new EnumMenu<>(main, "Select a " + getName(), + enumClass.getEnumConstants(), + Material.BARRIER, player, house, menu, + (enumValue) -> { + setValue(enumValue, player); + menu.open(); + } + ).open(); + } + + @Override + public String serialize() { + return getValue().name(); + } + + @Override + public E deserialize(Object value, HousingWorld housingWorld) { + return Enum.valueOf(enumClass, value.toString()); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ExpandableProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ExpandableProperty.java new file mode 100644 index 00000000..17de43e8 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ExpandableProperty.java @@ -0,0 +1,19 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Utils.Duple; +import lombok.Getter; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public abstract class ExpandableProperty extends ActionProperty { + private final List> properties = new ArrayList<>(); + public ExpandableProperty(String id) { + super(id, "&cERROR!", "&cIf you are seeing this, something went wrong.", Material.BARRIER); + } + + public abstract List> getInfo(); +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/FunctionProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/FunctionProperty.java new file mode 100644 index 00000000..66b0403c --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/FunctionProperty.java @@ -0,0 +1,44 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.Function; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class FunctionProperty extends PaginationProperty { + + public FunctionProperty(String id, String name, String description) { + super(id, name, description, Material.ACTIVATOR_RAIL); + } + + + @Override + protected List getItems(HousingWorld house) { + return house.getFunctions(); + } + + @Override + protected ItemBuilder buildItem(Function function) { + return ItemBuilder.create(function.getMaterial()) + .name(function.getName()) + .description(function.getDescription()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + } + + @Override + protected void onSelect(Function function, Player player) { +// player.sendMessage(colorize("&aSet " + getName() + " to: " + function.getName())); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/GroupProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/GroupProperty.java new file mode 100644 index 00000000..8e81eca3 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/GroupProperty.java @@ -0,0 +1,42 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.Group; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class GroupProperty extends PaginationProperty { + public GroupProperty(String id, String name, String description) { + super(id, name, description, Material.WHITE_BANNER); + } + + @Override + protected List getItems(HousingWorld house) { + return house.getGroups(); + } + + @Override + protected ItemBuilder buildItem(Group item) { + return ItemBuilder.create(Material.PAPER) + .name(item.getName()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + + } + + @Override + protected void onSelect(Group item, Player player) { +// player.sendMessage(colorize("&aSet " + getName() + " to: " + item.getName())); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/LayoutProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/LayoutProperty.java new file mode 100644 index 00000000..8ee288ef --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/LayoutProperty.java @@ -0,0 +1,42 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Layout; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class LayoutProperty extends PaginationProperty { + + public LayoutProperty(String id, String name, String description) { + super(id, name, description, Material.CHAINMAIL_CHESTPLATE); + } + + @Override + protected List getItems(HousingWorld house) { + return house.getLayouts(); + } + + @Override + protected ItemBuilder buildItem(Layout item) { + return ItemBuilder.create(Material.PAPER) + .name(item.getName()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + } + + @Override + protected void onSelect(Layout item, Player player) { +// player.sendMessage(colorize("&aSet " + getName() + " to: " + item.getName())); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/MenuProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/MenuProperty.java new file mode 100644 index 00000000..9e84be3e --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/MenuProperty.java @@ -0,0 +1,37 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.CustomMenu; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Layout; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class MenuProperty extends PaginationProperty { + + public MenuProperty(String id, String name, String description) { + super(id, name, description, Material.CHEST); + } + + @Override + protected List getItems(HousingWorld house) { + return house.getCustomMenus(); + } + + @Override + protected ItemBuilder buildItem(CustomMenu item) { + return ItemBuilder.create(Material.PAPER) + .name(item.getTitle()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + } + + @Override + protected void onSelect(CustomMenu item, Player player) { +// player.sendMessage(colorize("&aSet " + getName() + " to: " + item.getTitle())); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/RegionProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/RegionProperty.java new file mode 100644 index 00000000..c17ea770 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/RegionProperty.java @@ -0,0 +1,41 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Region; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +public class RegionProperty extends PaginationProperty { + + public RegionProperty(String id, String name, String description) { + super(id, name, description, Material.GRASS_BLOCK); + } + + + @Override + protected List getItems(HousingWorld house) { + return house.getRegions(); + } + + @Override + protected ItemBuilder buildItem(Region item) { + return ItemBuilder.create(Material.PAPER) + .name(item.getName()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + } + + @Override + protected void onSelect(Region item, Player player) { +// player.sendMessage("§aSet " + getName() + " to: " + item.getName()); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/TeamProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/TeamProperty.java new file mode 100644 index 00000000..8568cdea --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/GenericPagination/TeamProperty.java @@ -0,0 +1,40 @@ +package com.al3x.housing2.Action.Properties.GenericPagination; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.PaginationProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Team; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +public class TeamProperty extends PaginationProperty { + + public TeamProperty(String id, String name, String description) { + super(id, name, description, Material.BEACON); + } + + @Override + protected List getItems(HousingWorld house) { + return house.getTeams(); + } + + @Override + protected ItemBuilder buildItem(Team item) { + return ItemBuilder.create(Material.PAPER) + .name(item.getName()) + .lClick(ItemBuilder.ActionType.SELECT_YELLOW); + } + + @Override + protected void onSelect(Team item, Player player) { +// player.sendMessage("§aSet " + getName() + " to: " + item.getName()); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/IntegerProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/IntegerProperty.java new file mode 100644 index 00000000..3de1abee --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/IntegerProperty.java @@ -0,0 +1,57 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +@Getter +public class IntegerProperty extends ActionProperty implements ActionProperty.PropertySerializer { + private final int min; + private final int max; + + public IntegerProperty(String id, String name, String description) { + this(id, name, description, 0, Integer.MAX_VALUE); + } + + public IntegerProperty(String id, String name, String description, int min, int max) { + super(id, name, description, Material.IRON_INGOT); + this.min = min; + this.max = max; + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + player.sendMessage("§eEnter a integer between " + getMin() + " and " + getMax() + ":"); + menu.openChat(main, getValue().toString(), (message) -> { + try { + int value = Integer.parseInt(message); + if (value < getMin() || value > getMax()) { + player.sendMessage("§cValue must be between " + getMin() + " and " + getMax()); + return; + } + setValue(value, player); + } catch (NumberFormatException e) { + player.sendMessage("§cInvalid number format."); + } + }); + } + + @Override + public Object serialize() { + return getValue(); + } + + @Override + public Integer deserialize(Object value, HousingWorld house) { + if (value instanceof Double) { + return ((Double) value).intValue(); + } else if (value instanceof Integer) { + return (Integer) value; + } + + return Integer.parseInt(value.toString()); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ItemStackProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ItemStackProperty.java new file mode 100644 index 00000000..4ea5e080 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ItemStackProperty.java @@ -0,0 +1,52 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.ItemSelectMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.Serialization; +import com.al3x.housing2.Utils.StackUtils; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import java.io.IOException; + +public class ItemStackProperty extends ActionProperty implements ActionProperty.PropertySerializer { + public ItemStackProperty(String id, String name, String description) { + super(id, name, description, Material.ITEM_FRAME); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new ItemSelectMenu(player, menu, item -> setValue(item, player)); + } + + @Override + protected String displayValue() { + return getValue() == null ? "&cNot Set" : StackUtils.getDisplayName(getValue()); + } + + @Override + public String serialize() { + if (getValue() == null) { + return null; + } + return Serialization.itemStackToBase64(getValue()); + } + + @Override + public ItemStack deserialize(Object value, HousingWorld housingWorld) { + if (value == null) { + return null; + } + try { + return Serialization.itemStackFromBase64(value.toString()); + } catch (IOException e) { + Main.getInstance().getLogger().throwing("ItemStackProperty", "deserialize", e); + return null; + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ListProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ListProperty.java new file mode 100644 index 00000000..5e56395c --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ListProperty.java @@ -0,0 +1,33 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; + +//Shows a list of whatever in the builder +public class ListProperty extends CustomSlotProperty> { + public ListProperty(String id, String name, String description, Material icon, int slot) { + super(id, name, description, icon, slot); + } + + @Override + public ItemBuilder getDisplayItem() { + ItemBuilder builder = getBuilder().clone(); + builder.info("Current value", ""); + for (V v : getValue()) { + builder.info(null, "" + v.toString()); + } + return builder; + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/LocationProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/LocationProperty.java new file mode 100644 index 00000000..4d3baacb --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/LocationProperty.java @@ -0,0 +1,178 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Enums.Locations; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.EnumMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.HandlePlaceholders; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.util.Vector; + +import java.util.HashMap; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class LocationProperty extends ActionProperty implements ActionProperty.PropertyUpdater { + public LocationProperty(String id, String name, String description) { + super(id, name, description, Material.ENDER_PEARL); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + new EnumMenu<>(main, + "Select Location", + Locations.values(), + Material.BARRIER, player, house, menu, + (location) -> { + if (location == Locations.CUSTOM) { + player.sendMessage(colorize("&ePlease enter the custom location in the chat. (x,y,z) or (x,y,z,yaw,pitch)")); + menu.openChat(main, getValue(), (message) -> { + String customLocation = message; + message = HandlePlaceholders.parsePlaceholders(player, house, message); + String[] split = message.split(","); + if (split.length != 3 && split.length != 5) { + player.sendMessage(colorize("&cInvalid format! Please use: ,, or ,,,,")); + return; + } + + try { + for (int i = 0; i < split.length; i++) { + if (split[i].startsWith("~")) { + split[i] = split[i].substring(1); + } + + if (split[i].startsWith("^")) { + split[i] = split[i].substring(1); + } + + if (split[i].isEmpty()) continue; + if (split[i].equalsIgnoreCase("null")) { + split[i] = "0"; + } + + Float.parseFloat(split[i]); + } + } catch (NumberFormatException e) { + player.sendMessage(colorize("&cInvalid format! Please use: ,, or ,,,,")); + return; + } + setValue(customLocation, player); + Bukkit.getScheduler().runTask(main, menu::open); + }); + } else if (location == Locations.PLAYER_LOCATION) { + Location loc = player.getLocation(); + setValue(loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + loc.getYaw() + "," + loc.getPitch(), player); + menu.open(); + } else { + setValue(location.name(), player); + menu.open(); + } + } + ).open(); + } + + public Location getLocation(Player player, HousingWorld house) { + return getLocation(player, house, player.getLocation(), player.getEyeLocation()); + } + + public Location getLocation(Player player, HousingWorld house, Location baseLocation, Location eyeLocation) { + if (getValue() == null) return null; + if (getValue().equalsIgnoreCase("null") || getValue().equals("0")) return null; + + String value = Placeholder.handlePlaceholders(getValue(), house, player); + + if (Locations.fromString(value) != null) { + return switch (Locations.fromString(value)) { + case CUSTOM -> null; + case HOUSE_SPAWN -> house.getSpawn(); + case PLAYER_LOCATION -> null; + case INVOKERS_LOCATION -> player.getLocation(); + }; + } + + String[] split = value.split(","); + if (split.length != 3 && split.length != 5) return null; + try { + if (value.contains("^") && eyeLocation != null) { + String x = split[0]; + String y = split[1]; + String z = split[2]; + + double xV = (x.startsWith("^")) ? Double.parseDouble(x.substring(1)) : Double.parseDouble(x); + double yV = (y.startsWith("^")) ? Double.parseDouble(y.substring(1)) : Double.parseDouble(y); + double zV = (z.startsWith("^")) ? Double.parseDouble(z.substring(1)) : Double.parseDouble(z); + + //forward + Vector forward = eyeLocation.getDirection().clone().multiply(zV); + //right + Vector right = eyeLocation.getDirection().clone().crossProduct(new Vector(0, 1, 0)).normalize().multiply(xV); + //up + Vector up = new Vector(0, yV, 0); + + return baseLocation.clone().add(forward).add(right).add(up); + } + + double x = 0, y = 0, z = 0, yaw = baseLocation.getYaw(), pitch = baseLocation.getPitch(); + + for (int i = 0; i < split.length; i++) { + double handledValue = handleRelative(i, split[i], baseLocation); + switch (i) { + case 0 -> x = handledValue; + case 1 -> y = handledValue; + case 2 -> z = handledValue; + case 3 -> yaw = handledValue; + default -> pitch = handledValue; + } + } + + return new Location(baseLocation.getWorld(), x, y, z, (float) yaw, (float) pitch); + } catch (NumberFormatException e) { + e.printStackTrace(); + player.sendMessage(colorize("&cInvalid format! Please use: ,,")); + return null; + } + } + + private double handleRelative(int index, String part, Location baseLocation) { + //Sorry if this looks like a mess :( + double value = (part.startsWith("~")) ? + (part.length() == 1 ? 0 : Double.parseDouble(part.substring(1))) : + Double.parseDouble(part); + + double base = switch (index) { + case 0 -> baseLocation.getX(); + case 1 -> baseLocation.getY(); + case 2 -> baseLocation.getZ(); + case 3 -> baseLocation.getYaw(); + case 4 -> baseLocation.getPitch(); + default -> 0; + }; + + if (part.startsWith("~")) { + return base + value; + } + return value; + } + + @Override + public String update(HashMap properties, HousingWorld house) { + if (getId().equals("location")) { + if (properties.get("customLocation") != null) { + return (String) properties.get("customLocation"); + } + return properties.get("location").toString(); + } + if (getId().equals("location2")) { + if (properties.get("customLocation2") != null) { + return (String) properties.get("customLocation2"); + } + return properties.get("location2").toString(); + } + return properties.get(getId()).toString(); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/NPCProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/NPCProperty.java new file mode 100644 index 00000000..e831c3cf --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/NPCProperty.java @@ -0,0 +1,47 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingNPC; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class NPCProperty extends ActionProperty { + public NPCProperty(String id, String name, String description) { + super(id, name, description, Material.PLAYER_HEAD); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + List> npcs = new ArrayList<>(); + for (HousingNPC npc : house.getNPCs()) { + double distance = npc.getLocation().distance(player.getLocation()); + npcs.add(new Duple<>(npc, ItemBuilder.create(Material.PLAYER_HEAD).name(npc.getName()).info("Distance", Math.toIntExact(Math.round(distance))).info("NPC ID", npc.getInternalID()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); + } + + npcs.sort(Comparator.comparing(npc -> npc.getFirst().getLocation().distance(player.getLocation()))); + + PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select an NPC", npcs, player, house, menu, (npc) -> { + menu.open(); + setValue(npc.getInternalID()); + player.sendMessage(colorize("&a" + getName() + " set to: " + npc.getName())); + }); + paginationMenu.open(); + } + + public HousingNPC getHousingNPC(HousingWorld house) { + return house.getNPC(getValue()); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/NumberProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/NumberProperty.java new file mode 100644 index 00000000..b7d2aa6d --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/NumberProperty.java @@ -0,0 +1,72 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.NumberUtilsKt; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +@Getter +public class NumberProperty extends ActionProperty implements ActionProperty.PropertySerializer { + private final double min; + private final double max; + + public NumberProperty(String id, String name, String description) { + this(id, name, description, 0, Double.MAX_VALUE); + } + + public NumberProperty(String id, String name, String description, double min, double max) { + super(id, name, description, Material.REPEATER); + this.min = min; + this.max = max; + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + player.sendMessage("§eEnter a value:"); + menu.openChat(main, getValue(), message -> { + if (NumberUtilsKt.isDouble(message)) { + double value = Double.parseDouble(message); + + if (value < getMin()) value = getMin(); + if (value > getMax()) value = getMax(); + + setValue(String.valueOf(value), player); + return; + } + setValue(message, player); + }); + } + + public Double parsedValue(HousingWorld house, Player player) { + if (getValue() == null) return 0D; + String value = Placeholder.handlePlaceholders(getValue(), house, player); + try { + double parsedValue = Double.parseDouble(value); + if (parsedValue < getMin()) parsedValue = getMin(); + if (parsedValue > getMax()) parsedValue = getMax(); + return parsedValue; + } catch (NumberFormatException e) { + return 0D; + } + } + + @Override + public String serialize() { + return getValue(); + } + + @Override + public String deserialize(Object value, HousingWorld house) { + if (value instanceof Double) { + return String.valueOf(value); + } else if (value instanceof String) { + return (String) value; + } else { + return null; + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/PaginationProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/PaginationProperty.java new file mode 100644 index 00000000..b1c088e8 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/PaginationProperty.java @@ -0,0 +1,68 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; +import java.util.stream.Collectors; + +public abstract class PaginationProperty extends ActionProperty implements ActionProperty.PropertySerializer { + + public PaginationProperty(String id, String name, String description, Material icon) { + super(id, name, description, icon); + } + + protected abstract List getItems(HousingWorld house); + + protected abstract ItemBuilder buildItem(T item); + + protected abstract void onSelect(T item, Player player); + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + List> items = getItems(house).stream() + .map(item -> new Duple<>(item, buildItem(item))) + .collect(Collectors.toList()); + + PaginationMenu paginationMenu = new PaginationMenu<>( + main, + "Select " + getName(), + items, + player, + house, + menu, + (item) -> { + onSelect(item, player); + setValue(item, player); + menu.open(); + } + ); + paginationMenu.open(); + } + + @Override + protected String displayValue() { + return getValue() != null ? getValue().toString() : "&cNone"; + } + + @Override + public String serialize() { + return (getValue() != null) ? getValue().toString() : null; + } + + @Override + public T deserialize(Object value, HousingWorld housingWorld) { + return getItems(housingWorld) + .stream() + .filter(item -> item.toString().equals(value)) + .findFirst() + .orElse(null); + } +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/PotionProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/PotionProperty.java new file mode 100644 index 00000000..2dc6ff93 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/PotionProperty.java @@ -0,0 +1,68 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.StringUtilsKt; +import net.kyori.adventure.key.Key; +import org.bukkit.Material; +import org.bukkit.Registry; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.potion.PotionType; + +import java.util.ArrayList; +import java.util.List; + +public class PotionProperty extends ActionProperty implements ActionProperty.PropertySerializer { + public PotionProperty(String id, String name, String description) { + super(id, name, description, Material.POTION); + } + + @Override + protected String displayValue() { + return "&6" + StringUtilsKt.formatCapitalize(getValue().getName()); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + //Create a list of all the potion effects + List> potionDuple = new ArrayList<>(); + for (PotionEffectType type : Registry.EFFECT) { + potionDuple.add(new Duple<>(type, + ItemBuilder.create(Material.POTION) + .potionType(PotionType.getByEffect(PotionEffectType.GLOWING) == null ? PotionType.WATER : PotionType.getByEffect(PotionEffectType.GLOWING)) + .name("&6" + StringUtilsKt.formatCapitalize(type.getName().replace("minecraft:", ""))) + )); + } + //Basically because Sound isnt a ENUM we cant just use the enum class + new PaginationMenu<>(main, + "&eSelect a Potion", potionDuple, + player, house, menu, (e, sound) -> { + setValue(sound, player); + menu.open(); + }).open(); + } + + @Override + public String serialize() { + return getValue().getName(); + } + + @Override + public PotionEffectType deserialize(Object value, HousingWorld house) { + if (value instanceof String) { + return PotionEffectType.getByName((String) value); + } + Main.getInstance().getLogger().warning("Invalid Potion Effect: " + value); + return PotionEffectType.SPEED; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/ProtoolsCoordsProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/ProtoolsCoordsProperty.java new file mode 100644 index 00000000..f771c713 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/ProtoolsCoordsProperty.java @@ -0,0 +1,129 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Enums.Locations; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.Menu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.Duple; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.util.Vector; + +import java.util.function.BiFunction; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class ProtoolsCoordsProperty extends ActionProperty { + public ProtoolsCoordsProperty(String id, String name, String description) { + super(id, name, description, Material.GRASS_BLOCK); + } + + public Location getLocation(Player player, HousingWorld house) { + return getLocation(player, house, player.getLocation(), player.getEyeLocation()); + } + + public Location getLocation(Player player, HousingWorld house, Location baseLocation, Location eyeLocation) { + if (getValue() == null) return null; + if (getValue().equalsIgnoreCase("null") || getValue().equals("0")) return null; + + String value = Placeholder.handlePlaceholders(getValue(), house, player); + + String[] split = value.split(","); + if (split.length != 3) return null; + try { + if (value.contains("^") && eyeLocation != null) { + String x = split[0]; + String y = split[1]; + String z = split[2]; + + double xV = (x.startsWith("^")) ? Double.parseDouble(x.substring(1)) : Double.parseDouble(x); + double yV = (y.startsWith("^")) ? Double.parseDouble(y.substring(1)) : Double.parseDouble(y); + double zV = (z.startsWith("^")) ? Double.parseDouble(z.substring(1)) : Double.parseDouble(z); + + //forward + Vector forward = eyeLocation.getDirection().clone().multiply(zV); + //right + Vector right = eyeLocation.getDirection().clone().crossProduct(new Vector(0, 1, 0)).normalize().multiply(xV); + //up + Vector up = new Vector(0, yV, 0); + + return eyeLocation.clone().add(forward).add(right).add(up); + } + + double x = 0, y = 0, z = 0; + + for (int i = 0; i < split.length; i++) { + double handledValue = handleRelative(i, split[i], baseLocation); + switch (i) { + case 0 -> x = handledValue; + case 1 -> y = handledValue; + case 2 -> z = handledValue; + } + } + + return new Location(baseLocation.getWorld(), x, y, z); + } catch (NumberFormatException e) { + e.printStackTrace(); + return null; + } + } + + private double handleRelative(int index, String part, Location baseLocation) { + //Sorry if this looks like a mess :( + double value = (part.startsWith("~")) ? + (part.length() == 1 ? 0 : Double.parseDouble(part.substring(1))) : + Double.parseDouble(part); + + double base = switch (index) { + case 0 -> baseLocation.getX(); + case 1 -> baseLocation.getY(); + case 2 -> baseLocation.getZ(); + default -> 0; + }; + + if (part.startsWith("~")) { + return base + value; + } + return value; + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + boolean isA = getId().equals("posA"); + String value = getValue(); + if (event.isLeftClick()) { + menu.openChat(Main.getInstance(), value, (s) -> { + setValue(s, player); + Bukkit.getScheduler().runTask(Main.getInstance(), menu::open); + }); + } else if (event.getClick() == ClickType.MIDDLE) { + Duple selection = Main.getInstance().getProtoolsManager().getSelection(player); + if (selection == null || selection.getFirst() == null) { + player.sendMessage("&cYou must select a region first!"); + return; + } + if (isA) { + setValue(String.format( + "%s,%s,%s", + selection.getFirst().getBlockX(), + selection.getFirst().getBlockY(), + selection.getFirst().getBlockZ() + ), player); + } else { + setValue(String.format( + "%s,%s,%s", + selection.getSecond().getBlockX(), + selection.getSecond().getBlockY(), + selection.getSecond().getBlockZ() + ), player); + } + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/SlotProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/SlotProperty.java new file mode 100644 index 00000000..78d67f0b --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/SlotProperty.java @@ -0,0 +1,70 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.SlotSelectMenu; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class SlotProperty extends ActionProperty implements ActionProperty.PropertySerializer { + public SlotProperty(String id, String name, String description) { + super(id, name, description, Material.ARMOR_STAND); + } + + @Override + protected String displayValue() { + return slotIndexToName(getValue()); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu backMenu) { + new SlotSelectMenu(player, main, backMenu, this::setValue).open(); + } + + private String slotIndexToName(int index) { + if (index == -1) { + return "First Available Slot"; + } + if (index == -2) { + return "Hand Slot"; + } + if (index == -3 || index == -106) { + return "Offhand Slot"; + } + if (index < 9 && index >= 0) { + return "Inventory Slot " + (index + 1); + } + if (index < 36 && index >= 9) { + return "Inventory Slot " + (index - 8); + } + if (index == 103) { + return "Helmet"; + } + if (index == 102) { + return "Chestplate"; + } + if (index == 101) { + return "Leggings"; + } + if (index == 100) { + return "Boots"; + } + if (index >= 80 && index <= 83) { + return "Crafting Slot " + (index - 79); + } + return "Unknown Slot"; + } + + @Override + public Double serialize() { + return getValue().doubleValue(); + } + + @Override + public Integer deserialize(Object value, HousingWorld housingWorld) { + return ((Double) value).intValue(); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/SoundProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/SoundProperty.java new file mode 100644 index 00000000..c6033257 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/SoundProperty.java @@ -0,0 +1,56 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import com.al3x.housing2.Utils.StringUtilsKt; +import org.bukkit.Material; +import org.bukkit.Registry; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.List; + +public class SoundProperty extends ActionProperty implements ActionProperty.PropertySerializer { + public SoundProperty(String id, String name, String description) { + super(id, name, description, Material.NOTE_BLOCK); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + //Create a list of all the potion effects + List> soundDuple = new ArrayList<>(); + for (Sound type : Registry.SOUNDS) { + soundDuple.add(new Duple<>(type, ItemBuilder.create(Material.NOTE_BLOCK).name("&6" + type.name()))); + } + //Basically because Sound isnt a ENUM we cant just use the enum class + new PaginationMenu<>(main, + "&eSelect a Sound", soundDuple, + player, house, menu, (e, sound) -> { + if (e.isRightClick()) { + player.playSound(player.getLocation(), sound, + menu.getAction().getValue("volume", Double.class).floatValue(), + menu.getAction().getValue("pitch", Double.class).floatValue() + ); + } else { + setValue(sound, player); + menu.open(); + } + }).open(); + } + + @Override + public String serialize() { + return getValue().name(); + } + + @Override + public Sound deserialize(Object value, HousingWorld house) { + return Sound.valueOf((String) value); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/StatInstanceProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/StatInstanceProperty.java new file mode 100644 index 00000000..7d50db36 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/StatInstanceProperty.java @@ -0,0 +1,197 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Actions.StatValue; +import com.al3x.housing2.Action.StatInstance; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Enums.StatOperation; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Menus.PaginationMenu; +import com.al3x.housing2.Utils.Duple; +import com.al3x.housing2.Utils.ItemBuilder; +import com.google.gson.JsonElement; +import com.google.gson.internal.LinkedTreeMap; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.al3x.housing2.Instances.HousesManager.gson; +import static com.al3x.housing2.Utils.Color.colorize; + +@Slf4j +@Setter +public class StatInstanceProperty extends ExpandableProperty> implements ActionProperty.PropertySerializer, List>, ActionProperty.PropertyUpdater> { + boolean showExpression = false; + public StatInstanceProperty() { + super("statInstances"); + } + + @Override + public List> getProperties() { + List> properties = new ArrayList<>(); + List value = getValue(); + for (int i = 0; i < value.size(); i++) { + StatInstance instance = value.get(i); + properties.add(new ModeProperty(i, instance)); + properties.add(new StatValueProperty(i, instance)); + } + return properties; + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + + } + + @Override + public List serialize() { + return getValue().stream().map(StatInstance.StatInstanceData::new).collect(Collectors.toList()); + } + + @Override + public List deserialize(JsonElement val, HousingWorld housingWorld) { + List value = dataToList(val.getAsJsonArray(), StatInstance.StatInstanceData.class); + + return value.stream().map((data) -> { + StatInstance instance = new StatInstance(); + instance.mode = data.mode; + instance.value = new StatValueProperty.StatValueInstance( + data.value.isExpression(), + data.value.getLiteralValue(), + StatValue.fromActionData(data.value.getExpressionValue(), housingWorld) + ); + return instance; + }).collect(Collectors.toList()); + } + + @Override + public List> getInfo() { + List> info = new LinkedList<>(); + info.add(new Duple<>("Stat Instances", "")); + for (StatInstance instance : getValue()) { + info.add(new Duple<>(instance.mode.name(), instance.value.toString())); + } + return info; + } + + @Override + public List update(HashMap properties, HousingWorld house) { + if (!properties.containsKey("version")) { + List instancesList = (List) properties.get("statInstances"); + List instances = new ArrayList<>(statInstances(instancesList, house)); + return instances; + } + return null; + } + + private List statInstances(List instances, HousingWorld house) { + List statInstances = new ArrayList<>(); + for (Object object : instances) { + LinkedTreeMap map = (LinkedTreeMap) object; + StatInstance instance = new StatInstance(); + instance.mode = StatOperation.valueOf((String) map.get("mode")); + map = (LinkedTreeMap) map.get("value"); + + Object value = map.get("value"); + if (value != null) { + LinkedTreeMap map2 = (LinkedTreeMap) value; + HashMap map3 = new HashMap<>(); + for (String key : map2.keySet()) { + if (key.equals("statType") || key.equals("comment") || key.equals("name")) continue; + if (key.equals("literalValue") || key.equals("value")) { + HashMap map4 = new HashMap<>(); + map4.put("literalValue", map2.get("literalValue")); + map4.put("isExpression", map2.get("isExpression")); + map4.put("expressionValue", map2.get("value")); + map3.put("value", map4); + continue; + } + if (key.equals("statInstances")) { + map3.put("statInstances", map.get("statInstances")); + continue; + } + map3.put(key, map2.get(key)); + } + ActionData actionData = new ActionData( + "StatValue", + map3, + (String) map2.get("comment") + ); + instance.value = new StatValueProperty.StatValueInstance( + (boolean) map.get("isExpression"), + map.get("literalValue") == null ? null : (String) map.get("literalValue"), + StatValue.fromActionData(actionData, house) + ); + } else { + instance.value = new StatValueProperty.StatValueInstance( + (boolean) map.get("isExpression"), + map.get("literalValue") == null ? null : (String) map.get("literalValue"), + null + ); + } + statInstances.add(instance); + } + return statInstances; + } + + private class ModeProperty extends ActionProperty { + private final int index; + private final StatInstance instance; + public ModeProperty(int index, StatInstance instance) { + super( + "mode" + index, + "Mode", + "The operation to perform on the stat", + Material.COMPASS + ); + this.index = index; + this.instance = instance; + + getBuilder().lClick(ItemBuilder.ActionType.CHANGE_YELLOW); + if (index > 0) { + getBuilder().rClick(ItemBuilder.ActionType.REMOVE_YELLOW); + } + } + + @Override + protected String displayValue() { + return instance.mode.name(); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + if (event.getClick() == ClickType.RIGHT && index > 0) { + StatInstanceProperty.this.getValue().remove(instance); + menu.open(); + return; + } + + if (event.getClick() != ClickType.LEFT) return; + + List> modes = new ArrayList<>(); + for (StatOperation mode : StatOperation.values()) { + if (!showExpression && mode.expressionOnly()) continue; + modes.add(new Duple<>(mode, ItemBuilder.create(mode.getMaterial()).name("&a" + mode))); + } + new PaginationMenu<>(main, "&eSelect a mode", modes, player, house, menu, (mode) -> { + instance.mode = mode; + menu.open(); + }).open(); + } + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/StatValueProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/StatValueProperty.java new file mode 100644 index 00000000..32aea102 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/StatValueProperty.java @@ -0,0 +1,142 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Actions.StatValue; +import com.al3x.housing2.Action.StatInstance; +import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Utils.ItemBuilder; +import com.google.gson.JsonElement; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class StatValueProperty extends ActionProperty implements ActionProperty.PropertySerializer { + StatInstance instance = null; + + public StatValueProperty(String id) { + super(id, "Value", null, Material.BOOK); + + setValue(new StatValueInstance(false, "1.0", null)); + } + + public StatValueProperty(int index, StatInstance instance) { + super("value" + index, "Value", null, Material.BOOK); + this.instance = instance; + setValue(instance.value); + } + + @Override + public StatValueInstance getValue() { + if (instance != null) { + return instance.value; + } + return super.getValue(); + } + + @Override + public ItemBuilder getDisplayItem() { + ItemBuilder item = ItemBuilder.create(getIcon()) + .name("Value") + .info("&eCurrent Value", ""); + + if (getValue().isExpression()) { + item.info(null, getValue().getExpressionValue().toString()) + .lClick(ItemBuilder.ActionType.EDIT_YELLOW); + } else { + item.info(null, getValue().getLiteralValue()) + .lClick(ItemBuilder.ActionType.CHANGE_YELLOW); + } + + item.info(null, "") + .info("Expression", getValue().isExpression() ? "&aEnabled" : "&cDisabled") + .mClick(ItemBuilder.ActionType.TOGGLE_EXPRESSION); + return item; + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + if (event.getClick() == ClickType.MIDDLE) { + // Toggle expression + setValue(getValue().isExpression() ? + getValue().withLiteral(getValue().getLiteralValue()) : + getValue().withExpression(new StatValue()) + ); + menu.open(); + return; + } + + if (getValue().isExpression()) { + new ActionEditMenu(getValue().getExpressionValue(), main, player, house, menu).open(); + } else { + menu.openChat(main, getValue().getLiteralValue(), (message) -> setValue(getValue().withLiteral(message), player)); + } + } + + @Override + public StatValueData serialize() { + return new StatValueData( + getValue().isExpression(), + getValue().getLiteralValue(), + ActionData.toData(getValue().getExpressionValue()) + ); + } + + @Override + public StatValueInstance deserialize(JsonElement v, HousingWorld house) { + StatValueData value = dataToObject(v, StatValueData.class); + return new StatValueInstance( + value.isExpression, + value.literalValue, + StatValue.fromActionData(value.expressionValue, house) + ); + } + + @AllArgsConstructor + @Getter + @Setter + public static class StatValueInstance { + private boolean isExpression; + private String literalValue; + private StatValue expressionValue; + + public StatValueInstance withExpression(StatValue expressionValue) { + this.isExpression = true; + this.expressionValue = expressionValue; + return this; + } + + public StatValueInstance withLiteral(String literalValue) { + this.isExpression = false; + this.literalValue = literalValue; + return this; + } + + public String calculate(Player player, HousingWorld world) { + if (isExpression) { + return expressionValue.calculate(player, world); + } + return literalValue; + } + + @Override + public String toString() { + return isExpression ? expressionValue.toString() : literalValue; + } + } + + @AllArgsConstructor + @Getter + public static class StatValueData { + private boolean isExpression; + private String literalValue; + private ActionData expressionValue; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/StringProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/StringProperty.java new file mode 100644 index 00000000..34b1ac7b --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/StringProperty.java @@ -0,0 +1,42 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.Action; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Placeholders.custom.Placeholder; +import com.al3x.housing2.Utils.StringUtilsKt; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import static com.al3x.housing2.Utils.Color.colorize; + +public class StringProperty extends ActionProperty { + public StringProperty(String id, String name, String description) { + super(id, name, description, Material.STRING); + } + + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + player.sendMessage(colorize("&aPlease type the value you want to set for " + getName() + ":")); + menu.openChat(main, getValue(), (message) -> setValue(message, player)); + } + + public String parsedValue(HousingWorld house, Player player) { + return Placeholder.handlePlaceholders(getValue(), house, player); + } + + public Component component(HousingWorld house, Player player) { + return StringUtilsKt.housingStringFormatter(getValue(), house, player); + } + + public String parseNoSpace(HousingWorld house, Player player) { + String s = Placeholder.handlePlaceholders(getValue(), house, player); + if (s.contains(" ")) { + player.sendMessage(colorize("&cSpaces are not allowed in this value!")); + return null; + } + return s; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/Properties/VersionProperty.java b/paper/src/main/java/com/al3x/housing2/Action/Properties/VersionProperty.java new file mode 100644 index 00000000..e66ac90f --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Action/Properties/VersionProperty.java @@ -0,0 +1,27 @@ +package com.al3x.housing2.Action.Properties; + +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Menus.Actions.ActionEditMenu; +import com.al3x.housing2.Utils.Duple; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import java.util.List; + +public class VersionProperty extends ExpandableProperty { + public VersionProperty() { + super("version"); + } + + @Override + public void runnable(InventoryClickEvent event, HousingWorld house, Player player, ActionEditMenu menu) { + + } + + @Override + public List> getInfo() { + return List.of(); + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Action/StatInstance.java b/paper/src/main/java/com/al3x/housing2/Action/StatInstance.java index 187151da..358eb8cf 100644 --- a/paper/src/main/java/com/al3x/housing2/Action/StatInstance.java +++ b/paper/src/main/java/com/al3x/housing2/Action/StatInstance.java @@ -1,26 +1,36 @@ package com.al3x.housing2.Action; import com.al3x.housing2.Action.Actions.StatValue; -import com.al3x.housing2.Data.StatActionData; +import com.al3x.housing2.Data.ActionData; import com.al3x.housing2.Enums.StatOperation; -import com.google.gson.Gson; -import java.util.LinkedHashMap; +import static com.al3x.housing2.Action.Properties.StatValueProperty.*; public class StatInstance { - private static final Gson gson = new Gson(); public StatOperation mode; - public StatValue value; + public StatValueInstance value; - public StatInstance(String statType) { + public StatInstance() { this.mode = StatOperation.INCREASE; - this.value = new StatValue(statType); + this.value = new StatValueInstance( + false, + "1.0", + null + ); } - public void fromData(LinkedHashMap data, Class actionClass) { - mode = StatOperation.valueOf((String) data.get("mode")); - value = gson.fromJson(gson.toJson(data.get("value")), StatActionData.MoreStatData.class).toStatValue(); - } + public static class StatInstanceData { + public StatOperation mode; + public StatValueData value; + public StatInstanceData(StatInstance instance) { + this.mode = instance.mode; + this.value = new StatValueData( + instance.value.isExpression(), + instance.value.getLiteralValue(), + ActionData.toData(instance.value.getExpressionValue()) + ); + } + } } diff --git a/paper/src/main/java/com/al3x/housing2/Commands/Housing.java b/paper/src/main/java/com/al3x/housing2/Commands/Housing.java index 9da65557..5144c4c8 100644 --- a/paper/src/main/java/com/al3x/housing2/Commands/Housing.java +++ b/paper/src/main/java/com/al3x/housing2/Commands/Housing.java @@ -8,9 +8,11 @@ import com.al3x.housing2.Enums.permissions.Permissions; import com.al3x.housing2.Instances.HousesManager; import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Item; import com.al3x.housing2.Menus.HouseBrowserMenu; import com.al3x.housing2.Menus.HousingMenu.HousingMenu; import com.al3x.housing2.Network.PlayerNetwork; +import com.al3x.housing2.Utils.Serialization; import com.al3x.housing2.network.payload.clientbound.ClientboundSyntax; import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.StringArgumentType; @@ -29,7 +31,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -140,7 +144,7 @@ public Housing(Commands commandRegistrar, HousesManager housesManager) { .executes(this::unwhitelist) ) ) - .then(Commands.literal("migrate") + .then(Commands.literal("migrateitems") .requires(this::isAdmin) .executes(this::migrate) ) @@ -162,7 +166,47 @@ private int reload(CommandContext context) { } private int migrate(CommandContext context) { -// housesManager.migrateHouses(); + Player player = (Player) context.getSource().getSender(); + HousingWorld house = housesManager.getHouse(player.getWorld()); + if (house == null) { + player.sendMessage(colorize("&cYou are not in a house!")); + return Command.SINGLE_SUCCESS; + } + + house.getPlayersData().forEach((uuid, data) -> { + try { + List armor = Serialization.itemStacksFromBase64(data.getArmor()); + List inventory = Serialization.itemStacksFromBase64(data.getInventory()); + List enderChest = Serialization.itemStacksFromBase64(data.getEnderchest()); + + for (int i = 0; i < armor.size(); i++) { + ItemStack item = armor.get(i); + if (item != null) { + item = Item.fromOldItemStack(item, house).build(); + armor.set(i, item); + } + } + + for (int i = 0; i < inventory.size(); i++) { + ItemStack item = inventory.get(i); + if (item != null) { + item = Item.fromOldItemStack(item, house).build(); + inventory.set(i, item); + } + } + + for (int i = 0; i < enderChest.size(); i++) { + ItemStack item = enderChest.get(i); + if (item != null) { + item = Item.fromOldItemStack(item, house).build(); + enderChest.set(i, item); + } + } + } catch (IOException e) { + player.sendMessage(colorize("&cFailed to migrate items for " + uuid)); + throw new RuntimeException(e); + } + }); return Command.SINGLE_SUCCESS; } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/CHTSLImpl.java b/paper/src/main/java/com/al3x/housing2/Condition/CHTSLImpl.java index 1c239a91..861b1d16 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/CHTSLImpl.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/CHTSLImpl.java @@ -4,6 +4,7 @@ import com.al3x.housing2.Enums.EnumHTSLAlternative; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.NumberUtilsKt; +import org.bukkit.Material; import java.lang.reflect.Field; import java.util.Arrays; @@ -12,12 +13,10 @@ import java.util.List; public abstract class CHTSLImpl extends Condition { - public CHTSLImpl(String name) { - super(name); + public CHTSLImpl(ConditionEnum condition, String name, String description, Material icon, List scriptingKeywords) { + super(condition, name, description, icon, scriptingKeywords); } - public abstract String keyword(); - public String syntax() { HashMap actionData = data(); StringBuilder builder = new StringBuilder(); @@ -26,7 +25,7 @@ public String syntax() { builder.append("<").append(key).append(">"); if (actionData.get(key) != keys.getLast()) builder.append(" "); } - return keyword() + (!builder.isEmpty() ? " " + builder : ""); + return getScriptingKeywords().getFirst() + (!builder.isEmpty() ? " " + builder : ""); } public String export() { @@ -63,7 +62,7 @@ public String export(int indent) { } String output = builder.toString(); if (output.endsWith(" ")) output = output.substring(0, output.length() - 1); - return " ".repeat(indent) + keyword() + (!output.isEmpty() ? " " + output: ""); + return " ".repeat(indent) + getScriptingKeywords().getFirst() + (!output.isEmpty() ? " " + output: ""); } public void importCondition(String action, List nextLines) { diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Condition.java b/paper/src/main/java/com/al3x/housing2/Condition/Condition.java index f394b63f..2d1c3768 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Condition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Condition.java @@ -1,130 +1,41 @@ package com.al3x.housing2.Condition; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionExecutor; -import com.al3x.housing2.Action.Actions.CancelAction; -import com.al3x.housing2.Enums.EventType; +import com.al3x.housing2.Action.*; +import com.al3x.housing2.Action.Properties.BooleanProperty; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; -/** - * Represents an action that can be executed by a player. - */ -public abstract class Condition { - protected String name; - public boolean inverted = false; +public abstract class Condition extends Action.InternalAction { + public Condition(ConditionEnum condition, String name, String description, Material icon, List scriptingKeywords) { + super(condition.getId(), name, description, icon, scriptingKeywords); - public Condition(String name) { - this.name = name; + getProperties().add( + new BooleanProperty( + "inverted", + "Inverted", + "If true, the condition will be inverted." + ).setValue(false) + ); } - public String getName() { - return name; - } - - public abstract String toString(); - - public abstract void createDisplayItem(ItemBuilder builder); - - public abstract void createAddDisplayItem(ItemBuilder builder); - - public ActionEditor editorMenu(HousingWorld house) { - return null; - } - - public ActionEditor editorMenu(HousingWorld house, Player player) { - return editorMenu(house); - } - - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - return editorMenu(house); - } - - public ActionEditor editorMenu(HousingWorld house, Player player, Menu backMenu) { - return editorMenu(house, backMenu); - } - - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { - return execute(player, house); - } - - public boolean execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - return execute(player, house, event); - } - - public abstract boolean execute(Player player, HousingWorld house); - - public abstract LinkedHashMap data(); - - public abstract boolean requiresPlayer(); - - /** - * Returns a list of events that are allowed for this action. - * Null if all events are allowed. - * - * @return a list of strings representing the allowed events - */ - public List allowedEvents() { + @Override + public OutputType execute(Player player, HousingWorld house) { return null; } - /** - * Returns a map of conditions that are under this action. - *

- * Example: - * Random Action will have a key of "Actions" and then a list of actions under that key. - *

- * - * @return a map of strings representing the actions - */ - public HashMap> getConditions() { - return new HashMap<>(); - } - - public void fromData(HashMap data, Class< ? extends Condition> condtionClass) { - for (String key : data.keySet()) { - if (key.equals("inverted")) { - inverted = (Boolean) data.get(key); - continue; - } - try { - Field field = condtionClass.getDeclaredField(key); - field.setAccessible(true); - if (field.getType().isEnum()) { - field.set(this, Enum.valueOf((Class) field.getType(), (String) data.get(key))); - continue; - } - field.set(this, data.get(key)); - } catch (IllegalAccessException | NoSuchFieldException e) { - e.printStackTrace(); - } - } - } + public abstract OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor); - public Condition clone() { + public Condition clone(HousingWorld house) { Condition condition; - ConditionEnum conditionEnum = ConditionEnum.getConditionByName(getName()); + ConditionEnum conditionEnum = ConditionEnum.getConditionById(getId()); if (conditionEnum == null) { return null; } - HashMap data = data(); - data.put("inverted", inverted); - for (String key : data.keySet()) { - if (data.get(key) instanceof Enum e) { - data.put(key, e.name()); - } - } - condition = conditionEnum.getConditionInstance(data); + condition = conditionEnum.getConditionInstance(data(), house); return condition; } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/ConditionEnum.java b/paper/src/main/java/com/al3x/housing2/Condition/ConditionEnum.java index b8290e42..8eff6855 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/ConditionEnum.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/ConditionEnum.java @@ -2,10 +2,13 @@ import com.al3x.housing2.Condition.Conditions.*; import com.al3x.housing2.Condition.Conditions.IsSneakingCondition; +import com.al3x.housing2.Instances.HousingWorld; +import lombok.Getter; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; +@Getter public enum ConditionEnum { CLICKTYPE_REQUIREMENT("Click Type Requirement", ClickTypeCondition.class), DAMAGE_TYPE("Damage Type", DamageTypeCondition.class), @@ -31,34 +34,23 @@ public enum ConditionEnum { GAMEMODE_REQUIREMENT("Gamemode Requirement", GamemodeRequirementCondition.class), PLACEHOLDER_REQUIREMENT("Placeholder Requirement", PlaceholderRequirementCondition.class), IS_ATTACK_COOLDOWN("Is Attack Cooldown", IsAttackCooldownCondition.class), - IS_VOICE_CONNECTED("Is Voice Connected", IsVoiceConnected.class), - IS_EATING("Is Eating", IsEating.class), + IS_VOICE_CONNECTED("Is Voice Connected", IsVoiceConnectedCondition.class), + IS_EATING("Is Eating", IsEatingCondition.class), IS_SPRINTING("Is Sprinting", IsSprintingCondition.class), ; - - private String name; + private Class condition; + private String id; - ConditionEnum(String name, Class condition) { + ConditionEnum(String id, Class condition) { + this.id = id; this.condition = condition; - this.name = name; - } - - public Class getCondition() { - return condition; } - public String getName() { - return name; - } - - public Condition getConditionInstance(HashMap data) { + public Condition getConditionInstance(HashMap data, HousingWorld house) { try { Condition condition = this.condition.getDeclaredConstructor().newInstance(); - if (data.get("inverted") != null) { - condition.inverted = (boolean) data.get("inverted"); - } - condition.fromData(data, this.condition); + condition.fromData(data, house); return condition; } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); @@ -75,9 +67,9 @@ public Condition getConditionInstance() { return null; } - public static ConditionEnum getConditionByName(String name) { + public static ConditionEnum getConditionById(String id) { for (ConditionEnum condition : ConditionEnum.values()) { - if (condition.name.equals(name)) { + if (condition.getId().equals(id)) { return condition; } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/BlockTypeCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/BlockTypeCondition.java index a15ed218..c7d401e3 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/BlockTypeCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/BlockTypeCondition.java @@ -1,7 +1,11 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; @@ -19,68 +23,44 @@ import java.util.List; public class BlockTypeCondition extends CHTSLImpl { - private Material type; - public BlockTypeCondition() { - super("Block Type Requirement"); - this.type = Material.GRASS_BLOCK; - } - - @Override - public String toString() { - return "BlockTypeCondition{" + - "type=" + type + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GRASS_BLOCK); - builder.name("&eBlock Type Requirement"); - builder.description("Checks the block type is the same as the requirement."); - builder.info("Type", type.name()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); + super( + ConditionEnum.BLOCK_TYPE, + "Block Type Requirement", + "Checks if the block type is the same as the one specified.", + Material.STONE, + List.of("blockType") + ); + getProperties().add(new EnumProperty<>( + "type", + "Block Type", + "The type of block to check for.", + Material.class + ).setValue(Material.GRASS_BLOCK)); } - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GRASS_BLOCK); - builder.name("&eBlock Type Requirement"); - builder.description("Checks the block type is the same as the requirement."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("type", - ItemBuilder.create(type) - .name("&eType") - .info("&7Current Value", "") - .info(null, "&a" + type.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Material.values(), null - ) - ); - return new ActionEditor(4, "Click Type Requirement", items); - } + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Material eventType = null; + if (event.cancellable() instanceof BlockBreakEvent breakEvent) { + eventType = breakEvent.getBlock().getType(); + } - @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { - if (event.cancellable() instanceof BlockBreakEvent e) { - return e.getBlock().getType() == type; + if (event.cancellable() instanceof BlockPlaceEvent placeEvent) { + eventType = placeEvent.getBlock().getType(); } - if (event.cancellable() instanceof BlockPlaceEvent e) { - return e.getBlock().getType() == type; + + if (eventType == null) { + return OutputType.FALSE; } - return false; - } - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + Material blockTypeProperty = getValue("type", Material.class); + if (eventType == blockTypeProperty) { + return OutputType.TRUE; + } else { + return OutputType.FALSE; + } } @Override @@ -88,20 +68,8 @@ public List allowedEvents() { return Arrays.asList(EventType.PLAYER_BLOCK_BREAK, EventType.PLAYER_BLOCK_PLACE); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("type", type.name()); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "blockType"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/ClickTypeCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/ClickTypeCondition.java index 9b427b3d..3aa899f4 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/ClickTypeCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/ClickTypeCondition.java @@ -1,8 +1,12 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -20,65 +24,31 @@ import java.util.List; public class ClickTypeCondition extends CHTSLImpl { - private ClickType type; public ClickTypeCondition() { - super("Click Type Requirement"); - this.type = ClickType.LEFT; - } - - @Override - public String toString() { - return "ClickTypeCondition{" + - "type=" + type + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.DETECTOR_RAIL); - builder.name("&eClick Type Requirement"); - builder.description("Requires the users click type to match the provided condition."); - builder.info("Type", type.name()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DETECTOR_RAIL); - builder.name("&eClick Type Requirement"); - builder.description("Requires the users click type to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super( + ConditionEnum.CLICKTYPE_REQUIREMENT, + "Click Type", + "Checks if the click type is the same as the one specified.", + Material.OAK_BUTTON, + List.of("clickType") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("type", - ItemBuilder.create(Material.DETECTOR_RAIL) - .name("&eType") - .info("&7Current Value", "") - .info(null, "&a" + type.name()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, ClickType.values(), Material.STONE_BUTTON - ) + getProperties().add( + new EnumProperty<>( + "type", + "Click Type", + "The type of click to check for.", + ClickType.class + ).setValue(ClickType.LEFT) ); - return new ActionEditor(4, "Click Type Requirement", items); } - @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (event.cancellable() instanceof InventoryClickEvent e) { - return e.getClick() == type; + return e.getClick() == getValue("type", ClickType.class) ? OutputType.TRUE : OutputType.FALSE; } - return false; - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + return OutputType.FALSE; } @Override @@ -86,20 +56,8 @@ public List allowedEvents() { return Arrays.asList(EventType.INVENTORY_CLICK); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("type", type.name()); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "clickType"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageAmountCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageAmountCondition.java index 7f9c6d5f..6654039c 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageAmountCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageAmountCondition.java @@ -2,7 +2,11 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.StatComparator; @@ -24,77 +28,37 @@ import java.util.List; public class DamageAmountCondition extends CHTSLImpl implements NPCCondition { - private StatComparator comparator; - private Double compareValue; public DamageAmountCondition() { - super("Damage Amount"); - this.comparator = StatComparator.GREATER_THAN_OR_EQUAL; - this.compareValue = 1.0; - } - - @Override - public String toString() { - return "DamageAmount{" + - "comparator=" + comparator + - ", compareValue=" + compareValue + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.WOODEN_SWORD); - builder.name("&eDamage Amount Requirement"); - builder.description("Requires the users damage amount to match the provided condition."); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.WOODEN_SWORD); - builder.name("&eDamage Amount Requirement"); - builder.description("Requires the users damage amount to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ) + super(ConditionEnum.DAMAGE_AMOUNT, + "Damage Amount Requirement", + "Checks if the damage amount is the same as the one specified.", + Material.WOODEN_SWORD, + List.of("damageAmount") ); - return new ActionEditor(4, "Damage Amount Requirement", items); + getProperties().addAll(List.of( + new EnumProperty<>( + "comparator", + "Comparator", + "The comparator to use for the damage amount.", + StatComparator.class + ).setValue(StatComparator.GREATER_THAN_OR_EQUAL), + new DoubleProperty( + "compareValue", + "Damage Amount", + "The damage amount to compare against." + ).setValue(1.0) + )); } @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getValue("compareValue", Double.class); if (event.cancellable() instanceof EntityDamageEvent e) { - return Comparator.compare(comparator, e.getDamage(), compareValue); + return Comparator.compare(comparator, e.getDamage(), compareValue) ? OutputType.TRUE : OutputType.FALSE; } - return false; - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + return OutputType.FALSE; } @Override @@ -102,26 +66,15 @@ public List allowedEvents() { return Arrays.asList(EventType.PLAYER_DAMAGE, EventType.PLAYER_ATTACK, EventType.NPC_DAMAGE); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "damageAmount"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getValue("compareValue", Double.class); if (event.cancellable() instanceof EntityDamageByEntityEvent e) { return Comparator.compare(comparator, e.getDamage(), compareValue); } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageTypeCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageTypeCondition.java index eafc1c00..a0c0c389 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageTypeCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/DamageTypeCondition.java @@ -2,7 +2,10 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.DamageTypes; import com.al3x.housing2.Enums.EventType; @@ -22,65 +25,33 @@ import java.util.List; public class DamageTypeCondition extends CHTSLImpl implements NPCCondition { - private DamageTypes damageType; - public DamageTypeCondition() { - super("Damage Type"); - this.damageType = DamageTypes.PLAYER_ATTACK; - } - - @Override - public String toString() { - return "DamageType{" + - "damageType=" + damageType + - '}'; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(damageType.getMaterial()); - builder.name("&eDamage Type Requirement"); - builder.description("Requires the users damage type to match the provided condition."); - builder.info("Damage Type", damageType.getTranslation()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.IRON_SWORD); - builder.name("&eDamage Type Requirement"); - builder.description("Requires the users damage type to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ConditionEnum.DAMAGE_TYPE, + "Damage Type Requirement", + "Checks if the damage type is the same as the one specified.", + Material.IRON_SWORD, + List.of("damageType") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("damageType", - ItemBuilder.create(Material.WOODEN_SWORD) - .name("&eDamage Type") - .info("&7Current Value", "") - .info(null, damageType.getTranslation()) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, DamageTypes.values(), null - ) + getProperties().add( + new EnumProperty<>( + "damageType", + "Damage Type", + "The type of damage to check for.", + DamageTypes.class + ).setValue(DamageTypes.FALL) ); - return new ActionEditor(4, "Damage Type Requirement", items); } @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + DamageTypes damageType = getValue("damageType", DamageTypes.class); if (event.cancellable() instanceof EntityDamageEvent e) { - return e.getDamageSource().getDamageType() == damageType.getDamageType(); + return e.getDamageSource().getDamageType() == damageType.getDamageType() + ? OutputType.TRUE : OutputType.FALSE; } - return false; - } - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + return OutputType.FALSE; } @Override @@ -88,25 +59,14 @@ public List allowedEvents() { return Arrays.asList(EventType.PLAYER_DAMAGE, EventType.PLAYER_ATTACK, EventType.NPC_DAMAGE); } - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("damageType", damageType.name()); - return data; - } - @Override public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "damageType"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + DamageTypes damageType = getValue("damageType", DamageTypes.class); if (event.cancellable() instanceof EntityDamageEvent e) { return e.getDamageSource().getDamageType() == damageType.getDamageType(); } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GamemodeRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GamemodeRequirementCondition.java index 67cd3b33..45b74b9e 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GamemodeRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GamemodeRequirementCondition.java @@ -1,10 +1,15 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.Gamemodes; import com.al3x.housing2.Enums.StatComparator; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Comparator; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; @@ -16,71 +21,28 @@ import java.util.List; public class GamemodeRequirementCondition extends CHTSLImpl { - private Gamemodes gamemode; - public GamemodeRequirementCondition() { - super("Gamemode Requirement"); - this.gamemode = Gamemodes.SURVIVAL; - } - - @Override - public String toString() { - return "GamemodeRequirementCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.DAYLIGHT_DETECTOR); - builder.name("&aGamemode Requirement"); - builder.description("Requires the user to be in the specified gamemode."); - builder.info("Gamemode", gamemode.toString()); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.DAYLIGHT_DETECTOR); - builder.name("&eGamemode Requirement"); - builder.description("Requires the user to be in the specified gamemode."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("gamemode", - ItemBuilder.create(Material.DAYLIGHT_DETECTOR) - .name("&eGamemode") - .info("&7Current Value", "") - .info(null, "&a" + gamemode) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Gamemodes.values(), null - ) + super(ConditionEnum.GAMEMODE_REQUIREMENT, + "Gamemode Requirement", + "Checks if the player is in the specified gamemode.", + Material.DAYLIGHT_DETECTOR, + List.of("gamemode") ); - return new ActionEditor(4, "Gamemode Requirement", items); + getProperties().add(new EnumProperty<>( + "gamemode", + "Gamemode", + "The gamemode to check for.", + Gamemodes.class + ).setValue(Gamemodes.SURVIVAL)); } @Override - public boolean execute(Player player, HousingWorld house) { - return (player.getGameMode() == gamemode.getGameMode()); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("gamemode", gamemode); - return data; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.getGameMode() == getValue("gamemode", Gamemodes.class).getGameMode() ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "gamemode"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GlobalStatRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GlobalStatRequirementCondition.java index 0b1416f0..1c04100c 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GlobalStatRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GlobalStatRequirementCondition.java @@ -2,8 +2,14 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.NumberProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -23,17 +29,36 @@ import java.util.List; public class GlobalStatRequirementCondition extends CHTSLImpl implements NPCCondition { - private String stat; - private StatComparator comparator; - private String compareValue; - private boolean ignoreCase; - public GlobalStatRequirementCondition() { - super("Global Stat Requirement"); - this.stat = "Kills"; - this.comparator = StatComparator.EQUALS; - this.compareValue = "1.0"; - this.ignoreCase = false; + super(ConditionEnum.GLOBALSTAT_REQUIREMENT, + "Global Stat Requirement", + "Checks if the global stat matches the provided condition.", + Material.PLAYER_HEAD, + List.of("stat", "comparator", "compareValue", "ignoreCase") + ); + getProperties().addAll(List.of( + new StringProperty( + "stat", + "Stat Name", + "The name of the global stat to check for." + ).setValue("Kills"), + new EnumProperty<>( + "comparator", + "Comparator", + "The comparator to use for the stat.", + StatComparator.class + ).setValue(StatComparator.EQUALS), + new StringProperty( + "compareValue", + "Compare Value", + "The value to compare the stat against." + ).setValue("1.0"), + new BooleanProperty( + "ignoreCase", + "Ignore Case", + "Whether to ignore case when comparing the stat value." + ).setValue(false) + )); } @Override @@ -42,90 +67,32 @@ public String toString() { } @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.skullTexture("cf40942f364f6cbceffcf1151796410286a48b1aeba77243e218026c09cd1"); - builder.name("&eGlobal Stat Requirement"); - builder.description("Requires a global stat to match the provided condition."); - builder.info("Stat", stat); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.info("Ignores Case", ignoreCase ? "Yes" : "No"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); + public ItemBuilder createDisplayItem() { + return super.createDisplayItem() + .skullTexture("cf40942f364f6cbceffcf1151796410286a48b1aeba77243e218026c09cd1"); } @Override public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); + super.createAddDisplayItem(builder); builder.skullTexture("cf40942f364f6cbceffcf1151796410286a48b1aeba77243e218026c09cd1"); - builder.name("&eGlobal Stat Requirement"); - builder.description("Requires a global stat to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("stat", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + stat) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("ignoreCase", - ItemBuilder.create((ignoreCase ? Material.LIME_DYE : Material.RED_DYE)) - .name((ignoreCase ? "&aIgnore Case" : "&cIgnore Case")) - .info("&7Current Value", "") - .info(null, "&a" + ignoreCase) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "Global Stat Requirement", items); } @Override - public boolean execute(Player player, HousingWorld house) { - Stat stat = house.getStatManager().getGlobalStatByName(this.stat); - String compareValue = HandlePlaceholders.parsePlaceholders(player, house, this.compareValue); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + String statName = getProperty("stat", StringProperty.class).parsedValue(house, player); + Stat stat = house.getStatManager().getGlobalStatByName(statName); + String compareValue = getProperty("compareValue", StringProperty.class).parsedValue(house, player); String statValue = stat.getValue(); - if (ignoreCase) { + if (getProperty("ignoreCase", BooleanProperty.class).getValue()) { statValue = statValue.toLowerCase(); compareValue = compareValue.toLowerCase(); } - return Comparator.compare(comparator, statValue, compareValue); - } + StatComparator comparator = getValue("comparator", StatComparator.class); - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("stat", stat); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - data.put("ignoreCase", ignoreCase); - return data; + return Comparator.compare(comparator, statValue, compareValue) ? OutputType.TRUE : OutputType.FALSE; } @Override @@ -133,40 +100,35 @@ public boolean requiresPlayer() { return false; } - @Override - public String keyword() { - return "globalstat"; - } - - @Override - public String export(int indent) { - String compareValue = this.compareValue; - if (compareValue.contains(" ")) { - compareValue = "\"" + compareValue + "\""; - } - return "globalstat " + stat + " " + comparator.name() + " " + compareValue + " " + ignoreCase; - } - - @Override - public void importCondition(String action, List nextLines) { - String[] parts = action.split(" "); - Duple statArg = handleArg(parts, 0); - this.stat = statArg.getSecond(); - parts = statArg.getFirst(); - if (parts.length == 0) { - return; - } - this.comparator = StatComparator.getComparator(parts[0]); - Duple compareValueArg = handleArg(parts, 1); - compareValue = compareValueArg.getSecond(); - parts = compareValueArg.getFirst(); - if (parts.length > 0) { - ignoreCase = Boolean.parseBoolean(parts[0]); - } - } +// @Override +// public String export(int indent) { +// String compareValue = this.compareValue; +// if (compareValue.contains(" ")) { +// compareValue = "\"" + compareValue + "\""; +// } +// return "globalstat " + stat + " " + comparator.name() + " " + compareValue + " " + ignoreCase; +// } +// +// @Override +// public void importCondition(String action, List nextLines) { +// String[] parts = action.split(" "); +// Duple statArg = handleArg(parts, 0); +// this.stat = statArg.getSecond(); +// parts = statArg.getFirst(); +// if (parts.length == 0) { +// return; +// } +// this.comparator = StatComparator.getComparator(parts[0]); +// Duple compareValueArg = handleArg(parts, 1); +// compareValue = compareValueArg.getSecond(); +// parts = compareValueArg.getFirst(); +// if (parts.length > 0) { +// ignoreCase = Boolean.parseBoolean(parts[0]); +// } +// } @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - return execute(player, house); + return execute(player, house) == OutputType.TRUE; } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GroupRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GroupRequirementCondition.java index 2a8997f9..6e939473 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GroupRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/GroupRequirementCondition.java @@ -1,8 +1,15 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.GenericPagination.GroupProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Data.PlayerData; +import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Instances.Group; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; @@ -13,86 +20,40 @@ import java.util.List; public class GroupRequirementCondition extends CHTSLImpl { - private String group = null; - boolean includeHigherGroups = false; - - public GroupRequirementCondition() { - super("Required Group"); - } - - @Override - public String toString() { - return "GroupRequirementCondition (group: " + (group == null ? "&cNone" : "&6" + group) + ", includeHigherGroups: " + includeHigherGroups + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&aRequired Group"); - builder.description("Requires players to match the required group (or higher if set)."); - builder.info("Group", (group == null ? "&cNone" : "&6" + group)); - builder.info("Include Higher Groups", includeHigherGroups ? "&aYes" : "&cNo"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } + super(ConditionEnum.REQUIRED_GROUP, + "Group Requirement", + "Checks if the player is in the specified group.", + Material.DIAMOND_SWORD, + List.of("group") + ); - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.PLAYER_HEAD); - builder.name("&eRequired Group"); - builder.description("Requires players to match the required group (or higher if set)."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + getProperties().add(new GroupProperty( + "group", + "Group", + "The group to check for." + )); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("group", - ItemBuilder.create(Material.DIAMOND) - .name("&eGroup") - .info("&7Current Value", "") - .info(null, "&a" + (group == null ? "None" : group)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.GROUP - ), - new ActionEditor.ActionItem("includeHigherGroups", - ItemBuilder.create((includeHigherGroups) ? Material.LIME_DYE : Material.RED_DYE) - .name("&eInclude Higher Groups") - .info("&7Current Value", "") - .info(null, includeHigherGroups ? "&aYes" : "&cNo") - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "", items); + getProperties().add(new BooleanProperty( + "includeHigherGroups", + "Include Higher Groups", + "If true, the player will be considered in the group if they are in a higher group." + ).setValue(false)); } @Override - public boolean execute(Player player, HousingWorld house) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Group group = getProperty("group", GroupProperty.class).getValue(); + boolean includeHigherGroups = getValue("includeHigherGroups", Boolean.class); PlayerData playerData = house.loadOrCreatePlayerData(player); if (includeHigherGroups) { - return playerData.getGroupInstance(house).getPriority() >= house.getGroup(group).getPriority(); + return playerData.getGroupInstance(house).getPriority() >= group.getPriority() ? OutputType.TRUE : OutputType.FALSE; } - return playerData.getGroupInstance(house).getPriority() == house.getGroup(group).getPriority(); - } + return playerData.getGroupInstance(house).getPriority() == group.getPriority() ? OutputType.TRUE : OutputType.FALSE; - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("group", group); - data.put("includeHigherGroups", includeHigherGroups); - return data; } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "inGroup"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasItemCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasItemCondition.java index 5e5b31e2..0686ff32 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasItemCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasItemCondition.java @@ -1,18 +1,17 @@ package com.al3x.housing2.Condition.Conditions; -import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.IntegerProperty; +import com.al3x.housing2.Action.Properties.ItemStackProperty; +import com.al3x.housing2.Action.Properties.SlotProperty; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.EnumMaterial; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Menus.SlotSelectMenu; -import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.Serialization; -import com.al3x.housing2.Utils.StackUtils; -import com.al3x.housing2.Utils.StringUtilsKt; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -24,136 +23,60 @@ import java.util.List; public class HasItemCondition extends Condition { - private ItemStack item = null; - private WhatToCheck whatToCheck = WhatToCheck.METADATA; - private WhereToCheck whereToCheck = WhereToCheck.ANYWHERE; - private int customSlot = -1; - private Amount amountCondition = Amount.ANY_AMOUNT; - private int amount = 1; - - public HasItemCondition() { - super("Has Item"); - } - - @Override - public String toString() { - return "idk"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&aHas Item"); - builder.description("Requires the user to have the specified item."); - builder.info("&eSettings", ""); - builder.info("Item", (item == null ? "&cNone" : "&6" + item.getType().name())); - builder.info("What to check", "&6" + StringUtilsKt.formatCapitalize(whatToCheck.name())); - builder.info("Where to check", "&6" + StringUtilsKt.formatCapitalize(whereToCheck.name())); - builder.info("Amount Condition", "&6" + StringUtilsKt.formatCapitalize(amountCondition.name())); - builder.info("Amount", "&6" + amount); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CHEST); - builder.name("&eHas Item"); - builder.description("Requires the user to have the specified item."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu editMenu) { - List items = Arrays.asList( - new ActionEditor.ActionItem("item", - ItemBuilder.create(Material.BOOK) - .name("&eItem") - .info("&7Current Value", "") - .info(null, "&a" + (item == null ? "&aNot Set" : StackUtils.getDisplayName(item))) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ITEM - ), - new ActionEditor.ActionItem("whatToCheck", - ItemBuilder.create(whatToCheck.getMaterial()) - .name("&eWhat to check") - .info("&7Current Value", "") - .info(null, "&a" + StringUtilsKt.formatCapitalize(whatToCheck.name())) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, WhatToCheck.values(), null - ), - new ActionEditor.ActionItem("whereToCheck", - ItemBuilder.create(whereToCheck.getMaterial()) - .name("&eWhere to check") - .info("&7Current Value", "") - .info(null, "&a" + (whereToCheck == WhereToCheck.CUSTOM ? slotIndexToName(customSlot) : StringUtilsKt.formatCapitalize(whereToCheck.name()))) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, WhereToCheck.values(), null, (e, o) -> { - whereToCheck = (WhereToCheck) o; - e.getWhoClicked().sendMessage(Component.text("Set Where to check to " + StringUtilsKt.formatCapitalize(whereToCheck.name())).color(NamedTextColor.YELLOW)); - if (o == WhereToCheck.CUSTOM) { - new SlotSelectMenu((Player) e.getWhoClicked(), Main.getInstance(), editMenu, false, (slot) -> { - customSlot = slot; - whereToCheck = WhereToCheck.CUSTOM; - editMenu.open(); - }).open(); - } - return false; - } - ), - new ActionEditor.ActionItem("amountCondition", - ItemBuilder.create(amountCondition.getMaterial()) - .name("&eAmount Condition") - .info("&7Current Value", "") - .info(null, "&a" + StringUtilsKt.formatCapitalize(amountCondition.name())) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, Amount.values(), null - ), - new ActionEditor.ActionItem("amount", - ItemBuilder.create(Material.PAPER) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + amount) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.INT, 1, 64 - ) + super(ConditionEnum.HAS_ITEM, + "Has Item", + "Requires the user to have the specified item.", + Material.CHEST, + List.of("hasItem") ); - return new ActionEditor(4, "Settings", items); - } - private String slotIndexToName(int index) { - if (index < 9 && index >= 0) { - return "Hotbar Slot " + (index + 1); - } - if (index < 36 && index >= 9) { - return "Inventory Slot " + (index - 8); - } - if (index == 103) { - return "Helmet"; - } - if (index == 102) { - return "Chestplate"; - } - if (index == 101) { - return "Leggings"; - } - if (index == 100) { - return "Boots"; - } - if (index >= 80 && index <= 83) { - return "Crafting Slot " + (index - 79); - } - return "Unknown Slot"; + getProperties().addAll(Arrays.asList( + new ItemStackProperty( + "item", + "Item", + "The item to check for." + ), + new EnumProperty<>( + "whatToCheck", + "What to check", + "What to check for.", + WhatToCheck.class + ).setValue(WhatToCheck.METADATA), + new EnumProperty<>( + "whereToCheck", + "Where to check", + "Where to check for the item.", + WhereToCheck.class + ).setValue(WhereToCheck.ANYWHERE), + new SlotProperty( + "customSlot", + "Slot", + "The slot to check for the item." + ).setValue(-1).showIf(() -> getValue("whereToCheck", WhereToCheck.class) == WhereToCheck.CUSTOM), + new EnumProperty<>( + "amountCondition", + "Amount Condition", + "The condition for the amount of items.", + Amount.class + ).setValue(Amount.ANY_AMOUNT), + new IntegerProperty( + "amount", + "Amount", + "The amount of items to check for." + ).setValue(1) + )); } @Override - public boolean execute(Player player, HousingWorld house) { - if (item == null) return false; - switch (whereToCheck) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + ItemStack item = getProperty("item", ItemStackProperty.class).getValue(); + if (item == null) return OutputType.FALSE; + int amount = getValue("amount", Integer.class); + switch (getValue("whereToCheck", WhereToCheck.class)) { case CUSTOM: { - if (customSlot == -1) return false; + int customSlot = getValue("customSlot", Integer.class); + if (customSlot == -1) return OutputType.FALSE; if (checkItem(player.getInventory().getItem(customSlot))) { return checkAmount(player.getInventory().getItem(customSlot), amount); } @@ -220,72 +143,31 @@ public boolean execute(Player player, HousingWorld house) { break; } } - return false; + return OutputType.FALSE; } private boolean checkItem(ItemStack item) { if (item == null) return false; + WhatToCheck whatToCheck = getValue("whatToCheck", WhatToCheck.class); + ItemStack thisItem = getProperty("item", ItemStackProperty.class).getValue(); if (whatToCheck == WhatToCheck.ITEM_TYPE) { - return item.getType() == this.item.getType(); + return item.getType() == thisItem.getType(); } else if (whatToCheck == WhatToCheck.METADATA) { - return item.isSimilar(this.item); + return item.isSimilar(thisItem); } return false; } - private boolean checkAmount(ItemStack item, int amount) { - switch (this.amountCondition) { - case ANY_AMOUNT: { - return true; - } - case LESS: { - return item.getAmount() < amount; - } - case GREATER: { - return item.getAmount() > amount; - } - case EQUAL: { - return item.getAmount() == amount; - } - case GREATER_OR_EQUAL: { - return item.getAmount() >= amount; - } - case LESS_OR_EQUAL: { - return item.getAmount() <= amount; - } - } - return false; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("item", item == null ? null : Serialization.itemStackToBase64(item)); - data.put("whatToCheck", whatToCheck); - data.put("whereToCheck", whereToCheck); - data.put("customSlot", customSlot); - data.put("amountCondition", amountCondition); - data.put("amount", amount); - return data; - } - - @Override - public void fromData(HashMap data, Class condtionClass) { - try { - item = Serialization.itemStackFromBase64((String) data.get("item")); - } catch (IOException e) { - e.printStackTrace(); - } - whatToCheck = WhatToCheck.valueOf((String) data.get("whatToCheck")); - whereToCheck = WhereToCheck.valueOf((String) data.get("whereToCheck")); - if (data.get("customSlot") != null) customSlot = ((Double) data.get("customSlot")).intValue(); - if (data.get("amountCondition") != null) { - amountCondition = Amount.valueOf((String) data.get("amountCondition")); - amount = ((Double) data.get("amount")).intValue(); - } else { - amountCondition = Amount.valueOf((String) data.get("amount")); - amount = 1; - } + private OutputType checkAmount(ItemStack item, int amount) { + boolean output = switch (getValue("amountCondition", Amount.class)) { + case ANY_AMOUNT -> true; + case LESS -> item.getAmount() < amount; + case GREATER -> item.getAmount() > amount; + case EQUAL -> item.getAmount() == amount; + case GREATER_OR_EQUAL -> item.getAmount() >= amount; + case LESS_OR_EQUAL -> item.getAmount() <= amount; + }; + return output ? OutputType.TRUE : OutputType.FALSE; } @Override @@ -295,10 +177,10 @@ public boolean requiresPlayer() { private enum WhatToCheck implements EnumMaterial { ITEM_TYPE(Material.MAP), - METADATA(Material.FILLED_MAP) - ; + METADATA(Material.FILLED_MAP); private Material material; + WhatToCheck(Material material) { this.material = material; } @@ -316,10 +198,10 @@ private enum WhereToCheck implements EnumMaterial { HOTBAR(Material.PAPER), INVENTORY(Material.CHEST), ANYWHERE(Material.NETHER_STAR), - CUSTOM(Material.BOOK) - ; + CUSTOM(Material.BOOK); private Material material; + WhereToCheck(Material material) { this.material = material; } @@ -336,10 +218,10 @@ private enum Amount implements EnumMaterial { GREATER(Material.LIME_STAINED_GLASS), EQUAL(Material.YELLOW_STAINED_GLASS), GREATER_OR_EQUAL(Material.LIME_STAINED_GLASS), - LESS_OR_EQUAL(Material.RED_STAINED_GLASS) - ; + LESS_OR_EQUAL(Material.RED_STAINED_GLASS); private Material material; + Amount(Material material) { this.material = material; } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPermissionCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPermissionCondition.java index bafc043d..592a3c7d 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPermissionCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPermissionCondition.java @@ -1,9 +1,14 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.permissions.Permissions; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Menu; @@ -19,84 +24,29 @@ import java.util.List; public class HasPermissionCondition extends CHTSLImpl { - private Permissions permission = null; - public HasPermissionCondition() { - super("Has Permission"); - } - - @Override - public String toString() { - return "PermissionRequirementCondition (permission: " + (permission == null ? "&aNot Set" : "&6" + permission) + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.FILLED_MAP); - builder.name("&aRequired Permission"); - builder.description("Requires the user to have the specified permission."); - builder.info("&eSettings", ""); - builder.info("Permission", (permission == null ? "&aNot Set" : "&6" + permission)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.FILLED_MAP); - builder.name("&eRequired Permission"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ConditionEnum.HAS_PERMISSION, + "Required Permission", + "Requires the user to have the specified permission.", + Material.FILLED_MAP, + List.of("hasPermission")); - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = Arrays.asList( - new ActionEditor.ActionItem("permission", - ItemBuilder.create(Material.FILLED_MAP) - .name("&ePermission") - .info("&7Current Value", "") - .info(null, "&a" + (permission == null ? "Not Set" : permission)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (e, o) -> { - List> permissions = new ArrayList<>(); - for (Permissions type : Permissions.values()) { - permissions.add(new Duple<>(type, ItemBuilder.create(Material.PLAYER_HEAD) - .skullTexture("86f125004a8ffa6e4a4ec7b178606d0670c28a75b9cde59e011e66e91a66cf14") - .name("&6" + type.getDisplayName()))); - } - new PaginationMenu<>(Main.getInstance(), - "&eSelect a permission", permissions, - (Player) e.getWhoClicked(), house, backMenu, (permission) -> { - this.permission = permission; - backMenu.open(); - }).open(); - return true; - } - ) - ); - return new ActionEditor(4, "Required Permission", items); + getProperties().add(new EnumProperty<>( + "permission", + "Permission", + "The permission to check for.", + Permissions.class + ).setValue(Permissions.FLY)); } @Override - public boolean execute(Player player, HousingWorld house) { - return permission == null || house.hasPermission(player, permission); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("permission", permission); - return data; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Permissions permission = getValue("permission", Permissions.class); + return house.hasPermission(player, permission) ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "hasPermission"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPotionEffectCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPotionEffectCondition.java index 81514850..ed326074 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPotionEffectCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HasPotionEffectCondition.java @@ -2,8 +2,12 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.PotionProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.Gamemodes; import com.al3x.housing2.Events.CancellableEvent; @@ -24,80 +28,26 @@ import java.util.*; public class HasPotionEffectCondition extends CHTSLImpl implements NPCCondition { - private PotionEffectType potionEffect = null; - public HasPotionEffectCondition() { - super("Has Potion Effect"); - potionEffect = PotionEffectType.GLOWING; - } - - @Override - public String toString() { - return "HasPotionEffectCondition (potionEffect: " + (potionEffect == null ? "&aNot Set" : "&6" + potionEffect) + ")"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.POTION); - builder.name("&aHas Potion Effect"); - builder.description("Requires the user to have the specified potion effect."); - builder.info("Potion Effect", (potionEffect == null ? "&aNot Set" : "&6" + potionEffect.getKey())); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.POTION); - builder.name("&eHas Potion Effect"); - builder.description("Requires the user to have the specified potion effect."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house, Menu backMenu) { - List items = Arrays.asList( - new ActionEditor.ActionItem("potionEffect", - ItemBuilder.create(Material.POTION) - .name("&eEffect") - .info("&7Current Value", "") - .info(null, "&a" + (potionEffect == null ? "Not Set" : potionEffect.getKey())) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - (e, o) -> { - List> potions = new ArrayList<>(); - for (PotionEffectType type : PotionEffectType.values()) { - potions.add(new Duple<>(type, ItemBuilder.create(Material.POTION).name("&6" + type.getName()))); - } - //Basically because PotionEffectType isnt a ENUM we cant just use the enum class - new PaginationMenu<>(Main.getInstance(), - "&eSelect a Potion Effect", potions, - (Player) e.getWhoClicked(), house, backMenu, (potion) -> { - potionEffect = potion; - backMenu.open(); - }).open(); - return true; - } - ) + super(ConditionEnum.HAS_POTION_EFFECT, + "Has Potion Effect", + "Requires the user to have the specified potion effect.", + Material.POTION, + List.of("hasEffect") ); - return new ActionEditor(4, "Has Potion Effect", items); - } - @Override - public boolean execute(Player player, HousingWorld house) { - return player.hasPotionEffect(potionEffect); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("potionEffect", potionEffect == null ? PotionEffectType.SPEED.getName() : potionEffect.getName()); - return data; + getProperties().add( + new PotionProperty( + "potionEffect", + "Potion Effect", + "The potion effect to check for." + ).setValue(PotionEffectType.SPEED) + ); } @Override - public void fromData(HashMap data, Class condtionClass) { - potionEffect = PotionEffectType.getByName((String) data.get("potionEffect")); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.hasPotionEffect(getValue("potionEffect", PotionEffectType.class)) ? OutputType.TRUE : OutputType.FALSE; } @Override @@ -105,25 +55,10 @@ public boolean requiresPlayer() { return true; } - @Override - public String export(int indent) { - return " ".repeat(indent) + keyword() + " " + potionEffect.getName(); - } - - @Override - public void importCondition(String condition, List nextLines) { - potionEffect = PotionEffectType.getByName(condition); - } - - @Override - public String keyword() { - return "hasPotionEffect"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { if (npc.getEntity() instanceof LivingEntity le) { - return le.hasPotionEffect(potionEffect); + return le.hasPotionEffect(getValue("potionEffect", PotionEffectType.class)); } else { return false; } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HealthRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HealthRequirementCondition.java index 83a5e6a7..1d9137f9 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HealthRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HealthRequirementCondition.java @@ -3,8 +3,12 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; import com.al3x.housing2.Action.NPCAction; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -23,74 +27,32 @@ import java.util.List; public class HealthRequirementCondition extends CHTSLImpl implements NPCCondition { - private StatComparator comparator; - private Double compareValue; - public HealthRequirementCondition() { - super("Health Requirement"); - this.comparator = StatComparator.EQUALS; - this.compareValue = 20.0; - } + super(ConditionEnum.HEALTH_REQUIREMENT, + "Health Requirement", + "Requires the users current health to match the provided condition.", + Material.APPLE, + List.of("health")); - @Override - public String toString() { - return "HealthRequirementCondition"; - } + getProperties().add(new EnumProperty<>( + "comparator", + "Mode", + "The comparator to use for the health amount.", + StatComparator.class + ).setValue(StatComparator.EQUALS)); - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.APPLE); - builder.name("&eHealth Requirement"); - builder.description("Requires the users current health to match the provided condition."); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); + getProperties().add(new DoubleProperty( + "compareValue", + "Amount", + "The health amount to check against." + ).setValue(20.0)); } @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.APPLE); - builder.name("&eHealth Requirement"); - builder.description("Requires the users current health to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ) - ); - return new ActionEditor(4, "Health Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return Comparator.compare(comparator, player.getHealth(), compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - return data; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getProperty("compareValue", DoubleProperty.class).getValue(); + return Comparator.compare(comparator, player.getHealth(), compareValue) ? OutputType.TRUE : OutputType.FALSE; } @Override @@ -98,13 +60,10 @@ public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "health"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getProperty("compareValue", DoubleProperty.class).getValue(); if (npc.getEntity() instanceof LivingEntity le) { return Comparator.compare(comparator, le.getHealth(), compareValue); } else { diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HungerRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HungerRequirementCondition.java index 3275694e..f62cee73 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HungerRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/HungerRequirementCondition.java @@ -1,9 +1,15 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.StatComparator; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Comparator; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; @@ -15,74 +21,25 @@ import java.util.List; public class HungerRequirementCondition extends CHTSLImpl { - private StatComparator comparator; - private Double compareValue; - public HungerRequirementCondition() { - super("Hunger Requirement"); - this.comparator = StatComparator.EQUALS; - this.compareValue = 20.0; - } + super(ConditionEnum.HUNGER_REQUIREMENT, + "Hunger Requirement", + "Requires the users current hunger level to match the provided condition.", + Material.COOKED_BEEF, + List.of("hunger")); - @Override - public String toString() { - return "HungerRequirementCondition"; - } + getProperties().add(new EnumProperty<>( + "comparator", + "Mode", + "The comparator to use for the health amount.", + StatComparator.class + ).setValue(StatComparator.EQUALS)); - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.COOKED_BEEF); - builder.name("&eHunger Requirement"); - builder.description("Requires the users current hunger level to match the provided condition."); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.COOKED_BEEF); - builder.name("&eHunger Requirement"); - builder.description("Requires the users current hunger level to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ) - ); - return new ActionEditor(4, "Hunger Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return Comparator.compare(comparator, player.getFoodLevel(), compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - return data; + getProperties().add(new DoubleProperty( + "compareValue", + "Amount", + "The health amount to check against." + ).setValue(20.0)); } @Override @@ -91,7 +48,9 @@ public boolean requiresPlayer() { } @Override - public String keyword() { - return "hunger"; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getProperty("compareValue", DoubleProperty.class).getValue(); + return Comparator.compare(comparator, player.getFoodLevel(), compareValue) ? OutputType.TRUE : OutputType.FALSE; } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/InteractionTypeCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/InteractionTypeCondition.java index 99376242..ef2b00c6 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/InteractionTypeCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/InteractionTypeCondition.java @@ -1,7 +1,11 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.Gamemodes; import com.al3x.housing2.Events.CancellableEvent; @@ -19,85 +23,39 @@ import java.util.List; public class InteractionTypeCondition extends CHTSLImpl { - private boolean attack; public InteractionTypeCondition() { - super("Interaction Type"); - this.attack = true; - } - - @Override - public String toString() { - return "InteractionTypeCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.OAK_BUTTON); - builder.name("&aInteraction Type"); - builder.description("If the player must attack or interact with an npc."); - builder.info("Attack", "" + attack); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.OAK_BUTTON); - builder.name("&eInteraction Type"); - builder.description("If the player must attack or interact with an npc."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + super(ConditionEnum.INTERACTION_TYPE, + "Interaction Type", + "If the player must attack or interact with an npc.", + Material.OAK_BUTTON, + List.of("interactionType") + ); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("attack", - ItemBuilder.create(Material.DAYLIGHT_DETECTOR) - .name("&e" + (!attack ? "Set Attack" : "Set Interact")) - .info("&7Current Value", "") - .info(null, "&a" + (attack ? "Attack" : "Interact")) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) + getProperties().add( + new BooleanProperty("attack", + "Attack", + "If the player must attack the npc." + ).setValue(false) ); - return new ActionEditor(4, "Gamemode Requirement", items); } @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + boolean attack = getValue("attack", Boolean.class); if (event.cancellable() instanceof EntityDamageByEntityEvent) { - return attack; + return attack ? OutputType.TRUE : OutputType.FALSE; } else if (event.cancellable() instanceof PlayerInteractEntityEvent) { - return !attack; + return !attack ? OutputType.TRUE : OutputType.FALSE; } else { - return false; + return OutputType.FALSE; } } - @Override - public boolean execute(Player player, HousingWorld house) { - return false; - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("attack", attack); - return data; - } - @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "interactionType"; - } - @Override public List allowedEvents() { return Arrays.asList(EventType.PLAYER_DAMAGE, EventType.PLAYER_ATTACK); diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsAttackCooldownCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsAttackCooldownCondition.java index f80008ae..0e948baa 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsAttackCooldownCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsAttackCooldownCondition.java @@ -1,8 +1,11 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -21,53 +24,20 @@ public class IsAttackCooldownCondition extends CHTSLImpl { public IsAttackCooldownCondition() { - super("Is Attack Cooldown"); + super(ConditionEnum.IS_ATTACK_COOLDOWN, + "Is Attack Cooldown", + "Is the player on attack cooldown?", + Material.CLOCK, + List.of("isAttackCooldown")); } @Override - public String toString() { - return "IsAttackCooldownCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&eIs Attack Cooldown"); - builder.description("Is the player on attack cooldown?"); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.CLOCK); - builder.name("&eIs Attack Cooldown"); - builder.description("Is the player on attack cooldown?"); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house, CancellableEvent event) { - return player.getAttackCooldown() != 1.0f; - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return false; - } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.getAttackCooldown() != 1.0f ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isAttackCooldown"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEating.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEating.java deleted file mode 100644 index 8b84cf8e..00000000 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEating.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.al3x.housing2.Condition.Conditions; - -import com.al3x.housing2.Condition.CHTSLImpl; -import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Listeners.EatingListener; -import com.al3x.housing2.Utils.ItemBuilder; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.LinkedHashMap; - -public class IsEating extends CHTSLImpl { - - public IsEating() { - super("Is Eating"); - } - - @Override - public String toString() { - return "IsEatingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.MELON); - builder.name("&eIs Eating"); - builder.description("Check if the player is Eating. Hot Tip: This will also return true if the player is using a blockable item."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eIs Eating"); - builder.description("Check if the player is Eating. Hot Tip: This will also return true if the player is using a blockable item."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return EatingListener.isPlayerEating(player); - } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - - @Override - public boolean requiresPlayer() { - return true; - } - - @Override - public String keyword() { - return "isEating"; - } -} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEatingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEatingCondition.java new file mode 100644 index 00000000..66943633 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsEatingCondition.java @@ -0,0 +1,35 @@ +package com.al3x.housing2.Condition.Conditions; + +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Listeners.EatingListener; +import com.al3x.housing2.Utils.ItemBuilder; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.LinkedHashMap; +import java.util.List; + +public class IsEatingCondition extends CHTSLImpl { + public IsEatingCondition() { + super(ConditionEnum.IS_EATING, + "Is Eating", + "Check if the player is eating. This will also return true if the player is using a blockable item.", + Material.MELON, + List.of("isEating")); + } + + @Override + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return EatingListener.isPlayerEating(player) ? OutputType.TRUE : OutputType.FALSE; + } + + @Override + public boolean requiresPlayer() { + return true; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsFlyingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsFlyingCondition.java index a9222f0e..afd7b68a 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsFlyingCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsFlyingCondition.java @@ -1,59 +1,35 @@ package com.al3x.housing2.Condition.Conditions; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; public class IsFlyingCondition extends CHTSLImpl { + public IsFlyingCondition() { + super(ConditionEnum.IS_FLYING, + "Is Flying", + "Check if the player is flying.", + Material.FEATHER, + List.of("isFlying")); + } - public IsFlyingCondition() { - super("Is Flying"); - } - - @Override - public String toString() { - return "IsFlyingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eIs Flying"); - builder.description("Check if the player is flying."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eIs Flying"); - builder.description("Check if the player is Flying."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return player.isFlying(); - } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } + @Override + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.isFlying() ? OutputType.TRUE : OutputType.FALSE; + } - @Override - public boolean requiresPlayer() { + @Override + public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isFlying"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsGlidingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsGlidingCondition.java index 6b629812..402dd0a1 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsGlidingCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsGlidingCondition.java @@ -1,59 +1,35 @@ package com.al3x.housing2.Condition.Conditions; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; public class IsGlidingCondition extends CHTSLImpl { + public IsGlidingCondition() { + super(ConditionEnum.IS_GLIDING, + "Is Gliding", + "Check if the player is gliding with an elytra.", + Material.ELYTRA, + List.of("isGliding")); + } - public IsGlidingCondition() { - super("Is Gliding"); - } - - @Override - public String toString() { - return "IsGlidingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ELYTRA); - builder.name("&eIs Gliding"); - builder.description("Check if the player is gliding with an elytra."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ELYTRA); - builder.name("&eIs Gliding"); - builder.description("Check if the player is gliding with an elytra."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return player.isGliding(); - } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } + @Override + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.isGliding() ? OutputType.TRUE : OutputType.FALSE; + } - @Override - public boolean requiresPlayer() { + @Override + public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isGliding"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsNPCHiddenCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsNPCHiddenCondition.java index 372dbc91..d9c8b388 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsNPCHiddenCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsNPCHiddenCondition.java @@ -1,7 +1,9 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; @@ -12,43 +14,20 @@ import org.bukkit.event.Cancellable; import java.util.LinkedHashMap; +import java.util.List; public class IsNPCHiddenCondition extends CHTSLImpl implements NPCCondition { - public IsNPCHiddenCondition() { - super("Is NPC Hidden"); - } - - @Override - public String toString() { - return "IsNPCHiddenCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GRAY_DYE); - builder.name("&eIs NPC Hidden"); - builder.description("Check if the NPC is hidden."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GRAY_DYE); - builder.name("&eIs NPC Hidden"); - builder.description("Check if the NPC is hidden."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + super(ConditionEnum.IS_NPC_HIDDEN, + "Is NPC Hidden", + "Check if the NPC is hidden.", + Material.GRAY_DYE, + List.of("isNPCHidden")); } @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return OutputType.FALSE; } @Override @@ -56,11 +35,6 @@ public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "isNPCHidden"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { return !player.canSee(npc.getEntity()); diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsShieldingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsShieldingCondition.java index 5c9b4ced..88b6731f 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsShieldingCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsShieldingCondition.java @@ -1,58 +1,34 @@ package com.al3x.housing2.Condition.Conditions; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; public class IsShieldingCondition extends CHTSLImpl { - public IsShieldingCondition() { - super("Is Shielding"); - } - - @Override - public String toString() { - return "IsShieldingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.SHIELD); - builder.name("&eIs Shielding"); - builder.description("Check if the player is Shielding."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.SHIELD); - builder.name("&eIs Shielding"); - builder.description("Check if the player is Shielding."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return player.isBlocking(); + super(ConditionEnum.IS_SHIELDING, + "Is Shielding", + "Check if the player is shielding.", + Material.SHIELD, + List.of("isShielding")); } @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.isBlocking() ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isShielding"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSneakingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSneakingCondition.java index 7f933e9c..8d647238 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSneakingCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSneakingCondition.java @@ -1,59 +1,35 @@ package com.al3x.housing2.Condition.Conditions; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; public class IsSneakingCondition extends CHTSLImpl { - public IsSneakingCondition() { - super("Is Sneaking"); - } - - @Override - public String toString() { - return "IsSneakingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.HAY_BLOCK); - builder.name("&eIs Sneaking"); - builder.description("Check if the player is sneaking."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.HAY_BLOCK); - builder.name("&eIs Sneaking"); - builder.description("Check if the player is sneaking."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return player.isSneaking(); + super(ConditionEnum.IS_SNEAKING, + "Is Sneaking", + "Check if the player is sneaking.", + Material.HAY_BLOCK, + List.of("isSneaking")); } @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.isSneaking() ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isSneaking"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSprintingCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSprintingCondition.java index 71e438b5..e67f8e79 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSprintingCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsSprintingCondition.java @@ -1,58 +1,34 @@ package com.al3x.housing2.Condition.Conditions; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; import java.util.LinkedHashMap; +import java.util.List; public class IsSprintingCondition extends CHTSLImpl { - public IsSprintingCondition() { - super("Is Sprinting"); - } - - @Override - public String toString() { - return "IsSprintingCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.RABBIT_FOOT); - builder.name("&eIs Sprinting"); - builder.description("Check if the player is sprinting."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.RABBIT_FOOT); - builder.name("&eIs Sprinting"); - builder.description("Check if the player is sprinting."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return player.isSprinting(); + super(ConditionEnum.IS_SPRINTING, + "Is Sprinting", + "Check if the player is sprinting.", + Material.RABBIT_FOOT, + List.of("isSprinting")); } @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return player.isSprinting() ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "isSprinting"; - } -} \ No newline at end of file +} diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnected.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnected.java deleted file mode 100644 index 22cb5116..00000000 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnected.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.al3x.housing2.Condition.Conditions; - -import com.al3x.housing2.Condition.CHTSLImpl; -import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.VoiceChat; -import org.bukkit.Material; -import org.bukkit.entity.Player; - -import java.util.LinkedHashMap; - -public class IsVoiceConnected extends CHTSLImpl { - public IsVoiceConnected() { - super("Is Voice Connected"); - } - - @Override - public String toString() { - return "IsVoiceConnectedCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.NOTE_BLOCK); - builder.name("&eIs Voice Connected"); - builder.description("Check if the player is connected to voice chat."); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.NOTE_BLOCK); - builder.name("&eIs Voice Connected"); - builder.description("Check if the player is connected to voice chat."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return VoiceChat.isPlayerConnected(player); - } - - @Override - public LinkedHashMap data() { - return new LinkedHashMap<>(); - } - - @Override - public boolean requiresPlayer() { - return true; - } - - @Override - public String keyword() { - return "isVoiceConnected"; - } -} diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnectedCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnectedCondition.java new file mode 100644 index 00000000..79f8f408 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/IsVoiceConnectedCondition.java @@ -0,0 +1,33 @@ +package com.al3x.housing2.Condition.Conditions; + +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; +import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Utils.VoiceChat; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +import java.util.List; + +public class IsVoiceConnectedCondition extends CHTSLImpl { + public IsVoiceConnectedCondition() { + super(ConditionEnum.IS_VOICE_CONNECTED, + "Is Voice Connected", + "Check if the player is connected to voice chat.", + Material.NOTE_BLOCK, + List.of("isVoiceConnected")); + } + + @Override + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return VoiceChat.isPlayerConnected(player) ? OutputType.TRUE : OutputType.FALSE; + } + + @Override + public boolean requiresPlayer() { + return true; + } +} diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/MaxHealthRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/MaxHealthRequirementCondition.java index 086a920b..723ed026 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/MaxHealthRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/MaxHealthRequirementCondition.java @@ -2,8 +2,12 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.DoubleProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -21,74 +25,32 @@ import java.util.List; public class MaxHealthRequirementCondition extends CHTSLImpl implements NPCCondition { - private StatComparator comparator; - private Double compareValue; - public MaxHealthRequirementCondition() { - super("Max Health Requirement"); - this.comparator = StatComparator.EQUALS; - this.compareValue = 20.0; - } + super(ConditionEnum.MAXHEALTH_REQUIREMENT, + "Max Health Requirement", + "Requires the users current max health to match the provided condition.", + Material.GOLDEN_APPLE, + List.of("maxHealth")); - @Override - public String toString() { - return "MaxHealthRequirementCondition"; - } + getProperties().add(new EnumProperty<>( + "comparator", + "Mode", + "The comparator to use for the max health amount.", + StatComparator.class + ).setValue(StatComparator.EQUALS)); - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GOLDEN_APPLE); - builder.name("&eMax Health Requirement"); - builder.description("Requires the users current max health to match the provided condition."); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); + getProperties().add(new DoubleProperty( + "compareValue", + "Amount", + "The max health amount to check against." + ).setValue(20.0)); } @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GOLDEN_APPLE); - builder.name("&eMax Health Requirement"); - builder.description("Requires the users current max health to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.DOUBLE - ) - ); - return new ActionEditor(4, "Max Health Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return Comparator.compare(comparator, player.getMaxHealth(), compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - return data; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getProperty("compareValue", DoubleProperty.class).getValue(); + return Comparator.compare(comparator, player.getMaxHealth(), compareValue) ? OutputType.TRUE : OutputType.FALSE; } @Override @@ -96,13 +58,10 @@ public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "maxHealth"; - } - @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + StatComparator comparator = getValue("comparator", StatComparator.class); + double compareValue = getProperty("compareValue", DoubleProperty.class).getValue(); if (npc.getEntity() instanceof LivingEntity le) { return Comparator.compare(comparator, le.getMaxHealth(), compareValue); } else { diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/NPCStatRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/NPCStatRequirementCondition.java index 5b02dc7e..4e1a1e30 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/NPCStatRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/NPCStatRequirementCondition.java @@ -2,7 +2,12 @@ import com.al3x.housing2.Action.ActionEditor; import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Condition.CHTSLImpl; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Condition.NPCCondition; import com.al3x.housing2.Enums.StatComparator; import com.al3x.housing2.Events.CancellableEvent; @@ -23,112 +28,56 @@ import java.util.List; public class NPCStatRequirementCondition extends CHTSLImpl implements NPCCondition { - private String stat; - private StatComparator comparator; - private String compareValue; - private boolean ignoreCase; - public NPCStatRequirementCondition() { - super("NPC Stat Requirement"); - this.stat = "Kills"; - this.comparator = StatComparator.EQUALS; - this.compareValue = "1.0"; - this.ignoreCase = false; - } - - @Override - public String toString() { - return "NPCStatRequirementCondition"; + super(ConditionEnum.NPC_STAT_REQUIREMENT, + "NPC Stat Requirement", + "Requires a stat to match the provided condition.", + Material.ZOMBIE_SPAWN_EGG, + List.of("npcstat")); + + getProperties().addAll(List.of( + new StringProperty( + "stat", + "Stat Name", + "The name of the NPC stat to check for." + ).setValue("Kills"), + new EnumProperty<>( + "comparator", + "Comparator", + "The comparator to use for the stat.", + StatComparator.class + ).setValue(StatComparator.EQUALS), + new StringProperty( + "compareValue", + "Compare Value", + "The value to compare the stat against." + ).setValue("1.0"), + new BooleanProperty( + "ignoreCase", + "Ignore Case", + "Whether to ignore case when comparing the stat value." + ).setValue(false) + )); } @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.ZOMBIE_SPAWN_EGG); - builder.name("&eNPC Stat Requirement"); - builder.description("Requires a stat to match the provided condition."); - builder.info("Stat", stat); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.info("Ignores Case", ignoreCase ? "Yes" : "No"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.ZOMBIE_SPAWN_EGG); - builder.name("&eNPC Stat Requirement"); - builder.description("Requires a stat to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } - - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("stat", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + stat) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("ignoreCase", - ItemBuilder.create((ignoreCase ? Material.LIME_DYE : Material.RED_DYE)) - .name((ignoreCase ? "&aIgnore Case" : "&cIgnore Case")) - .info("&7Current Value", "") - .info(null, "&a" + ignoreCase) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "Stat Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return false; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + return OutputType.FALSE; } @Override public boolean npcExecute(Player player, NPC npc, HousingWorld house, CancellableEvent event, ActionExecutor executor) { - String statString = HandlePlaceholders.parsePlaceholders(player, house, this.stat); + String statString = getProperty("stat", StringProperty.class).parsedValue(house, player); Stat stat = house.getNPCByCitizensID(npc.getId()).getStats().stream().filter(s -> s.getStatName().equalsIgnoreCase(statString)).findFirst().orElse(null); - String compareValue = HandlePlaceholders.parsePlaceholders(player, house, this.compareValue); + String compareValue = getProperty("compareValue", StringProperty.class).parsedValue(house, player); String statValue = stat.getValue(); - if (ignoreCase) { + + if (getValue("ignoreCase", Boolean.class)) { statValue = statValue.toLowerCase(); compareValue = compareValue.toLowerCase(); } - return Comparator.compare(comparator, statValue, compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("stat", stat); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - data.put("ignoreCase", ignoreCase); - return data; + return Comparator.compare(getValue("comparator", StatComparator.class), statValue, compareValue); } @Override @@ -136,38 +85,6 @@ public boolean requiresPlayer() { return true; } - @Override - public String keyword() { - return "npcstat"; - } - - @Override - public String export(int indent) { - String compareValue = this.compareValue; - if (compareValue.contains(" ")) { - compareValue = "\"" + compareValue + "\""; - } - return "npcstat " + stat + " " + comparator.name() + " " + compareValue + " " + ignoreCase; - } - - @Override - public void importCondition(String action, List nextLines) { - String[] parts = action.split(" "); - Duple statArg = handleArg(parts, 0); - this.stat = statArg.getSecond(); - parts = statArg.getFirst(); - if (parts.length == 0) { - return; - } - this.comparator = StatComparator.getComparator(parts[0]); - Duple compareValueArg = handleArg(parts, 1); - compareValue = compareValueArg.getSecond(); - parts = compareValueArg.getFirst(); - if (parts.length > 0) { - ignoreCase = Boolean.parseBoolean(parts[0]); - } - } - @Override public boolean hide() { return true; diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/PlaceholderRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/PlaceholderRequirementCondition.java index f1680f91..e16138ae 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/PlaceholderRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/PlaceholderRequirementCondition.java @@ -1,9 +1,16 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.StatComparator; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Comparator; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Utils.Color; @@ -19,162 +26,64 @@ import java.util.List; public class PlaceholderRequirementCondition extends CHTSLImpl { - private String placeholder; - private StatComparator comparator; - private String compareValue; - private boolean ignoreCase; - private boolean ignoreColor; - public PlaceholderRequirementCondition() { - super("Placeholder Requirement"); - this.placeholder = "%stat.player/Kills%"; - this.comparator = StatComparator.EQUALS; - this.compareValue = "1.0"; - this.ignoreCase = false; - this.ignoreColor = false; - } - - @Override - public String toString() { - return "PlaceholderRequirementCondition"; + super(ConditionEnum.PLACEHOLDER_REQUIREMENT, + "Placeholder Requirement", + "Requires a placeholder to match the provided condition.", + Material.OAK_SIGN, + List.of("placeholder")); + + getProperties().addAll(List.of( + new StringProperty( + "placeholder", + "Placeholder", + "The placeholder to check." + ).setValue("Kills"), + new EnumProperty<>( + "comparator", + "Comparator", + "The comparator to use for the placeholder.", + StatComparator.class + ).setValue(StatComparator.EQUALS), + new StringProperty( + "compareValue", + "Compare Value", + "The value to compare the placeholder against." + ).setValue("1.0"), + new BooleanProperty( + "ignoreCase", + "Ignore Case", + "Whether to ignore case when comparing the placeholder value." + ).setValue(false), + new BooleanProperty( + "ignoreColor", + "Ignore Color", + "Whether to ignore colors when comparing the placeholder value." + ).setValue(false) + )); } @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.OAK_SIGN); - builder.name("&ePlaceholder Requirement"); - builder.description("Requires a placeholder to match the provided condition."); - builder.info("Placeholder", placeholder); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.info("Ignores Case", ignoreCase ? "Yes" : "No"); - builder.info("Ignores Color", ignoreColor ? "Yes" : "No"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.OAK_SIGN); - builder.name("&ePlaceholder Requirement"); - builder.description("Requires a placeholder to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); - } + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + String placeholderValue = getProperty("placeholder", StringProperty.class).parsedValue(house, player); + String compareValue = getProperty("compareValue", StringProperty.class).parsedValue(house, player); - @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("placeholder", - ItemBuilder.create(Material.OAK_SIGN) - .name("&ePlaceholder") - .info("&7Current Value", "") - .info(null, "&a" + placeholder) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("ignoreCase", - ItemBuilder.create((ignoreCase ? Material.LIME_DYE : Material.RED_DYE)) - .name((ignoreCase ? "&aIgnore Case" : "&cIgnore Case")) - .info("&7Current Value", "") - .info(null, "&a" + ignoreCase) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ), - new ActionEditor.ActionItem("ignoreColor", - ItemBuilder.create((ignoreColor ? Material.LIME_DYE : Material.RED_DYE)) - .name((ignoreColor ? "&aIgnore Color" : "&cIgnore Color")) - .info("&7Current Value", "") - .info(null, "&a" + ignoreColor) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "Placeholder Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - String placeholderValue = HandlePlaceholders.parsePlaceholders(player, house, placeholder); - String compareValue = HandlePlaceholders.parsePlaceholders(player, house, this.compareValue); - - if (ignoreCase) { + if (getValue("ignoreCase", Boolean.class)) { placeholderValue = placeholderValue.toLowerCase(); compareValue = compareValue.toLowerCase(); } - if (ignoreColor) { + if (getValue("ignoreColor", Boolean.class)) { placeholderValue = Color.removeColor(placeholderValue); compareValue = Color.removeColor(compareValue); } - return Comparator.compare(comparator, placeholderValue, compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("placeholder", placeholder); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - data.put("ignoreCase", ignoreCase); - data.put("ignoreColor", ignoreColor); - return data; + return Comparator.compare(getValue("comparator", StatComparator.class), placeholderValue, compareValue) + ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return false; } - - @Override - public String keyword() { - return "placeholder"; - } - - @Override - public String export() { - String compareValue = this.compareValue; - if (compareValue.contains(" ")) { - compareValue = "\"" + compareValue + "\""; - } - return keyword() + " " + placeholder + " " + comparator.name() + " " + compareValue + " " + ignoreCase + " " + ignoreColor; - } - - @Override - public void importCondition(String action, List nextLines) { - String[] parts = action.split(" "); - Duple placeholderArg = handleArg(parts, 0); - this.placeholder = placeholderArg.getSecond(); - parts = placeholderArg.getFirst(); - if (parts.length == 0) { - return; - } - this.comparator = StatComparator.getComparator(parts[0]); - Duple compareValueArg = handleArg(parts, 1); - compareValue = compareValueArg.getSecond(); - parts = compareValueArg.getFirst(); - if (parts.length > 0) { - ignoreCase = Boolean.parseBoolean(parts[0]); - } - if (parts.length > 1) { - ignoreColor = Boolean.parseBoolean(parts[1]); - } - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/StatRequirementCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/StatRequirementCondition.java index 0e6bb5b7..b9a197f9 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/StatRequirementCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/StatRequirementCondition.java @@ -1,9 +1,16 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.BooleanProperty; +import com.al3x.housing2.Action.Properties.EnumProperty; +import com.al3x.housing2.Action.Properties.StringProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; import com.al3x.housing2.Enums.StatComparator; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.Comparator; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Stat; @@ -19,143 +26,56 @@ import java.util.List; public class StatRequirementCondition extends CHTSLImpl { - private String stat; - private StatComparator comparator; - private String compareValue; - private boolean ignoreCase; - public StatRequirementCondition() { - super("Stat Requirement"); - this.stat = "Kills"; - this.comparator = StatComparator.EQUALS; - this.compareValue = "1.0"; - this.ignoreCase = false; - } - - @Override - public String toString() { - return "StatRequirementCondition"; - } - - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eStat Requirement"); - builder.description("Requires a stat to match the provided condition."); - builder.info("Stat", stat); - builder.info("Comparator", comparator.name()); - builder.info("Value", compareValue); - builder.info("Ignores Case", ignoreCase ? "Yes" : "No"); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } + super(ConditionEnum.STAT_REQUIREMENT, + "Stat Requirement", + "Requires a stat to match the provided condition.", + Material.FEATHER, + List.of("stat")); - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.FEATHER); - builder.name("&eStat Requirement"); - builder.description("Requires a stat to match the provided condition."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + getProperties().addAll(List.of( + new StringProperty( + "stat", + "Stat Name", + "The name of the player stat to check for." + ).setValue("Kills"), + new EnumProperty<>( + "comparator", + "Comparator", + "The comparator to use for the stat.", + StatComparator.class + ).setValue(StatComparator.EQUALS), + new StringProperty( + "compareValue", + "Compare Value", + "The value to compare the stat against." + ).setValue("1.0"), + new BooleanProperty( + "ignoreCase", + "Ignore Case", + "Whether to ignore case when comparing the stat value." + ).setValue(false) + )); } @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("stat", - ItemBuilder.create(Material.BOOK) - .name("&eStat") - .info("&7Current Value", "") - .info(null, "&a" + stat) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("comparator", - ItemBuilder.create(Material.COMPASS) - .name("&eMode") - .info("&7Current Value", "") - .info(null, "&a" + comparator) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.ENUM, StatComparator.values(), null - ), - new ActionEditor.ActionItem("compareValue", - ItemBuilder.create(Material.BOOK) - .name("&eAmount") - .info("&7Current Value", "") - .info(null, "&a" + compareValue) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.STRING - ), - new ActionEditor.ActionItem("ignoreCase", - ItemBuilder.create((ignoreCase ? Material.LIME_DYE : Material.RED_DYE)) - .name((ignoreCase ? "&aIgnore Case" : "&cIgnore Case")) - .info("&7Current Value", "") - .info(null, "&a" + ignoreCase) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionEditor.ActionItem.ActionType.BOOLEAN - ) - ); - return new ActionEditor(4, "Stat Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - String statString = HandlePlaceholders.parsePlaceholders(player, house, this.stat); + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + String statString = getProperty("stat", StringProperty.class).parsedValue(house, player); Stat stat = house.getStatManager().getPlayerStatByName(player, statString); - String compareValue = HandlePlaceholders.parsePlaceholders(player, house, this.compareValue); + String compareValue = getProperty("compareValue", StringProperty.class).parsedValue(house, player); String statValue = stat.getValue(); - if (ignoreCase) { + + if (getProperty("ignoreCase", BooleanProperty.class).getValue()) { statValue = statValue.toLowerCase(); compareValue = compareValue.toLowerCase(); } - return Comparator.compare(comparator, statValue, compareValue); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("stat", stat); - data.put("comparator", comparator.name()); - data.put("compareValue", compareValue); - data.put("ignoreCase", ignoreCase); - return data; + return Comparator.compare(getValue("comparator", StatComparator.class), statValue, compareValue) + ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "stat"; - } - - @Override - public String export(int indent) { - String compareValue = this.compareValue; - if (compareValue.contains(" ")) { - compareValue = "\"" + compareValue + "\""; - } - return "stat " + stat + " " + comparator.name() + " " + compareValue + " " + ignoreCase; - } - - @Override - public void importCondition(String action, List nextLines) { - String[] parts = action.split(" "); - Duple statArg = handleArg(parts, 0); - this.stat = statArg.getSecond(); - parts = statArg.getFirst(); - if (parts.length == 0) { - return; - } - this.comparator = StatComparator.getComparator(parts[0]); - Duple compareValueArg = handleArg(parts, 1); - compareValue = compareValueArg.getSecond(); - parts = compareValueArg.getFirst(); - if (parts.length > 0) { - ignoreCase = Boolean.parseBoolean(parts[0]); - } - } } diff --git a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/WithinRegionCondition.java b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/WithinRegionCondition.java index a5507d9e..16ee7ca4 100644 --- a/paper/src/main/java/com/al3x/housing2/Condition/Conditions/WithinRegionCondition.java +++ b/paper/src/main/java/com/al3x/housing2/Condition/Conditions/WithinRegionCondition.java @@ -1,9 +1,15 @@ package com.al3x.housing2.Condition.Conditions; import com.al3x.housing2.Action.ActionEditor; +import com.al3x.housing2.Action.ActionExecutor; +import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.GenericPagination.RegionProperty; import com.al3x.housing2.Condition.CHTSLImpl; import com.al3x.housing2.Condition.Condition; +import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Events.CancellableEvent; import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Instances.Region; import com.al3x.housing2.Utils.ItemBuilder; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -13,71 +19,28 @@ import java.util.List; public class WithinRegionCondition extends CHTSLImpl { - private String region = null; - public WithinRegionCondition() { - super("Within Region"); - - } - - @Override - public String toString() { - return "Region: " + region; - } + super(ConditionEnum.WITHIN_REGION, + "Within Region", + "Requires the user to be in the specified region.", + Material.GRASS_BLOCK, + List.of("inRegion")); - @Override - public void createDisplayItem(ItemBuilder builder) { - builder.material(Material.GRASS_BLOCK); - builder.name("&aWithin Region"); - builder.description("Requires the user to be in the specified region."); - builder.info("Region", (region == null ? "&aNot Set" : "&6" + region)); - builder.lClick(ItemBuilder.ActionType.EDIT_YELLOW); - builder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); - builder.shiftClick(); - } - - @Override - public void createAddDisplayItem(ItemBuilder builder) { - builder.material(Material.GRASS_BLOCK); - builder.name("&eWithin Region"); - builder.description("Requires the user to be in the specified region."); - builder.lClick(ItemBuilder.ActionType.ADD_YELLOW); + getProperties().add(new RegionProperty( + "region", + "Region", + "The region to check." + )); } @Override - public ActionEditor editorMenu(HousingWorld house) { - List items = Arrays.asList( - new ActionEditor.ActionItem("region", - ItemBuilder.create(Material.GRASS_BLOCK) - .name("&eRegion") - .info("&7Current Value", "") - .info(null, "&a" + (region == null ? "Not Set" : region)) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW), - ActionEditor.ActionItem.ActionType.REGION - ) - ); - return new ActionEditor(4, "Within Region Requirement", items); - } - - @Override - public boolean execute(Player player, HousingWorld house) { - return house.getRegions().stream().filter(region -> region.getPlayersInRegion().contains(player.getUniqueId())).anyMatch(region -> region.getName().equalsIgnoreCase(this.region)); - } - - @Override - public LinkedHashMap data() { - LinkedHashMap data = new LinkedHashMap<>(); - data.put("region", region); - return data; + public OutputType execute(Player player, HousingWorld house, CancellableEvent event, ActionExecutor executor) { + Region region = getProperty("region", RegionProperty.class).getValue(); + return region.getPlayersInRegion().contains(player.getUniqueId()) ? OutputType.TRUE : OutputType.FALSE; } @Override public boolean requiresPlayer() { return true; } - - @Override - public String keyword() { - return "inRegion"; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Data/ActionData.java b/paper/src/main/java/com/al3x/housing2/Data/ActionData.java index 0dd11ea8..b293137d 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/ActionData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/ActionData.java @@ -4,6 +4,7 @@ import com.al3x.housing2.Action.ActionEnum; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Instances.HousingWorld; +import com.al3x.housing2.Main; import lombok.Getter; import lombok.Setter; @@ -34,7 +35,7 @@ public static HashMap> fromHashMap(HashMap> map = new HashMap<>(); for (Map.Entry> entry : actionMap.entrySet()) { List list = entry.getValue().stream() - .map(action -> new ActionData(action.getName(), action.data(), action.getComment())) + .map(action -> new ActionData(action.getId(), action.data(), action.getComment())) .collect(Collectors.toList()); map.put(entry.getKey().name(), list); } @@ -45,7 +46,7 @@ public static HashMap> fromHashMap(HashMap> map = new HashMap<>(); for (Map.Entry> entry : actionMap.entrySet()) { List list = entry.getValue().stream() - .map(action -> new ActionData(action.getName(), action.data(), action.getComment())) + .map(action -> new ActionData(action.getId(), action.data(), action.getComment())) .collect(Collectors.toList()); map.put(entry.getKey(), list); } @@ -54,31 +55,39 @@ public static HashMap> fromHashMap(HashMap fromList(List actionList) { return actionList.stream() - .map(action -> new ActionData(action.getName(), action.data(), action.getComment())) + .map(action -> new ActionData(action.getId(), action.data(), action.getComment())) .collect(Collectors.toList()); } - public static List toList(List actionDataList) { + public static List toList(List actionDataList, HousingWorld house) { List collect = new ArrayList<>(); for (ActionData data : actionDataList) { - ActionEnum actionEnum = ActionEnum.getActionByName(data.getAction()); + ActionEnum actionEnum = ActionEnum.getActionById(data.getAction()); if (actionEnum == null) { + Main.getInstance().getLogger().warning("Action " + data.action + " not found"); continue; //skip invalid actions, rather than freaking out } - collect.add(actionEnum.getActionInstance(data.getData(), data.getComment())); + collect.add(actionEnum.getActionInstance(data.getData(), data.getComment(), house)); } return collect; } public static ActionData toData(Action action) { + if (action == null) { + return null; + } return new ActionData(action.getName(), action.data(), action.getComment()); } - public static Action fromData(ActionData data) { - ActionEnum actionEnum = ActionEnum.getActionByName(data.getAction()); + public static Action fromData(ActionData data, HousingWorld house) { + if (data == null) { + return null; + } + ActionEnum actionEnum = ActionEnum.getActionById(data.getAction()); if (actionEnum == null) { - throw new IllegalArgumentException("Action " + data.getAction() + " does not exist"); + Main.getInstance().getLogger().warning("Action " + data.action + " not found"); + return null; //skip invalid actions, rather than freaking out } - return actionEnum.getActionInstance(data.getData(), data.getComment()); + return actionEnum.getActionInstance(data.getData(), data.getComment(), house); } } \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Data/CommandData.java b/paper/src/main/java/com/al3x/housing2/Data/CommandData.java index 52d3fa5b..206ba87f 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/CommandData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/CommandData.java @@ -2,6 +2,7 @@ import com.al3x.housing2.Instances.Command; import com.al3x.housing2.Instances.Command.CommandArg; +import com.al3x.housing2.Instances.HousingWorld; import lombok.Getter; import lombok.Setter; @@ -42,7 +43,7 @@ public static List fromList(List commands) { return commandData; } - public static List toList(List commandDataList) { + public static List toList(List commandDataList, HousingWorld house) { List commands = new ArrayList<>(); if (commandDataList != null) { for (CommandData commandData : commandDataList) { @@ -51,7 +52,7 @@ public static List toList(List commandDataList) { commandData.getCommand(), commandData.getArgs(), commandData.getPriorityRequired(), - ActionData.toList(commandData.getActions()) + ActionData.toList(commandData.getActions(), house) )); } } diff --git a/paper/src/main/java/com/al3x/housing2/Data/ConditionalData.java b/paper/src/main/java/com/al3x/housing2/Data/ConditionalData.java index 4cc4a83d..d85f89e5 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/ConditionalData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/ConditionalData.java @@ -2,6 +2,7 @@ import com.al3x.housing2.Condition.Condition; import com.al3x.housing2.Condition.ConditionEnum; +import com.al3x.housing2.Instances.HousingWorld; import lombok.Getter; import lombok.Setter; @@ -27,21 +28,19 @@ public ConditionalData(String condition, HashMap data) { public static List fromList(List conditions) { List list = new ArrayList<>(); for (Condition condition : conditions) { - HashMap data = new HashMap<>(condition.data()); - data.put("inverted", condition.inverted); - list.add(new ConditionalData(condition.getName(), data)); + list.add(new ConditionalData(condition.getId(), condition.data())); } return list; } - public static List toList(List conditionList) { + public static List toList(List conditionList, HousingWorld house) { List list = new ArrayList<>(); for (ConditionalData data : conditionList) { - ConditionEnum conditionEnum = ConditionEnum.getConditionByName(data.getCondition()); + ConditionEnum conditionEnum = ConditionEnum.getConditionById(data.getCondition()); if (conditionEnum == null) { throw new IllegalArgumentException("Condition " + data.getCondition() + " does not exist"); } - list.add(conditionEnum.getConditionInstance(data.getData())); + list.add(conditionEnum.getConditionInstance(data.getData(), house)); } return list; } diff --git a/paper/src/main/java/com/al3x/housing2/Data/CustomMenuData.java b/paper/src/main/java/com/al3x/housing2/Data/CustomMenuData.java index e4836d59..db526e50 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/CustomMenuData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/CustomMenuData.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Data; import com.al3x.housing2.Instances.CustomMenu; +import com.al3x.housing2.Instances.HousingWorld; import lombok.Getter; import lombok.Setter; @@ -25,10 +26,10 @@ public CustomMenuData(String title, int rows, int refreshRate, List toList(List customMenuData) { + public static List toList(List customMenuData, HousingWorld house) { List list = new ArrayList<>(); for (CustomMenuData data : customMenuData) { - list.add(new CustomMenu(data)); + list.add(new CustomMenu(data, house)); } return list; } diff --git a/paper/src/main/java/com/al3x/housing2/Data/FunctionData.java b/paper/src/main/java/com/al3x/housing2/Data/FunctionData.java index c2e2fdab..30bbd71d 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/FunctionData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/FunctionData.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Data; import com.al3x.housing2.Instances.Function; +import com.al3x.housing2.Instances.HousingWorld; import lombok.Getter; import lombok.Setter; import org.bukkit.Material; @@ -50,7 +51,7 @@ public static List fromList(List list) { return functionData; } - public static List toList(List list) { + public static List toList(List list, HousingWorld housingWorld) { List functions = new ArrayList<>(); for (FunctionData data : list) { functions.add(new Function( @@ -59,7 +60,7 @@ public static List toList(List list) { data.getTicks(), Material.valueOf(data.getMaterial()), data.getDescription(), - ActionData.toList(data.getActions()), + ActionData.toList(data.getActions(), housingWorld), data.isGlobal() )); } diff --git a/paper/src/main/java/com/al3x/housing2/Data/LocationData.java b/paper/src/main/java/com/al3x/housing2/Data/LocationData.java index 8eea699a..c946cc07 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/LocationData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/LocationData.java @@ -55,6 +55,11 @@ public static LocationData fromString(String key) { } } + @Override + public String toString() { + return x + ", " + y + ", " + z; + } + public Location toLocation() { return new Location(Bukkit.getWorld(world), x, y, z, yaw, pitch); } diff --git a/paper/src/main/java/com/al3x/housing2/Data/RegionData.java b/paper/src/main/java/com/al3x/housing2/Data/RegionData.java index 04835796..92186ada 100644 --- a/paper/src/main/java/com/al3x/housing2/Data/RegionData.java +++ b/paper/src/main/java/com/al3x/housing2/Data/RegionData.java @@ -1,6 +1,7 @@ package com.al3x.housing2.Data; import com.al3x.housing2.Enums.PvpSettings; +import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.Region; import lombok.Getter; import lombok.Setter; @@ -54,21 +55,21 @@ public static List fromList(List regions) { .collect(Collectors.toList()); } - public static Region toRegion(RegionData regionData) { + public static Region toRegion(RegionData regionData, HousingWorld house) { return new Region( regionData.isLoaded(), regionData.getPosA().toLocation(), regionData.getPosB().toLocation(), regionData.getName(), - ActionData.toList(regionData.getExitActions()), - ActionData.toList(regionData.getEnterActions()), + ActionData.toList(regionData.getExitActions(), house), + ActionData.toList(regionData.getEnterActions(), house), new HashMap<>(regionData.getPvpSettings()) ); } - public static List toList(List regionDataList) { + public static List toList(List regionDataList, HousingWorld house) { return regionDataList.stream() - .map(RegionData::toRegion) + .map((regionData) -> toRegion(regionData, house)) .collect(Collectors.toList()); } } \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Data/StatActionData.java b/paper/src/main/java/com/al3x/housing2/Data/StatActionData.java deleted file mode 100644 index d562c8f9..00000000 --- a/paper/src/main/java/com/al3x/housing2/Data/StatActionData.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.al3x.housing2.Data; - -import com.al3x.housing2.Action.Actions.StatValue; -import com.al3x.housing2.Action.StatInstance; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -public class StatActionData { - public static MoreStatData fromStatValue(StatValue statValue) { - return new MoreStatData( - statValue.getLiteralValue(), - statValue.getStatInstances(), - statValue.getValue() != null ? fromStatValue(statValue.getValue()) : null, - statValue.isExpression(), - statValue.getStatType() - ); - } - - @Getter - @Setter - public static class MoreStatData { - private String literal; - private List statInstances; - private MoreStatData value; - private boolean isExpression; - private String statType; - private Boolean isGlobal; - - public MoreStatData() { - } - - public MoreStatData(String literal, List statInstances, MoreStatData value, boolean isExpression, String statType) { - this.literal = literal; - this.statInstances = statInstances; - this.value = value; - this.isExpression = isExpression; - this.statType = statType; - this.isGlobal = false; - } - - public StatValue toStatValue() { - if (isGlobal != null) { // Convert from old format - return new StatValue( - isGlobal, - isExpression, - literal, - value != null ? value.toStatValue() : null, - statInstances - ); - } - return new StatValue( - statType, - isExpression, - literal, - value != null ? value.toStatValue() : null, - statInstances - ); - } - } -} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Enums/Locations.java b/paper/src/main/java/com/al3x/housing2/Enums/Locations.java index 06dbdc2f..8615496c 100644 --- a/paper/src/main/java/com/al3x/housing2/Enums/Locations.java +++ b/paper/src/main/java/com/al3x/housing2/Enums/Locations.java @@ -1,19 +1,25 @@ package com.al3x.housing2.Enums; -public enum Locations { - CUSTOM, - HOUSE_SPAWN, - PLAYER_LOCATION, - INVOKERS_LOCATION, +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; + +@Getter +@AllArgsConstructor +public enum Locations implements EnumMaterial { + CUSTOM(Material.COMPASS), + HOUSE_SPAWN(Material.GRASS_BLOCK), + PLAYER_LOCATION(Material.LIGHTNING_ROD), + INVOKERS_LOCATION(Material.PLAYER_HEAD), ; + private final Material material; public static Locations fromString(String string) { - return switch (string) { - case "CUSTOM" -> CUSTOM; - case "HOUSE_SPAWN" -> HOUSE_SPAWN; - case "PLAYER_LOCATION" -> PLAYER_LOCATION; - case "INVOKERS_LOCATION" -> INVOKERS_LOCATION; - default -> null; - }; + for (Locations location : values()) { + if (location.name().equalsIgnoreCase(string)) { + return location; + } + } + return null; } } diff --git a/paper/src/main/java/com/al3x/housing2/Enums/PushDirection.java b/paper/src/main/java/com/al3x/housing2/Enums/PushDirection.java index 2b93d86b..f64cb03f 100644 --- a/paper/src/main/java/com/al3x/housing2/Enums/PushDirection.java +++ b/paper/src/main/java/com/al3x/housing2/Enums/PushDirection.java @@ -11,7 +11,7 @@ public enum PushDirection { SOUTH, EAST, WEST, - CUSTOM; + ; public static PushDirection fromString(String string) { for (PushDirection direction : values()) { diff --git a/paper/src/main/java/com/al3x/housing2/Instances/ClipboardManager.java b/paper/src/main/java/com/al3x/housing2/Instances/ClipboardManager.java index 5908591c..ec8b8a61 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/ClipboardManager.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/ClipboardManager.java @@ -43,11 +43,11 @@ public List addOrLoad(String uuid) { return clipboard; } - public List fromClipboard(String uuid) { + public List fromClipboard(String uuid, HousingWorld house) { List actions = new ArrayList<>(); for (String serialized : addOrLoad(uuid)) { try { - actions.add(StringToBase64.actionFromBase64(serialized)); + actions.add(StringToBase64.actionFromBase64(serialized, house)); } catch (Exception e) { //skip it because of the error, normally just because its a action that was removed or name got changed } @@ -62,8 +62,8 @@ public Action addAction(String uuid, Action action) { return action; } - public void removeAction(String uuid, Action action) { - List actions = fromClipboard(uuid); + public void removeAction(String uuid, Action action, HousingWorld house) { + List actions = fromClipboard(uuid, house); actions.remove(action); saveActions(uuid, actions); } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/CustomMenu.java b/paper/src/main/java/com/al3x/housing2/Instances/CustomMenu.java index 693e5f12..20e3824f 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/CustomMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/CustomMenu.java @@ -31,14 +31,14 @@ public CustomMenu(String title, int rows) { items.set(0, new Duple<>(new ItemStack(Material.DIAMOND), new ArrayList<>())); } - public CustomMenu(CustomMenuData data) { + public CustomMenu(CustomMenuData data, HousingWorld house) { this.title = data.getTitle(); this.rows = data.getRows(); this.refreshRate = data.getRefreshRate(); this.items = new ArrayList<>(data.getItems().stream().map(item -> { if (item == null) return null; try { - return new Duple<>(Serialization.itemStackFromBase64(item.getItem()), ActionData.toList(item.getActions())); + return new Duple<>(Serialization.itemStackFromBase64(item.getItem()), ActionData.toList(item.getActions(), house)); } catch (IOException e) { e.printStackTrace(); } @@ -46,6 +46,11 @@ public CustomMenu(CustomMenuData data) { }).toList()); } + @Override + public String toString() { + return title; + } + public String getTitle() { return title; } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Function.java b/paper/src/main/java/com/al3x/housing2/Instances/Function.java index 16b78fdf..fcea4ebe 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Function.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Function.java @@ -3,6 +3,7 @@ import com.al3x.housing2.Action.Action; import com.al3x.housing2.Action.ActionExecutor; import com.al3x.housing2.Action.OutputType; +import com.al3x.housing2.Action.Properties.ArgumentsProperty; import com.al3x.housing2.Main; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -16,7 +17,7 @@ import java.util.UUID; public class Function { - public static HashMap> functionArguments = new HashMap<>(); + public static HashMap> functionArguments = new HashMap<>(); private String name; private UUID id;//probably not needed? @@ -49,10 +50,10 @@ public Function(String name, UUID id, Integer ticks, Material material, String d } public OutputType execute(Main main, Entity entity, Player player, HousingWorld house, boolean automatic, boolean await, ActionExecutor oldExecutor) { - return execute(main, entity, player, house, automatic, await, oldExecutor, new HashMap<>()); + return execute(main, entity, player, house, automatic, await, oldExecutor, new ArrayList<>()); } - public OutputType execute(Main main, Entity entity, Player player, HousingWorld house, boolean automatic, boolean await, ActionExecutor oldExecutor, HashMap arguments) { + public OutputType execute(Main main, Entity entity, Player player, HousingWorld house, boolean automatic, boolean await, ActionExecutor oldExecutor, List arguments) { if (!loaded) return OutputType.ERROR; List players = new ArrayList<>(); //I dont fliping know anymore lol @@ -67,8 +68,10 @@ public OutputType execute(Main main, Entity entity, Player player, HousingWorld } for (Player p : players) { - HashMap args = functionArguments.getOrDefault(p.getUniqueId(), new HashMap<>()); - args.putAll(arguments); + List args = functionArguments.getOrDefault(p.getUniqueId(), new ArrayList<>()); + if (arguments != null && !arguments.isEmpty()) { + args.addAll(arguments); + } functionArguments.put(p.getUniqueId(), args); ActionExecutor executor = new ActionExecutor("function"); executor.setLimits(oldExecutor != null ? oldExecutor.getLimits() : new HashMap<>()); @@ -145,5 +148,10 @@ public void setLoaded(boolean loaded) { public int getLastRun() { return lastRun; } + + @Override + public String toString() { + return name; + } } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Group.java b/paper/src/main/java/com/al3x/housing2/Instances/Group.java index 0e99d2b7..4c686380 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Group.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Group.java @@ -52,6 +52,11 @@ public void setName(String name) { } + @Override + public String toString() { + return name; + } + public String getPrefix() { return prefix; } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/HTSLHandler.java b/paper/src/main/java/com/al3x/housing2/Instances/HTSLHandler.java index 9227b45b..77fea8de 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/HTSLHandler.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/HTSLHandler.java @@ -11,7 +11,7 @@ import java.util.List; public class HTSLHandler { - public static List importActions(String content, String indent) { + public static List importActions(String content, String indent, HousingWorld house) { List defaultActions = List.of(Arrays.stream(ActionEnum.values()).map(ActionEnum::getActionInstance).filter(a -> a instanceof HTSLImpl).map(a -> (HTSLImpl) a).toArray(HTSLImpl[]::new)); ArrayList lines = new ArrayList<>(Arrays.asList(content.split("\n"))); @@ -20,9 +20,9 @@ public static List importActions(String content, String indent) { while (!lines.isEmpty()) { String line = lines.removeFirst().replaceFirst(indent, ""); for (HTSLImpl action : defaultActions) { - if (line.startsWith(action.keyword())) { - HTSLImpl a = (HTSLImpl) action.clone(); - lines = a.importAction(StringUtilsKt.substringAfter(line, action.keyword() + (line.contains(" ") ? " " : "")), indent, new ArrayList<>(lines)); + if (line.startsWith(action.getScriptingKeywords().getFirst())) { + HTSLImpl a = (HTSLImpl) action.clone(house); + lines = a.importAction(StringUtilsKt.substringAfter(line, action.getScriptingKeywords().getFirst() + (line.contains(" ") ? " " : "")), indent, new ArrayList<>(lines)); actions.add(a); break; } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/HousingNPC.java b/paper/src/main/java/com/al3x/housing2/Instances/HousingNPC.java index 67864a35..95e0de97 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/HousingNPC.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/HousingNPC.java @@ -106,7 +106,7 @@ public HousingNPC(Main main, Location location, HousingWorld house, NPCData data this.lookAtPlayer = data.isLookAtPlayer(); this.location = location; this.entityType = EntityType.valueOf(data.getNpcType()); - this.actions = ActionData.toList(data.getActions()); + this.actions = ActionData.toList(data.getActions(), house); this.stats = StatData.toList(data.getStats() == null ? new ArrayList<>() : data.getStats()); this.internalID = data.getNpcID(); this.eventActions = new HashMap<>(); @@ -120,7 +120,7 @@ public HousingNPC(Main main, Location location, HousingWorld house, NPCData data this.eventActions.put(type.name(), new ArrayList<>()); continue; } - this.eventActions.put(type.name(), ActionData.toList(data.getEventActions().get(type.name()))); + this.eventActions.put(type.name(), ActionData.toList(data.getEventActions().get(type.name()), house)); } } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/HousingWorld.java b/paper/src/main/java/com/al3x/housing2/Instances/HousingWorld.java index 4ca5a2e3..6a507d62 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/HousingWorld.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/HousingWorld.java @@ -13,7 +13,6 @@ import com.al3x.housing2.Data.*; import com.al3x.housing2.Listeners.TrashCanListener; import com.al3x.housing2.Main; -import com.al3x.housing2.Mongo.Collection.HousesCollection; import com.al3x.housing2.Utils.*; import com.google.common.collect.ConcurrentHashMultiset; import com.google.gson.Gson; @@ -57,7 +56,9 @@ import static org.bukkit.scoreboard.Team.Option.COLLISION_RULE; public class HousingWorld { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().registerTypeAdapter(Instant.class, new InstantTypeAdapter()).create(); + private static final Gson GSON = new GsonBuilder().setPrettyPrinting() + .registerTypeAdapter(Instant.class, new InstantTypeAdapter()) + .create(); private transient Main main; private transient SlimeLoader loader; @@ -239,9 +240,9 @@ private void setupHouseData() { this.timeCreated = houseData.getTimeCreated(); this.privacy = houseData.getPrivacy() != null ? HousePrivacy.valueOf(houseData.getPrivacy()) : HousePrivacy.PRIVATE; this.statManager.setGlobalStats(StatData.toList(houseData.getGlobalStats())); - this.commands = houseData.getCommands() != null ? CommandData.toList(houseData.getCommands()) : new ArrayList<>(); + this.commands = houseData.getCommands() != null ? CommandData.toList(houseData.getCommands(), this) : new ArrayList<>(); this.layouts = houseData.getLayouts() != null ? LayoutData.toList(houseData.getLayouts()) : new ArrayList<>(); - this.customMenus = houseData.getCustomMenus() != null ? CustomMenuData.toList(houseData.getCustomMenus()) : new ArrayList<>(); + this.customMenus = houseData.getCustomMenus() != null ? CustomMenuData.toList(houseData.getCustomMenus(), this) : new ArrayList<>(); this.groups = houseData.getGroups() != null ? GroupData.toList(houseData.getGroups()) : new ArrayList<>(); this.teams = houseData.getTeams() != null ? TeamData.toList(houseData.getTeams()) : new ArrayList<>(); this.playersData = houseData.getPlayerData() != null ? houseData.getPlayerData() : new HashMap<>(); @@ -265,7 +266,7 @@ private void setupHouseData() { this.scoreboard = houseData.getScoreboard(); this.scoreboardTitle = houseData.getScoreboardTitle() != null ? houseData.getScoreboardTitle() : "ᴘʟᴀʏɢʀᴏᴜɴᴅ"; loadEventActions(); - this.functions = houseData.getFunctions() != null ? FunctionData.toList(houseData.getFunctions()) : new ArrayList<>(); + this.functions = houseData.getFunctions() != null ? FunctionData.toList(houseData.getFunctions(), this) : new ArrayList<>(); this.seed = houseData.getSeed(); this.random = new Random(seed.hashCode()); this.size = houseData.getSize(); @@ -297,7 +298,7 @@ private void setupHouseData() { } private void setupDataAfterLoad() { - this.regions = houseData.getRegions() != null ? RegionData.toList(houseData.getRegions()) : new ArrayList<>(); + this.regions = houseData.getRegions() != null ? RegionData.toList(houseData.getRegions(), this) : new ArrayList<>(); this.holograms = houseData.getHolograms() != null ? HologramData.toList(houseData.getHolograms(), this) : new ArrayList<>(); this.spawn = houseData.getSpawnLocation() != null ? houseData.getSpawnLocation().toLocation() : new Location(Bukkit.getWorld(this.houseUUID.toString()), 0, 61, 0); this.trashCans = houseData.getTrashCans() != null ? new ArrayList<>(houseData.getTrashCans().stream().map(LocationData::toLocation).toList()) : new ArrayList<>(); @@ -326,7 +327,15 @@ private void loadEventActions() { List actions = houseData.getEventActions().get(type.name()); if (actions != null) { for (ActionData action : actions) { - eventActions.get(type).add(ActionEnum.getActionByName(action.getAction()).getActionInstance(action.getData(), action.getComment())); + if (action.getAction() == null) { + continue; + } + ActionEnum e = ActionEnum.getActionById(action.getAction()); + if (e == null) { + main.getLogger().warning("Action " + action.getAction() + " not found"); + continue; + } + eventActions.get(type).add(e.getActionInstance(action.getData(), action.getComment(), this)); } } } @@ -557,12 +566,16 @@ public void save() { try { houseData = HouseData.fromHousingWorld(this); + File testfile = new File(main.getDataFolder(), "testhouses/" + houseUUID + ".json"); File file = new File(main.getDataFolder(), "houses/" + houseUUID + ".json"); + if (!testfile.getParentFile().exists()) testfile.getParentFile().mkdirs(); + if (!testfile.exists()) testfile.createNewFile(); if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); if (!file.exists()) file.createNewFile(); String json = GSON.toJson(houseData); Files.writeString(file.toPath(), json, StandardCharsets.UTF_8); main.getHousesManager().updateCache(houseData); + } catch (IOException e) { Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e); } @@ -1135,7 +1148,7 @@ public void addActionButton(Location location) { public List getActionButton(Location location) { for (LocationData loc : actionButtons.keySet()) { if (loc.toLocation().distance(location) < 1) { - return ActionData.toList(actionButtons.get(loc)); + return ActionData.toList(actionButtons.get(loc), this); } } return null; diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Item.java b/paper/src/main/java/com/al3x/housing2/Instances/Item.java index 69d1f3f9..a0118699 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Item.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Item.java @@ -2,8 +2,10 @@ import com.al3x.housing2.Action.Action; import com.al3x.housing2.Main; +import com.al3x.housing2.Migration.MigrationManagerKt; import com.al3x.housing2.Utils.NbtItemBuilder; import com.al3x.housing2.Utils.StringToBase64; +import com.google.gson.JsonArray; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; @@ -53,8 +55,35 @@ public boolean hasActions() { return false; } + public static Item fromOldItemStack(ItemStack item, HousingWorld house) { + if (item == null || item.getItemMeta() == null) { + return null; + } + Item newItem = new Item(item); + HashMap> actions = newItem.getActions(); + NbtItemBuilder nbtItemBuilder = new NbtItemBuilder(item); + NbtItemBuilder actionsBuilder = nbtItemBuilder.getChild("actions"); + + if (actionsBuilder != null) { + for (ClickType clickType : actions.keySet()) { + String base64 = actionsBuilder.getString(clickType.name().toLowerCase()); + if (base64 != null) { + String json = StringToBase64.decodeBase64(base64); + json = MigrationManagerKt.main(json); + if (json != null) { + ArrayList actionList = StringToBase64.fromJson(json, house); + actions.put(clickType, actionList); + } else { + Main.getInstance().getLogger().warning("Item " + item.getType() + " has no actions."); + } + } + } + } + return newItem; + } + - public static Item fromItemStack(ItemStack item) { + public static Item fromItemStack(ItemStack item, HousingWorld house) { if (item == null || item.getItemMeta() == null) { return null; } @@ -66,7 +95,7 @@ public static Item fromItemStack(ItemStack item) { for (ClickType clickType : actions.keySet()) { String base64 = actionsBuilder.getString(clickType.name().toLowerCase()); if (base64 != null) { - actions.put(clickType, StringToBase64.actionsFromBase64(base64)); + actions.put(clickType, StringToBase64.actionsFromBase64(base64, house)); } } } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Layout.java b/paper/src/main/java/com/al3x/housing2/Instances/Layout.java index de2397d0..82c88aae 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Layout.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Layout.java @@ -73,6 +73,11 @@ public Layout(String name, String description, String icon, List invento } } + @Override + public String toString() { + return name; + } + public String getName() { return name; } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Region.java b/paper/src/main/java/com/al3x/housing2/Instances/Region.java index 7321ca46..1e801ab7 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Region.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Region.java @@ -69,6 +69,11 @@ public HashMap getPvpSettings() { public List getPlayersInRegion() { return playersInRegion; } + + @Override + public String toString() { + return name; + } } diff --git a/paper/src/main/java/com/al3x/housing2/Instances/Team.java b/paper/src/main/java/com/al3x/housing2/Instances/Team.java index ddc5df94..26170825 100644 --- a/paper/src/main/java/com/al3x/housing2/Instances/Team.java +++ b/paper/src/main/java/com/al3x/housing2/Instances/Team.java @@ -28,6 +28,11 @@ public Team(TeamData data) { this.friendlyFire = data.isFriendlyFire(); } + @Override + public String toString() { + return name; + } + public String getName() { return name; } diff --git a/paper/src/main/java/com/al3x/housing2/Listeners/HouseEvents/PlayerDropItem.java b/paper/src/main/java/com/al3x/housing2/Listeners/HouseEvents/PlayerDropItem.java index c4e70e6d..649ba5a9 100644 --- a/paper/src/main/java/com/al3x/housing2/Listeners/HouseEvents/PlayerDropItem.java +++ b/paper/src/main/java/com/al3x/housing2/Listeners/HouseEvents/PlayerDropItem.java @@ -24,7 +24,7 @@ public PlayerDropItem(HousesManager housesManager) { @EventHandler public void onDrop(PlayerDropItemEvent e) { ItemStack item = e.getItemDrop().getItemStack(); - Item customItem = Item.fromItemStack(item); + Item customItem = Item.fromItemStack(item, housesManager.getHouse(e.getPlayer().getWorld())); if (customItem != null && customItem.hasActions()) { ClickType type = (item.getAmount() > 1 ? ClickType.CONTROL_DROP : ClickType.DROP); new ActionExecutor("event", customItem.getActions().get(type)).execute(e.getPlayer(), housesManager.getHouse(e.getPlayer().getWorld()), new CancellableEvent(null, e)); diff --git a/paper/src/main/java/com/al3x/housing2/Listeners/HousingItems.java b/paper/src/main/java/com/al3x/housing2/Listeners/HousingItems.java index 22336bac..472ea493 100644 --- a/paper/src/main/java/com/al3x/housing2/Listeners/HousingItems.java +++ b/paper/src/main/java/com/al3x/housing2/Listeners/HousingItems.java @@ -66,7 +66,7 @@ public void moveToOffhand(PlayerSwapHandItemsEvent event) { } ItemStack item = event.getOffHandItem(); - Item customItem = Item.fromItemStack(item); + Item customItem = Item.fromItemStack(item, housesManager.getHouse(player.getWorld())); if (customItem != null) { ClickType type = ClickType.SWAP_OFFHAND; new ActionExecutor("event", customItem.getActions().get(type)).execute(player, housesManager.getHouse(player.getWorld()), new CancellableEvent(null, event)); @@ -76,7 +76,7 @@ public void moveToOffhand(PlayerSwapHandItemsEvent event) { } ItemStack mainHandItem = event.getMainHandItem(); - Item customMainHandItem = Item.fromItemStack(mainHandItem); + Item customMainHandItem = Item.fromItemStack(mainHandItem, housesManager.getHouse(player.getWorld())); if (customMainHandItem != null) { ClickType type = ClickType.SWAP_OFFHAND; new ActionExecutor("event", customMainHandItem.getActions().get(type)).execute(player, housesManager.getHouse(player.getWorld()), new CancellableEvent(null, event)); @@ -226,7 +226,7 @@ private void executeCustomItem(Player player, ItemStack item, Action action, Can HousingWorld house = housesManager.getHouse(player.getWorld()); if (house == null) return; - Item customItem = Item.fromItemStack(item); + Item customItem = Item.fromItemStack(item, house); if (customItem == null) return; diff --git a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionClipboardMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionClipboardMenu.java index e30bb79c..eadfe626 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionClipboardMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionClipboardMenu.java @@ -37,7 +37,7 @@ public ActionClipboardMenu(Player player, Main main, HousingWorld house, Action public void initItems() { clearItems(); int[] allowedSlots = {10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34}; - List newList = clipboardManager.fromClipboard(player.getUniqueId().toString()); + List newList = clipboardManager.fromClipboard(player.getUniqueId().toString(), house); newList = newList.stream().filter(action -> action.getClass().equals(this.action.getClass())).toList(); PaginationList actions = new PaginationList<>(newList, 21); List page = actions.getPage(currentPage); @@ -52,17 +52,16 @@ public void initItems() { } else { for (int i = 0; i < page.size(); i++) { Action action = page.get(i); - ItemBuilder itemBuilder = new ItemBuilder(); - action.createDisplayItem(itemBuilder, house); + ItemBuilder itemBuilder = action.createDisplayItem(); itemBuilder.lClick(ItemBuilder.ActionType.CLONE); itemBuilder.rClick(ItemBuilder.ActionType.REMOVE_YELLOW); itemBuilder.shiftClick(false); addItem(allowedSlots[i], itemBuilder.build(), (e) -> { if (e.isRightClick()) { - clipboardManager.removeAction(player.getUniqueId().toString(), action); + clipboardManager.removeAction(player.getUniqueId().toString(), action, house); setupItems(); } else if (e.isLeftClick()) { - this.action.fromData(action.data(), action.getClass()); + this.action.fromData(action.data(), house); previousMenu.setAction(this.action); if (previousMenu.getUpdate() != null) { previousMenu.getUpdate().run(); diff --git a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEditMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEditMenu.java index a86c848e..2c614554 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEditMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEditMenu.java @@ -2,9 +2,10 @@ import com.al3x.housing2.Action.Action; import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Action.ActionEditor.ActionItem.ActionType; +import com.al3x.housing2.Action.ActionProperty; +import com.al3x.housing2.Action.Properties.CustomSlotProperty; +import com.al3x.housing2.Action.Properties.ExpandableProperty; import com.al3x.housing2.Condition.Condition; -import com.al3x.housing2.Data.HouseData; import com.al3x.housing2.Enums.EventType; import com.al3x.housing2.Events.OpenActionMenuEvent; import com.al3x.housing2.Instances.*; @@ -14,8 +15,9 @@ import com.al3x.housing2.Menus.PaginationMenu; import com.al3x.housing2.Utils.Duple; import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.Serialization; import com.al3x.housing2.Utils.StackUtils; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -23,30 +25,35 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import java.io.IOException; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; import java.util.Comparator; +import java.util.List; import static com.al3x.housing2.Utils.Color.colorize; public class ActionEditMenu extends Menu { - private Main main; + private final Main main; + @Setter + @Getter private Action action; private Condition condition; - private Player player; - private HousingWorld house; + private final Player player; + private final HousingWorld house; + @Setter private HousingNPC housingNPC; + @Setter private EventType event; + @Getter + @Setter private Runnable update; - private Menu backMenu; + @Getter + private final Menu backMenu; + @Getter + @Setter private List parentActions = new ArrayList<>(); - public Menu getBackMenu() { - return backMenu; - } - public int getBackMenusNestedLevel() { if (backMenu == null) { return 0; @@ -61,11 +68,11 @@ public int getBackMenusNestedLevel() { } private static ActionEditor getEditor(Action action, HousingWorld house, ActionEditMenu menu, Player player) { - return action.editorMenu(house) != null ? action.editorMenu(house) : action.editorMenu(house, menu) != null ? action.editorMenu(house, menu) : action.editorMenu(house, menu, player); + return action.editorMenu(house, menu, player); } private static ActionEditor getEditor(Condition condition, HousingWorld house, ActionEditMenu menu, Player player) { - return condition.editorMenu(house) != null ? condition.editorMenu(house) : condition.editorMenu(house, menu) != null ? condition.editorMenu(house, menu) : condition.editorMenu(house, player); + return condition.editorMenu(house, menu, player); } //Action @@ -89,14 +96,6 @@ public ActionEditMenu(Condition condition, Main main, Player player, HousingWorl this.backMenu = backMenu; } - public List getParentActions() { - return parentActions; - } - - public void setParentActions(List parentActions) { - this.parentActions = parentActions; - } - @Override public String getTitle() { ActionEditor editor; @@ -126,7 +125,7 @@ public static boolean isLimitReached(List actions, Action action) { @Override public void open() { - Bukkit.getScheduler().runTaskLater(main, () -> { + Bukkit.getScheduler().runTask(main, () -> { OpenActionMenuEvent event = new OpenActionMenuEvent(this, action, main, player, house, backMenu); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -138,7 +137,7 @@ public void open() { return; } super.open(); - }, 1); + }); } @Override @@ -150,461 +149,35 @@ public void initItems() { ActionEditor editor; if (action == null) { editor = getEditor(condition, house, this, player); - ArrayList items = new ArrayList<>(editor.getItems()); - items.addFirst(new ActionEditor.ActionItem( - "inverted", - ItemBuilder.create(Material.BARRIER) - .name("&aInverted") - .info("&7Current Value", "") - .info(null, "&6" + condition.inverted) - .lClick(ItemBuilder.ActionType.TOGGLE_YELLOW), - ActionType.CUSTOM, (e, o) -> { - condition.inverted = !condition.inverted; - player.sendMessage(colorize("&aInverted set to: " + condition.inverted)); - open(); - return true; - } - )); - editor.setItems(items); } else { editor = getEditor(action, house, this, player); } setTitle(colorize(editor.getTitle())); - List items = editor.getItems(); + List> properties = new ArrayList<>(editor.getProperties()); int[] slots = new int[]{11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35}; - for (int i = 0; i < items.size(); i++) { - ActionEditor.ActionItem item = items.get(i); - int slot = slots[i] - 1; - if (item.getSlot() != -1) { - slot = item.getSlot(); + //Go through all properties and expand them + for (int i = 0; i < properties.size(); i++) { + ActionProperty property = properties.get(i); + if (property instanceof ExpandableProperty) { + ExpandableProperty expandableProperty = (ExpandableProperty) property; + List> expandedProperties = expandableProperty.getProperties(); + properties.remove(property); + properties.addAll(i, expandedProperties); } - addItem(slot, item.getBuilder().build(), (e) -> { - if (item.getCustomRunnable() != null && (item.getType() == null || item.getType() == ActionType.CUSTOM)) { - if (item.getCustomRunnable().apply(e, null)) return; - } - - //I don't understand java - var o = new Object() { - Field field = null; - Object value = null; - - public void setValue(Object value) { - if (item.getCustomRunnable() != null) { - if (!item.getCustomRunnable().apply(e, value)) return; - return; - } - try { - field.set((action == null) ? condition : action, value); - } catch (IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - } - }; - try { - if (action != null) { - o.field = action.getClass().getDeclaredField(item.getVarName()); - o.field.setAccessible(true); - o.value = o.field.get(action); - } else { - o.field = condition.getClass().getDeclaredField(item.getVarName()); - o.field.setAccessible(true); - o.value = o.field.get(condition); - } - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to get field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to get field " + item.getBuilder().getName() + " in " + action.getName())); - } - switch (item.getType()) { - case STRING: { - player.sendMessage(colorize("&ePlease enter the text you wish to set in chat!")); - openChat(main, String.valueOf(o.value), (input) -> { - // Set the field - if (o.field == null) return; - o.setValue(input); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + input)); - }); - break; - } - case INT: { - player.sendMessage(colorize("&ePlease enter the number you wish to set in chat!")); - openChat(main, o.value.toString(), (input) -> { - try { - int num = Integer.parseInt(input); - // Check if the number is within the min and max range - if (num < item.getMin()) { - player.sendMessage(colorize("&cNumber must be greater than " + item.getMin())); - return; - } - if (num > item.getMax()) { - player.sendMessage(colorize("&cNumber must be less than " + item.getMax())); - return; - } - // Set the field - if (o.field == null) return; - o.setValue(num); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + input)); - } catch (NumberFormatException ex) { - player.sendMessage(colorize("&cInvalid number! Please enter a valid number.")); - } - }); - break; - } - case DOUBLE: { - player.sendMessage(colorize("&ePlease enter the number you wish to set in chat!")); - openChat(main, o.value.toString(), (input) -> { - try { - // a google search told me that using Double.valueOf might work compared to Double.parseDouble - double num = Double.valueOf(input); - // Check if the number is within the min and max range - if (num < item.getMin()) { - player.sendMessage(colorize("&cNumber must be greater than " + item.getMin())); - return; - } - if (num > item.getMax()) { - player.sendMessage(colorize("&cNumber must be less than " + item.getMax())); - return; - } - // Set the field - if (o.field == null) return; - o.setValue(num); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + input)); - } catch (NumberFormatException ex) { - player.sendMessage(colorize("&cInvalid number! Please enter a valid number.")); - } - }); - break; - } - case ENUM: { - if (action == null) { - new ActionEnumMenu(condition, item, main, player, house, event, this).open(); - break; - } - new ActionEnumMenu(action, item, main, player, house, event, this).open(); - break; - } - case ACTION: { - try { - //Get the sub actions field and open the ActionsMenu - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - List subActions = (List) field.get(action); - ActionsMenu actionMenu = new ActionsMenu(main, player, house, subActions, this, item.getVarName()); - //Add this to check for events and such - actionMenu.setEvent(event); - actionMenu.setHousingNPC(housingNPC); - actionMenu.setUpdate(update); - actionMenu.setParentActions(parentActions); - actionMenu.addParentAction(action); - actionMenu.setNestedLevel(getBackMenusNestedLevel() + 1); - actionMenu.open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to get field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to get field " + item.getVarName() + " in " + action.getName())); - } - break; - } - case CONDITION: { - try { - //Get the sub actions field and open the ActionsMenu - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - List subActions = (List) field.get(action); - ActionsMenu actionMenu = new ActionsMenu(main, player, house, subActions, this, true); - if (event != null) { - actionMenu.setEvent(event); - } - if (housingNPC != null) { - actionMenu.setHousingNPC(housingNPC); - } - actionMenu.setNestedLevel(getBackMenusNestedLevel() + 1); - actionMenu.setParentActions(parentActions); - actionMenu.addParentAction(action); - actionMenu.open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to get field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to get field " + item.getVarName() + " in " + action.getName())); - } - break; - } - case FUNCTION: { - List> functions = new ArrayList<>(); - for (Function function : house.getFunctions()) { - functions.add(new Duple<>(function, ItemBuilder.create(function.getMaterial()).name(function.getName()).description(function.getDescription()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu(main, "Select a Function", functions, player, house, this, (function) -> { - try { - // Set the field - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, function.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + function.getName())); - open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - - case GROUP: { - List> groups = new ArrayList<>(); - for (Group group : house.getGroups()) { - groups.add(new Duple<>(group, ItemBuilder.create(Material.PAPER).name(group.getName()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select a Group", groups, player, house, this, (group) -> { - try { - // Set the field - if (action != null) { - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, group.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + group.getName())); - open(); - } else { - Field field = condition.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(condition, group.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + group.getName())); - open(); - } - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - - case TEAM: { - List> teams = new ArrayList<>(); - for (Team team : house.getTeams()) { - teams.add(new Duple<>(team, ItemBuilder.create(Material.PAPER).name(team.getName()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select a Team", teams, player, house, this, (team) -> { - try { - // Set the field - if (action != null) { - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, team.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + team.getName())); - open(); - } else { - Field field = condition.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(condition, team.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + team.getName())); - open(); - } - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - - case REGION: { - List> regions = new ArrayList<>(); - for (Region region : house.getRegions()) { - regions.add(new Duple<>(region, ItemBuilder.create(Material.GRASS_BLOCK).name(region.getName()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select a Region", regions, player, house, this, (region) -> { - try { - // Set the field - Field field = condition.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(condition, region.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + region.getName())); - open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - - case LAYOUT: { - List> layouts = new ArrayList<>(); - for (Layout layout : house.getLayouts()) { - layouts.add(new Duple<>(layout, ItemBuilder.create(layout.getIcon()).name(layout.getName()).description(layout.getDescription()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu(main, "Select a Layout", layouts, player, house, this, (layout) -> { - try { - // Set the field - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, layout.getName()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + layout.getName())); - open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - case MENU: { - List> customMenus = new ArrayList<>(); - for (CustomMenu customMenu : house.getCustomMenus()) { - customMenus.add(new Duple<>(customMenu, ItemBuilder.create(Material.CHEST).name(customMenu.getTitle()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select a Menu", customMenus, player, house, this, (layout) -> { - try { - // Set the field - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, layout.getTitle()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + layout.getTitle())); - open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - case BOOLEAN: { - if (o.field == null) return; - boolean value = o.value instanceof Boolean ? (boolean) o.value : false; - o.setValue(!value); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + !value)); - open(); - break; - } - case ITEM: { - if (o.field == null) return; - new ItemSelectMenu(player, this, (selectedItem) -> { - o.setValue(selectedItem); - if (selectedItem == null) { - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: &cNone")); - open(); - return; - } - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + StackUtils.getDisplayName(selectedItem))); - open(); - }).open(); - break; - } - case NPC: { - if (o.field == null) return; - List> npcs = new ArrayList<>(); - for (HousingNPC npc : house.getNPCs()) { - double distance = npc.getLocation().distance(player.getLocation()); - npcs.add(new Duple<>(npc, ItemBuilder.create(Material.PLAYER_HEAD).name(npc.getName()).info("Distance", Math.toIntExact(Math.round(distance))).info("NPC ID", npc.getInternalID()).lClick(ItemBuilder.ActionType.SELECT_YELLOW))); - } - - npcs.sort(Comparator.comparing(npc -> npc.getFirst().getLocation().distance(player.getLocation()))); - - PaginationMenu paginationMenu = new PaginationMenu<>(main, "Select a NPC", npcs, player, house, this, (npc) -> { - try { - // Set the field - Field field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - field.set(action, npc.getInternalID()); - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: " + npc.getName())); - open(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } - }); - paginationMenu.open(); - break; - } - case HOUSE: { - if (o.field == null) return; - - List> houses = new ArrayList<>(); - HousesManager housesManager = main.getHousesManager(); - List houseIDs = housesManager.getPlayerHouses().get(player.getUniqueId()); - - for (String houseID : houseIDs) { - HouseData h = housesManager.getHouseData(houseID); - if (h == null) continue; - - String hIcon = h.getIcon() == null ? "OAK_DOOR" : h.getIcon(); - ItemStack houseItem; - if (Material.getMaterial(hIcon) != null) { - houseItem = new ItemStack(Material.getMaterial(hIcon)); - } else { - try { - houseItem = Serialization.itemStackFromBase64(hIcon); - } catch (IOException exception) { - houseItem = new ItemStack(Material.OAK_DOOR); - } - } - - ItemBuilder itemBuilder = ItemBuilder - .create(houseItem.getType()) - .name(h.getName()) - .info("ID", h.getHouseID()); - - if (Objects.equals(houseID, house.getHouseUUID().toString())) { - itemBuilder.extraLore(new String[]{"", "§c&oThis house"}); - } else { - itemBuilder.lClick(ItemBuilder.ActionType.SELECT_YELLOW); - } - - houses.add(new Duple<>(h, itemBuilder)); - } - - PaginationMenu paginationMenu = new PaginationMenu<>( - main, - "Select a House", - houses, - player, - house, - this, - (selectedHouse) -> { - // Safety check: make sure player owns the house - // This should never happen in theory - if (!Objects.equals(selectedHouse.getOwnerID(), player.getUniqueId().toString())) { - player.sendMessage(colorize("&cYou aren't the owner of the selected house!")); - return; - } - - if (Objects.equals(selectedHouse.getHouseID(), house.getHouseUUID().toString())) { - player.sendMessage(colorize("&cYou can't send a player to the current house!")); - return; - } - - // Set the field - o.setValue(selectedHouse.getHouseID()); - - player.sendMessage(colorize("&a" + item.getBuilder().getName() + " set to: &r" + selectedHouse.getHouseID())); - - open(); - } - ); - - paginationMenu.open(); + } - break; - } - case ACTION_SETTING: { - try { - new ActionEditMenu((Action) action.getField(item.getVarName()), main, player, house, this).open(); - } catch (NoSuchFieldException | IllegalAccessException | NumberFormatException ex) { - Bukkit.getLogger().warning("Failed to get field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to get field " + item.getVarName() + " in " + action.getName())); - } - break; - } - } + for (int i = 0; i < properties.size(); i++) { + ActionProperty property = properties.get(i); + ItemBuilder builder = property.getDisplayItem(); + int slot = slots[i] - 1; + if (property instanceof CustomSlotProperty customSlotProperty) { + slot = customSlotProperty.getCustomSlot(); + } + addItem(slot, builder.build(), (e) -> { + e.setCancelled(true); + property.runnable(e, house, player, this); }); - - if (update != null) update.run(); } // Add back button @@ -651,28 +224,4 @@ public void setValue(Object value) { }); } } - - public void setEvent(EventType event) { - this.event = event; - } - - public void setHousingNPC(HousingNPC housingNPC) { - this.housingNPC = housingNPC; - } - - public void setUpdate(Runnable update) { - this.update = update; - } - - public Runnable getUpdate() { - return update; - } - - public Action getAction() { - return action; - } - - public void setAction(Action action) { - this.action = action; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEnumMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEnumMenu.java deleted file mode 100644 index 8ed68c2c..00000000 --- a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionEnumMenu.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.al3x.housing2.Menus.Actions; - -import com.al3x.housing2.Action.Action; -import com.al3x.housing2.Action.ActionEditor; -import com.al3x.housing2.Condition.Condition; -import com.al3x.housing2.Enums.EnumMaterial; -import com.al3x.housing2.Enums.EventType; -import com.al3x.housing2.Enums.StatOperation; -import com.al3x.housing2.Instances.HousingNPC; -import com.al3x.housing2.Instances.HousingWorld; -import com.al3x.housing2.Instances.MenuManager; -import com.al3x.housing2.Main; -import com.al3x.housing2.Menus.Menu; -import com.al3x.housing2.Utils.Color; -import com.al3x.housing2.Utils.ItemBuilder; -import com.al3x.housing2.Utils.PaginationList; -import com.al3x.housing2.Utils.StringUtilsKt; -import net.kyori.adventure.bossbar.BossBar; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.boss.BarColor; -import org.bukkit.entity.Player; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import static com.al3x.housing2.Utils.Color.colorize; -import static org.bukkit.Material.*; - -public class ActionEnumMenu extends Menu { - private Main main; - private Action action; - private Condition condition; - private ActionEditor.ActionItem item; - private Player player; - private HousingWorld house; - private HousingNPC housingNPC; - private EventType event; - private Menu backMenu; - - //1 is the new 0 - private int currentPage = 1; - private String search = ""; - - // Events - public ActionEnumMenu(Action action, ActionEditor.ActionItem item, Main main, Player player, HousingWorld house, EventType event, Menu backMenu) { - super(player, "§eSelect Option (" + 1 + "/" + getItems(item, "").getPageCount() + ")", 54); - this.main = main; - this.action = action; - this.item = item; - this.player = player; - this.house = house; - this.event = event; - this.backMenu = backMenu; - } - - // Events conditional - public ActionEnumMenu(Condition condition, ActionEditor.ActionItem item, Main main, Player player, HousingWorld house, EventType event, Menu backMenu) { - super(player, "§eSelect Option (" + 1 + "/" + getItems(item, "").getPageCount() + ")", 54); - this.main = main; - this.condition = condition; - this.item = item; - this.player = player; - this.house = house; - this.event = event; - this.backMenu = backMenu; - } - - private static Material[] STAT_OPERATION_MATERIALS = new Material[]{ - GREEN_STAINED_GLASS, // INCREASE - RED_STAINED_GLASS, // DECREASE - YELLOW_STAINED_GLASS,// SET - ORANGE_STAINED_GLASS, // MULTIPLY - BLUE_STAINED_GLASS, // DIVIDE - MAGENTA_STAINED_GLASS, // MODULUS - WHITE_STAINED_GLASS, // FLOOR - BROWN_STAINED_GLASS, // ROUND - FEATHER, // GET STAT - BOOK, // CONCAT - CHAIN, // INDEX_OF - PAPER, // SET_STRING - BREEZE_ROD, // LENGTH_OF - SPYGLASS, // CHAT_AT - }; - - private static Material[] STRING_OPERATION_MATERIALS = new Material[]{ - GREEN_STAINED_GLASS, // CONCAT - BROWN_STAINED_GLASS, // INDEX_OF - YELLOW_STAINED_GLASS, //SET STRING -// Material.RED_STAINED_GLASS, // REPLACE -// Material.YELLOW_STAINED_GLASS, // SUBSTRING -// Material.ORANGE_STAINED_GLASS, // TO_LOWER -// Material.BLUE_STAINED_GLASS, // TO_UPPER -// Material.MAGENTA_STAINED_GLASS, // TRIM -// Material.WHITE_STAINED_GLASS, // LENGTH -// Material.BOOK, // CHAR_AT -// Material.CHAIN // SPLIT - }; - - @Override - public String getTitle() { - return "§eSelect Option (" + currentPage + "/" + getItems(item, search).getPageCount() + ")"; - } - - @Override - public void initItems() { - clearItems(); - int[] slots = new int[]{11, 12, 13, 14, 15, 16, 17, 20, 21, 22, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35}; - - PaginationList paginationList = getItems(item, search); - List pageItems = paginationList.getPage(currentPage); - - - if (pageItems != null) { - for (int i = 0; i < pageItems.size(); i++) { - ItemBuilder itemBuilder = pageItems.get(i); - if (item.getEnumClass() instanceof Sound[]) { - itemBuilder.rClick(ItemBuilder.ActionType.PLAY_SOUND); - } - int slot = slots[i] - 1; - int finalI = i; - addItem(slot, itemBuilder.build(), (e) -> { - if (e.getCurrentItem() == null) return; - if (!e.getCurrentItem().hasItemMeta()) return; - String name = e.getCurrentItem().getItemMeta().getDisplayName().replace(" ", "_").toUpperCase().replaceAll("§[A-F0-9]", ""); - - if (item.getEnumClass() instanceof Sound[] && e.getClick().isRightClick()) { - player.playSound(player.getLocation(), Sound.valueOf(name), 1, 1); - return; - } - - try { - Field field; - if (action != null) { - field = action.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - if (item.getCustomRunnable() != null) { - if (!item.getCustomRunnable().apply(e, Enum.valueOf(field.getType().asSubclass(Enum.class), name))) return; - } - field.set(action, Enum.valueOf(field.getType().asSubclass(Enum.class), name)); - } else if (condition != null) { - field = condition.getClass().getDeclaredField(item.getVarName()); - field.setAccessible(true); - if (item.getCustomRunnable() != null) { - if (!item.getCustomRunnable().apply(e, Enum.valueOf(field.getType().asSubclass(Enum.class), name))) return; - } - field.set(condition, Enum.valueOf(field.getType().asSubclass(Enum.class), name)); - } - - player.sendMessage(colorize("&aUpdated " + item.getBuilder().getName() + " to " + pageItems.get(finalI).getName())); - if (backMenu != null) { - backMenu.open(); - return; - } - player.sendMessage(colorize("&cError: No back menu found")); - player.closeInventory(); - } catch (NoSuchFieldException | IllegalAccessException ex) { - if (action != null) { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + action.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + action.getName())); - } else { - Bukkit.getLogger().warning("Failed to set field " + item.getVarName() + " in " + condition.getName()); - player.sendMessage(colorize("&cFailed to set field " + item.getBuilder().getName() + " in " + condition.getName())); - } - } - }); - } - } - - if (paginationList.getPageCount() > 1) { - addItem(53, new ItemBuilder().material(ARROW) - .name("&eNext Page") - .description("&ePage " + (currentPage + 1)) - .build(), () -> { - if (currentPage >= paginationList.getPageCount()) return; - currentPage++; - open(); - }); - } - - if (currentPage > 1) { - addItem(45, new ItemBuilder().material(ARROW) - .name("&ePrevious Page") - .description("&ePage " + (currentPage - 1)) - .build(), () -> { - if (currentPage <= 1) return; - currentPage--; - open(); - }); - } - - // Search - addItem(48, new ItemBuilder().material(ANVIL).name("&eSearch").punctuation(false) - .description("&7Search for an option.\n\n&eCurrent Value:\n&7" + search) - .lClick(ItemBuilder.ActionType.CHANGE_YELLOW) - .rClick(ItemBuilder.ActionType.REMOVE_YELLOW) - .build(), (e) -> { - if (e.getClick().isRightClick()) { - search = ""; - currentPage = 1; - Bukkit.getScheduler().runTaskLater(main, this::open, 1L); - return; - } - player.sendMessage(colorize("&ePlease enter the search term:")); - openChat(main, search, (search) -> { - this.search = search; - currentPage = 1; - Bukkit.getScheduler().runTaskLater(main, this::open, 1L); - }); - }); - - addItem(49, new ItemBuilder().material(ARROW).name("&cGo Back") - .description((backMenu != null) ? "&7Back to " + backMenu.getTitle() : "&7Back to previous menu") - .build(), () -> { - // not sure why this wasnt here? (prob bald) si - if (backMenu != null) { - backMenu.open(); - return; - } - player.sendMessage(colorize("&cError: No back menu found")); - player.closeInventory(); - }); - } - - private static PaginationList getItems(ActionEditor.ActionItem item, String search) { - List items = new ArrayList<>(); - Enum[] enumClass = item.getEnumClass(); - - for (int i = 0; i < enumClass.length; i++) { - Enum value = enumClass[i]; - String name = StringUtilsKt.formatCapitalize(value.toString()); - if (item.getEnumMaterial() != null && item.getEnumMaterial() != LEGACY_FEATHER) { - items.add(new ItemBuilder().material(item.getEnumMaterial()).name("&e" + name)); - } else { - //Are there better ways to do this? Probably, do I care? No - if (value instanceof BossBar.Color) - items.add(new ItemBuilder().material(Color.fromColor((BossBar.Color) value)).name("&e" + name)); - - if (value instanceof Material m) { - if (!m.isItem()) continue; - items.add(new ItemBuilder().material((Material) value).name("&e" + name)); - } - - if (value instanceof EnumMaterial enumMaterial) { - items.add(new ItemBuilder().material(enumMaterial.getMaterial()).name("&e" + name)); - } - } - } - - if (item.getEnumMaterial() == LEGACY_FEATHER) { - items.clear(); - for (int i = 0; i < STRING_OPERATION_MATERIALS.length; i++) { - items.add(new ItemBuilder().material(STRING_OPERATION_MATERIALS[i]).name("&e" + StringUtilsKt.formatCapitalize(item.getEnumClass()[9 + i].toString()))); - } - } - - if (search != null) { - items = items.stream().filter(i -> Color.removeColor(i.getName().toLowerCase()).contains(search.toLowerCase())).collect(Collectors.toList()); - } - - return new PaginationList<>(items, 21); - } -} diff --git a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionsMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionsMenu.java index b07aaf6b..82ef8862 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionsMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/Actions/ActionsMenu.java @@ -20,6 +20,8 @@ import com.al3x.housing2.network.payload.clientbound.ClientboundExport; import com.al3x.housing2.network.payload.clientbound.ClientboundImport; import com.al3x.housing2.network.payload.clientbound.ClientboundWebsocket; +import lombok.Getter; +import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -37,13 +39,24 @@ public class ActionsMenu extends Menu { private Main main; private Player player; private HousingWorld house; + @Getter + @Setter private List actions; + @Setter private List conditions; + @Setter private HousingNPC housingNPC; + @Setter private EventType event; + @Setter private Function function; + @Getter + @Setter private Menu backMenu; + @Setter private Runnable update; + @Setter + @Getter private int nestedLevel = 0; //If the player accidentally deletes an action, we can cache it here private Action cachedAction; @@ -51,6 +64,8 @@ public class ActionsMenu extends Menu { private String varName = null; private String search = ""; //1 is the new 0 + @Setter + @Getter private List parentActions = new ArrayList<>(); private int currentPage = 1; @@ -131,14 +146,6 @@ public void addParentAction(Action action) { parentActions.add(action); } - public List getParentActions() { - return parentActions; - } - - public void setParentActions(List parentActions) { - this.parentActions = parentActions; - } - @Override public void open() { if (!house.hasPermission(player, Permissions.EDIT_ACTIONS)) { @@ -211,11 +218,8 @@ public void initItems() { try { Condition condition = conditions.get(i); int slot = allowedSlots[i]; - ItemBuilder item = new ItemBuilder(); - item.description = (condition.inverted ? "&cInverted\n" : "") + item.getDescription(); + ItemBuilder item = condition.createDisplayItem(); item.mClick(ItemBuilder.ActionType.CLONE); - condition.createDisplayItem(item); - replacePlayerWithNPC(item); int finalI = i; addItem(slot, item.build(), (e) -> { if (e.isShiftClick()) { @@ -225,12 +229,12 @@ public void initItems() { } if (e.getClick() == ClickType.MIDDLE) { - this.conditions.add(finalI, condition.clone()); + this.conditions.add(finalI, condition.clone(house)); setupItems(); return; } - if (e.isLeftClick() && condition.editorMenu(house, player, backMenu) != null) { + if (e.isLeftClick() && condition.editorMenu(house, backMenu, player) != null) { ActionEditMenu menu = new ActionEditMenu(condition, main, player, house, this); menu.setEvent(event); menu.setHousingNPC(housingNPC); @@ -303,13 +307,11 @@ public void initItems() { try { Action action = actions.get(i); int slot = allowedSlots[i]; - ItemBuilder item = new ItemBuilder(); + ItemBuilder item = action.createDisplayItem(); item.mClick(ItemBuilder.ActionType.CLONE); if (!Objects.equals(action.getComment(), "") && action.getComment() != null) { item.description(action.getComment()).punctuation(false); } - action.createDisplayItem(item, house); - replacePlayerWithNPC(item); int finalI = i; addItem(slot, item.build(), (e) -> { if (e.isShiftClick()) { @@ -323,7 +325,7 @@ public void initItems() { player.sendMessage(colorize("&cYou have reached the limit for this action!")); return; } - this.actions.add(finalI, action.clone()); + this.actions.add(finalI, action.clone(house)); setupItems(); return; } @@ -341,6 +343,7 @@ public void initItems() { } }); } catch (Exception e) { + e.printStackTrace(); int finalI1 = i; addItem(allowedSlots[i], ItemBuilder.create(Material.BARRIER).name("&cError!").description("An error occurred whilst adding this action!\n\n&cPlease report this to your nearest admin :).").rClick(ItemBuilder.ActionType.REMOVE_YELLOW).build(), () -> { @@ -494,46 +497,6 @@ public void initItems() { }); } - public void setEvent(EventType event) { - this.event = event; - } - - public void setFunction(Function function) { - this.function = function; - } - - public void setActions(List actions) { - this.actions = actions; - } - - public void setConditions(List conditions) { - this.conditions = conditions; - } - - public void setBackMenu(Menu backMenu) { - this.backMenu = backMenu; - } - - public void setHousingNPC(HousingNPC housingNPC) { - this.housingNPC = housingNPC; - } - - public void setUpdate(Runnable update) { - this.update = update; - } - - public int getNestedLevel() { - return nestedLevel; - } - - public void setNestedLevel(int nestedLevel) { - this.nestedLevel = nestedLevel; - } - - public Menu getBackMenu() { - return backMenu; - } - private void replacePlayerWithNPC(ItemBuilder itemBuilder) { if (parentActions.stream().anyMatch(action -> action instanceof RunAsNPCAction)) { itemBuilder.description(itemBuilder.getDescription().replaceAll("(pP)layer", "NPC")); @@ -571,7 +534,4 @@ public void shiftCondition(Condition condition, boolean forward) { setupItems(); } - public List getActions() { - return actions; - } } diff --git a/paper/src/main/java/com/al3x/housing2/Menus/EnumMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/EnumMenu.java index 28eb6cf8..dd7b2a04 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/EnumMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/EnumMenu.java @@ -7,6 +7,7 @@ import com.al3x.housing2.Utils.Color; import com.al3x.housing2.Utils.ItemBuilder; import com.al3x.housing2.Utils.PaginationList; +import com.al3x.housing2.Utils.StringUtilsKt; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -72,8 +73,9 @@ public void initItems() { if (e instanceof EnumMaterial) material = ((EnumMaterial) e).getMaterial(); if (material == null) continue; if (material.equals(Material.AIR)) continue; + String name = e.name().replace("minecraft:", ""); addItem(i, ItemBuilder.create((material)) - .name(colorize("&a" + e.name())) + .name(colorize("&a" + StringUtilsKt.formatCapitalize(name))) .lClick(ItemBuilder.ActionType.SELECT_YELLOW) .build(), () -> { con.accept(e); diff --git a/paper/src/main/java/com/al3x/housing2/Menus/HouseBrowserMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/HouseBrowserMenu.java index 316f9150..93c6b1f9 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/HouseBrowserMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/HouseBrowserMenu.java @@ -7,7 +7,6 @@ import com.al3x.housing2.Utils.*; import net.kyori.adventure.text.Component; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; @@ -92,7 +91,7 @@ public void initItems() { } } - List lore = new ArrayList<>(HypixelLoreFormatter.hypixelLore(house.getDescription(), icon.getInfo(), labels, false, 28)); + List lore = new ArrayList<>(HypixelLoreFormatter.loreSplitter(house.getDescription(), icon.getInfo(), labels, false, 28)); ItemMeta meta = item.getItemMeta(); meta.displayName(StringUtilsKt.housingStringFormatter("§a" + house.getHouseName())); diff --git a/paper/src/main/java/com/al3x/housing2/Menus/ItemEditor/EditItemMainMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/ItemEditor/EditItemMainMenu.java index b035e450..9b9415ae 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/ItemEditor/EditItemMainMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/ItemEditor/EditItemMainMenu.java @@ -28,18 +28,20 @@ import static com.al3x.housing2.Utils.ItemBuilder.ActionType.*; public class EditItemMainMenu extends Menu { + Player player; public EditItemMainMenu(Player player) { super(player, "&7Edit Item", 9 * 6); + this.player = player; } @Override public void initItems() { clearItems(); + HousingWorld house = Main.getInstance().getHousesManager().getHouse(player.getWorld()); - Item customItem = Item.fromItemStack(player.getInventory().getItemInMainHand()); + Item customItem = Item.fromItemStack(player.getInventory().getItemInMainHand(), house); ItemStack item = customItem.getBase(); - HousingWorld house = Main.getInstance().getHousesManager().getHouse(player.getWorld()); addItem(13, item); diff --git a/paper/src/main/java/com/al3x/housing2/Menus/MyHousesMenu.java b/paper/src/main/java/com/al3x/housing2/Menus/MyHousesMenu.java index b01bf2d2..95f90c70 100644 --- a/paper/src/main/java/com/al3x/housing2/Menus/MyHousesMenu.java +++ b/paper/src/main/java/com/al3x/housing2/Menus/MyHousesMenu.java @@ -139,7 +139,7 @@ public void initItems() { - List lore = new ArrayList<>(HypixelLoreFormatter.hypixelLore(house.getDescription(), new ArrayList<>(), new ArrayList<>(), false, 28)); + List lore = new ArrayList<>(HypixelLoreFormatter.loreSplitter(house.getDescription(), new ArrayList<>(), new ArrayList<>(), false, 28)); lore.add(Component.empty()); lore.add(Component.text("§7Created: §a" + formattedDate)); diff --git a/paper/src/main/java/com/al3x/housing2/Migration/MigrationManager.kt b/paper/src/main/java/com/al3x/housing2/Migration/MigrationManager.kt new file mode 100644 index 00000000..e207b5a0 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Migration/MigrationManager.kt @@ -0,0 +1,31 @@ +package com.al3x.housing2.Migration + +import java.io.File + +fun main(lines: String): String { + val lines = lines.lines() + val lookFor = OldActionType.entries.map { it.actionName } + val convertTo = NewActionType.entries.map { it.name } + val newLines = mutableListOf() + for (line in lines) { + var newLine = line + for ((i, look) in lookFor.withIndex()) { + if (line.contains(look)) { + newLine = line.replace(look, convertTo[i]) + println("Old: $line") + println("New: $newLine") + println() + } + } + + if (newLine.contains("\"data\": {")) { + newLine = newLine.replace("\"data\": {", "\"properties\": {") + println("Old: $line") + println("New: $newLine") + } + + newLines.add(newLine) + } + + return newLines.joinToString("\n") +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Migration/NewActionType.kt b/paper/src/main/java/com/al3x/housing2/Migration/NewActionType.kt new file mode 100644 index 00000000..31e0ad7e --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Migration/NewActionType.kt @@ -0,0 +1,70 @@ +enum class NewActionType { + CONDITIONAL, + CANCEL, + CHANGE_PLAYER_GROUP, + CHANGE_PLAYER_TEAM, + KILL_PLAYER, + KILL_NPC, + FULL_HEAL, + SET_VELOCITY, + SEND_TITLE, + ACTIONBAR, + RESET_INVENTORY, + CHANGE_MAX_HEALTH, + GIVE_ITEM, + REMOVE_ITEM, + CHAT, + APPLY_POTION, + CLEAR_POTION, + PLAYER_STAT, + NPC_STAT, + GLOBAL_STAT, + TELEPORT, + CLEAR_ENDERCHEST, + PLAY_SOUND, + STOP_SOUND, + SET_GAMEMODE, + CHANGE_HEALTH, + CHANGE_HUNGER, + RANDOM_ACTION, + FUNCTION, + APPLY_INVENTORY_LAYOUT, + PAUSE_EXECUTION, + SHOW_BOSSBAR, + SET_HITDELAY, + LAUNCH_PROJECTILE, + PARTICLE, + CHANGE_NPC_NAVIGATION, + CHANGE_PLAYER_DISPLAYNAME, + CHANGE_PLAYER_NAMETAG, + REPEAT, + CLEAR_BOSSBAR, + CLEAR_PLAYERSTATS, + CLEAR_GLOBALSTATS, + EXIT, + BREAK, + CONTINUE, + DISPLAY_MENU, + CLOSE_MENU, + EXPLOSION, + START_HOUSE_MUSIC, + STOP_HOUSE_MUSIC, + CHANGE_PLAYER_ATTRIBUTE, + CHANGE_NPC_ATTRIBUTE, + CHANGE_TIME, + ATTACK_ENTITY, + DROP_ITEM, + RUN_AS_NPC, + HIDE_NPC, + SHOW_NPC, + SWIM_CRAWL, + TOGGLE_SIT, + SEND_TO_HOUSE, + SET_VOICE_GROUP, + EDIT_VOICE_GROUP, + EDIT_VISIBILITY, + EDIT_AUDIBILITY, + PROTOOLS_ACTION, + SPAWN_GHOST_BLOCK, + SET_PLAYER_SLOT +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Migration/OldActionType.kt b/paper/src/main/java/com/al3x/housing2/Migration/OldActionType.kt new file mode 100644 index 00000000..97ad9c59 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Migration/OldActionType.kt @@ -0,0 +1,70 @@ +enum class OldActionType(val actionName: String) { + CONDITIONAL("Conditional Action"), + CANCEL("Cancel Action"), + CHANGE_PLAYER_GROUP("Change Player Group"), + CHANGE_PLAYER_TEAM("Change Player Team"), + KILL_PLAYER("Kill Player Action"), + KILL_NPC("Kill NPC Action"), + FULL_HEAL("Full Heal Action"), + SET_VELOCITY("Set Velocity Action"), + SEND_TITLE("Send Title Action"), + ACTIONBAR("Actionbar Action"), + RESET_INVENTORY("Reset Inventory Action"), + CHANGE_MAX_HEALTH("Change Max Health Action"), + GIVE_ITEM("Give Item Action"), + REMOVE_ITEM("Remove Item Action"), + CHAT("Chat Action"), + APPLY_POTION("Apply Potion Effect Action"), + CLEAR_POTION("Clear Potion Effect Action"), + PLAYER_STAT("Player Stat Action"), + NPC_STAT("NPC Stat Action"), + GLOBAL_STAT("Global Stat Action"), + TELEPORT("Teleport Action"), + CLEAR_ENDERCHEST("Clear Enderchest Action"), + PLAY_SOUND("Play Sound Action"), + STOP_SOUND("Stop Sound Action"), + SET_GAMEMODE("Set Gamemode Action"), + CHANGE_HEALTH("Change Health Action"), + CHANGE_HUNGER("Change Hunger Action"), + RANDOM_ACTION("Random Action"), + FUNCTION("Function Action"), + APPLY_INVENTORY_LAYOUT("Apply Inventory Layout Action"), + PAUSE_EXECUTION("Pause Action"), + SHOW_BOSSBAR("Show Bossbar Action"), + SET_HITDELAY("Set Hit Delay Action"), + LAUNCH_PROJECTILE("Launch Projectile Action"), + PARTICLE("Particle Action"), + CHANGE_NPC_NAVIGATION("Change Npc Navigation Action"), + CHANGE_PLAYER_DISPLAYNAME("Change Player Display Name Action"), + CHANGE_NAMETAG("NameTag Action"), + REPEAT("Repeat Action"), + CLEAR_BOSSBAR("Clear Bossbars Action"), + CLEAR_PLAYERSTATS("Clear Player Stats Action"), + CLEAR_GLOBALSTATS("Clear Global Stats Action"), + EXIT("Exit Action"), + BREAK("Break Action"), + CONTINUE("Continue Action"), + DISPLAY_MENU("Display Menu Action"), + CLOSE_MENU("Close Menu Action"), + EXPLOSION("Explosion Action"), + START_HOUSE_MUSIC("Start House Music Action"), + STOP_HOUSE_MUSIC("Stop House Music Action"), + CHANGE_PLAYER_ATTRIBUTE("Change Player Attribute Action"), + CHANGE_NPC_ATTRIBUTE("Change NPC Attribute Action"), + CHANGE_TIME("Change Time Action"), + ATTACK_ENTITY("Attack Entity Action"), + DROP_ITEM("Drop Item Action"), + RUN_AS_NPC("Run As NPC Action"), + HIDE_NPC("Hide NPC Action"), + SHOW_NPC("Show NPC Action"), + SWIM_CRAWL("Swim/Crawl Action"), + TOGGLE_SIT("Toggle Sit Action"), + SEND_TO_HOUSE("Send to House Action"), + SET_VOICE_GROUP("Set Voice Group Action"), + EDIT_VOICE_GROUP("Edit Voice Group Action"), + EDIT_VISIBILITY("Edit Visibility Action"), + EDIT_AUDIBILITY("Edit Audibility Action"), + PROTOOLS_ACTION("Protools Action"), + SPAWN_GHOST_BLOCK("Spawn Ghost Block"), + SET_PLAYER_SLOT("Set Player Slot Action"); +} \ No newline at end of file diff --git a/paper/src/main/java/com/al3x/housing2/Network/PlayerNetworkListener.java b/paper/src/main/java/com/al3x/housing2/Network/PlayerNetworkListener.java index 4c6fe2a9..3c9f547f 100644 --- a/paper/src/main/java/com/al3x/housing2/Network/PlayerNetworkListener.java +++ b/paper/src/main/java/com/al3x/housing2/Network/PlayerNetworkListener.java @@ -3,6 +3,7 @@ import com.al3x.housing2.Action.Action; import com.al3x.housing2.Action.HTSLImpl; import com.al3x.housing2.Instances.HTSLHandler; +import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Instances.MenuManager; import com.al3x.housing2.Main; import com.al3x.housing2.Menus.Actions.ActionsMenu; @@ -34,7 +35,9 @@ public final class PlayerNetworkListener implements PlaygroundServerboundMessage @Override public void handleImport(@NotNull ServerboundImport message) { try { - List action = HTSLHandler.importActions(message.getHtslContent(), ""); + HousingWorld house = Main.getInstance().getHousesManager().getHouse(player.getPlayer().getWorld()); + if (house == null) return; + List action = HTSLHandler.importActions(message.getHtslContent(), "", house); Menu menu = MenuManager.getPlayerMenu(player.getPlayer()); if (menu instanceof ActionsMenu actionsMenu) { actionsMenu.getActions().clear(); @@ -83,7 +86,9 @@ public void handleWebsocket(ServerboundWebsocket serverboundWebsocket) { return; } try { - List action = HTSLHandler.importActions(serverboundWebsocket.getHtslContent(), ""); + HousingWorld house = Main.getInstance().getHousesManager().getHouse(player.getPlayer().getWorld()); + if (house == null) return; + List action = HTSLHandler.importActions(serverboundWebsocket.getHtslContent(), "", house); ActionsMenu actionsMenu = player.getActionsMenu(serverboundWebsocket.getPort()); actionsMenu.getActions().clear(); //This will update the actions internally actionsMenu.getActions().addAll(action); diff --git a/paper/src/main/java/com/al3x/housing2/Placeholders/custom/placeholders/Misc.java b/paper/src/main/java/com/al3x/housing2/Placeholders/custom/placeholders/Misc.java index ace8efde..75bb9a2e 100644 --- a/paper/src/main/java/com/al3x/housing2/Placeholders/custom/placeholders/Misc.java +++ b/paper/src/main/java/com/al3x/housing2/Placeholders/custom/placeholders/Misc.java @@ -1,5 +1,6 @@ package com.al3x.housing2.Placeholders.custom.placeholders; +import com.al3x.housing2.Action.Properties.ArgumentsProperty; import com.al3x.housing2.Instances.Function; import com.al3x.housing2.Instances.HousingWorld; import com.al3x.housing2.Placeholders.custom.Placeholder; @@ -94,11 +95,15 @@ public String handlePlaceholder(String input, HousingWorld house, Player player) } String arg1 = StringUtilsKt.substringAfter(input, "/"); arg1 = Placeholder.handlePlaceholders(arg1, house, player, true); - HashMap args = Function.functionArguments.get(player.getUniqueId()); + List args = Function.functionArguments.get(player.getUniqueId()); if (args == null) { return "null"; } - String arg = args.getOrDefault(arg1, "null"); + String finalArg = arg1; + String arg = args.stream().filter((argument) -> argument.getName().equals(finalArg)) + .map(ArgumentsProperty.Argument::getValue) + .findFirst() + .orElse("null"); arg = Placeholder.handlePlaceholders(arg, house, player, false); return arg; } diff --git a/paper/src/main/java/com/al3x/housing2/Tests/ActionSaveTest.java b/paper/src/main/java/com/al3x/housing2/Tests/ActionSaveTest.java index 61ef8341..17e2e2a5 100644 --- a/paper/src/main/java/com/al3x/housing2/Tests/ActionSaveTest.java +++ b/paper/src/main/java/com/al3x/housing2/Tests/ActionSaveTest.java @@ -24,58 +24,58 @@ public class ActionSaveTest extends Test { @Override public void execute(Player player, int index, int size, List results) { - player.sendMessage("§aRunning test \"ActionSaveTest\" (" + index + "/" + size + ")"); - try { - HousingWorld world = new HousingWorld(Main.getInstance(), player, HouseSize.XLARGE); - Function func = world.createFunction("test"); - world.createNPC(player, world.getSpawn()); - - - ActionEnum[] actions = ActionEnum.values(); - ConditionEnum[] conditions = ConditionEnum.values(); - - // Create a list of all actions and conditions aswell as have each action that can have subactions have all actions as subactions - ArrayList actionList = Arrays.stream(actions).map(ActionEnum::getActionInstance).collect(Collectors.toCollection(ArrayList::new)); - ArrayList conditionList = Arrays.stream(conditions).map(ConditionEnum::getConditionInstance).collect(Collectors.toCollection(ArrayList::new)); - ArrayList usedActions = new ArrayList<>(actionList); - for (Action action : usedActions) { - if (action instanceof ConditionalAction conditionalAction) { - conditionalAction.setIfActions(new ArrayList<>(actionList)); - conditionalAction.setElseActions(new ArrayList<>(actionList)); -// conditionalAction.setConditions(new ArrayList<>(conditionList)); - } - if (action instanceof RepeatAction repeatAction) { - repeatAction.setSubActions(new ArrayList<>(actionList)); - } - if (action instanceof FunctionAction functionAction) { - functionAction.setFunction("test"); - } - if (action instanceof RandomAction randomAction) { - randomAction.setSubActions(new ArrayList<>(actionList)); - } - } - - func.setActions(new ArrayList<>(usedActions)); - for (EventType eventType : EventType.values()) { - if (!eventType.name().startsWith("NPC")) world.setEventActions(eventType, new ArrayList<>(usedActions)); - } - - world.createNPC(player, player.getLocation()); - HousingNPC npc = world.getNPCs().getFirst(); - npc.getActions().addAll(usedActions); - for (EventType eventType : EventType.values()) { - if (eventType.name().startsWith("NPC")) npc.getActions(eventType).addAll(usedActions); - } - - world.save(); - - world.delete(); - - results.add(true); - player.sendMessage("§aTest passed successfully"); - } catch (Exception e) { - results.add(false); - player.sendMessage("§cTest failed: " + e.getMessage()); - } +// player.sendMessage("§aRunning test \"ActionSaveTest\" (" + index + "/" + size + ")"); +// try { +// HousingWorld world = new HousingWorld(Main.getInstance(), player, HouseSize.XLARGE); +// Function func = world.createFunction("test"); +// world.createNPC(player, world.getSpawn()); +// +// +// ActionEnum[] actions = ActionEnum.values(); +// ConditionEnum[] conditions = ConditionEnum.values(); +// +// // Create a list of all actions and conditions aswell as have each action that can have subactions have all actions as subactions +// ArrayList actionList = Arrays.stream(actions).map(ActionEnum::getActionInstance).collect(Collectors.toCollection(ArrayList::new)); +// ArrayList conditionList = Arrays.stream(conditions).map(ConditionEnum::getConditionInstance).collect(Collectors.toCollection(ArrayList::new)); +// ArrayList usedActions = new ArrayList<>(actionList); +// for (Action action : usedActions) { +// if (action instanceof ConditionalAction conditionalAction) { +// conditionalAction.setIfActions(new ArrayList<>(actionList)); +// conditionalAction.setElseActions(new ArrayList<>(actionList)); +//// conditionalAction.setConditions(new ArrayList<>(conditionList)); +// } +// if (action instanceof RepeatAction repeatAction) { +// repeatAction.setSubActions(new ArrayList<>(actionList)); +// } +// if (action instanceof FunctionAction functionAction) { +// functionAction.setFunction("test"); +// } +// if (action instanceof RandomAction randomAction) { +// randomAction.setSubActions(new ArrayList<>(actionList)); +// } +// } +// +// func.setActions(new ArrayList<>(usedActions)); +// for (EventType eventType : EventType.values()) { +// if (!eventType.name().startsWith("NPC")) world.setEventActions(eventType, new ArrayList<>(usedActions)); +// } +// +// world.createNPC(player, player.getLocation()); +// HousingNPC npc = world.getNPCs().getFirst(); +// npc.getActions().addAll(usedActions); +// for (EventType eventType : EventType.values()) { +// if (eventType.name().startsWith("NPC")) npc.getActions(eventType).addAll(usedActions); +// } +// +// world.save(); +// +// world.delete(); +// +// results.add(true); +// player.sendMessage("§aTest passed successfully"); +// } catch (Exception e) { +// results.add(false); +// player.sendMessage("§cTest failed: " + e.getMessage()); +// } } } diff --git a/paper/src/main/java/com/al3x/housing2/Utils/HypixelLoreFormatter.java b/paper/src/main/java/com/al3x/housing2/Utils/HypixelLoreFormatter.java index c75d5930..ce8143cc 100644 --- a/paper/src/main/java/com/al3x/housing2/Utils/HypixelLoreFormatter.java +++ b/paper/src/main/java/com/al3x/housing2/Utils/HypixelLoreFormatter.java @@ -2,23 +2,18 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; -import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Bukkit; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; //Thanks IxNoah and ChatGippity public class HypixelLoreFormatter { private static final Pattern HYPX_LORE_PUNCTUATION = Pattern.compile("(.*)[!.?]"); - private static final int MAX_LENGTH = 28; + public static final int MAX_LENGTH = 28; public static final int LINE_LENGTH = 28; private static final Style nullStyle = Style.style() @@ -83,7 +78,7 @@ private static List unstackComponents(TextComponent root) { return orphanedComponents; } - public static List hypixelLore(String root, List> info, List labels, boolean punctuation, int maxLength) { + public static List loreSplitter(String root, List> info, List labels, boolean punctuation, int maxLength) { List lines = new ArrayList<>(); if (root != null && !root.isEmpty()) { diff --git a/paper/src/main/java/com/al3x/housing2/Utils/ItemBuilder.java b/paper/src/main/java/com/al3x/housing2/Utils/ItemBuilder.java index 7ba95d98..a8cfb4c7 100644 --- a/paper/src/main/java/com/al3x/housing2/Utils/ItemBuilder.java +++ b/paper/src/main/java/com/al3x/housing2/Utils/ItemBuilder.java @@ -1,7 +1,9 @@ package com.al3x.housing2.Utils; import com.al3x.housing2.Main; +import lombok.Getter; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -13,6 +15,8 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionType; import java.util.ArrayList; import java.util.Arrays; @@ -20,8 +24,10 @@ import java.util.List; import static com.al3x.housing2.Utils.Color.colorize; -import static org.bukkit.ChatColor.*; - +import static com.al3x.housing2.Utils.HypixelLoreFormatter.loreSplitter; +import static com.al3x.housing2.Utils.HypixelLoreFormatter.splitComponent; +import static com.al3x.housing2.Utils.StringUtilsKt.housingStringFormatter; +import static org.bukkit.ChatColor.YELLOW; /** * ItemBuilder class for creating ItemStack objects with customizable properties such as name, description, actions, @@ -40,6 +46,7 @@ * return builder.build(); * */ +@Getter public class ItemBuilder { private ItemStack stack; private Material material; @@ -49,13 +56,14 @@ public class ItemBuilder { private String name; public String description; private List extraLore; - private HashMap actions; + private final HashMap actions; //Key: String, Value: Object (String, Int or Double) - private List> info; + private final List> info; private boolean glow; private boolean changeOrderLore; private boolean punctuation; private int textWidth; + private PotionType potionType; public ItemBuilder() { this.material = Material.AIR; @@ -65,10 +73,13 @@ public ItemBuilder() { this.description = ""; this.actions = new HashMap<>(); this.info = new ArrayList<>(); + this.extraLore = new ArrayList<>(); this.glow = false; this.changeOrderLore = false; this.punctuation = true; this.textWidth = 28; + this.skullTexture = null; + this.potionType = null; } public ItemBuilder material(Material material) { @@ -246,6 +257,11 @@ public ItemBuilder textWidth(int textWidth) { return this; } + public ItemBuilder potionType(PotionType potionType) { + this.potionType = potionType; + return this; + } + public ItemStack build() { //Make the skull or item stack if (skullTexture != null) { @@ -254,6 +270,12 @@ public ItemStack build() { stack = new ItemStack(material, amount); } + if (potionType != null && material == Material.POTION) { + PotionMeta potionMeta = (PotionMeta) stack.getItemMeta(); + potionMeta.setBasePotionType(potionType); + stack.setItemMeta(potionMeta); + } + ItemMeta itemMeta = stack.getItemMeta(); if (itemMeta == null) { // ItemMeta is null for AIR @@ -261,10 +283,10 @@ public ItemStack build() { } //Set the item name and lore - itemMeta.displayName(StringUtilsKt.housingStringFormatter(name)); + itemMeta.displayName(housingStringFormatter(name)); itemMeta.lore(getLore()); - // Hide all item flags cause they are annoying and useless + // Hide all item flags because they are annoying and useless itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_DESTROYS, ItemFlag.HIDE_PLACED_ON, ItemFlag.HIDE_ADDITIONAL_TOOLTIP); itemMeta.addAttributeModifier(Attribute.ATTACK_DAMAGE, new AttributeModifier(new NamespacedKey(Main.getInstance(), "dummy"), 0, AttributeModifier.Operation.ADD_NUMBER)); // needed to correctly hide attributes @@ -295,7 +317,7 @@ private List getLore() { } } //Lore formatting - List lore = HypixelLoreFormatter.hypixelLore(description, info, labels, punctuation, textWidth); + List lore = loreSplitter(description, info, labels, punctuation, textWidth); //Action menu label if (changeOrderLore) { @@ -304,7 +326,9 @@ private List getLore() { //Extra lore if (extraLore != null) { - lore.addAll(extraLore.stream().map(StringUtilsKt::housingStringFormatter).toList()); + lore.addAll(extraLore.stream() + .flatMap(str -> splitComponent(housingStringFormatter("" + str), HypixelLoreFormatter.MAX_LENGTH).stream()) + .toList()); } return new ArrayList<>(lore); @@ -314,53 +338,27 @@ public static ItemBuilder create(Material material) { return new ItemBuilder().material(material); } - public ItemStack getStack() { - return stack; - } - - public Material getMaterial() { - return material; - } - - public int getAmount() { - return amount; - } - - public short getData() { - return data; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public List getExtraLore() { - return extraLore; - } - - public HashMap getActions() { - return actions; - } - - public List> getInfo() { - return info; - } - - public boolean isGlow() { - return glow; - } - - public boolean isChangeOrderLore() { - return changeOrderLore; + public ItemBuilder clone() { + ItemBuilder clone = new ItemBuilder(); + clone.material = this.material; + clone.skullTexture = this.skullTexture; + clone.amount = this.amount; + clone.data = this.data; + clone.name = this.name; + clone.description = this.description; + clone.extraLore = new ArrayList<>(this.extraLore == null ? new ArrayList<>() : this.extraLore); + clone.actions.putAll(this.actions); + clone.info.addAll(this.info); + clone.glow = this.glow; + clone.changeOrderLore = this.changeOrderLore; + clone.punctuation = this.punctuation; + return clone; } /** * Enum representing different types of actions with associated colors. */ + @Getter public static enum ActionType { EDIT_YELLOW("edit", YELLOW), VIEW_YELLOW("view", YELLOW), @@ -391,6 +389,7 @@ public static enum ActionType { EDIT_LEFT_CLICK_ACTIONS("edit left click actions", YELLOW), EDIT_RIGHT_CLICK_ACTIONS("edit right click actions", YELLOW), CYCLE_FORWARD("cycle forward", YELLOW), + EDIT_KEY("edit key", YELLOW), CYCLE_BACKWARD("cycle backwards", YELLOW), SAVE_LOCATION("save location", YELLOW), TOGGLE_VISIBILITY("toggle visibility", YELLOW), @@ -400,8 +399,8 @@ public static enum ActionType { USE_SELECTION("use selection", YELLOW), ; - private String action; - private ChatColor color; + private final String action; + private final ChatColor color; ActionType(String action, ChatColor color) { this.action = action; @@ -412,12 +411,5 @@ public String toString() { return action; } - public ChatColor getColor() { - return color; - } - - public String getAction() { - return action; - } } } diff --git a/paper/src/main/java/com/al3x/housing2/Utils/Returnable.java b/paper/src/main/java/com/al3x/housing2/Utils/Returnable.java new file mode 100644 index 00000000..29a9d1e3 --- /dev/null +++ b/paper/src/main/java/com/al3x/housing2/Utils/Returnable.java @@ -0,0 +1,5 @@ +package com.al3x.housing2.Utils; + +public interface Returnable { + V apply(); +} diff --git a/paper/src/main/java/com/al3x/housing2/Utils/StringToBase64.java b/paper/src/main/java/com/al3x/housing2/Utils/StringToBase64.java index 91ca207d..a4ef20e6 100644 --- a/paper/src/main/java/com/al3x/housing2/Utils/StringToBase64.java +++ b/paper/src/main/java/com/al3x/housing2/Utils/StringToBase64.java @@ -2,6 +2,7 @@ import com.al3x.housing2.Action.Action; import com.al3x.housing2.Data.ActionData; +import com.al3x.housing2.Instances.HousingWorld; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -31,7 +32,32 @@ public static String actionsToBase64(List action) { } } - public static ArrayList actionsFromBase64(String data) { + public static String decodeBase64(String data) { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(data)); + BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); + String item; + item = (String) dataInput.readObject(); + + dataInput.close(); + return item; + } catch (Exception e) { + + } + return null; + } + + public static ArrayList fromJson(String json, HousingWorld house) { + JsonArray jsonArray = gson.fromJson(json, JsonArray.class); + ArrayList actions = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); + actions.add(gson.fromJson(jsonObject, ActionData.class)); + } + return new ArrayList<>(ActionData.toList(actions, house)); + } + + public static ArrayList actionsFromBase64(String data, HousingWorld house) { try { ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(data)); BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); @@ -46,20 +72,20 @@ public static ArrayList actionsFromBase64(String data) { JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); actions.add(gson.fromJson(jsonObject, ActionData.class)); } - return new ArrayList<>(ActionData.toList(actions)); + return new ArrayList<>(ActionData.toList(actions, house)); } catch (Exception e) { throw new IllegalStateException("Unable to load action.", e); } } - public static Action actionFromBase64(String data) { + public static Action actionFromBase64(String data, HousingWorld house) { try { ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64.getDecoder().decode(data)); BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); String item; item = (String) dataInput.readObject(); dataInput.close(); - return ActionData.fromData(gson.fromJson(item, ActionData.class)); + return ActionData.fromData(gson.fromJson(item, ActionData.class), house); } catch (Exception e) { throw new IllegalStateException("Unable to load action.", e); }