From e64b563190629b1fc74816f6aa196d5ba06140e5 Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 8 Dec 2025 17:19:06 -0300 Subject: [PATCH 01/45] Refactored policy system, fixed config file parsing inconsistencies. - LocationPolicy is now an extension of Policy - Policy.parse() is now PolicyParser mapped in PolicyParsers. - NodeValueParser was merged with DataShifter - More code small changes to enable the project to work with this new configuration. --- README.md | 34 ++- build.gradle | 2 +- settings.gradle | 2 +- .../github/adrianvic/nemesiseye/Config.java | 24 +- .../adrianvic/nemesiseye/DataShifter.java | 38 +++ .../adrianvic/nemesiseye/Validator.java | 25 +- .../commands/sub/CurrentPolicies.java | 6 +- .../nemesiseye/commands/sub/ListPolicies.java | 4 +- .../nemesiseye/commands/sub/PolicyInfo.java | 15 +- .../nemesiseye/policy/LocationPolicy.java | 65 ----- .../nemesiseye/policy/NodeValueParser.java | 28 -- .../adrianvic/nemesiseye/policy/Policy.java | 13 + .../nemesiseye/policy/PolicyParser.java | 7 + .../nemesiseye/policy/PolicyParsers.java | 18 ++ .../policy/handlers/attackWith.java | 3 +- .../policy/handlers/useEnchantment.java | 3 +- .../nemesiseye/policy/handlers/useItem.java | 3 +- .../policy/parser/LocationPolicyParser.java | 68 +++++ .../policy/policies/LocationPolicy.java | 10 + .../{ => policies}/PermissionPolicy.java | 3 +- .../{ => policies}/PlayerNamePolicy.java | 4 +- src/main/resources/plugin.yml | 2 +- src/main/resources/settings.yml | 239 +++++++++--------- 23 files changed, 358 insertions(+), 258 deletions(-) delete mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/LocationPolicy.java delete mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/NodeValueParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java rename src/main/java/io/github/adrianvic/nemesiseye/policy/{ => policies}/PermissionPolicy.java (62%) rename src/main/java/io/github/adrianvic/nemesiseye/policy/{ => policies}/PlayerNamePolicy.java (55%) diff --git a/README.md b/README.md index c4aceff..b213dd4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,34 @@ # Eye of Nemesis -Eye of Nemesis is a Minecraft Paper plugin that allows server admins to write *policies* that will deny or allow (black/whitelist) players to do specific things. +Eye of Nemesis is a plugin that allows server admins to write [policies](#Policies) that will deny or allow (black/whitelist) players to do specific things based on the value of [nodes](#Nodes). -You can create policies based on player location, ~but other types of policies are available, like permission and player-name policy.~ (WIP) +## Warnings +- Even though running `/eye` will tell you to run `/eye help` to list all available commands, this is not implemented yet, however all commands are available as tab-complete of `/eye`. +- This plugin is in a very early stage. + +## Policies +Policy is a structure that holds nodes and tell them _where_ to act. For example, a Location policy will tell its child nodes that they work from coordinates `x1 y1 z1` to `x2 y2 z2`. + +Currently, the only policy type is Location. + +## Nodes +Nodes are specific rules that rely on it's value to know _when_ to act. For example, a useItem policy with value `cookie` will prevent users from doing anything with a cookie. + +### `useItem` +**Triggered:** breaking/placing/interacting with anything using this item. + +**Expects:** list of strings. + +### `useEnchantment` +**Triggered:** breaking/placing/interacting with anything using an item with the specified enchantment, **will allow items without enchantment even on allowlist mode**. + +**Expects:** map of _string: string_. + +### `attackWith` +**Triggered:** attacking with this item in hand. + +**Expects:** list of strings. + +## Performance +This plugin is not scalable as it is and will run unoptimized checks when your players do certain things in the server if you have policies enabled, I made it for a server with a few friends. + +For every policy there's a check, for every matching policy there are its child nodes, each one introducing new checks. Keep that in mind. \ No newline at end of file diff --git a/build.gradle b/build.gradle index a155746..ca8860c 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'io.github.adrianvic' -version = '1.0.1-SNAPSHOT' +version = '1.0.2-SNAPSHOT' repositories { mavenCentral() diff --git a/settings.gradle b/settings.gradle index 52b1811..9a6526e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -rootProject.name = 'regions' +rootProject.name = 'eyeofnemesis' diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Config.java b/src/main/java/io/github/adrianvic/nemesiseye/Config.java index faca9d8..56812df 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Config.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Config.java @@ -1,19 +1,21 @@ package io.github.adrianvic.nemesiseye; -import io.github.adrianvic.nemesiseye.policy.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyParser; +import io.github.adrianvic.nemesiseye.policy.PolicyParsers; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; +import java.util.ArrayList; import java.util.List; +import java.util.Map; public class Config { private final static Config instance = new Config(); private File file; private YamlConfiguration config; - private List locationPolicies; -// private List permissionPolicies; -// private List playerNamePolicies; + private List policies = new ArrayList<>(); private Config() { } @@ -33,7 +35,15 @@ public class Config { e.printStackTrace(); } - locationPolicies = LocationPolicy.parseLocationPolicy(config.getMapList("Policies.Location")); + List> rawPolicies = config.getMapList("Policies"); + for (Map map : rawPolicies) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { + List parsed = PolicyParsers.get(k).parse(v); + policies.addAll(parsed); + } + } + } } public void save() { @@ -49,8 +59,8 @@ public class Config { save(); } - public List getLocationPolicies() { - return locationPolicies; + public List getPolicies() { + return policies; } public static Config getInstance() { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java index a9712d0..026d6c5 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java @@ -1,5 +1,9 @@ package io.github.adrianvic.nemesiseye; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Pattern; public class DataShifter { @@ -8,4 +12,38 @@ public class DataShifter { Pattern pattern = Pattern.compile(cleanPattern, Pattern.CASE_INSENSITIVE); return pattern.matcher(against).matches(); } + + public static List parseValueToStringList(List values) { + List result = new ArrayList<>(); + for (Object o : values) { + if (o instanceof String) result.add((String) o); + } + return result; + } + + public static Map parseValueToStringMap(List values) { + Map result = new HashMap<>(); + + for (Object o : values) { + if (o instanceof Map raw) { + for (Map.Entry e : raw.entrySet()) { + if (e.getKey() instanceof String k && e.getValue() instanceof String v) { + result.put(k, v); + } + } + } + } + return result; + } + + public static List> parseValueToListOfMaps(List values) { + List> result = new ArrayList<>(); + + for (Object o : values) { + if (o instanceof Map raw) { + result.add(raw); + } + } + return result; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java index 7b6af1b..b598b08 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java @@ -1,7 +1,8 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Action; -import io.github.adrianvic.nemesiseye.policy.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; import org.bukkit.util.BoundingBox; @@ -38,22 +39,24 @@ public class Validator { return node.isWhitelist() != allowed; } - public static List getNodesForPolicies(List policies) { + public static List getNodesForPolicies(List policies) { List nodes = new ArrayList<>(); - for (LocationPolicy p : policies) { + for (Policy p : policies) { nodes.addAll(p.nodes()); } return nodes; } - public static List getPoliciesForEntity(HumanEntity entity) { - List lps = Config.getInstance().getLocationPolicies(); - List applyingLPS = new ArrayList<>(); - for (LocationPolicy lp : lps) { - for (ArrayList boxes : lp.locations()) { - for (BoundingBox box : boxes) { - if (box.contains(entity.getLocation().toVector())) { - applyingLPS.add(lp); + public static List getPoliciesForEntity(HumanEntity entity) { + List ps = Config.getInstance().getPolicies(); + List applyingLPS = new ArrayList<>(); + for (Policy p : ps) { + if (p instanceof LocationPolicy lp) { + for (ArrayList boxes : lp.locations()) { + for (BoundingBox box : boxes) { + if (box.contains(entity.getLocation().toVector())) { + applyingLPS.add(lp); + } } } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java index 764419e..09fa798 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java @@ -1,7 +1,7 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Validator; -import io.github.adrianvic.nemesiseye.policy.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.Policy; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; @@ -16,9 +16,9 @@ public class CurrentPolicies implements Subcommand { @Override public boolean execute(CommandSender commandSender, String[] args) { - List policies = Validator.getPoliciesForEntity((HumanEntity) commandSender); + List policies = Validator.getPoliciesForEntity((HumanEntity) commandSender); List pstrings = new ArrayList<>(); - for (LocationPolicy p : policies) { + for (Policy p : policies) { pstrings.add(" %s (%s nodes)".formatted(p.name(), p.nodes().size())); } if (pstrings.isEmpty()) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java index ea9a2f5..cb866a1 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java @@ -1,7 +1,7 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Config; -import io.github.adrianvic.nemesiseye.policy.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.Policy; import org.bukkit.command.CommandSender; import java.util.ArrayList; @@ -17,7 +17,7 @@ public class ListPolicies implements Subcommand { @Override public boolean execute(CommandSender commandSender, String[] args) { List rstr = new ArrayList<>(); - for (LocationPolicy p : Config.getInstance().getLocationPolicies()) { + for (Policy p : Config.getInstance().getPolicies()) { rstr.add(p.name()); } commandSender.sendMessage(String.join(", ", rstr) + "."); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index ad969ea..178361f 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -1,7 +1,7 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Config; -import io.github.adrianvic.nemesiseye.policy.LocationPolicy; +import io.github.adrianvic.nemesiseye.policy.Policy; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -16,18 +16,15 @@ public class PolicyInfo implements Subcommand { @Override public boolean execute(CommandSender commandSender, String[] strings) { - List policies = Config.getInstance().getLocationPolicies(); - for (LocationPolicy lp : policies) { - if (lp.name().equals(strings[0])) { - String locations = lp.locations().toString(); - + List policies = Config.getInstance().getPolicies(); + for (Policy policy : policies) { + if (policy.name().equals(strings[0])) { commandSender.sendMessage(String.format(""" Showing info for policy "%s%s%s": Type: %s - Locations: %s Nodes: %s %s - """, ChatColor.UNDERLINE, lp.name(), ChatColor.RESET, "location", locations, lp.nodes().size(), lp.allowlist() ? "Is allowlist" : "Is blacklist")); + """, ChatColor.UNDERLINE, policy.name(), ChatColor.RESET, "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); } } return true; @@ -36,7 +33,7 @@ public class PolicyInfo implements Subcommand { @Override public List onTabComplete(CommandSender sender, String[] args) { List rstr = new ArrayList<>(); - for (LocationPolicy p : Config.getInstance().getLocationPolicies()) { + for (Policy p : Config.getInstance().getPolicies()) { rstr.add(p.name()); } return rstr; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/LocationPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/LocationPolicy.java deleted file mode 100644 index 4c224cd..0000000 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/LocationPolicy.java +++ /dev/null @@ -1,65 +0,0 @@ -package io.github.adrianvic.nemesiseye.policy; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.util.BoundingBox; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public record LocationPolicy(String name, List> locations, List nodes, boolean allowlist) { - public static List parseLocationPolicy(List> raw) { - List out = new ArrayList<>(raw.size()); - for (Map m : raw) { - String name = (String) m.get("name"); - boolean allowlist = Boolean.TRUE.equals(m.get("allowList")); - - // Nodes - Object rawNodes = m.get("nodes"); - List> nodeList = new ArrayList<>(); - if (rawNodes instanceof List list) { - for (Object o : list) { - if (o instanceof Map map) - nodeList.add((Map) map); - } - } - - List nodes = PolicyNode.parseNodes(nodeList, allowlist); - - // Parsing locations - List> locations = new ArrayList<>(); - Object rawGroups = m.get("locations"); - List groups = rawGroups instanceof List ? (List) rawGroups : List.of(); - - // Getting groups - for (Object gObj : groups) { - List group = (List) gObj; - ArrayList boxes = new ArrayList<>(group.size()); - - // Now iterate over regions inside the group - for (Object rObj : group) { - Map region = (Map) rObj; - Map c1 = (Map) region.get("corner1"); - Map c2 = (Map) region.get("corner2"); - - double x1 = ((Number) c1.get("x")).doubleValue(); - double y1 = ((Number) c1.get("y")).doubleValue(); - double z1 = ((Number) c1.get("z")).doubleValue(); - - double x2 = ((Number) c2.get("x")).doubleValue(); - double y2 = ((Number) c2.get("y")).doubleValue(); - double z2 = ((Number) c2.get("z")).doubleValue(); - - Location loc1 = new Location(Bukkit.getWorlds().getFirst(), x1, y1, z1); - Location loc2 = new Location(Bukkit.getWorlds().getFirst(), x2, y2, z2); - - boxes.add(BoundingBox.of(loc1, loc2)); - } - locations.add(boxes); - } - out.add(new LocationPolicy(name, locations, nodes, allowlist)); - } - return out; - } -} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeValueParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeValueParser.java deleted file mode 100644 index 84bde22..0000000 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeValueParser.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.adrianvic.nemesiseye.policy; - -import java.util.*; - -public class NodeValueParser { - public static List parseValueToStringList(List values) { - List result = new ArrayList<>(); - for (Object o : values) { - if (o instanceof String) result.add((String) o); - } - return result; - } - - public static Map parseValueToStringMap(List values) { - Map result = new HashMap<>(); - - for (Object o : values) { - if (o instanceof Map raw) { - for (Map.Entry e : raw.entrySet()) { - if (e.getKey() instanceof String k && e.getValue() instanceof String v) { - result.put(k, v); - } - } - } - } - return result; - } -} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java new file mode 100644 index 0000000..6eb868d --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java @@ -0,0 +1,13 @@ +package io.github.adrianvic.nemesiseye.policy; + +import java.util.List; + +public interface Policy { + String name(); + List nodes(); + boolean allowlist(); + + default PolicyParser getParser() { + return PolicyParsers.get(""); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java new file mode 100644 index 0000000..9e5b546 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java @@ -0,0 +1,7 @@ +package io.github.adrianvic.nemesiseye.policy; + +import java.util.List; + +public interface PolicyParser { + List parse(List raw); +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java new file mode 100644 index 0000000..7047021 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java @@ -0,0 +1,18 @@ +package io.github.adrianvic.nemesiseye.policy; + +import io.github.adrianvic.nemesiseye.policy.parser.LocationPolicyParser; + +import java.util.HashMap; +import java.util.Map; + +public class PolicyParsers { + private static final Map handlers = new HashMap<>(); + + static { + handlers.put("Location", new LocationPolicyParser()); + } + + public static PolicyParser get(String type) { + return handlers.get(type); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java index 3759c2e..f5b1d71 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java @@ -3,7 +3,6 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; -import io.github.adrianvic.nemesiseye.policy.NodeValueParser; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; @@ -12,7 +11,7 @@ public class attackWith implements NodeHandler { @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { if (action == Action.HIT) { - for (String s : NodeValueParser.parseValueToStringList(node.values())) { + for (String s : DataShifter.parseValueToStringList(node.values())) { if (DataShifter.safeMatches(s, entity.getInventory().getItemInMainHand().getType().toString())) return false; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java index 96bfa21..fd580fc 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java @@ -3,7 +3,6 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; -import io.github.adrianvic.nemesiseye.policy.NodeValueParser; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.HumanEntity; @@ -25,7 +24,7 @@ public class useEnchantment implements NodeHandler { return !node.isWhitelist(); } - Map valuesmap = NodeValueParser.parseValueToStringMap(node.values()); + Map valuesmap = DataShifter.parseValueToStringMap(node.values()); for (Map.Entry e : enchants.entrySet()) { String enchantment = e.getKey().getKey().getKey(); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java index 060d4fb..cb97eca 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java @@ -3,7 +3,6 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; -import io.github.adrianvic.nemesiseye.policy.NodeValueParser; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; @@ -13,7 +12,7 @@ public class useItem implements NodeHandler { public boolean allows(HumanEntity entity, PolicyNode node, Action action) { String type = entity.getInventory().getItemInMainHand().getType().toString(); - for (String s : NodeValueParser.parseValueToStringList(node.values())) { + for (String s : DataShifter.parseValueToStringList(node.values())) { if (DataShifter.safeMatches(s, type)) { return false; } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java new file mode 100644 index 0000000..26389fc --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java @@ -0,0 +1,68 @@ +package io.github.adrianvic.nemesiseye.policy.parser; + +import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.policy.*; +import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.util.BoundingBox; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class LocationPolicyParser implements PolicyParser { + public List parse(List raw) { + List out = new ArrayList<>(raw.size()); + List> parsedRawMap = DataShifter.parseValueToListOfMaps(raw); + + for (Map m : parsedRawMap) { + String name = (String) m.get("name"); + boolean allowlist = Boolean.TRUE.equals(m.get("allowList")); + + // Nodes + Object rawNodes = m.get("nodes"); + List> nodeList = new ArrayList<>(); + if (rawNodes instanceof List list) { + for (Object o : list) { + if (o instanceof Map map) + nodeList.add((Map) map); + } + } + + List nodes = PolicyNode.parseNodes(nodeList, allowlist); + + // Parsing locations + List> locations = new ArrayList<>(); + + Object rawLocations = m.get("locations"); + List groups = rawLocations instanceof List ? (List) rawLocations : List.of(); + + ArrayList boxes = new ArrayList<>(groups.size()); + + // Now iterate over regions + for (Object rObj : groups) { + Map region = (Map) rObj; + Map c1 = (Map) region.get("corner1"); + Map c2 = (Map) region.get("corner2"); + + double x1 = ((Number) c1.get("x")).doubleValue(); + double y1 = ((Number) c1.get("y")).doubleValue(); + double z1 = ((Number) c1.get("z")).doubleValue(); + + double x2 = ((Number) c2.get("x")).doubleValue(); + double y2 = ((Number) c2.get("y")).doubleValue(); + double z2 = ((Number) c2.get("z")).doubleValue(); + + Location loc1 = new Location(Bukkit.getWorlds().getFirst(), x1, y1, z1); + Location loc2 = new Location(Bukkit.getWorlds().getFirst(), x2, y2, z2); + + boxes.add(BoundingBox.of(loc1, loc2)); + } + locations.add(boxes); + + out.add(new LocationPolicy(name, locations, nodes, allowlist)); + } + return out; + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java new file mode 100644 index 0000000..40a7e86 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java @@ -0,0 +1,10 @@ +package io.github.adrianvic.nemesiseye.policy.policies; + +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import org.bukkit.util.BoundingBox; + +import java.util.ArrayList; +import java.util.List; + +public record LocationPolicy(String name, List> locations, List nodes, boolean allowlist) implements Policy {} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PermissionPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java similarity index 62% rename from src/main/java/io/github/adrianvic/nemesiseye/policy/PermissionPolicy.java rename to src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java index 9f10260..b1c63dc 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PermissionPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java @@ -1,5 +1,6 @@ -package io.github.adrianvic.nemesiseye.policy; +package io.github.adrianvic.nemesiseye.policy.policies; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.permissions.Permission; import java.util.ArrayList; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PlayerNamePolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java similarity index 55% rename from src/main/java/io/github/adrianvic/nemesiseye/policy/PlayerNamePolicy.java rename to src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java index 5038d92..2a1a821 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PlayerNamePolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java @@ -1,4 +1,6 @@ -package io.github.adrianvic.nemesiseye.policy; +package io.github.adrianvic.nemesiseye.policy.policies; + +import io.github.adrianvic.nemesiseye.policy.PolicyNode; import java.util.ArrayList; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1c97eb4..5db0296 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Eye-of-Nemesis" -version: '1.0.1-SNAPSHOT' +version: '1.0.2-SNAPSHOT' main: io.github.adrianvic.nemesiseye.Nemesis api-version: '1.21' author: 'Adrian Victor' diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index a8a6b89..522c8ec 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -1,122 +1,121 @@ Policies: - Location: - # NO SPACES - - name: "Beta-1.7.3-items-only" - # Will deny anything that's not allowed by the nodes if set to true - allowList: true - nodes: - - useItem: - - AIR - - STONE - - COBBLESTONE - - "^(OAK|SPRUCE|BIRCH)_(LOG|SAPLING|PLANKS|LEAVES)$" - - "^(DIAMOND|GOLD|IRON|COAL|LAPIS|REDSTONE)_ORE$" - - "^(DIAMOND|GOLD|IRON|LAPIS)_BLOCK$" - - GRAVEL - - BEDROCK - - SAND - - SPONGE - - WET_SPONGE - - GLASS - - LAPIS_LAZULI - - COBWEB - - PISTON - - STICKY_PISTON - - GRASS - - DISPENSER - - NOTE_BLOCK - - SANDSTONE - - RED_BED - - "^(POWERED|DETECTOR)_RAIL$" - - RAIL - - SHORT_GRASS - - "^(WHITE|BLACK|GREEN|YELLOW|PINK|PURPLE|CYAN|BLUE|RED|LIME|BROWN|LIGHT_GRAY|GRAY)_(WOOL|DYE)$" - - POPPY - - DANDELION - - "^(RED|BROWN)_MUSHROOM$" - - "^(OAK|COBBLESTONE)_SLAB$" - - BRICK_BLOCK - - TNT - - BOOKSHELF - - OBSIDIAN - - MOSSY_COBBLESTONE - - TORCH - - SPAWNER - - REDSTONE - - CHEST - - CRAFTING_TABLE - - FARMLAND - - FURNACE - - SIGN - - LADDER - - "^(COBBLESTONE|OAK)_STAIRS$" - - LEVER - - "^(OAK|STONE)_PRESSURE_PLATE$" - - "^(OAK|IRON)_DOOR$" - - BLUE_ICE - - REDSTONE_TORCH - - STONE_BUTTON - - SNOW - - SNOW_BLOCK - - CLAY - - SUGAR_CANE - - JUKEBOX - - OAK_FENCE - - PUMPKIN - - NETHERRACK - - SOUL_SAND - - GLOWSTONE - - JACK_O_LANTERN - - CAKE - - REPEATER - - OAK_TRAPDOOR - - "^(IRON|STONE|DIAMOND|WOODEN|GOLDEN)_(SHOVEL|AXE|PICKAXE|SWORD|HOE)$" - - "^(IRON|LEATHER|DIAMOND|GOLDEN)_(HELMET|CHESTPLATE|LEGGINGS|BOOTS)$" - - STICK - - BOWL - - MUSHROOM_STEW - - FEATHER - - STRING - - GUNPOWDER - - WHEAT_SEEDS - - WHEAT - - FLINT - - FLINT_AND_STEEL - - PORKCHOP - - "^(COOKED|RAW)_(PORKCHOP|FISH)$" - - PAINTING - - GOLDEN_APPLE - - BUCKET - - "^(LAVA|MILK|WATER)_BUCKET$" - - MINECART - - SADDLE - - SNOWBALL - - OAK_BOAT - - LEATHER - - "^(FURNACE|CHEST)_MINECART$" - - EGG - - BOOK - - PAPER - - BRICK - - SLIME_BALL - - COMPASS - - FISHING_ROD - - CLOCK - - GLOWSTONE_DUST - - INK_SAC - - BONE_MEAL - - SUGAR - - COOKIE - - MAP - - FILLED_MAP - - SHEARS - - MUSIC_DISK_CAT - - MUSIC_DISK_13 - - DIRT - - BREAD - - useEnchantment: - "gibberish": 999999 - locations: - - + - Location: + # NO SPACES + - name: "Beta-1.7.3-items-only" + # Will deny anything that's not allowed by the nodes if set to true + allowList: true + nodes: + - useItem: + - AIR + - STONE + - COBBLESTONE + - "^(OAK|SPRUCE|BIRCH)_(LOG|SAPLING|PLANKS|LEAVES)$" + - "^(DIAMOND|GOLD|IRON|COAL|LAPIS|REDSTONE)_ORE$" + - "^(DIAMOND|GOLD|IRON|LAPIS)_BLOCK$" + - GRAVEL + - BEDROCK + - SAND + - SPONGE + - WET_SPONGE + - GLASS + - LAPIS_LAZULI + - COBWEB + - PISTON + - STICKY_PISTON + - GRASS + - DISPENSER + - NOTE_BLOCK + - SANDSTONE + - RED_BED + - "^(POWERED|DETECTOR)_RAIL$" + - RAIL + - SHORT_GRASS + - "^(WHITE|BLACK|GREEN|YELLOW|PINK|PURPLE|CYAN|BLUE|RED|LIME|BROWN|LIGHT_GRAY|GRAY)_(WOOL|DYE)$" + - POPPY + - DANDELION + - "^(RED|BROWN)_MUSHROOM$" + - "^(OAK|COBBLESTONE)_SLAB$" + - BRICK_BLOCK + - TNT + - BOOKSHELF + - OBSIDIAN + - MOSSY_COBBLESTONE + - TORCH + - SPAWNER + - REDSTONE + - CHEST + - CRAFTING_TABLE + - FARMLAND + - FURNACE + - SIGN + - LADDER + - "^(COBBLESTONE|OAK)_STAIRS$" + - LEVER + - "^(OAK|STONE)_PRESSURE_PLATE$" + - "^(OAK|IRON)_DOOR$" + - BLUE_ICE + - REDSTONE_TORCH + - STONE_BUTTON + - SNOW + - SNOW_BLOCK + - CLAY + - SUGAR_CANE + - JUKEBOX + - OAK_FENCE + - PUMPKIN + - NETHERRACK + - SOUL_SAND + - GLOWSTONE + - JACK_O_LANTERN + - CAKE + - REPEATER + - OAK_TRAPDOOR + - "^(IRON|STONE|DIAMOND|WOODEN|GOLDEN)_(SHOVEL|AXE|PICKAXE|SWORD|HOE)$" + - "^(IRON|LEATHER|DIAMOND|GOLDEN)_(HELMET|CHESTPLATE|LEGGINGS|BOOTS)$" + - STICK + - BOWL + - MUSHROOM_STEW + - FEATHER + - STRING + - GUNPOWDER + - WHEAT_SEEDS + - WHEAT + - FLINT + - FLINT_AND_STEEL + - PORKCHOP + - "^(COOKED|RAW)_(PORKCHOP|FISH)$" + - PAINTING + - GOLDEN_APPLE + - BUCKET + - "^(LAVA|MILK|WATER)_BUCKET$" + - MINECART + - SADDLE + - SNOWBALL + - OAK_BOAT + - LEATHER + - "^(FURNACE|CHEST)_MINECART$" + - EGG + - BOOK + - PAPER + - BRICK + - SLIME_BALL + - COMPASS + - FISHING_ROD + - CLOCK + - GLOWSTONE_DUST + - INK_SAC + - BONE_MEAL + - SUGAR + - COOKIE + - MAP + - FILLED_MAP + - SHEARS + - MUSIC_DISK_CAT + - MUSIC_DISK_13 + - DIRT + - BREAD + - useEnchantment: + "gibberish": 999999 + locations: - corner1: { x: 2100, y: 256, z: 1400 } - corner2: { x: 1000, y: -64, z: 2200 } + corner2: { x: 1000, y: -64, z: 2200 } \ No newline at end of file From 9b98d8a2a95f625318aefb97cf622c0793ffa7ee Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Wed, 10 Dec 2025 01:42:15 -0300 Subject: [PATCH 02/45] Add project status and documentation notice Added important project status notice and documentation update info. --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b213dd4..49ea53c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +> [!IMPORTANT] +> This project is in a very early stage, expect bugs until `Release 1.0`. +> +> Documentation will soon be moved from README.md. + # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write [policies](#Policies) that will deny or allow (black/whitelist) players to do specific things based on the value of [nodes](#Nodes). @@ -31,4 +36,4 @@ Nodes are specific rules that rely on it's value to know _when_ to act. For exam ## Performance This plugin is not scalable as it is and will run unoptimized checks when your players do certain things in the server if you have policies enabled, I made it for a server with a few friends. -For every policy there's a check, for every matching policy there are its child nodes, each one introducing new checks. Keep that in mind. \ No newline at end of file +For every policy there's a check, for every matching policy there are its child nodes, each one introducing new checks. Keep that in mind. From 56f337110ff98d4463a058e6ccf7ccf5fc289bc5 Mon Sep 17 00:00:00 2001 From: adrian Date: Fri, 12 Dec 2025 00:02:11 -0300 Subject: [PATCH 03/45] Initial work on reflection, pulls version from resources. --- build.gradle | 55 ----------- build.gradle.kts | 93 +++++++++++++++++++ .../adrianvic/nemesiseye/impl/b1_7_3.java | 6 ++ src/b1_7_3/resources/plugin.yml | 5 + src/b1_7_3/resources/version.properties | 1 + .../github/adrianvic/nemesiseye/Config.java | 1 - .../github/adrianvic/nemesiseye/Nemesis.java | 48 +++++++++- .../nemesiseye/reflection/Glimmer.java | 5 + .../adrianvic/nemesiseye/impl/r1_21.java | 4 + src/{main => r1_21}/resources/plugin.yml | 0 src/r1_21/resources/version.properties | 1 + 11 files changed, 161 insertions(+), 58 deletions(-) delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java create mode 100644 src/b1_7_3/resources/plugin.yml create mode 100644 src/b1_7_3/resources/version.properties create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java create mode 100644 src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java rename src/{main => r1_21}/resources/plugin.yml (100%) create mode 100644 src/r1_21/resources/version.properties diff --git a/build.gradle b/build.gradle deleted file mode 100644 index ca8860c..0000000 --- a/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -plugins { - id 'java' - id("xyz.jpenilla.run-paper") version "2.3.1" -} - -group = 'io.github.adrianvic' -version = '1.0.2-SNAPSHOT' - -repositories { - mavenCentral() - maven { - name = "papermc-repo" - url = "https://repo.papermc.io/repository/maven-public/" - } -} - -dependencies { - compileOnly("io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") -} - -tasks { - runServer { - // Configure the Minecraft version for our task. - // This is the only required configuration besides applying the plugin. - // Your plugin's jar (or shadowJar if present) will be used automatically. - minecraftVersion("1.21") - } -} - -def targetJavaVersion = 21 -java { - def javaVersion = JavaVersion.toVersion(targetJavaVersion) - sourceCompatibility = javaVersion - targetCompatibility = javaVersion - if (JavaVersion.current() < javaVersion) { - toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' - - if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { - options.release.set(targetJavaVersion) - } -} - -processResources { - def props = [version: version] - inputs.properties props - filteringCharset 'UTF-8' - filesMatching('plugin.yml') { - expand props - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..c29ae2b --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,93 @@ +plugins { + java + id("xyz.jpenilla.run-paper") version "2.3.1" +} + +group = "io.github.adrianvic" +version = "1.0.2-SNAPSHOT" + +repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") +} + +/* ----------------------------------------- */ +/* SUPPORTED VERSIONS */ +/* ----------------------------------------- */ + +val mcVersions = listOf( + "b1_7_3", + "r1_21" +) + +/* ----------------------------------------- */ +/* CREATE SOURCE SET PER VERSION */ +/* ----------------------------------------- */ + +mcVersions.forEach { ver -> + val ss = sourceSets.create(ver) { + java.srcDir("src/$ver/java") + + resources.setSrcDirs(listOf("src/$ver/resources", "src/main/resources")) + + compileClasspath += sourceSets["main"].output + runtimeClasspath += output + compileClasspath + } + + tasks.withType { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } + + configurations[ss.implementationConfigurationName] + .extendsFrom(configurations["implementation"]) + + configurations[ss.compileOnlyConfigurationName] + .extendsFrom(configurations["compileOnly"]) + +} + +/* ----------------------------------------- */ +/* DEPENDENCIES */ +/* ----------------------------------------- */ + +dependencies { + add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + add("b1_7_3CompileOnly", files("libs/beta173-api.jar")) +} + +/* ----------------------------------------- */ +/* BUILD TASKS */ +/* ----------------------------------------- */ + +mcVersions.forEach { ver -> + tasks.register("jar${ver.replace(".", "_").replace("-", "_").replace("/", "_").capitalize()}") { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + from(sourceSets["main"].output) + from(sourceSets[ver].output) + archiveClassifier.set(ver) + + manifest { + attributes( + "Nemesis-Impl-Version" to ver + ) + } + + } +} + +/* ----------------------------------------- */ +/* JAVA SETTINGS */ +/* ----------------------------------------- */ + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) +} + +tasks.withType { + options.encoding = "UTF-8" +} + +tasks.runServer { + minecraftVersion("1.21") +} \ No newline at end of file diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java new file mode 100644 index 0000000..9d640e7 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -0,0 +1,6 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.reflection.Glimmer; + +public class b1_7_3 implements Glimmer { +} diff --git a/src/b1_7_3/resources/plugin.yml b/src/b1_7_3/resources/plugin.yml new file mode 100644 index 0000000..b1b1232 --- /dev/null +++ b/src/b1_7_3/resources/plugin.yml @@ -0,0 +1,5 @@ +name: "Eye-of-Nemesis" +version: '1.0.2-SNAPSHOT' +main: io.github.adrianvic.nemesiseye.Nemesis +author: 'Adrian Victor' +description: "Change what players can do based in custom criteria." \ No newline at end of file diff --git a/src/b1_7_3/resources/version.properties b/src/b1_7_3/resources/version.properties new file mode 100644 index 0000000..5c6ec00 --- /dev/null +++ b/src/b1_7_3/resources/version.properties @@ -0,0 +1 @@ +impl.version=b1_7_3 \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Config.java b/src/main/java/io/github/adrianvic/nemesiseye/Config.java index 56812df..da504ad 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Config.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Config.java @@ -1,7 +1,6 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Policy; -import io.github.adrianvic.nemesiseye.policy.PolicyParser; import io.github.adrianvic.nemesiseye.policy.PolicyParsers; import org.bukkit.configuration.file.YamlConfiguration; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java index 03e95ef..ed09eb3 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java @@ -1,23 +1,67 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.commands.Eye; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.plugin.java.JavaPlugin; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + public final class Nemesis extends JavaPlugin { + private Glimmer glim; + private static final String VERSION_PROP = "impl.version"; + private static Nemesis instance; @Override public void onEnable() { + instance = this; + glim = loadGlim(); getServer().getPluginManager().registerEvents(new EventListener(), this); Config.getInstance().load(); getCommand("eye").setExecutor(new Eye()); } + private String readImplVersion() { + Properties props = new Properties(); + try (InputStream is = getClass().getClassLoader() + .getResourceAsStream("version.properties")) { + if (is == null) { + throw new IllegalStateException("version.properties not found on classpath."); + } + props.load(is); + } catch (IOException e) { + throw new IllegalStateException("Failed to load version.properties", e); + } + String version = props.getProperty(VERSION_PROP); + if (version == null || version.isBlank()) { + throw new IllegalStateException(VERSION_PROP + " property missing in version.properties."); + } + return version.trim(); + } + + private Glimmer loadGlim() { + String implVersion = readImplVersion(); + String className = "io.github.adrianvic.nemesiseye.impl." + implVersion; + + try { + Class clazz = Class.forName(className, true, getClass().getClassLoader()); + if (!Glimmer.class.isAssignableFrom(clazz)) { + throw new IllegalStateException(className + " does not implement Glimmer."); + } + return (Glimmer) clazz.getDeclaredConstructor().newInstance(); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException("Failed to instantiate " + className, e); + } + } + @Override public void onDisable() { - // Plugin shutdown logic } public static Nemesis getInstance() { - return getPlugin(Nemesis.class); + return instance; } + + public Glimmer getGlimmer() { return glim; } } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java new file mode 100644 index 0000000..df105cc --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java @@ -0,0 +1,5 @@ +package io.github.adrianvic.nemesiseye.reflection; + +public interface Glimmer { + +} diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java new file mode 100644 index 0000000..8bd126f --- /dev/null +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -0,0 +1,4 @@ +package io.github.adrianvic.nemesiseye.impl; + +public class r1_21 { +} diff --git a/src/main/resources/plugin.yml b/src/r1_21/resources/plugin.yml similarity index 100% rename from src/main/resources/plugin.yml rename to src/r1_21/resources/plugin.yml diff --git a/src/r1_21/resources/version.properties b/src/r1_21/resources/version.properties new file mode 100644 index 0000000..89241bf --- /dev/null +++ b/src/r1_21/resources/version.properties @@ -0,0 +1 @@ +impl.version=r1_21 \ No newline at end of file From 8562a51543ceecc4ee19ab1d451fefda0da9807a Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Fri, 12 Dec 2025 00:32:10 -0300 Subject: [PATCH 04/45] Update README.md --- README.md | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index b213dd4..6445b20 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,12 @@ # Eye of Nemesis -Eye of Nemesis is a plugin that allows server admins to write [policies](#Policies) that will deny or allow (black/whitelist) players to do specific things based on the value of [nodes](#Nodes). +Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. ## Warnings - Even though running `/eye` will tell you to run `/eye help` to list all available commands, this is not implemented yet, however all commands are available as tab-complete of `/eye`. - This plugin is in a very early stage. -## Policies -Policy is a structure that holds nodes and tell them _where_ to act. For example, a Location policy will tell its child nodes that they work from coordinates `x1 y1 z1` to `x2 y2 z2`. - -Currently, the only policy type is Location. - -## Nodes -Nodes are specific rules that rely on it's value to know _when_ to act. For example, a useItem policy with value `cookie` will prevent users from doing anything with a cookie. - -### `useItem` -**Triggered:** breaking/placing/interacting with anything using this item. - -**Expects:** list of strings. - -### `useEnchantment` -**Triggered:** breaking/placing/interacting with anything using an item with the specified enchantment, **will allow items without enchantment even on allowlist mode**. - -**Expects:** map of _string: string_. - -### `attackWith` -**Triggered:** attacking with this item in hand. - -**Expects:** list of strings. +## Motivations +I made this plugin as an effort to preserve a village from my private server. Originally from beta 1.7.3 Betalands server, then transferred to RetroMC, and finly we downloaded the chunks to merge into our server, I was afraid it would not have the same feeling after all the updates, so I had the idea to make a plugin that can block the newer features. ## Performance -This plugin is not scalable as it is and will run unoptimized checks when your players do certain things in the server if you have policies enabled, I made it for a server with a few friends. - -For every policy there's a check, for every matching policy there are its child nodes, each one introducing new checks. Keep that in mind. \ No newline at end of file +This plugin is not scalable as it is and will end up running unoptimized checks when your players do things with policies in effect, I made it for a server with a few friends. I'll look forward into writing more performant code after all my other priorities are implemented. \ No newline at end of file From b7b43d6aef87b7816ccecbec96370517cfe5de2b Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Fri, 12 Dec 2025 00:32:53 -0300 Subject: [PATCH 05/45] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6445b20..1e47fac 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Eye of Nemesis is a plugin that allows server admins to write policies that will - This plugin is in a very early stage. ## Motivations -I made this plugin as an effort to preserve a village from my private server. Originally from beta 1.7.3 Betalands server, then transferred to RetroMC, and finly we downloaded the chunks to merge into our server, I was afraid it would not have the same feeling after all the updates, so I had the idea to make a plugin that can block the newer features. +I made this plugin as an effort to preserve a village from my private server. Originally from beta 1.7.3 Betalands server, then transferred to RetroMC, and then finally we downloaded the chunks to merge into our server, I was afraid it would not have the same feeling after all the updates, so I had the idea to make a plugin that can block the newer features. ## Performance This plugin is not scalable as it is and will end up running unoptimized checks when your players do things with policies in effect, I made it for a server with a few friends. I'll look forward into writing more performant code after all my other priorities are implemented. \ No newline at end of file From 90d43ac3dede200afffa7810d317a391722fe5e6 Mon Sep 17 00:00:00 2001 From: adrian Date: Fri, 12 Dec 2025 17:31:28 -0300 Subject: [PATCH 06/45] Finished r1_21 implementation. - Better NodeHandler evaluation. --- .gitignore | 3 +- build.gradle.kts | 2 +- .../adrianvic/nemesiseye/impl/b1_7_3.java | 13 ++ .../github/adrianvic/nemesiseye/Config.java | 60 +++------ .../adrianvic/nemesiseye/DataShifter.java | 22 ++-- .../{EventListener.java => Events.java} | 13 +- .../github/adrianvic/nemesiseye/Nemesis.java | 12 +- .../adrianvic/nemesiseye/Validator.java | 23 +--- .../commands/{Eye.java => EyeCore.java} | 24 ++-- .../nemesiseye/commands/sub/PolicyInfo.java | 4 +- .../policy/handlers/attackWith.java | 9 +- .../policy/handlers/useEnchantment.java | 34 ++---- .../nemesiseye/policy/handlers/useItem.java | 13 +- .../policy/parser/LocationPolicyParser.java | 16 +-- .../policy/policies/LocationPolicy.java | 4 +- .../nemesiseye/reflection/Glimmer.java | 47 ++++++++ src/main/resources/settings.yml | 6 +- .../nemesiseye/impl/EventListener.java | 25 ++++ .../nemesiseye/impl/commands/Eye.java | 30 +++++ .../adrianvic/nemesiseye/impl/r1_21.java | 114 +++++++++++++++++- 20 files changed, 326 insertions(+), 148 deletions(-) rename src/main/java/io/github/adrianvic/nemesiseye/{EventListener.java => Events.java} (62%) rename src/main/java/io/github/adrianvic/nemesiseye/commands/{Eye.java => EyeCore.java} (61%) create mode 100644 src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java create mode 100644 src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java diff --git a/.gitignore b/.gitignore index 1ac6f97..026e990 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .gradle/ build/ out/ -.idea/ \ No newline at end of file +.idea/ +libs/ \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index c29ae2b..cc2bbf8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -53,7 +53,7 @@ mcVersions.forEach { ver -> dependencies { add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") - add("b1_7_3CompileOnly", files("libs/beta173-api.jar")) + add("b1_7_3CompileOnly", files("libs/craftbukkit-1060.jar")) } /* ----------------------------------------- */ diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java index 9d640e7..2620aab 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -1,6 +1,19 @@ package io.github.adrianvic.nemesiseye.impl; +import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import java.io.File; +import java.util.List; + public class b1_7_3 implements Glimmer { + @Override + public File loadConfigFile() { + return null; + } + + @Override + public List loadPoliciesFromFile(File file) { + return List.of(); + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Config.java b/src/main/java/io/github/adrianvic/nemesiseye/Config.java index da504ad..5e286cd 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Config.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Config.java @@ -1,62 +1,38 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Policy; -import io.github.adrianvic.nemesiseye.policy.PolicyParsers; -import org.bukkit.configuration.file.YamlConfiguration; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import java.io.File; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class Config { - private final static Config instance = new Config(); + private static Config instance = new Config(); + private Glimmer glim = Nemesis.getInstance().getGlimmer(); private File file; - private YamlConfiguration config; private List policies = new ArrayList<>(); - private Config() { - } + private Config() {} public void load() { - file = new File(Nemesis.getInstance().getDataFolder(), "settings.yml"); - - if (!file.exists()) - Nemesis.getInstance().saveResource("settings.yml", false); - - config = new YamlConfiguration(); - config.options().parseComments(true); - - try { - config.load(file); - } catch (Exception e) { - e.printStackTrace(); - } - - List> rawPolicies = config.getMapList("Policies"); - for (Map map : rawPolicies) { - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { - List parsed = PolicyParsers.get(k).parse(v); - policies.addAll(parsed); - } - } - } + List newPolicies = glim.loadPoliciesFromFile(glim.loadConfigFile()); + policies = newPolicies; } - public void save() { - try { - config.save(file); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void set(String path, Object value) { - config.set(path, value); - save(); - } +// public void save() { +// try { +// config.save(file); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// public void set(String path, Object value) { +// config.set(path, value); +// save(); +// } public List getPolicies() { return policies; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java index 026d6c5..b9edf4a 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java @@ -21,19 +21,23 @@ public class DataShifter { return result; } - public static Map parseValueToStringMap(List values) { - Map result = new HashMap<>(); + public static Map parseValueToStringMap(List raw) { + Map out = new HashMap<>(); - for (Object o : values) { - if (o instanceof Map raw) { - for (Map.Entry e : raw.entrySet()) { - if (e.getKey() instanceof String k && e.getValue() instanceof String v) { - result.put(k, v); - } + for (Object o : raw) { + if (o instanceof Map map) { + for (Map.Entry e : map.entrySet()) { + out.put(String.valueOf(e.getKey()), String.valueOf(e.getValue())); + } + } else if (o instanceof String s) { + + String[] parts = s.split(":", 2); + if (parts.length == 2) { + out.put(parts[0].trim(), parts[1].trim()); } } } - return result; + return out; } public static List> parseValueToListOfMaps(List values) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/EventListener.java b/src/main/java/io/github/adrianvic/nemesiseye/Events.java similarity index 62% rename from src/main/java/io/github/adrianvic/nemesiseye/EventListener.java rename to src/main/java/io/github/adrianvic/nemesiseye/Events.java index 4666861..07f0ed2 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/EventListener.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Events.java @@ -2,27 +2,22 @@ package io.github.adrianvic.nemesiseye; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; -public class EventListener implements Listener { - @EventHandler - public void onBlockBreak(BlockBreakEvent event) { +public class Events { + public static void onBlockBreak(BlockBreakEvent event) { event.setCancelled(!Validator.canBreak(event.getPlayer())); } - @EventHandler - public void onInteractionEvent(PlayerInteractEvent event) { + public static void onInteractionEvent(PlayerInteractEvent event) { if (event.getItem() != null) { event.setCancelled(!Validator.canInteract(event.getPlayer())); } } - @EventHandler - public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { + public static void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { event.setCancelled(!Validator.canHit((HumanEntity) event.getDamager())); } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java index ed09eb3..0618f50 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java @@ -1,7 +1,8 @@ package io.github.adrianvic.nemesiseye; -import io.github.adrianvic.nemesiseye.commands.Eye; +import io.github.adrianvic.nemesiseye.commands.EyeCore; import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -17,9 +18,8 @@ public final class Nemesis extends JavaPlugin { public void onEnable() { instance = this; glim = loadGlim(); - getServer().getPluginManager().registerEvents(new EventListener(), this); Config.getInstance().load(); - getCommand("eye").setExecutor(new Eye()); + glim.onLoad(); } private String readImplVersion() { @@ -59,9 +59,7 @@ public final class Nemesis extends JavaPlugin { public void onDisable() { } - public static Nemesis getInstance() { - return instance; - } - + public static Nemesis getInstance() { return instance; } public Glimmer getGlimmer() { return glim; } + public PluginManager getPluginManager() { return this.getServer().getPluginManager(); } } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java index b598b08..bd445cd 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java @@ -1,16 +1,17 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Action; -import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.entity.HumanEntity; -import org.bukkit.util.BoundingBox; import java.util.ArrayList; import java.util.List; public class Validator { + private final static Glimmer glim = Nemesis.getInstance().getGlimmer(); + public static boolean canInteract(HumanEntity entity) { return checkAgainstEntity(entity, Action.INTERACT); } @@ -30,13 +31,11 @@ public class Validator { for (PolicyNode n : nodes) { if (!checkAgainstNode(entity, n, action)) return false; } - return true; } public static boolean checkAgainstNode(HumanEntity entity, PolicyNode node, Action action) { - boolean allowed = node.getHandler().allows(entity, node, action); - return node.isWhitelist() != allowed; + return node.getHandler().allows(entity, node, action); } public static List getNodesForPolicies(List policies) { @@ -49,18 +48,6 @@ public class Validator { public static List getPoliciesForEntity(HumanEntity entity) { List ps = Config.getInstance().getPolicies(); - List applyingLPS = new ArrayList<>(); - for (Policy p : ps) { - if (p instanceof LocationPolicy lp) { - for (ArrayList boxes : lp.locations()) { - for (BoundingBox box : boxes) { - if (box.contains(entity.getLocation().toVector())) { - applyingLPS.add(lp); - } - } - } - } - } - return applyingLPS; + return glim.getApplyingPoliciesForEntity(entity, ps); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/Eye.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java similarity index 61% rename from src/main/java/io/github/adrianvic/nemesiseye/commands/Eye.java rename to src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java index 6929f18..666bfab 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/Eye.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -2,20 +2,14 @@ package io.github.adrianvic.nemesiseye.commands; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.commands.sub.*; -import org.bukkit.ChatColor; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - import java.util.*; -public class Eye implements CommandExecutor, TabCompleter { - private final Map subs = new HashMap<>(); +public class EyeCore { + public final Map subs = new HashMap<>(); - public Eye() { + public EyeCore() { register(new Reload()); register(new ListPolicies()); register(new PolicyInfo()); @@ -26,14 +20,13 @@ public class Eye implements CommandExecutor, TabCompleter { subs.put(sub.name(), sub); } - @Override - public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) { + public boolean onCommand(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 0) { commandSender.sendMessage(""" - %sEye of Nemesis%s version %s + Eye of Nemesis version %s Usage: '/eye ' Use '/eye help' for a list of available commands - """.formatted(ChatColor.RED, ChatColor.RESET, Nemesis.getInstance().getDescription().getVersion())); + """.formatted(Nemesis.getInstance().getDescription().getVersion())); } else { Subcommand sub = subs.get(strings[0].toLowerCase()); if (sub == null) { @@ -45,8 +38,7 @@ public class Eye implements CommandExecutor, TabCompleter { return false; } - @Override - public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) { + public List onTabComplete(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 1) { return new ArrayList<>(subs.keySet()); } @@ -56,4 +48,6 @@ public class Eye implements CommandExecutor, TabCompleter { } return List.of(); } + + public Map getSubs() { return subs; }; } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index 178361f..d9460e5 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -20,11 +20,11 @@ public class PolicyInfo implements Subcommand { for (Policy policy : policies) { if (policy.name().equals(strings[0])) { commandSender.sendMessage(String.format(""" - Showing info for policy "%s%s%s": + Showing info for policy "%s": Type: %s Nodes: %s %s - """, ChatColor.UNDERLINE, policy.name(), ChatColor.RESET, "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); + """, policy.name(), "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); } } return true; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java index f5b1d71..c4e159b 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java @@ -1,20 +1,25 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.entity.HumanEntity; public class attackWith implements NodeHandler { + private final static Glimmer glim = Nemesis.getInstance().getGlimmer(); + @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { if (action == Action.HIT) { for (String s : DataShifter.parseValueToStringList(node.values())) { - if (DataShifter.safeMatches(s, entity.getInventory().getItemInMainHand().getType().toString())) return false; + boolean matches = DataShifter.safeMatches(s, glim.getItemInMainHandHumanEntity(entity).getType().toString()); + if (matches) return node.isWhitelist(); } } - return true; + return !node.isWhitelist(); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java index fd580fc..50df134 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java @@ -1,41 +1,27 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.PolicyNode; -import org.bukkit.enchantments.Enchantment; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; -import java.util.Map; - public class useEnchantment implements NodeHandler { + private Glimmer glim = Nemesis.getInstance().getGlimmer(); + @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { - ItemStack item = entity.getInventory().getItemInMainHand(); - if (item.getItemMeta() == null) { - return !node.isWhitelist(); - } + ItemStack item = glim.getItemInMainHandHumanEntity(entity); - Map enchants = item.getItemMeta().getEnchants(); + if (!glim.hasItemMeta(item)) return true; + if (!glim.hasAnyEnchantment(item)) return true; - if (enchants.isEmpty()) { - return !node.isWhitelist(); - } + boolean matches = glim.hasEnchantment(item, + DataShifter.parseValueToStringMap(node.values())); - Map valuesmap = DataShifter.parseValueToStringMap(node.values()); - - for (Map.Entry e : enchants.entrySet()) { - String enchantment = e.getKey().getKey().getKey(); - String level = e.getValue().toString(); - - for (Map.Entry entry : valuesmap.entrySet()) { - if (DataShifter.safeMatches(entry.getKey().trim(), enchantment) && DataShifter.safeMatches(entry.getValue().trim(), level)) { - return false; - } - } - } - return true; + return matches ? node.isWhitelist() : !node.isWhitelist(); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java index cb97eca..d956816 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java @@ -1,22 +1,25 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.entity.HumanEntity; public class useItem implements NodeHandler { + private Glimmer glim = Nemesis.getInstance().getGlimmer(); + @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { - String type = entity.getInventory().getItemInMainHand().getType().toString(); + String type = glim.getItemInMainHandHumanEntity(entity).getType().toString(); for (String s : DataShifter.parseValueToStringList(node.values())) { - if (DataShifter.safeMatches(s, type)) { - return false; - } + boolean matches = DataShifter.safeMatches(s, type); + if (matches) return node.isWhitelist(); } - return true; + return !node.isWhitelist(); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java index 26389fc..e96611f 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java @@ -1,17 +1,19 @@ package io.github.adrianvic.nemesiseye.policy.parser; import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.*; import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; -import org.bukkit.Bukkit; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.Location; -import org.bukkit.util.BoundingBox; import java.util.ArrayList; import java.util.List; import java.util.Map; public class LocationPolicyParser implements PolicyParser { + private Glimmer glim = Nemesis.getInstance().getGlimmer(); + public List parse(List raw) { List out = new ArrayList<>(raw.size()); List> parsedRawMap = DataShifter.parseValueToListOfMaps(raw); @@ -33,12 +35,12 @@ public class LocationPolicyParser implements PolicyParser { List nodes = PolicyNode.parseNodes(nodeList, allowlist); // Parsing locations - List> locations = new ArrayList<>(); + List> locations = new ArrayList<>(); Object rawLocations = m.get("locations"); List groups = rawLocations instanceof List ? (List) rawLocations : List.of(); - ArrayList boxes = new ArrayList<>(groups.size()); + ArrayList boxes = new ArrayList<>(groups.size()); // Now iterate over regions for (Object rObj : groups) { @@ -54,10 +56,10 @@ public class LocationPolicyParser implements PolicyParser { double y2 = ((Number) c2.get("y")).doubleValue(); double z2 = ((Number) c2.get("z")).doubleValue(); - Location loc1 = new Location(Bukkit.getWorlds().getFirst(), x1, y1, z1); - Location loc2 = new Location(Bukkit.getWorlds().getFirst(), x2, y2, z2); + Location loc1 = new Location(glim.getWorlds().getFirst(), x1, y1, z1); + Location loc2 = new Location(glim.getWorlds().getFirst(), x2, y2, z2); - boxes.add(BoundingBox.of(loc1, loc2)); + boxes.add(Glimmer.Box.of(loc1, loc2)); } locations.add(boxes); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java index 40a7e86..48c9a97 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java @@ -2,9 +2,9 @@ package io.github.adrianvic.nemesiseye.policy.policies; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; -import org.bukkit.util.BoundingBox; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import java.util.ArrayList; import java.util.List; -public record LocationPolicy(String name, List> locations, List nodes, boolean allowlist) implements Policy {} \ No newline at end of file +public record LocationPolicy(String name, List> locations, List nodes, boolean allowlist) implements Policy {} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java index df105cc..2509e39 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java @@ -1,5 +1,52 @@ package io.github.adrianvic.nemesiseye.reflection; +import io.github.adrianvic.nemesiseye.policy.Policy; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.io.File; +import java.util.List; +import java.util.Map; + public interface Glimmer { + File loadConfigFile(); + List loadPoliciesFromFile(File file); + List getApplyingPoliciesForEntity(HumanEntity entity, List policies); + void onLoad(); + ItemStack getItemInMainHandHumanEntity(HumanEntity entity); + boolean hasItemMeta(ItemStack item); + List getWorlds(); + boolean hasEnchantment(ItemStack item, Map valuesmap); + boolean hasAnyEnchantment(ItemStack itemStack); + + class Box { + public final double x1, y1, z1, x2, y2, z2; + + public Box(double x1, double y1, double z1, double x2, double y2, double z2) { + this.x1 = Math.min(x1, x2); + this.y1 = Math.min(y1, y2); + this.z1 = Math.min(z1, z2); + this.x2 = Math.max(x1, x2); + this.y2 = Math.max(y1, y2); + this.z2 = Math.max(z1, z2); + } + + public boolean contains(double x, double y, double z) { + return x >= x1 && x <= x2 + && y >= y1 && y <= y2 + && z >= z1 && z <= z2; + } + public boolean contains(Vector v) { + return v.getX() >= x1 && v.getX() <= x2 + && v.getY() >= y1 && v.getY() <= y2 + && v.getZ() >= z1 && v.getZ() <= z2; + } + + + public static Box of(Location loc1, Location loc2) { return new Box(loc1.getX(), loc1.getY(), loc1.getZ(), loc2.getX(), loc2.getY(), loc2.getZ()); } + } } diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index 522c8ec..baf80f2 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -103,7 +103,7 @@ Policies: - FISHING_ROD - CLOCK - GLOWSTONE_DUST - - INK_SAC + - INK_SACw - BONE_MEAL - SUGAR - COOKIE @@ -115,7 +115,7 @@ Policies: - DIRT - BREAD - useEnchantment: - "gibberish": 999999 + "theresnoenchantmentwiththisname": "3" locations: - corner1: { x: 2100, y: 256, z: 1400 } - corner2: { x: 1000, y: -64, z: 2200 } \ No newline at end of file + corner2: { x: 1000, y: -64, z: 2200 } diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java new file mode 100644 index 0000000..d1afe2d --- /dev/null +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java @@ -0,0 +1,25 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.Events; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class EventListener implements Listener { + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + Events.onBlockBreak(event); + } + + @EventHandler + public void onInteractionEvent(PlayerInteractEvent event) { + Events.onInteractionEvent(event); + } + + @EventHandler + public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { + Events.onEntityDamageByEntityEvent(event); + } +} diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java new file mode 100644 index 0000000..ca8c0ac --- /dev/null +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java @@ -0,0 +1,30 @@ +package io.github.adrianvic.nemesiseye.impl.commands; + +import io.github.adrianvic.nemesiseye.commands.EyeCore; +import io.github.adrianvic.nemesiseye.commands.sub.*; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class Eye implements CommandExecutor, TabCompleter { + private EyeCore core; + + public Eye() { + core = new EyeCore(); + } + + @Override + public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) { + return core.onCommand(commandSender, command, s, strings); + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String @NotNull [] strings) { + return core.onTabComplete(commandSender, command, s, strings); + } +} \ No newline at end of file diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java index 8bd126f..43d65dc 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -1,4 +1,116 @@ package io.github.adrianvic.nemesiseye.impl; -public class r1_21 { +import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.Nemesis; +import io.github.adrianvic.nemesiseye.impl.commands.Eye; +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyParsers; +import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class r1_21 implements Glimmer { + @Override + public File loadConfigFile() { + File file = new File(Nemesis.getInstance().getDataFolder(), "settings.yml"); + + if (!file.exists()) + Nemesis.getInstance().saveResource("settings.yml", false); + + return file; + } + + @Override + public List loadPoliciesFromFile(File file) { + YamlConfiguration config = new YamlConfiguration(); + config.options().parseComments(true); + + try { + config.load(file); + } catch (Exception e) { + e.printStackTrace(); + } + + List> rawPolicies = config.getMapList("Policies"); + List allPolicies = new ArrayList<>(); + for (Map map : rawPolicies) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { + List parsed = PolicyParsers.get(k).parse(v); + allPolicies.addAll(parsed); + } + } + } + return allPolicies; + } + + @Override + public List getApplyingPoliciesForEntity(HumanEntity entity, List policies) { + List applyingLPS = new ArrayList<>(); + for (Policy p : policies) { + if (p instanceof LocationPolicy lp) { + for (ArrayList boxes : lp.locations()) { + for (Box box : boxes) { + if (box.contains(entity.getLocation().toVector())) { + applyingLPS.add(lp); + } + } + } + } + } + return applyingLPS; + } + + @Override + public void onLoad() { + PluginManager pm = Nemesis.getInstance().getPluginManager(); + Nemesis.getInstance().getCommand("eye").setExecutor(new Eye()); + pm.registerEvents(new EventListener(), Nemesis.getInstance()); + } + + @Override + public ItemStack getItemInMainHandHumanEntity(HumanEntity entity) { + return entity.getInventory().getItemInMainHand(); + } + + @Override + public boolean hasItemMeta(ItemStack item) { + if (item.getItemMeta() == null) { + return false; + } + return true; + } + + @Override + public List getWorlds() { + return Bukkit.getWorlds(); + } + + @Override + public boolean hasEnchantment(ItemStack item, Map valuesmap) { + Map enchantmentList = item.getEnchantments(); + for (Map.Entry enchantmentEntry : enchantmentList.entrySet()) { + for (Map.Entry valueEntry : valuesmap.entrySet()) { + if (enchantmentEntry.getKey().getKey().getKey().equals(valueEntry.getKey()) && enchantmentEntry.getValue().toString().equals(valueEntry.getValue())) { + return true; + } + } + } + return false; + } + + public boolean hasAnyEnchantment(ItemStack item) { + return !(item.getItemMeta().getEnchants().isEmpty()); + } } From 4857bd155a2f6e192309793c4d2135f88d01355c Mon Sep 17 00:00:00 2001 From: adrian Date: Fri, 12 Dec 2025 21:42:27 -0300 Subject: [PATCH 07/45] Finished initial b1_7_3 implementation. --- build.gradle.kts | 2 +- .../nemesiseye/impl/BlockEventListener.java | 13 +++ .../nemesiseye/impl/ConfigurationEx.java | 89 +++++++++++++++++ .../nemesiseye/impl/EntityEventListener.java | 13 +++ .../github/adrianvic/nemesiseye/impl/Log.java | 41 ++++++++ .../nemesiseye/impl/PlayerEventListener.java | 15 +++ .../adrianvic/nemesiseye/impl/b1_7_3.java | 95 ++++++++++++++++++- .../nemesiseye/impl/commands/Eye.java | 19 ++++ src/b1_7_3/resources/plugin.yml | 7 +- .../github/adrianvic/nemesiseye/Nemesis.java | 2 +- src/r1_21/resources/plugin.yml | 2 +- 11 files changed, 291 insertions(+), 7 deletions(-) create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/ConfigurationEx.java create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/Log.java create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java create mode 100644 src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java diff --git a/build.gradle.kts b/build.gradle.kts index cc2bbf8..28061f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "io.github.adrianvic" -version = "1.0.2-SNAPSHOT" +version = "1.0.3-SNAPSHOT" repositories { mavenCentral() diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java new file mode 100644 index 0000000..bcad2f3 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java @@ -0,0 +1,13 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.Events; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockListener; + +public class BlockEventListener extends BlockListener { + @Override + public void onBlockBreak(BlockBreakEvent event) { + Events.onBlockBreak(event); + } + +} diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/ConfigurationEx.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/ConfigurationEx.java new file mode 100644 index 0000000..a4b3327 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/ConfigurationEx.java @@ -0,0 +1,89 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.Nemesis; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.config.Configuration; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; + +public class ConfigurationEx extends Configuration { + private final File configFile; + private final Log logger; + JavaPlugin plugin; + + public ConfigurationEx(String fileName, Log _logger) { + super(new File(Nemesis.getInstance().getDataFolder(), fileName)); + this.plugin = Nemesis.getInstance(); + logger = _logger; + this.configFile = new File(plugin.getDataFolder(), fileName); + } + + @Override + public void load() { + createParentDirectories(); + + if (!configFile.exists()) { + copyDefaultConfig(); + } + + try { + super.load(); + } catch (Exception e) { + logger.severe(String.format("Failed to load config '%s': %s", configFile.getName(), e.getMessage())); + } + } + + private void createParentDirectories() { + try { + Files.createDirectories(configFile.getParentFile().toPath()); + } catch (IOException e) { + logger.severe(String.format("Failed to generate default config directory: %s", e.getMessage())); + } + } + + private void copyDefaultConfig() { + // Load the config from the JAR directly (it is located at the root level) + String resourcePath = "/" + configFile.getName(); // Root path of JAR + + try (InputStream input = plugin.getClass().getResourceAsStream(resourcePath)) { + if (input == null) { + logger.severe(String.format("Default config '%s' wasn't found in the JAR.", configFile.getName())); + return; + } + + Files.copy(input, configFile.toPath()); + if (Files.exists(configFile.toPath())) { + logger.info(String.format("Default config '%s' generated successfully.", configFile.getName())); + } else { + logger.warning("We tried to generate the default config file, but it was not found even after the creation. Maybe your permissions are broken?"); + } + } catch (IOException e) { + logger.severe(String.format("Failed to generate default config '%s': %s", configFile.getName(), e.getMessage())); + } + } + + public void loadConfig() { + try { + this.load(); + logger.info(String.format("Config '%s' loaded successfully.", configFile.getName())); + } catch (Exception e) { + logger.severe(String.format("Failed to load config '%s': %s", configFile.getName(), e.getMessage())); + } + } + + public void saveConfig() { + try { + this.save(); + logger.info(String.format("Config '%s' saved successfully.", configFile.getName())); + } catch (Exception e) { + logger.severe(String.format("Failed to save config '%s': %s", configFile.getName(), e.getMessage())); + } + } + + public File getConfig() { + return configFile; + } +} \ No newline at end of file diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java new file mode 100644 index 0000000..c1e8966 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java @@ -0,0 +1,13 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.Events; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityListener; + +public class EntityEventListener extends EntityListener { + public void onEntityDamage(EntityDamageByEntityEvent event) { +// Events.onEntityDamageByEntityEvent(event); + event.setCancelled(true); + } +} + diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/Log.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/Log.java new file mode 100644 index 0000000..ccba8b1 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/Log.java @@ -0,0 +1,41 @@ +package io.github.adrianvic.nemesiseye.impl; + +import static org.bukkit.Bukkit.getServer; + +import io.github.adrianvic.nemesiseye.Nemesis; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPlugin; + +public class Log { + JavaPlugin plugin; + PluginDescriptionFile pdf; + + public Log() { + plugin = Nemesis.getInstance(); + pdf = plugin.getDescription(); + } + + public void info(String message) { + getServer().getLogger().info("[" + pdf.getName() + "] " + message); + } + + public void infoc(String message) { + getServer().getLogger().info("[" + pdf.getName() + "] " + message); + } + + public void warning(String message) { + getServer().getLogger().warning("[" + pdf.getName() + "] " + message); + } + + public void warningc(String message) { + getServer().getLogger().warning("[" + pdf.getName() + "] " + message); + } + + public void severe(String message) { + getServer().getLogger().severe("[" + pdf.getName() + "] " + message); + } + + public void severec(String message) { + getServer().getLogger().severe("[" + pdf.getName() + "] " + message); + } +} \ No newline at end of file diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java new file mode 100644 index 0000000..c45789a --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java @@ -0,0 +1,15 @@ +package io.github.adrianvic.nemesiseye.impl; + +import io.github.adrianvic.nemesiseye.Events; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockListener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerListener; + +public class PlayerEventListener extends PlayerListener { + @Override + public void onPlayerInteract(PlayerInteractEvent event) { + Events.onInteractionEvent(event); + } +} + diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java index 2620aab..f8d6fc8 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -1,19 +1,110 @@ package io.github.adrianvic.nemesiseye.impl; +import io.github.adrianvic.nemesiseye.Nemesis; +import io.github.adrianvic.nemesiseye.impl.commands.Eye; import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyParsers; +import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.World; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.Event; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; import java.io.File; +import java.util.ArrayList; import java.util.List; +import java.util.Map; public class b1_7_3 implements Glimmer { + JavaPlugin plugin; + PluginManager pm; + ConfigurationEx config; + @Override public File loadConfigFile() { - return null; + config = new ConfigurationEx("settings.yml", new Log()); + config.load(); + return config.getConfig(); } @Override public List loadPoliciesFromFile(File file) { - return List.of(); + List rawPolicies = config.getList("Policies"); + + if (rawPolicies == null) { + return new ArrayList<>(); + } + + List> result = new ArrayList<>(rawPolicies.size()); + + for (Object entry : rawPolicies) { + if (entry instanceof Map m) { + result.add(m); + } + } + + List allPolicies = new ArrayList<>(); + for (Map map : result) { + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { + List parsed = PolicyParsers.get(k).parse(v); + allPolicies.addAll(parsed); + } + } + } + return allPolicies; + } + + @Override + public List getApplyingPoliciesForEntity(HumanEntity entity, List policies) { + List result = new ArrayList<>(); + for (Policy p : policies) { + if (p instanceof LocationPolicy lp) { + for (List boxList : lp.locations()) { + for (Box b : boxList) { + if (b.contains(entity.getLocation().toVector())) result.add(p); + } + } + } + } + return result; + } + + @Override + public void onLoad() { + plugin = Nemesis.getInstance(); + pm = Nemesis.getInstance().getPluginManager(); + pm.registerEvent(Event.Type.ENTITY_DAMAGE, new EntityEventListener(), Event.Priority.Normal, plugin); + pm.registerEvent(Event.Type.BLOCK_BREAK, new BlockEventListener(), Event.Priority.Normal, plugin); + pm.registerEvent(Event.Type.PLAYER_INTERACT, new PlayerEventListener(), Event.Priority.Normal, plugin); + plugin.getCommand("eye").setExecutor(new Eye()); + } + + @Override + public ItemStack getItemInMainHandHumanEntity(HumanEntity entity) { + return entity.getItemInHand(); + } + + @Override + public boolean hasItemMeta(ItemStack item) { + return false; + } + + @Override + public List getWorlds() { + return plugin.getServer().getWorlds(); + } + + @Override + public boolean hasEnchantment(ItemStack item, Map valuesmap) { + return false; + } + + @Override + public boolean hasAnyEnchantment(ItemStack itemStack) { + return false; } } diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java new file mode 100644 index 0000000..c1f5da7 --- /dev/null +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java @@ -0,0 +1,19 @@ +package io.github.adrianvic.nemesiseye.impl.commands; + +import io.github.adrianvic.nemesiseye.commands.EyeCore; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +public class Eye implements CommandExecutor { + private EyeCore core; + + public Eye() { + core = new EyeCore(); + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String [] strings) { + return core.onCommand(commandSender, command, s, strings); + } +} \ No newline at end of file diff --git a/src/b1_7_3/resources/plugin.yml b/src/b1_7_3/resources/plugin.yml index b1b1232..e9c90d2 100644 --- a/src/b1_7_3/resources/plugin.yml +++ b/src/b1_7_3/resources/plugin.yml @@ -1,5 +1,8 @@ name: "Eye-of-Nemesis" -version: '1.0.2-SNAPSHOT' +version: '1.0.3-SNAPSHOT' main: io.github.adrianvic.nemesiseye.Nemesis author: 'Adrian Victor' -description: "Change what players can do based in custom criteria." \ No newline at end of file +description: "Change what players can do based in custom criteria." +commands: + eye: + description: "Run /eye help to see all available commands." \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java index 0618f50..b2bb00c 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java @@ -18,8 +18,8 @@ public final class Nemesis extends JavaPlugin { public void onEnable() { instance = this; glim = loadGlim(); - Config.getInstance().load(); glim.onLoad(); + Config.getInstance().load(); } private String readImplVersion() { diff --git a/src/r1_21/resources/plugin.yml b/src/r1_21/resources/plugin.yml index 5db0296..ec04a6b 100644 --- a/src/r1_21/resources/plugin.yml +++ b/src/r1_21/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Eye-of-Nemesis" -version: '1.0.2-SNAPSHOT' +version: '1.0.3-SNAPSHOT' main: io.github.adrianvic.nemesiseye.Nemesis api-version: '1.21' author: 'Adrian Victor' From 1f923283d8fa43ed8af045fa7ef6e7bd400db9c3 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sat, 13 Dec 2025 15:40:54 -0300 Subject: [PATCH 08/45] Set GitHub Sponsors username to 'adrianvic' Updated GitHub Sponsors username in FUNDING.yml --- .github/FUNDING.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..ac1941e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: adrianvic +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 7f65a8605d24d6cf0812c8c3a3e1705b83851518 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sat, 13 Dec 2025 17:13:32 -0300 Subject: [PATCH 09/45] Add image to README for Eye of Nemesis plugin --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d221c72..b4da786 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +eye_of_nemesis_social_cover + # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. From 7a3aa34b43c5febbf6b76daabc9cc57c38474300 Mon Sep 17 00:00:00 2001 From: adrian Date: Sun, 14 Dec 2025 14:51:33 -0300 Subject: [PATCH 10/45] Fixed EntityDamageByEntity not triggering because the method was not overriding and checked against the correct event. --- build.gradle.kts | 2 +- .../adrianvic/nemesiseye/impl/EntityEventListener.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 28061f0..d3f7b54 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -51,7 +51,7 @@ mcVersions.forEach { ver -> /* ----------------------------------------- */ dependencies { - add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") + add("compileOnly", files("libs/craftbukkit-1060.jar")) add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") add("b1_7_3CompileOnly", files("libs/craftbukkit-1060.jar")) } diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java index c1e8966..cf49da1 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java @@ -2,12 +2,12 @@ package io.github.adrianvic.nemesiseye.impl; import io.github.adrianvic.nemesiseye.Events; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityListener; public class EntityEventListener extends EntityListener { - public void onEntityDamage(EntityDamageByEntityEvent event) { -// Events.onEntityDamageByEntityEvent(event); - event.setCancelled(true); + @Override + public void onEntityDamage(EntityDamageEvent event) { + if (event instanceof EntityDamageByEntityEvent e) Events.onEntityDamageByEntityEvent(e); } -} - +} \ No newline at end of file From a5adc828dc3e5de836789d343e19ee54df3f2eb8 Mon Sep 17 00:00:00 2001 From: adrian Date: Sun, 14 Dec 2025 16:01:15 -0300 Subject: [PATCH 11/45] Fixed some warnings. --- build.gradle.kts | 2 +- .../adrianvic/nemesiseye/impl/PlayerEventListener.java | 2 -- .../java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java | 1 + .../io/github/adrianvic/nemesiseye/impl/commands/Eye.java | 2 +- src/main/java/io/github/adrianvic/nemesiseye/Config.java | 8 ++++---- src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java | 1 - .../io/github/adrianvic/nemesiseye/commands/EyeCore.java | 2 +- .../adrianvic/nemesiseye/commands/sub/PolicyInfo.java | 1 - .../nemesiseye/policy/handlers/useEnchantment.java | 2 +- .../adrianvic/nemesiseye/policy/handlers/useItem.java | 2 +- .../io/github/adrianvic/nemesiseye/impl/commands/Eye.java | 3 +-- .../java/io/github/adrianvic/nemesiseye/impl/r1_21.java | 7 ++----- 12 files changed, 13 insertions(+), 20 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d3f7b54..28061f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -51,7 +51,7 @@ mcVersions.forEach { ver -> /* ----------------------------------------- */ dependencies { - add("compileOnly", files("libs/craftbukkit-1060.jar")) + add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT") add("b1_7_3CompileOnly", files("libs/craftbukkit-1060.jar")) } diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java index c45789a..b77a56a 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java @@ -1,8 +1,6 @@ package io.github.adrianvic.nemesiseye.impl; import io.github.adrianvic.nemesiseye.Events; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockListener; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerListener; diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java index f8d6fc8..68783b1 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +@SuppressWarnings("unused") public class b1_7_3 implements Glimmer { JavaPlugin plugin; PluginManager pm; diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java index c1f5da7..b3db3e5 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java @@ -6,7 +6,7 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; public class Eye implements CommandExecutor { - private EyeCore core; + private final EyeCore core; public Eye() { core = new EyeCore(); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Config.java b/src/main/java/io/github/adrianvic/nemesiseye/Config.java index 5e286cd..52bc4dc 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Config.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Config.java @@ -9,7 +9,7 @@ import java.util.List; public class Config { private static Config instance = new Config(); - private Glimmer glim = Nemesis.getInstance().getGlimmer(); + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); private File file; private List policies = new ArrayList<>(); @@ -17,10 +17,10 @@ public class Config { private Config() {} public void load() { - List newPolicies = glim.loadPoliciesFromFile(glim.loadConfigFile()); - policies = newPolicies; + policies = glim.loadPoliciesFromFile(glim.loadConfigFile()); } - +// TODO: Implement config saving +// // public void save() { // try { // config.save(file); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java index b2bb00c..d232213 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java @@ -1,6 +1,5 @@ package io.github.adrianvic.nemesiseye; -import io.github.adrianvic.nemesiseye.commands.EyeCore; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java index 666bfab..38be35b 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -49,5 +49,5 @@ public class EyeCore { return List.of(); } - public Map getSubs() { return subs; }; + public Map getSubs() { return subs; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index d9460e5..20576cf 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -2,7 +2,6 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Config; import io.github.adrianvic.nemesiseye.policy.Policy; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import java.util.ArrayList; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java index 50df134..e34c28f 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java @@ -10,7 +10,7 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; public class useEnchantment implements NodeHandler { - private Glimmer glim = Nemesis.getInstance().getGlimmer(); + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java index d956816..a28a700 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java @@ -10,7 +10,7 @@ import org.bukkit.entity.HumanEntity; public class useItem implements NodeHandler { - private Glimmer glim = Nemesis.getInstance().getGlimmer(); + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override public boolean allows(HumanEntity entity, PolicyNode node, Action action) { diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java index ca8c0ac..e28b412 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/commands/Eye.java @@ -1,7 +1,6 @@ package io.github.adrianvic.nemesiseye.impl.commands; import io.github.adrianvic.nemesiseye.commands.EyeCore; -import io.github.adrianvic.nemesiseye.commands.sub.*; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -12,7 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; public class Eye implements CommandExecutor, TabCompleter { - private EyeCore core; + private final EyeCore core; public Eye() { core = new EyeCore(); diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java index 43d65dc..2d735eb 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -1,6 +1,5 @@ package io.github.adrianvic.nemesiseye.impl; -import io.github.adrianvic.nemesiseye.DataShifter; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.impl.commands.Eye; import io.github.adrianvic.nemesiseye.policy.Policy; @@ -20,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +@SuppressWarnings("unused") public class r1_21 implements Glimmer { @Override public File loadConfigFile() { @@ -86,10 +86,7 @@ public class r1_21 implements Glimmer { @Override public boolean hasItemMeta(ItemStack item) { - if (item.getItemMeta() == null) { - return false; - } - return true; + return item.getItemMeta() != null; } @Override From 42ab7e4d8964872d413f9b80d3407a9d067d34c6 Mon Sep 17 00:00:00 2001 From: adrian Date: Sun, 14 Dec 2025 16:25:18 -0300 Subject: [PATCH 12/45] Fixed attackWith that was returning !node.isWhitelist() instead of true whe it's not in effect. --- .../github/adrianvic/nemesiseye/policy/handlers/attackWith.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java index c4e159b..db54c09 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java @@ -20,6 +20,6 @@ public class attackWith implements NodeHandler { if (matches) return node.isWhitelist(); } } - return !node.isWhitelist(); + return true; } } From df606000732705d7fab91bf9ba28901c5f7aa967 Mon Sep 17 00:00:00 2001 From: adrian Date: Sun, 14 Dec 2025 23:36:20 -0300 Subject: [PATCH 13/45] Preparing Gradle build for automatic build from Actions. --- build.gradle.kts | 14 +++++++++++++- src/b1_7_3/resources/plugin.yml | 2 +- src/r1_21/resources/plugin.yml | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 28061f0..b7eea0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "io.github.adrianvic" -version = "1.0.3-SNAPSHOT" +version = System.getenv("NEMESIS_VERSION_NAME")?.take(7) ?: "1.0.3-SNAPSHOT" repositories { mavenCentral() @@ -24,6 +24,14 @@ val mcVersions = listOf( /* CREATE SOURCE SET PER VERSION */ /* ----------------------------------------- */ +tasks.withType { + inputs.property("version", project.version) + + filesMatching("plugin.yml") { + expand("version" to project.version) + } +} + mcVersions.forEach { ver -> val ss = sourceSets.create(ver) { java.srcDir("src/$ver/java") @@ -76,6 +84,10 @@ mcVersions.forEach { ver -> } } +tasks.register("buildAll") { + dependsOn(tasks.withType()) +} + /* ----------------------------------------- */ /* JAVA SETTINGS */ /* ----------------------------------------- */ diff --git a/src/b1_7_3/resources/plugin.yml b/src/b1_7_3/resources/plugin.yml index e9c90d2..3ed24e7 100644 --- a/src/b1_7_3/resources/plugin.yml +++ b/src/b1_7_3/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Eye-of-Nemesis" -version: '1.0.3-SNAPSHOT' +version: ${version} main: io.github.adrianvic.nemesiseye.Nemesis author: 'Adrian Victor' description: "Change what players can do based in custom criteria." diff --git a/src/r1_21/resources/plugin.yml b/src/r1_21/resources/plugin.yml index ec04a6b..da9278b 100644 --- a/src/r1_21/resources/plugin.yml +++ b/src/r1_21/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Eye-of-Nemesis" -version: '1.0.3-SNAPSHOT' +version: ${version} main: io.github.adrianvic.nemesiseye.Nemesis api-version: '1.21' author: 'Adrian Victor' From 6bce18a04de51c1c4651e28f64e2c22de89acab4 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:36:36 -0300 Subject: [PATCH 14/45] Create build.yml --- .github/workflows/build.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..8d4c4ca --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,27 @@ +name: Build + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6.0.1 + + - name: Setup Java enviroment + uses: actions/setup-java@v5.1.0 + with: + distribution: termurin + java-version: 21 + + - name: Setup Gradle + uses: gradle/actions@v5.0.0 + + - name: Build with Gradle + run: ./gradlew buildAll + + - name: Upload artifacts + uses: actions/upload-artifact@v6.0.0 + with: + path: build/libs/*.jar From f37ba38178ac882284db1dc40011a0ced9bbc9d5 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:40:04 -0300 Subject: [PATCH 15/45] Fix typo in Java distribution name --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d4c4ca..9ac4c60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Java enviroment uses: actions/setup-java@v5.1.0 with: - distribution: termurin + distribution: temurin java-version: 21 - name: Setup Gradle From 2ce90cd14a83f16d3a3607d52ebce535281a8a6b Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:41:27 -0300 Subject: [PATCH 16/45] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ac4c60..264bd14 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: java-version: 21 - name: Setup Gradle - uses: gradle/actions@v5.0.0 + uses: gradle/actions/setup-gradle@v5 - name: Build with Gradle run: ./gradlew buildAll From fcafe470aa132f28766cb416751618fda683942d Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:52:07 -0300 Subject: [PATCH 17/45] Update build.yml --- .github/workflows/build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 264bd14..7dcee92 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,12 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 - + + - name: Download CB1060 + run: | + mkdir -p libs + curl -L -o libs/craftbukkit-1060.jar https://archive.org/download/craftbukkit1060/craftbukkit1-7-3%281060%29.jar + - name: Build with Gradle run: ./gradlew buildAll From 5302092596d871fda193c120e17c6788ed02728e Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 15 Dec 2025 00:21:00 -0300 Subject: [PATCH 18/45] Build now concats "autobuild-" the commit sha to make the version string and sets unused build channel variable for future implementation. Added badges to README. --- .github/workflows/build.yml | 4 ++++ README.md | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7dcee92..9821057 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,11 @@ jobs: - name: Build with Gradle run: ./gradlew buildAll + - name: Upload artifacts uses: actions/upload-artifact@v6.0.0 with: path: build/libs/*.jar + env: + NEMESIS_VERSION_NAME: "autobuild-${{ github.sha }}" + NEMESIS_BUILD_CHANNEL: "autobuild" \ No newline at end of file diff --git a/README.md b/README.md index b4da786..4d8a7bf 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,24 @@ eye_of_nemesis_social_cover +[![Build status badge](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml/badge.svg)](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml) +![Modrinth link](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green&link=https%3A%2F%2Fmodrinth.com%2Fplugin%2Feye-of-nemesis%2F) + # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. ## Warnings -- Even though running `/eye` will tell you to run `/eye help` to list all available commands, this is not implemented yet, however all commands are available as tab-complete of `/eye`. - This plugin is in a very early stage. +- Even though running `/eye` will tell you to run `/eye help` to list all available commands, this is not implemented yet, however all commands are available as tab-complete of `/eye`. ## Motivations I made this plugin as an effort to preserve a village from my private server. Originally from beta 1.7.3 Betalands server, then transferred to RetroMC, and then finally we downloaded the chunks to merge into our server, I was afraid it would not have the same feeling after all the updates, so I had the idea to make a plugin that can block the newer features. +## Game version and loaders +Since version 1.0.3-SNAPSHOT, Eye of Nemesis has _reflection_, a technique that allows me to target multiple versions of the game while sharing the codebase across versions. + +Currently, we support the following Minecraft versions/loaders: +- **PaperMC** `1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10` +- **Bukkit** `b1.7.3 (CB1060)` + ## Performance This plugin is not scalable as it is and will end up running unoptimized checks when your players do things with policies in effect, I made it for a server with a few friends. I'll look forward into writing more performant code after all my other priorities are implemented. From 75b0259943af91bb16d0174dfa7918167ea34252 Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 15 Dec 2025 00:23:43 -0300 Subject: [PATCH 19/45] Fix build workflow env injecting. --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9821057..55bea5f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,9 @@ on: [push] jobs: build: runs-on: ubuntu-latest + env: + NEMESIS_VERSION_NAME: "autobuild-${{ github.sha }}" + NEMESIS_BUILD_CHANNEL: "autobuild" steps: - name: Checkout uses: actions/checkout@v6.0.1 @@ -30,7 +33,4 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v6.0.0 with: - path: build/libs/*.jar - env: - NEMESIS_VERSION_NAME: "autobuild-${{ github.sha }}" - NEMESIS_BUILD_CHANNEL: "autobuild" \ No newline at end of file + path: build/libs/*.jar \ No newline at end of file From 6250c48d815d2e76e34e170732b41a324b8a2cdb Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 15 Dec 2025 00:27:03 -0300 Subject: [PATCH 20/45] Stop truncating the version string in the gradle build file. --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index b7eea0c..694a1db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "io.github.adrianvic" -version = System.getenv("NEMESIS_VERSION_NAME")?.take(7) ?: "1.0.3-SNAPSHOT" +version = System.getenv("NEMESIS_VERSION_NAME") ?: "1.0.3-SNAPSHOT" repositories { mavenCentral() From 616a4b92e5376949c71f643b80517d46f79d96be Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 00:42:21 -0300 Subject: [PATCH 21/45] More badges! --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d8a7bf..c0f562c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ eye_of_nemesis_social_cover -[![Build status badge](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml/badge.svg)](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml) ![Modrinth link](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green&link=https%3A%2F%2Fmodrinth.com%2Fplugin%2Feye-of-nemesis%2F) +[![Build status badge](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml/badge.svg)](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml) +![GitHub Release](https://img.shields.io/github/v/release/adrianvic/NemesisEye?include_prereleases&style=flat&label=Latest%20Release) +![English Wiki Badge](https://img.shields.io/badge/English-White?style=flat-square&label=Wiki&color=black&link=https%3A%2F%2Fgithub.com%2Fadrianvic%2FNemesisEye%2Fwiki) +![Portuguese Wiki Badge](https://img.shields.io/badge/Portuguese-White?style=flat-square&label=Wiki&color=black&link=https%3A%2F%2Fmgr.rf.gd%2Fw%2FEye_of_Nemesis) # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. From 8ee5891dbac2939491f07f913e15ea818ca3ce72 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 00:47:44 -0300 Subject: [PATCH 22/45] Fix badges links. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c0f562c..ca7f2cb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ eye_of_nemesis_social_cover -![Modrinth link](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green&link=https%3A%2F%2Fmodrinth.com%2Fplugin%2Feye-of-nemesis%2F) +[![Modrinth Badge](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green)](https://modrinth.com/plugin/eye-of-nemesis) [![Build status badge](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml/badge.svg)](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml) -![GitHub Release](https://img.shields.io/github/v/release/adrianvic/NemesisEye?include_prereleases&style=flat&label=Latest%20Release) -![English Wiki Badge](https://img.shields.io/badge/English-White?style=flat-square&label=Wiki&color=black&link=https%3A%2F%2Fgithub.com%2Fadrianvic%2FNemesisEye%2Fwiki) -![Portuguese Wiki Badge](https://img.shields.io/badge/Portuguese-White?style=flat-square&label=Wiki&color=black&link=https%3A%2F%2Fmgr.rf.gd%2Fw%2FEye_of_Nemesis) +[![GitHub Release](https://img.shields.io/github/v/release/adrianvic/NemesisEye?include_prereleases&style=flat&label=Latest%20Release)](https://github.com/adrianvic/NemesisEye/releases) +[![English Wiki Badge](https://img.shields.io/badge/English-White?style=flat-square&label=Wiki&color=black)](https://github.com/adrianvic/NemesisEye/wiki) +[![Portuguese Wiki Badge](https://img.shields.io/badge/Portuguese-White?style=flat-square&label=Wiki&color=black)](https://mgr.rf.gd/w/Eye_of_Nemesis) # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. From 21df2cc7bfbeeac93ea591a4b5c2e268ba4e7668 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 00:54:44 -0300 Subject: [PATCH 23/45] Run build only when pushing changes to src/**, .github/** and Gradle files. --- .github/workflows/build.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55bea5f..c3c036b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,13 @@ name: Build -on: [push] +on: + push: + paths: + - 'src/**' + - '.github/**' + - 'build.gradle.kts' + - 'gradle.properties' + - 'settings.gradle' jobs: build: @@ -33,4 +40,4 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v6.0.0 with: - path: build/libs/*.jar \ No newline at end of file + path: build/libs/*.jar From 0b04c0553a8b196b9d93f3fcc21989f26eadedb0 Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 15 Dec 2025 02:09:09 -0300 Subject: [PATCH 24/45] Add sendCommand() on Glimmer because beta does not break line on sendMessage() line break. Subcommands are now mapped in the class Commands. Add usage() and description() to Subcommand. Add help command. --- README.md | 7 ++- .../adrianvic/nemesiseye/impl/b1_7_3.java | 9 ++++ .../nemesiseye/commands/Commands.java | 26 ++++++++++ .../nemesiseye/commands/EyeCore.java | 25 ++++------ .../commands/sub/CurrentPolicies.java | 15 ++++-- .../nemesiseye/commands/sub/Help.java | 47 +++++++++++++++++++ .../nemesiseye/commands/sub/ListPolicies.java | 16 ++++--- .../nemesiseye/commands/sub/PolicyInfo.java | 19 ++++++-- .../nemesiseye/commands/sub/Reload.java | 10 ++-- .../nemesiseye/commands/sub/Subcommand.java | 3 +- .../nemesiseye/reflection/Glimmer.java | 15 ++++-- .../adrianvic/nemesiseye/impl/r1_21.java | 6 +++ 12 files changed, 154 insertions(+), 44 deletions(-) create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java diff --git a/README.md b/README.md index 4d8a7bf..7223155 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,12 @@ [![Build status badge](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml/badge.svg)](https://github.com/adrianvic/NemesisEye/actions/workflows/build.yml) ![Modrinth link](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green&link=https%3A%2F%2Fmodrinth.com%2Fplugin%2Feye-of-nemesis%2F) +> [!IMPORTANT] +> This project is in a early stage, please report any bug you find. + # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. -## Warnings -- This plugin is in a very early stage. -- Even though running `/eye` will tell you to run `/eye help` to list all available commands, this is not implemented yet, however all commands are available as tab-complete of `/eye`. - ## Motivations I made this plugin as an effort to preserve a village from my private server. Originally from beta 1.7.3 Betalands server, then transferred to RetroMC, and then finally we downloaded the chunks to merge into our server, I was afraid it would not have the same feeling after all the updates, so I had the idea to make a plugin that can block the newer features. diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java index 68783b1..7ef72cf 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -7,6 +7,7 @@ import io.github.adrianvic.nemesiseye.policy.PolicyParsers; import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; import org.bukkit.event.Event; import org.bukkit.inventory.ItemStack; @@ -89,6 +90,14 @@ public class b1_7_3 implements Glimmer { return entity.getItemInHand(); } + @Override + public void sendMessage(CommandSender commandSender, String text) { + String[] lines = text.split("\\r?\\n"); + for (String line : lines) { + commandSender.sendMessage(line); + } + } + @Override public boolean hasItemMeta(ItemStack item) { return false; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java new file mode 100644 index 0000000..cc5e497 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java @@ -0,0 +1,26 @@ +package io.github.adrianvic.nemesiseye.commands; + +import io.github.adrianvic.nemesiseye.commands.sub.*; + +import java.util.HashMap; +import java.util.Map; + +public class Commands { + private static final Map commands = new HashMap<>(); + + static { + commands.put("help", new Help()); + commands.put("listpolicies", new ListPolicies()); + commands.put("currentpolicies", new CurrentPolicies()); + commands.put("policyinfo", new PolicyInfo()); + commands.put("reload", new Reload()); + } + + public static Map getAll() { + return commands; + } + + public static Subcommand get(String type) { + return commands.get(type); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java index 38be35b..542bdc0 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -2,33 +2,26 @@ package io.github.adrianvic.nemesiseye.commands; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.commands.sub.*; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import io.github.adrianvic.nemesiseye.commands.Commands; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import java.util.*; public class EyeCore { - public final Map subs = new HashMap<>(); + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); - public EyeCore() { - register(new Reload()); - register(new ListPolicies()); - register(new PolicyInfo()); - register(new CurrentPolicies()); - } - - private void register(Subcommand sub) { - subs.put(sub.name(), sub); - } + public EyeCore() {} public boolean onCommand(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 0) { - commandSender.sendMessage(""" + glim.sendMessage(commandSender, """ Eye of Nemesis version %s Usage: '/eye ' Use '/eye help' for a list of available commands """.formatted(Nemesis.getInstance().getDescription().getVersion())); } else { - Subcommand sub = subs.get(strings[0].toLowerCase()); + Subcommand sub = Commands.get(strings[0].toLowerCase()); if (sub == null) { commandSender.sendMessage("Unknown command, try '/eye help' to list available commands."); return true; @@ -40,14 +33,12 @@ public class EyeCore { public List onTabComplete(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 1) { - return new ArrayList<>(subs.keySet()); + return new ArrayList<>(Commands.getAll().keySet()); } - Subcommand sub = subs.get(strings[0].toLowerCase()); + Subcommand sub = Commands.get(strings[0].toLowerCase()); if (sub != null) { return sub.onTabComplete(commandSender, Arrays.copyOfRange(strings, 1, strings.length)); } return List.of(); } - - public Map getSubs() { return subs; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java index 09fa798..ba77e73 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java @@ -9,11 +9,6 @@ import java.util.ArrayList; import java.util.List; public class CurrentPolicies implements Subcommand { - @Override - public String name() { - return "currentpolicies"; - } - @Override public boolean execute(CommandSender commandSender, String[] args) { List policies = Validator.getPoliciesForEntity((HumanEntity) commandSender); @@ -34,4 +29,14 @@ public class CurrentPolicies implements Subcommand { public List onTabComplete(CommandSender sender, String[] args) { return List.of(); } + + @Override + public String description() { + return "Lists policies appliying to you."; + } + + @Override + public String usage() { + return ""; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java new file mode 100644 index 0000000..2ef436e --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java @@ -0,0 +1,47 @@ +package io.github.adrianvic.nemesiseye.commands.sub; + +import io.github.adrianvic.nemesiseye.Nemesis; +import io.github.adrianvic.nemesiseye.commands.Commands; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class Help implements Subcommand { + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); + + @Override + public boolean execute(CommandSender commandSender, String[] strings) { + List rstr = new ArrayList<>(); + Map allSubcommands = Commands.getAll(); + if (allSubcommands.isEmpty()) { + rstr.add("No commands found."); + } + for (Map.Entry e : allSubcommands.entrySet()) { + rstr.add(""" + %s - %s + Usage: /eye %s %s + """.formatted(e.getKey(), e.getValue().description(), e.getKey(), e.getValue())); + } + + glim.sendMessage(commandSender, String.join("\n", rstr)); + return true; + } + + @Override + public List onTabComplete(CommandSender sender, String[] strings) { + return List.of(); + } + + @Override + public String description() { + return "Lists all commands."; + } + + @Override + public String usage() { + return ""; + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java index cb866a1..bc1a028 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java @@ -8,12 +8,6 @@ import java.util.ArrayList; import java.util.List; public class ListPolicies implements Subcommand { - - @Override - public String name() { - return "listpolicies"; - } - @Override public boolean execute(CommandSender commandSender, String[] args) { List rstr = new ArrayList<>(); @@ -28,4 +22,14 @@ public class ListPolicies implements Subcommand { public List onTabComplete(CommandSender sender, String[] args) { return List.of(); } + + @Override + public String description() { + return "Lists all loaded policies."; + } + + @Override + public String usage() { + return ""; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index 20576cf..e2632b5 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -1,24 +1,23 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Config; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.command.CommandSender; import java.util.ArrayList; import java.util.List; public class PolicyInfo implements Subcommand { - @Override - public String name() { - return "policyinfo"; - } + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override public boolean execute(CommandSender commandSender, String[] strings) { List policies = Config.getInstance().getPolicies(); for (Policy policy : policies) { if (policy.name().equals(strings[0])) { - commandSender.sendMessage(String.format(""" + glim.sendMessage(commandSender, String.format(""" Showing info for policy "%s": Type: %s Nodes: %s @@ -37,4 +36,14 @@ public class PolicyInfo implements Subcommand { } return rstr; } + + @Override + public String description() { + return "Shows info for a specified policy."; + } + + @Override + public String usage() { + return ""; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java index 23f1659..48800b6 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java @@ -6,7 +6,6 @@ import org.bukkit.command.CommandSender; import java.util.List; public class Reload implements Subcommand { - @Override public boolean execute(CommandSender commandSender, String [] strings) { Config.getInstance().load(); @@ -20,7 +19,12 @@ public class Reload implements Subcommand { } @Override - public String name() { - return "reload"; + public String description() { + return "Reloads the plugin configuration file."; + } + + @Override + public String usage() { + return ""; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java index 1ea9426..cc25614 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java @@ -5,7 +5,8 @@ import org.bukkit.command.CommandSender; import java.util.List; public interface Subcommand { - String name(); + String description(); + String usage(); @SuppressWarnings("SameReturnValue") boolean execute(CommandSender commandSender, String[] strings); List onTabComplete(CommandSender sender, String[] strings); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java index 2509e39..69f5fff 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java @@ -3,6 +3,7 @@ package io.github.adrianvic.nemesiseye.reflection; import io.github.adrianvic.nemesiseye.policy.Policy; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; @@ -12,15 +13,23 @@ import java.util.List; import java.util.Map; public interface Glimmer { + void onLoad(); + + List getWorlds(); + + // Configuration File loadConfigFile(); List loadPoliciesFromFile(File file); List getApplyingPoliciesForEntity(HumanEntity entity, List policies); - void onLoad(); - ItemStack getItemInMainHandHumanEntity(HumanEntity entity); + + // Items boolean hasItemMeta(ItemStack item); - List getWorlds(); boolean hasEnchantment(ItemStack item, Map valuesmap); boolean hasAnyEnchantment(ItemStack itemStack); + ItemStack getItemInMainHandHumanEntity(HumanEntity entity); + + // Commands + void sendMessage(CommandSender commandSender, String text); class Box { public final double x1, y1, z1, x2, y2, z2; diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java index 2d735eb..b406742 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -8,6 +8,7 @@ import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.HumanEntity; @@ -84,6 +85,11 @@ public class r1_21 implements Glimmer { return entity.getInventory().getItemInMainHand(); } + @Override + public void sendMessage(CommandSender commandSender, String text) { + commandSender.sendMessage(text); + } + @Override public boolean hasItemMeta(ItemStack item) { return item.getItemMeta() != null; From 81bf64c463ddab65d093d4ca03e6d3e06da58f72 Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 15 Dec 2025 14:16:07 -0300 Subject: [PATCH 25/45] Policies now provide their own checks to whether the player applies or not. Added GlobalPolicy. Revamped config YAML structure for more consistency. Added ChatColor back to commands, should be correctly implemented in the future. Build environment is now passed to plugin manifest. Added workflow to automatically build releases. --- .github/workflows/release-build.yml | 44 +++++++ README.md | 2 +- build.gradle.kts | 5 +- .../adrianvic/nemesiseye/impl/b1_7_3.java | 26 +--- src/b1_7_3/resources/settings.yml | 9 ++ .../adrianvic/nemesiseye/DataShifter.java | 42 +++++- .../adrianvic/nemesiseye/Validator.java | 6 +- .../nemesiseye/commands/EyeCore.java | 6 +- .../nemesiseye/commands/sub/PolicyInfo.java | 5 +- .../adrianvic/nemesiseye/policy/Policy.java | 6 +- .../nemesiseye/policy/PolicyNode.java | 18 +-- .../nemesiseye/policy/PolicyParser.java | 4 +- .../nemesiseye/policy/PolicyParsers.java | 4 +- .../policy/parser/GlobalPolicyParser.java | 32 +++++ .../policy/parser/LocationPolicyParser.java | 46 +------ .../policy/policies/GlobalPolicy.java | 13 ++ .../policy/policies/LocationPolicy.java | 12 +- .../nemesiseye/reflection/Glimmer.java | 2 - src/main/resources/settings.yml | 121 ------------------ .../adrianvic/nemesiseye/impl/r1_21.java | 29 +---- src/r1_21/resources/settings.yml | 121 ++++++++++++++++++ 21 files changed, 312 insertions(+), 241 deletions(-) create mode 100644 .github/workflows/release-build.yml create mode 100644 src/b1_7_3/resources/settings.yml create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java delete mode 100644 src/main/resources/settings.yml create mode 100644 src/r1_21/resources/settings.yml diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml new file mode 100644 index 0000000..3ed2ff0 --- /dev/null +++ b/.github/workflows/release-build.yml @@ -0,0 +1,44 @@ +name: Release Build + +on: + release: + types: [created] + +jobs: + build-and-release: + runs-on: ubuntu-latest + env: + NEMESIS_VERSION_NAME: "${{ github.ref_name }}" + NEMESIS_BUILD_CHANNEL: "production" + steps: + - name: Checkout + uses: actions/checkout@v6.0.1 + + - name: Set up Java + uses: actions/setup-java@v5.1.0 + with: + distribution: temurin + java-version: 21 + + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v5 + + - name: Download CB1060 + run: | + mkdir -p libs + curl -L -o libs/craftbukkit-1060.jar \ + https://archive.org/download/craftbukkit1060/craftbukkit1-7-3%281060%29.jar + + - name: Build with Gradle + run: ./gradlew buildAll + + - name: Upload JARs to release + uses: softprops/action-gh-release@v2.5.0 + with: + files: build/libs/*.jar + tag_name: ${{ github.ref_name }} + name: ${{ github.ref_name }} + body: | + Automated build for release **${{ github.ref_name }}**. + Includes the following artifacts: + - `$(ls build/libs/*.jar | tr '\n' '\n' | sed 's/^/ - /')` diff --git a/README.md b/README.md index edc86f3..e771bc2 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Portuguese Wiki Badge](https://img.shields.io/badge/Portuguese-White?style=flat-square&label=Wiki&color=black)](https://mgr.rf.gd/w/Eye_of_Nemesis) > [!IMPORTANT] -> This project is in a early stage, please report any bug you find. +> This project is in an early stage, please report any bug you find. # Eye of Nemesis Eye of Nemesis is a plugin that allows server admins to write policies that will deny or allow (black/whitelist) players to do specific things based on the value of nodes. diff --git a/build.gradle.kts b/build.gradle.kts index 694a1db..4aabc3c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "io.github.adrianvic" -version = System.getenv("NEMESIS_VERSION_NAME") ?: "1.0.3-SNAPSHOT" +version = System.getenv("NEMESIS_VERSION_NAME") ?: "unknown" repositories { mavenCentral() @@ -77,7 +77,8 @@ mcVersions.forEach { ver -> manifest { attributes( - "Nemesis-Impl-Version" to ver + "Nemesis-Impl-Version" to ver, + "Nemesis-Environment" to (System.getenv("NEMESIS_BUILD_CHANNEL") ?: "dev") ) } diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java index 7ef72cf..19d08fb 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/b1_7_3.java @@ -4,7 +4,6 @@ import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.impl.commands.Eye; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyParsers; -import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.World; import org.bukkit.command.CommandSender; @@ -49,30 +48,13 @@ public class b1_7_3 implements Glimmer { } List allPolicies = new ArrayList<>(); - for (Map map : result) { - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { - List parsed = PolicyParsers.get(k).parse(v); - allPolicies.addAll(parsed); - } + for (Map policyMap : result) { + if (policyMap.get("type") != null && policyMap.get("type") instanceof String type) { + allPolicies.add(PolicyParsers.get(type).parse(policyMap)); } } - return allPolicies; - } - @Override - public List getApplyingPoliciesForEntity(HumanEntity entity, List policies) { - List result = new ArrayList<>(); - for (Policy p : policies) { - if (p instanceof LocationPolicy lp) { - for (List boxList : lp.locations()) { - for (Box b : boxList) { - if (b.contains(entity.getLocation().toVector())) result.add(p); - } - } - } - } - return result; + return allPolicies; } @Override diff --git a/src/b1_7_3/resources/settings.yml b/src/b1_7_3/resources/settings.yml new file mode 100644 index 0000000..09921c7 --- /dev/null +++ b/src/b1_7_3/resources/settings.yml @@ -0,0 +1,9 @@ +Policies: + # NO SPACES + - name: "Block-illegal-items" + type: global # global / location / permission / list of types + allowList: false # Will deny anything that's not allowed by the nodes if set to true + nodes: + - useItem: + value: + - SAND \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java index b9edf4a..39331d6 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java @@ -1,5 +1,8 @@ package io.github.adrianvic.nemesiseye; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.Location; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -7,6 +10,7 @@ import java.util.Map; import java.util.regex.Pattern; public class DataShifter { + public static boolean safeMatches(String expression, String against) { String cleanPattern = expression.trim(); Pattern pattern = Pattern.compile(cleanPattern, Pattern.CASE_INSENSITIVE); @@ -40,14 +44,38 @@ public class DataShifter { return out; } - public static List> parseValueToListOfMaps(List values) { - List> result = new ArrayList<>(); + public static List configLocationParser(Object rawLocations) { + Glimmer glim = Nemesis.getInstance().getGlimmer(); - for (Object o : values) { - if (o instanceof Map raw) { - result.add(raw); - } + if (rawLocations == null) { + return List.of(); } - return result; + + // Parsing locations + List groups = rawLocations instanceof List ? (List) rawLocations : List.of(); + + ArrayList boxes = new ArrayList<>(groups.size()); + + // Now iterate over regions + for (Object rObj : groups) { + Map region = (Map) rObj; + Map c1 = (Map) region.get("corner1"); + Map c2 = (Map) region.get("corner2"); + + double x1 = ((Number) c1.get("x")).doubleValue(); + double y1 = ((Number) c1.get("y")).doubleValue(); + double z1 = ((Number) c1.get("z")).doubleValue(); + + double x2 = ((Number) c2.get("x")).doubleValue(); + double y2 = ((Number) c2.get("y")).doubleValue(); + double z2 = ((Number) c2.get("z")).doubleValue(); + + Location loc1 = new Location(glim.getWorlds().getFirst(), x1, y1, z1); + Location loc2 = new Location(glim.getWorlds().getFirst(), x2, y2, z2); + + boxes.add(Glimmer.Box.of(loc1, loc2)); + } + + return boxes; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java index bd445cd..ade192d 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java @@ -48,6 +48,10 @@ public class Validator { public static List getPoliciesForEntity(HumanEntity entity) { List ps = Config.getInstance().getPolicies(); - return glim.getApplyingPoliciesForEntity(entity, ps); + List result = new ArrayList<>(); + for (Policy policy : ps) { + if (policy.applies(entity)) result.add(policy); + } + return result; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java index 542bdc0..3ce2bb0 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -3,7 +3,7 @@ package io.github.adrianvic.nemesiseye.commands; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.commands.sub.*; import io.github.adrianvic.nemesiseye.reflection.Glimmer; -import io.github.adrianvic.nemesiseye.commands.Commands; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import java.util.*; @@ -16,10 +16,10 @@ public class EyeCore { public boolean onCommand(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 0) { glim.sendMessage(commandSender, """ - Eye of Nemesis version %s + %sEye of Nemesis%s version %s%s%s Usage: '/eye ' Use '/eye help' for a list of available commands - """.formatted(Nemesis.getInstance().getDescription().getVersion())); + """.formatted(ChatColor.AQUA, ChatColor.WHITE, ChatColor.GRAY, Nemesis.getInstance().getDescription().getVersion(), ChatColor.WHITE)); } else { Subcommand sub = Commands.get(strings[0].toLowerCase()); if (sub == null) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index e2632b5..b5e898a 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -4,6 +4,7 @@ import io.github.adrianvic.nemesiseye.Config; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import java.util.ArrayList; @@ -18,11 +19,11 @@ public class PolicyInfo implements Subcommand { for (Policy policy : policies) { if (policy.name().equals(strings[0])) { glim.sendMessage(commandSender, String.format(""" - Showing info for policy "%s": + Showing info for policy %s%s%s: Type: %s Nodes: %s %s - """, policy.name(), "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); + """, ChatColor.GREEN, policy.name(), ChatColor.WHITE, "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); } } return true; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java index 6eb868d..42b3382 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java @@ -1,13 +1,13 @@ package io.github.adrianvic.nemesiseye.policy; +import org.bukkit.entity.HumanEntity; + import java.util.List; public interface Policy { String name(); List nodes(); boolean allowlist(); + boolean applies(HumanEntity entity); - default PolicyParser getParser() { - return PolicyParsers.get(""); - } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java index b8dc7de..2192821 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java @@ -14,15 +14,17 @@ public record PolicyNode(String type, List values, boolean isWhitelist) List values = new ArrayList<>(); Object val = entry.getValue(); - if (val instanceof String s) { - values.add(s); - } else if (val instanceof List l) { - values.addAll(l); - } else if (val instanceof Map map) { - values.add(map); - } + if (val instanceof Map valMap) { + if (valMap.get("values") instanceof String s) { + values.add(s); + } else if (valMap.get("values") instanceof List l) { + values.addAll(l); + } else if (valMap.get("values") instanceof Map map) { + values.add(map); + } - nodes.add(new PolicyNode(type, values, isWhitelist)); + nodes.add(new PolicyNode(type, values, isWhitelist)); + } } } return nodes; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java index 9e5b546..ecddd33 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java @@ -1,7 +1,7 @@ package io.github.adrianvic.nemesiseye.policy; -import java.util.List; +import java.util.Map; public interface PolicyParser { - List parse(List raw); + Policy parse(Map raw); } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java index 7047021..9f256af 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java @@ -1,5 +1,6 @@ package io.github.adrianvic.nemesiseye.policy; +import io.github.adrianvic.nemesiseye.policy.parser.GlobalPolicyParser; import io.github.adrianvic.nemesiseye.policy.parser.LocationPolicyParser; import java.util.HashMap; @@ -9,7 +10,8 @@ public class PolicyParsers { private static final Map handlers = new HashMap<>(); static { - handlers.put("Location", new LocationPolicyParser()); + handlers.put("location", new LocationPolicyParser()); + handlers.put("global", new GlobalPolicyParser()); } public static PolicyParser get(String type) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java new file mode 100644 index 0000000..8716f02 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java @@ -0,0 +1,32 @@ +package io.github.adrianvic.nemesiseye.policy.parser; + +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.policy.PolicyParser; +import io.github.adrianvic.nemesiseye.policy.policies.GlobalPolicy; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class GlobalPolicyParser implements PolicyParser { + @Override + public Policy parse(Map raw) { + boolean allowlist = (boolean) raw.get("allowList"); + String name = (String) raw.get("name"); + + // Nodes + Object rawNodes = raw.get("nodes"); + List> nodeList = new ArrayList<>(); + if (rawNodes instanceof List list) { + for (Object o : list) { + if (o instanceof Map map) + nodeList.add((Map) map); + } + } + + List nodes = PolicyNode.parseNodes(nodeList, allowlist); + + return new GlobalPolicy(name, nodes, allowlist); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java index e96611f..cacf4e9 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java @@ -5,7 +5,6 @@ import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.*; import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; -import org.bukkit.Location; import java.util.ArrayList; import java.util.List; @@ -14,16 +13,12 @@ import java.util.Map; public class LocationPolicyParser implements PolicyParser { private Glimmer glim = Nemesis.getInstance().getGlimmer(); - public List parse(List raw) { - List out = new ArrayList<>(raw.size()); - List> parsedRawMap = DataShifter.parseValueToListOfMaps(raw); - - for (Map m : parsedRawMap) { - String name = (String) m.get("name"); - boolean allowlist = Boolean.TRUE.equals(m.get("allowList")); + public Policy parse(Map raw) { + String name = (String) raw.get("name"); + boolean allowlist = Boolean.TRUE.equals(raw.get("allowList")); // Nodes - Object rawNodes = m.get("nodes"); + Object rawNodes = raw.get("nodes"); List> nodeList = new ArrayList<>(); if (rawNodes instanceof List list) { for (Object o : list) { @@ -34,37 +29,8 @@ public class LocationPolicyParser implements PolicyParser { List nodes = PolicyNode.parseNodes(nodeList, allowlist); - // Parsing locations - List> locations = new ArrayList<>(); + List locations = DataShifter.configLocationParser(raw.get("locations")); - Object rawLocations = m.get("locations"); - List groups = rawLocations instanceof List ? (List) rawLocations : List.of(); - - ArrayList boxes = new ArrayList<>(groups.size()); - - // Now iterate over regions - for (Object rObj : groups) { - Map region = (Map) rObj; - Map c1 = (Map) region.get("corner1"); - Map c2 = (Map) region.get("corner2"); - - double x1 = ((Number) c1.get("x")).doubleValue(); - double y1 = ((Number) c1.get("y")).doubleValue(); - double z1 = ((Number) c1.get("z")).doubleValue(); - - double x2 = ((Number) c2.get("x")).doubleValue(); - double y2 = ((Number) c2.get("y")).doubleValue(); - double z2 = ((Number) c2.get("z")).doubleValue(); - - Location loc1 = new Location(glim.getWorlds().getFirst(), x1, y1, z1); - Location loc2 = new Location(glim.getWorlds().getFirst(), x2, y2, z2); - - boxes.add(Glimmer.Box.of(loc1, loc2)); - } - locations.add(boxes); - - out.add(new LocationPolicy(name, locations, nodes, allowlist)); - } - return out; + return new LocationPolicy(name, locations, nodes, allowlist); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java new file mode 100644 index 0000000..c9797a0 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java @@ -0,0 +1,13 @@ +package io.github.adrianvic.nemesiseye.policy.policies; + +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import org.bukkit.entity.HumanEntity; + +import java.util.List; + +public record GlobalPolicy(String name, List nodes, boolean allowlist) implements Policy { + public boolean applies(HumanEntity entity) { + return true; + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java index 48c9a97..8e63cf6 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java @@ -3,8 +3,16 @@ package io.github.adrianvic.nemesiseye.policy.policies; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.entity.HumanEntity; -import java.util.ArrayList; import java.util.List; -public record LocationPolicy(String name, List> locations, List nodes, boolean allowlist) implements Policy {} \ No newline at end of file +public record LocationPolicy(String name, List locations, List nodes, boolean allowlist) implements Policy { + @Override + public boolean applies(HumanEntity entity) { + for (Glimmer.Box box : locations) { + if (box.contains(entity.getLocation().toVector())) return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java index 69f5fff..ec5aa5d 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java @@ -20,7 +20,6 @@ public interface Glimmer { // Configuration File loadConfigFile(); List loadPoliciesFromFile(File file); - List getApplyingPoliciesForEntity(HumanEntity entity, List policies); // Items boolean hasItemMeta(ItemStack item); @@ -54,7 +53,6 @@ public interface Glimmer { && v.getZ() >= z1 && v.getZ() <= z2; } - public static Box of(Location loc1, Location loc2) { return new Box(loc1.getX(), loc1.getY(), loc1.getZ(), loc2.getX(), loc2.getY(), loc2.getZ()); } } diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml deleted file mode 100644 index baf80f2..0000000 --- a/src/main/resources/settings.yml +++ /dev/null @@ -1,121 +0,0 @@ -Policies: - - Location: - # NO SPACES - - name: "Beta-1.7.3-items-only" - # Will deny anything that's not allowed by the nodes if set to true - allowList: true - nodes: - - useItem: - - AIR - - STONE - - COBBLESTONE - - "^(OAK|SPRUCE|BIRCH)_(LOG|SAPLING|PLANKS|LEAVES)$" - - "^(DIAMOND|GOLD|IRON|COAL|LAPIS|REDSTONE)_ORE$" - - "^(DIAMOND|GOLD|IRON|LAPIS)_BLOCK$" - - GRAVEL - - BEDROCK - - SAND - - SPONGE - - WET_SPONGE - - GLASS - - LAPIS_LAZULI - - COBWEB - - PISTON - - STICKY_PISTON - - GRASS - - DISPENSER - - NOTE_BLOCK - - SANDSTONE - - RED_BED - - "^(POWERED|DETECTOR)_RAIL$" - - RAIL - - SHORT_GRASS - - "^(WHITE|BLACK|GREEN|YELLOW|PINK|PURPLE|CYAN|BLUE|RED|LIME|BROWN|LIGHT_GRAY|GRAY)_(WOOL|DYE)$" - - POPPY - - DANDELION - - "^(RED|BROWN)_MUSHROOM$" - - "^(OAK|COBBLESTONE)_SLAB$" - - BRICK_BLOCK - - TNT - - BOOKSHELF - - OBSIDIAN - - MOSSY_COBBLESTONE - - TORCH - - SPAWNER - - REDSTONE - - CHEST - - CRAFTING_TABLE - - FARMLAND - - FURNACE - - SIGN - - LADDER - - "^(COBBLESTONE|OAK)_STAIRS$" - - LEVER - - "^(OAK|STONE)_PRESSURE_PLATE$" - - "^(OAK|IRON)_DOOR$" - - BLUE_ICE - - REDSTONE_TORCH - - STONE_BUTTON - - SNOW - - SNOW_BLOCK - - CLAY - - SUGAR_CANE - - JUKEBOX - - OAK_FENCE - - PUMPKIN - - NETHERRACK - - SOUL_SAND - - GLOWSTONE - - JACK_O_LANTERN - - CAKE - - REPEATER - - OAK_TRAPDOOR - - "^(IRON|STONE|DIAMOND|WOODEN|GOLDEN)_(SHOVEL|AXE|PICKAXE|SWORD|HOE)$" - - "^(IRON|LEATHER|DIAMOND|GOLDEN)_(HELMET|CHESTPLATE|LEGGINGS|BOOTS)$" - - STICK - - BOWL - - MUSHROOM_STEW - - FEATHER - - STRING - - GUNPOWDER - - WHEAT_SEEDS - - WHEAT - - FLINT - - FLINT_AND_STEEL - - PORKCHOP - - "^(COOKED|RAW)_(PORKCHOP|FISH)$" - - PAINTING - - GOLDEN_APPLE - - BUCKET - - "^(LAVA|MILK|WATER)_BUCKET$" - - MINECART - - SADDLE - - SNOWBALL - - OAK_BOAT - - LEATHER - - "^(FURNACE|CHEST)_MINECART$" - - EGG - - BOOK - - PAPER - - BRICK - - SLIME_BALL - - COMPASS - - FISHING_ROD - - CLOCK - - GLOWSTONE_DUST - - INK_SACw - - BONE_MEAL - - SUGAR - - COOKIE - - MAP - - FILLED_MAP - - SHEARS - - MUSIC_DISK_CAT - - MUSIC_DISK_13 - - DIRT - - BREAD - - useEnchantment: - "theresnoenchantmentwiththisname": "3" - locations: - - corner1: { x: 2100, y: 256, z: 1400 } - corner2: { x: 1000, y: -64, z: 2200 } diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java index b406742..3cdd6fd 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -4,7 +4,6 @@ import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.impl.commands.Eye; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyParsers; -import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import org.bukkit.Bukkit; import org.bukkit.World; @@ -45,32 +44,14 @@ public class r1_21 implements Glimmer { List> rawPolicies = config.getMapList("Policies"); List allPolicies = new ArrayList<>(); - for (Map map : rawPolicies) { - for (Map.Entry entry : map.entrySet()) { - if (entry.getKey() instanceof String k && entry.getValue() instanceof List v) { - List parsed = PolicyParsers.get(k).parse(v); - allPolicies.addAll(parsed); - } - } - } - return allPolicies; - } - @Override - public List getApplyingPoliciesForEntity(HumanEntity entity, List policies) { - List applyingLPS = new ArrayList<>(); - for (Policy p : policies) { - if (p instanceof LocationPolicy lp) { - for (ArrayList boxes : lp.locations()) { - for (Box box : boxes) { - if (box.contains(entity.getLocation().toVector())) { - applyingLPS.add(lp); - } - } - } + for (Map policyMap : rawPolicies) { + if (policyMap.get("type") != null && policyMap.get("type") instanceof String type) { + allPolicies.add(PolicyParsers.get(type).parse(policyMap)); } } - return applyingLPS; + + return allPolicies; } @Override diff --git a/src/r1_21/resources/settings.yml b/src/r1_21/resources/settings.yml new file mode 100644 index 0000000..0336fb6 --- /dev/null +++ b/src/r1_21/resources/settings.yml @@ -0,0 +1,121 @@ +Policies: + # NO SPACES + - name: "Beta-1.7.3-items-only" + type: "location" + allowList: true # Will deny anything that's not allowed by the nodes if set to true + locations: + - corner1: { x: 2100, y: 256, z: 1400 } + corner2: { x: 1000, y: -64, z: 2200 } + nodes: + - useItem: + values: + - AIR + - STONE + - COBBLESTONE + - "^(OAK|SPRUCE|BIRCH)_(LOG|SAPLING|PLANKS|LEAVES)$" + - "^(DIAMOND|GOLD|IRON|COAL|LAPIS|REDSTONE)_ORE$" + - "^(DIAMOND|GOLD|IRON|LAPIS)_BLOCK$" + - GRAVEL + - BEDROCK + - SAND + - SPONGE + - WET_SPONGE + - GLASS + - LAPIS_LAZULI + - COBWEB + - PISTON + - STICKY_PISTON + - GRASS + - DISPENSER + - NOTE_BLOCK + - SANDSTONE + - RED_BED + - "^(POWERED|DETECTOR)_RAIL$" + - RAIL + - SHORT_GRASS + - "^(WHITE|BLACK|GREEN|YELLOW|PINK|PURPLE|CYAN|BLUE|RED|LIME|BROWN|LIGHT_GRAY|GRAY)_(WOOL|DYE)$" + - POPPY + - DANDELION + - "^(RED|BROWN)_MUSHROOM$" + - "^(OAK|COBBLESTONE)_SLAB$" + - BRICK_BLOCK + - TNT + - BOOKSHELF + - OBSIDIAN + - MOSSY_COBBLESTONE + - TORCH + - SPAWNER + - REDSTONE + - CHEST + - CRAFTING_TABLE + - FARMLAND + - FURNACE + - SIGN + - LADDER + - "^(COBBLESTONE|OAK)_STAIRS$" + - LEVER + - "^(OAK|STONE)_PRESSURE_PLATE$" + - "^(OAK|IRON)_DOOR$" + - BLUE_ICE + - REDSTONE_TORCH + - STONE_BUTTON + - SNOW + - SNOW_BLOCK + - CLAY + - SUGAR_CANE + - JUKEBOX + - OAK_FENCE + - PUMPKIN + - NETHERRACK + - SOUL_SAND + - GLOWSTONE + - JACK_O_LANTERN + - CAKE + - REPEATER + - OAK_TRAPDOOR + - "^(IRON|STONE|DIAMOND|WOODEN|GOLDEN)_(SHOVEL|AXE|PICKAXE|SWORD|HOE)$" + - "^(IRON|LEATHER|DIAMOND|GOLDEN)_(HELMET|CHESTPLATE|LEGGINGS|BOOTS)$" + - STICK + - BOWL + - MUSHROOM_STEW + - FEATHER + - STRING + - GUNPOWDER + - WHEAT_SEEDS + - WHEAT + - FLINT + - FLINT_AND_STEEL + - PORKCHOP + - "^(COOKED|RAW)_(PORKCHOP|FISH)$" + - PAINTING + - GOLDEN_APPLE + - BUCKET + - "^(LAVA|MILK|WATER)_BUCKET$" + - MINECART + - SADDLE + - SNOWBALL + - OAK_BOAT + - LEATHER + - "^(FURNACE|CHEST)_MINECART$" + - EGG + - BOOK + - PAPER + - BRICK + - SLIME_BALL + - COMPASS + - FISHING_ROD + - CLOCK + - GLOWSTONE_DUST + - INK_SACw + - BONE_MEAL + - SUGAR + - COOKIE + - MAP + - FILLED_MAP + - SHEARS + - MUSIC_DISK_CAT + - MUSIC_DISK_13 + - DIRT + - BREAD + - useEnchantment: + "flying bananas": "0" \ No newline at end of file From d4510a7257a9846671c4c918908c1e22d8feaa82 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:26:52 -0300 Subject: [PATCH 26/45] Update release-build.yml --- .github/workflows/release-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 3ed2ff0..41e1923 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -2,7 +2,7 @@ name: Release Build on: release: - types: [created] + types: [created, published] jobs: build-and-release: From 80591dc8a74392cffbe9f57ace39243dad07a6a6 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:36:34 -0300 Subject: [PATCH 27/45] Only run release-build when publishing a release --- .github/workflows/release-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 41e1923..df07ecd 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -2,8 +2,8 @@ name: Release Build on: release: - types: [created, published] - + types: [published] + jobs: build-and-release: runs-on: ubuntu-latest From 9180807f0a0e1cf2d610544495eea4487342c9d9 Mon Sep 17 00:00:00 2001 From: Tenkuma <85490958+adrianvic@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:46:23 -0300 Subject: [PATCH 28/45] Update release-build.yml --- .github/workflows/release-build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index df07ecd..dcc83d3 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -38,7 +38,3 @@ jobs: files: build/libs/*.jar tag_name: ${{ github.ref_name }} name: ${{ github.ref_name }} - body: | - Automated build for release **${{ github.ref_name }}**. - Includes the following artifacts: - - `$(ls build/libs/*.jar | tr '\n' '\n' | sed 's/^/ - /')` From 708f65fe36d25c8e83fa376402c9300d752e4ffe Mon Sep 17 00:00:00 2001 From: adrian Date: Thu, 18 Dec 2025 23:33:34 -0300 Subject: [PATCH 29/45] Added permission support for commands. --- src/b1_7_3/resources/plugin.yml | 11 ++++++++++- .../nemesiseye/commands/Commands.java | 9 +++++++++ .../nemesiseye/commands/EyeCore.java | 19 ++++++++++++++++--- .../commands/sub/CurrentPolicies.java | 5 +++++ .../nemesiseye/commands/sub/Help.java | 15 +++++++++++---- .../nemesiseye/commands/sub/ListPolicies.java | 5 +++++ .../nemesiseye/commands/sub/PolicyInfo.java | 5 +++++ .../nemesiseye/commands/sub/Reload.java | 10 ++++++++-- .../nemesiseye/commands/sub/Subcommand.java | 5 +++++ src/r1_21/resources/plugin.yml | 11 ++++++++++- 10 files changed, 84 insertions(+), 11 deletions(-) diff --git a/src/b1_7_3/resources/plugin.yml b/src/b1_7_3/resources/plugin.yml index 3ed24e7..bdb6b5a 100644 --- a/src/b1_7_3/resources/plugin.yml +++ b/src/b1_7_3/resources/plugin.yml @@ -5,4 +5,13 @@ author: 'Adrian Victor' description: "Change what players can do based in custom criteria." commands: eye: - description: "Run /eye help to see all available commands." \ No newline at end of file + description: "Run /eye help to see all available commands." +permissions: + nemesiseye.reload: + default: op + nemesiseye.policy.list.all: + default: op + nemesiseye.policy.list.self: + default: true + nemesiseye.help: + default: true \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java index cc5e497..a550f20 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/Commands.java @@ -1,12 +1,16 @@ package io.github.adrianvic.nemesiseye.commands; +import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.commands.sub.*; +import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.command.CommandSender; import java.util.HashMap; import java.util.Map; public class Commands { private static final Map commands = new HashMap<>(); + private static final Glimmer glim = Nemesis.getInstance().getGlimmer(); static { commands.put("help", new Help()); @@ -23,4 +27,9 @@ public class Commands { public static Subcommand get(String type) { return commands.get(type); } + + public static void sendNoPermissionError(CommandSender sender) { + glim.sendMessage(sender, "You do not have the necessary permission to use this command."); + } + } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java index 3ce2bb0..31cbd82 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -26,17 +26,30 @@ public class EyeCore { commandSender.sendMessage("Unknown command, try '/eye help' to list available commands."); return true; } - return sub.execute(commandSender, Arrays.copyOfRange(strings, 1, strings.length)); + else if (commandSender.hasPermission(sub.permission())) { + return sub.execute(commandSender, Arrays.copyOfRange(strings, 1, strings.length)); + } else { + Nemesis.getInstance().getLogger().info("does not have %s".formatted(sub.permission())); + Commands.sendNoPermissionError(commandSender); + return true; + } } return false; } public List onTabComplete(CommandSender commandSender, Command command, String s, String [] strings) { if (strings.length == 1) { - return new ArrayList<>(Commands.getAll().keySet()); + Map cmds = new HashMap<>(); + for (Map.Entry e : Commands.getAll().entrySet()) { + if (e.getValue().hasPermission(commandSender)) { + cmds.put(e.getKey(), e.getValue()); + cmds.put(e.getKey(), e.getValue()); + } + } + return new ArrayList<>(cmds.keySet()); } Subcommand sub = Commands.get(strings[0].toLowerCase()); - if (sub != null) { + if (sub != null && commandSender.hasPermission(sub.permission())) { return sub.onTabComplete(commandSender, Arrays.copyOfRange(strings, 1, strings.length)); } return List.of(); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java index ba77e73..09133e4 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/CurrentPolicies.java @@ -39,4 +39,9 @@ public class CurrentPolicies implements Subcommand { public String usage() { return ""; } + + @Override + public String permission() { + return "nemsiseye.policies.list.self"; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java index 2ef436e..0526a6b 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Help.java @@ -20,10 +20,12 @@ public class Help implements Subcommand { rstr.add("No commands found."); } for (Map.Entry e : allSubcommands.entrySet()) { - rstr.add(""" - %s - %s - Usage: /eye %s %s - """.formatted(e.getKey(), e.getValue().description(), e.getKey(), e.getValue())); + if (e.getValue().hasPermission(commandSender)) { + rstr.add(""" + %s - %s + Usage: /eye %s %s + """.formatted(e.getKey(), e.getValue().description(), e.getKey(), e.getValue().usage())); + } } glim.sendMessage(commandSender, String.join("\n", rstr)); @@ -44,4 +46,9 @@ public class Help implements Subcommand { public String usage() { return ""; } + + @Override + public String permission() { + return "nemsiseye.help"; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java index bc1a028..d4169ac 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/ListPolicies.java @@ -32,4 +32,9 @@ public class ListPolicies implements Subcommand { public String usage() { return ""; } + + @Override + public String permission() { + return "nemsiseye.policy.list.all"; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index b5e898a..ad48e02 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -47,4 +47,9 @@ public class PolicyInfo implements Subcommand { public String usage() { return ""; } + + @Override + public String permission() { + return "nemsiseye.policy.info"; + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java index 48800b6..9cc49be 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Reload.java @@ -1,6 +1,7 @@ package io.github.adrianvic.nemesiseye.commands.sub; import io.github.adrianvic.nemesiseye.Config; +import io.github.adrianvic.nemesiseye.commands.Commands; import org.bukkit.command.CommandSender; import java.util.List; @@ -8,8 +9,8 @@ import java.util.List; public class Reload implements Subcommand { @Override public boolean execute(CommandSender commandSender, String [] strings) { - Config.getInstance().load(); - commandSender.sendMessage("Reloading..."); + Config.getInstance().load(); + commandSender.sendMessage("Reloading..."); return true; } @@ -18,6 +19,11 @@ public class Reload implements Subcommand { return List.of(); } + @Override + public String permission() { + return "nemsiseye.reload"; + } + @Override public String description() { return "Reloads the plugin configuration file."; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java index cc25614..3678494 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java @@ -1,6 +1,7 @@ package io.github.adrianvic.nemesiseye.commands.sub; import org.bukkit.command.CommandSender; +import org.bukkit.permissions.Permission; import java.util.List; @@ -10,4 +11,8 @@ public interface Subcommand { @SuppressWarnings("SameReturnValue") boolean execute(CommandSender commandSender, String[] strings); List onTabComplete(CommandSender sender, String[] strings); + String permission(); + default boolean hasPermission(CommandSender sender) { + return sender.hasPermission(permission()); + } } \ No newline at end of file diff --git a/src/r1_21/resources/plugin.yml b/src/r1_21/resources/plugin.yml index da9278b..07679ff 100644 --- a/src/r1_21/resources/plugin.yml +++ b/src/r1_21/resources/plugin.yml @@ -7,4 +7,13 @@ website: "https://github.io/adrianvic/NemesisEye" description: "Change what players can do based in custom criteria." commands: eye: - usage: "/eye