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 01/38] 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 02/38] 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 03/38] 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 04/38] 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 05/38] 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 06/38] 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 07/38] 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 08/38] 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 09/38] 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 10/38] 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 11/38] 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 12/38] 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 13/38] 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 14/38] 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 15/38] 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 16/38] 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 17/38] 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 18/38] 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 19/38] 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 20/38] 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 21/38] 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 22/38] 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