diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml deleted file mode 100644 index 149d2f5..0000000 --- a/.forgejo/workflows/build.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Build - -on: - push: - paths: - - 'src/**' - - '.github/**' - - 'build.gradle.kts' - - 'gradle.properties' - - 'settings.gradle' - -jobs: - build: - runs-on: arch-linux - env: - NEMESIS_VERSION_NAME: "autobuild-${{ github.sha }}" - NEMESIS_BUILD_CHANNEL: "autobuild" - steps: - - name: Checkout - uses: actions/checkout@v6.0.1 - - - name: Setup Java enviroment - uses: actions/setup-java@v5.1.0 - with: - distribution: temurin - java-version: 21 - - - 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 - - - - name: Upload artifacts - uses: actions/upload-artifact@v6.0.0 - with: - path: build/libs/*.jar diff --git a/.forgejo/workflows/release-build.yml b/.forgejo/workflows/release-build.yml deleted file mode 100644 index 392e32e..0000000 --- a/.forgejo/workflows/release-build.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Release Build - -on: - release: - types: [published] - -jobs: - build-and-release: - runs-on: arch-linux - 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 }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0e8199d..f5d4ddb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: "arch-linux" env: NEMESIS_VERSION_NAME: "autobuild-${{ github.sha }}" NEMESIS_BUILD_CHANNEL: "autobuild" diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 9570712..c038796 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -6,7 +6,7 @@ on: jobs: build-and-release: - runs-on: ubuntu-latest + runs-on: "arch-linux" env: NEMESIS_VERSION_NAME: "${{ github.ref_name }}" NEMESIS_BUILD_CHANNEL: "production" @@ -32,10 +32,9 @@ jobs: - name: Build with Gradle run: ./gradlew buildAll - - name: Upload artifacts to release - run: | - curl -X POST \ - -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ - -H "Content-Type: application/octet-stream" \ - https://inspiran.beetal-castor.ts.net/git/api/v1/repos/${{ github.repository }}/releases/tags/${{ github.ref_name }}/assets \ - --data-binary @build/libs/your-artifact.jar \ No newline at end of file + - 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 }} \ No newline at end of file diff --git a/README.md b/README.md index bf357cf..6751543 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -eye_of_nemesis_social_cover +eye_of_nemesis_social_cover [![Modrinth Badge](https://img.shields.io/badge/Modrinth-Black?style=social&logo=Modrinth&logoColor=green)](https://modrinth.com/plugin/eye-of-nemesis) [![English Wiki Badge](https://img.shields.io/badge/English-White?style=flat-square&label=Wiki&color=black)](https://github.com/adrianvic/NemesisEye/wiki) diff --git a/build.gradle.kts b/build.gradle.kts index e2d9a2e..488a93d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -59,24 +59,9 @@ mcVersions.forEach { ver -> /* ----------------------------------------- */ dependencies { - add("compileOnly", "io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT") - add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT") + 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")) - - testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") - testImplementation("org.mockito:mockito-core:5.5.0") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - testImplementation("io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT") - testImplementation("com.github.seeseemelk:MockBukkit-v1.21:3.102.0") - - // Allow tests to see the versioned implementations - mcVersions.forEach { ver -> - testImplementation(sourceSets[ver].output) - } -} - -tasks.test { - useJUnitPlatform() } /* ----------------------------------------- */ diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/BlockEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java similarity index 90% rename from src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/BlockEventListener.java rename to src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java index 6ea38bf..76fd2d1 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/BlockEventListener.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/BlockEventListener.java @@ -1,4 +1,4 @@ -package io.github.adrianvic.nemesiseye.impl.events; +package io.github.adrianvic.nemesiseye.impl; import io.github.adrianvic.nemesiseye.Events; import org.bukkit.event.block.BlockBreakEvent; diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/EntityEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java similarity index 89% rename from src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/EntityEventListener.java rename to src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java index e6655f8..cf49da1 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/EntityEventListener.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/EntityEventListener.java @@ -1,4 +1,4 @@ -package io.github.adrianvic.nemesiseye.impl.events; +package io.github.adrianvic.nemesiseye.impl; import io.github.adrianvic.nemesiseye.Events; import org.bukkit.event.entity.EntityDamageByEntityEvent; diff --git a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/PlayerEventListener.java b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java similarity index 86% rename from src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/PlayerEventListener.java rename to src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java index ec81484..b77a56a 100644 --- a/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/events/PlayerEventListener.java +++ b/src/b1_7_3/java/io/github/adrianvic/nemesiseye/impl/PlayerEventListener.java @@ -1,4 +1,4 @@ -package io.github.adrianvic.nemesiseye.impl.events; +package io.github.adrianvic.nemesiseye.impl; import io.github.adrianvic.nemesiseye.Events; import org.bukkit.event.player.PlayerInteractEvent; 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 0a86ce9..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 @@ -2,13 +2,9 @@ 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.impl.events.BlockEventListener; -import io.github.adrianvic.nemesiseye.impl.events.EntityEventListener; -import io.github.adrianvic.nemesiseye.impl.events.PlayerEventListener; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyParsers; import io.github.adrianvic.nemesiseye.reflection.Glimmer; -import org.bukkit.Material; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.HumanEntity; @@ -76,38 +72,6 @@ public class b1_7_3 implements Glimmer { return entity.getItemInHand(); } - @Override - public boolean isAir(ItemStack item) { - return item == null || item.getType() == Material.AIR; - } - - @Override - public boolean isGliding(org.bukkit.entity.Player player) { - return false; - } - - @Override - public void setGliding(org.bukkit.entity.Player player, boolean gliding) { - } - - @Override - public boolean hasPermission(org.bukkit.command.CommandSender sender, String permission) { - if (sender instanceof org.bukkit.entity.Player p) { - return p.isOp(); - } - return true; // Console always has permission - } - - @Override - public boolean isArmorEquipAttempt(org.bukkit.event.Event event) { - return false; - } - - @Override - public ItemStack getEquippedItem(org.bukkit.event.Event event) { - return null; - } - @Override public void sendMessage(CommandSender commandSender, String text) { String[] lines = text.split("\\r?\\n"); @@ -135,18 +99,4 @@ public class b1_7_3 implements Glimmer { public boolean hasAnyEnchantment(ItemStack itemStack) { return false; } - - @Override - public boolean isArmor(ItemStack item) { - if (item == null || item.getType() == Material.AIR) { - return false; - } - - String name = item.getType().name(); - - return name.endsWith("_HELMET") - || name.endsWith("_CHESTPLATE") - || name.endsWith("_LEGGINGS") - || name.endsWith("_BOOTS"); - } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java index 45ec7b5..ceb0e36 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java @@ -7,22 +7,13 @@ 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); return pattern.matcher(against).matches(); } - public static boolean safeMatches(List expressions, String against) { - for (String s : expressions) { - if (DataShifter.safeMatches(s, against)) { - return true; - } - } - - return false; - } - public static List parseValueToStringList(List values) { List result = new ArrayList<>(); for (Object o : values) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Events.java b/src/main/java/io/github/adrianvic/nemesiseye/Events.java index a611890..442bbdc 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Events.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Events.java @@ -1,14 +1,15 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Action; -import io.github.adrianvic.nemesiseye.reflection.Glimmer; +import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; @@ -17,10 +18,6 @@ import java.util.List; public class Events { - private static Glimmer g() { - return Nemesis.getInstance().getGlimmer(); - } - public static void onBlockBreak(BlockBreakEvent event) { event.setCancelled( !Validator.can( @@ -34,12 +31,12 @@ public class Events { public static void onInteractionEvent(PlayerInteractEvent event) { ItemStack item = event.getItem(); - if (g().isAir(item)) { + if (item == null || item.getType().isAir()) { return; } // Right-click armor equipping - if (g().isArmor(item) + if (isArmor(item) && !Validator.can(event.getPlayer(), Action.EQUIP, event)) { event.setCancelled(true); return; @@ -70,18 +67,18 @@ public class Events { } public static void onPlayerMoveEvent(PlayerMoveEvent event) { - if (g().isGliding(event.getPlayer()) + if (event.getPlayer().isGliding() && !Validator.can( event.getPlayer(), List.of(Action.GLYDE), event )) { - g().setGliding(event.getPlayer(), false); + event.getPlayer().setGliding(false); } } public static void onInventoryClickEvent(InventoryClickEvent event) { - if (!g().isArmorEquipAttempt(event)) { + if (!isArmorEquipAttempt(event)) { return; } @@ -92,7 +89,38 @@ public class Events { } } - public static void onCreatureSpawnEvent(CreatureSpawnEvent event) { - event.setCancelled(!Validator.can(event.getEntity(), Action.SPAWN, event)); + private static boolean isArmorEquipAttempt(InventoryClickEvent event) { + if (event.getSlotType() == InventoryType.SlotType.ARMOR) { + return true; + } + + if (event.isShiftClick()) { + return isArmor(event.getCurrentItem()); + } + + if (event.getClick() == ClickType.NUMBER_KEY + && event.getSlotType() == InventoryType.SlotType.ARMOR + && event.getWhoClicked() instanceof Player player) { + return isArmor( + player.getInventory().getItem(event.getHotbarButton()) + ); + } + + return false; + } + + private static boolean isArmor(ItemStack item) { + if (item == null || item.getType().isAir()) { + return false; + } + + Material type = item.getType(); + String name = type.name(); + + return name.endsWith("_HELMET") + || name.endsWith("_CHESTPLATE") + || name.endsWith("_LEGGINGS") + || name.endsWith("_BOOTS") + || type == Material.ELYTRA; } } \ 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 9989ea6..9222de5 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java @@ -3,7 +3,6 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.Policy; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import java.util.ArrayList; @@ -20,7 +19,7 @@ public class Validator { return true; } - public static boolean can(LivingEntity entity, Action action, Event event) { + public static boolean can(HumanEntity entity, Action action, Event event) { boolean restricted = false; boolean allowed = false; @@ -42,7 +41,7 @@ public class Validator { } - public static List getPoliciesForEntity(LivingEntity entity) { + public static List getPoliciesForEntity(HumanEntity entity) { List ps = Config.getInstance().getPolicies(); List result = new ArrayList<>(); 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 6d2c799..e6583db 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/EyeCore.java @@ -26,7 +26,7 @@ public class EyeCore { commandSender.sendMessage("Unknown command, try '/eye help' to list available commands."); return true; } - else if (glim.hasPermission(commandSender, sub.permission())) { + 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())); @@ -41,7 +41,7 @@ public class EyeCore { if (strings.length == 1) { Map cmds = new HashMap<>(); for (Map.Entry e : Commands.getAll().entrySet()) { - if (glim.hasPermission(commandSender, e.getValue().permission())) { + if (e.getValue().hasPermission(commandSender)) { cmds.put(e.getKey(), e.getValue()); cmds.put(e.getKey(), e.getValue()); } @@ -49,7 +49,7 @@ public class EyeCore { return new ArrayList<>(cmds.keySet()); } Subcommand sub = Commands.get(strings[0].toLowerCase()); - if (sub != null && glim.hasPermission(commandSender, sub.permission())) { + 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/Subcommand.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/Subcommand.java index 00e0c56..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,5 @@ package io.github.adrianvic.nemesiseye.commands.sub; -import io.github.adrianvic.nemesiseye.Nemesis; import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; @@ -14,6 +13,6 @@ public interface Subcommand { List onTabComplete(CommandSender sender, String[] strings); String permission(); default boolean hasPermission(CommandSender sender) { - return Nemesis.getInstance().getGlimmer().hasPermission(sender, permission()); + return sender.hasPermission(permission()); } } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java index debbb36..b80f6a9 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java @@ -8,6 +8,5 @@ public enum Action { EQUIP, PLACE, USE_ENCHANTMENT, - GLYDE, - SPAWN + GLYDE } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java index 2202797..31fa568 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java @@ -1,9 +1,8 @@ package io.github.adrianvic.nemesiseye.policy; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; public interface NodeHandler { - boolean check(LivingEntity entity, PolicyNode node, Action action, Event event); + boolean check(HumanEntity entity, PolicyNode node, Action action, Event event); } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java index 70f4a49..465747e 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java @@ -9,14 +9,13 @@ public class NodeHandlers { private static final Map handlers = new HashMap<>(); static { - handlers.put(Action.HIT, new UseItem()); - handlers.put(Action.PLACE, new BePlaced()); - handlers.put(Action.INTERACT, new UseItem()); - handlers.put(Action.USE_ENCHANTMENT, new UseEnchantment()); - handlers.put(Action.GLYDE, new Glyde()); - handlers.put(Action.EQUIP, new Equip()); - handlers.put(Action.SPAWN, new Spawn()); - handlers.put(Action.BREAK, new UseItem()); // TODO: implement place handler + handlers.put(Action.HIT, new useItem()); + handlers.put(Action.PLACE, new bePlaced()); + handlers.put(Action.INTERACT, new useItem()); + handlers.put(Action.USE_ENCHANTMENT, new useEnchantment()); + handlers.put(Action.GLYDE, new glyde()); + handlers.put(Action.EQUIP, new equip()); + handlers.put(Action.BREAK, new useItem()); // TODO: implement place handler } public static NodeHandler get(Action type) { 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 5cb69cc..5992433 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java @@ -1,7 +1,6 @@ package io.github.adrianvic.nemesiseye.policy; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import java.util.List; @@ -10,7 +9,7 @@ public interface Policy { String name(); List nodes(); boolean policyAllowList(); - boolean applies(LivingEntity entity); + boolean applies(HumanEntity entity); Effect effect(); int weight(); List worlds(); @@ -19,7 +18,7 @@ public interface Policy { nodes().add(node); } - default boolean matches(LivingEntity entity, Action action, Event event) { + default boolean matches(HumanEntity entity, Action action, Event event) { if (!worlds().contains(entity.getWorld().getName())) { return false; } 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 8dcbc4e..c87f916 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java @@ -2,7 +2,6 @@ package io.github.adrianvic.nemesiseye.policy; import io.github.adrianvic.nemesiseye.DataShifter; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import java.util.ArrayList; @@ -56,7 +55,7 @@ public record PolicyNode(List actions, List values) { return handlers; } - public boolean matches(LivingEntity entity, Action action, Event event) { + public boolean matches(HumanEntity entity, Action action, Event event) { if (!actions.contains(action)) { return false; } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Spawn.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Spawn.java deleted file mode 100644 index 938f6ee..0000000 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Spawn.java +++ /dev/null @@ -1,21 +0,0 @@ -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.PolicyNode; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.Event; - -import java.util.List; - -public class Spawn implements NodeHandler { - - @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { - String type = entity.getType().name(); - List parsedValue = DataShifter.parseValueToStringList(node.values()); - - return DataShifter.safeMatches(parsedValue, type); - } -} 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 deleted file mode 100644 index d67e9f9..0000000 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/UseEnchantment.java +++ /dev/null @@ -1,34 +0,0 @@ -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; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.Event; -import org.bukkit.inventory.ItemStack; - -public class UseEnchantment implements NodeHandler { - private final Glimmer glim = Nemesis.getInstance().getGlimmer(); - - @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { - if (entity instanceof HumanEntity e) { - ItemStack item = glim.getItemInMainHandHumanEntity(e); - - if (glim.isAir(item)) return false; - if (!glim.hasItemMeta(item)) return false; - if (!glim.hasAnyEnchantment(item)) return false; - - boolean matches = glim.hasEnchantment(item, - DataShifter.parseValueToStringMap(node.values())); - - return matches; - } - - return false; - } -} 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 deleted file mode 100644 index ef91a98..0000000 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/UseItem.java +++ /dev/null @@ -1,33 +0,0 @@ -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; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.Event; - -import java.util.List; - -public class UseItem implements NodeHandler { - - private final Glimmer glim = Nemesis.getInstance().getGlimmer(); - - @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { - if (entity instanceof HumanEntity e) { - org.bukkit.inventory.ItemStack item = glim.getItemInMainHandHumanEntity(e); - if (glim.isAir(item)) return false; - - String type = item.getType().toString(); - List parsedValue = DataShifter.parseValueToStringList(node.values()); - - return DataShifter.safeMatches(parsedValue, type); - } - - return false; - } -} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/BePlaced.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/bePlaced.java similarity index 61% rename from src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/BePlaced.java rename to src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/bePlaced.java index ff9d08b..edf5d7c 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/BePlaced.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/bePlaced.java @@ -5,22 +5,21 @@ import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; import org.bukkit.event.block.BlockPlaceEvent; -import java.util.List; - -public class BePlaced implements NodeHandler { +public class bePlaced implements NodeHandler { @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { + public boolean check(HumanEntity entity, PolicyNode node, Action action, Event event) { if (event instanceof BlockPlaceEvent bpe) { String type = bpe.getBlock().getType().toString(); - List parsedValue = DataShifter.parseValueToStringList(node.values()); - return DataShifter.safeMatches(parsedValue, type); + for (String s : DataShifter.parseValueToStringList(node.values())) { + if (DataShifter.safeMatches(s, type)) { + return true; + } + } } - return false; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/equip.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/equip.java new file mode 100644 index 0000000..88bb6b6 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/equip.java @@ -0,0 +1,84 @@ +package io.github.adrianvic.nemesiseye.policy.handlers; + +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; +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.PolicyNode; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; + +public class equip implements NodeHandler { + + @Override + public boolean check(HumanEntity entity, PolicyNode node, Action action, Event event) { + ItemStack item = null; + + if (event instanceof PlayerArmorChangeEvent e) { + // Right click equip, dispenser equip, etc... + item = e.getNewItem(); + } + + else if (event instanceof InventoryClickEvent e) { + InventoryType.SlotType slotType = e.getSlotType(); + + // Number key swap into armor slot + if (e.getClick() == ClickType.NUMBER_KEY + && slotType == InventoryType.SlotType.ARMOR + && entity instanceof Player player) { + item = player.getInventory().getItem(e.getHotbarButton()); + } + + // Shift click armor from inventory + else if (e.isShiftClick()) { + ItemStack current = e.getCurrentItem(); + + if (isArmor(current)) { + item = current; + } + } + + // Cursor click onto armor slot + else if (slotType == InventoryType.SlotType.ARMOR) { + ItemStack cursor = e.getCursor(); + + if (isArmor(cursor)) { + item = cursor; + } + } + } + + if (!isArmor(item)) { + return false; + } + + String type = item.getType().name(); + + for (String s : DataShifter.parseValueToStringList(node.values())) { + if (DataShifter.safeMatches(s, type)) { + return true; + } + } + + return false; + } + + private boolean isArmor(ItemStack item) { + if (item == null || item.getType().isAir()) { + return false; + } + + String name = item.getType().name(); + + return name.endsWith("_HELMET") + || name.endsWith("_CHESTPLATE") + || name.endsWith("_LEGGINGS") + || name.endsWith("_BOOTS") + || item.getType() == org.bukkit.Material.ELYTRA; + } +} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Glyde.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/glyde.java similarity index 63% rename from src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Glyde.java rename to src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/glyde.java index 46d2b11..dcce855 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Glyde.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/glyde.java @@ -3,12 +3,12 @@ package io.github.adrianvic.nemesiseye.policy.handlers; import io.github.adrianvic.nemesiseye.policy.Action; import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.PolicyNode; -import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.HumanEntity; import org.bukkit.event.Event; -public class Glyde implements NodeHandler { +public class glyde implements NodeHandler { @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { + public boolean check(HumanEntity entity, PolicyNode node, Action action, Event event) { return true; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Equip.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java similarity index 51% rename from src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Equip.java rename to src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java index 8d5cfcf..5fe3ae0 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/Equip.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java @@ -6,26 +6,23 @@ 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.LivingEntity; +import org.bukkit.entity.HumanEntity; import org.bukkit.event.Event; import org.bukkit.inventory.ItemStack; -import java.util.List; - -public class Equip implements NodeHandler { +public class useEnchantment implements NodeHandler { private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override - public boolean check(LivingEntity entity, PolicyNode node, Action action, Event event) { - ItemStack item = glim.getEquippedItem(event); + public boolean check(HumanEntity entity, PolicyNode node, Action action, Event event) { + ItemStack item = glim.getItemInMainHandHumanEntity(entity); - if (!glim.isArmor(item)) { - return false; - } + if (!glim.hasItemMeta(item)) return false; + if (!glim.hasAnyEnchantment(item)) return false; - String type = item.getType().name(); - List parsedValue = DataShifter.parseValueToStringList(node.values()); + boolean matches = glim.hasEnchantment(item, + DataShifter.parseValueToStringMap(node.values())); - return DataShifter.safeMatches(parsedValue, type); + return matches; } -} \ No newline at end of file +} 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 new file mode 100644 index 0000000..6009407 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java @@ -0,0 +1,28 @@ +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; +import org.bukkit.event.Event; + +public class useItem implements NodeHandler { + + private final Glimmer glim = Nemesis.getInstance().getGlimmer(); + + @Override + public boolean check(HumanEntity entity, PolicyNode node, Action action, Event event) { + String type = glim.getItemInMainHandHumanEntity(entity).getType().toString(); + + for (String s : DataShifter.parseValueToStringList(node.values())) { + if (DataShifter.safeMatches(s, type)) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java index 7e85467..8476fda 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java @@ -4,13 +4,12 @@ import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import java.util.List; public record Core(String name, List worlds, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { @Override - public boolean applies(LivingEntity entity) { + public boolean applies(HumanEntity entity) { return false; } } \ No newline at end of file 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 index 127430c..7080ea8 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java @@ -4,12 +4,11 @@ import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import java.util.List; public record GlobalPolicy(String name, List worlds, List nodes, boolean policyAllowList, Effect effect, int weight) implements Policy { - public boolean applies(LivingEntity entity) { + 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 255e433..5765535 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 @@ -5,13 +5,12 @@ 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.entity.LivingEntity; import java.util.List; public record LocationPolicy(String name, List worlds, List locations, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { @Override - public boolean applies(LivingEntity entity) { + public boolean applies(HumanEntity entity) { for (Glimmer.Box box : locations) { if (box.contains(entity.getLocation().toVector(), entity.getWorld())) { return !policyAllowList; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java index 309ce07..1c952ac 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java @@ -1,20 +1,18 @@ package io.github.adrianvic.nemesiseye.policy.policies; -import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import java.util.List; public record PermissionPolicy(String name, List worlds, List permissions, List nodes, boolean policyAllowList, Effect effect, int weight) implements Policy { @Override - public boolean applies(LivingEntity entity) { + public boolean applies(HumanEntity entity) { for (String perm : permissions) { - if (Nemesis.getInstance().getGlimmer().hasPermission(entity, perm)) { + if (entity.hasPermission(perm)) { return true; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java index ba40e4b..8eeae4b 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java @@ -4,14 +4,13 @@ import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.LivingEntity; import java.util.List; public record PlayerNamePolicy(String name, List worlds, List playerName, List nodes, Effect effect, boolean policyAllowList, int weight) implements Policy { @Override - public boolean applies(LivingEntity entity) { + public boolean applies(HumanEntity entity) { if (playerName.contains(entity.getName())) { return !policyAllowList(); } else { 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 ccc69b4..dec3092 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/Glimmer.java @@ -26,19 +26,8 @@ public interface Glimmer { boolean hasItemMeta(ItemStack item); boolean hasEnchantment(ItemStack item, Map valuesmap); boolean hasAnyEnchantment(ItemStack itemStack); - boolean isArmor(ItemStack item); - boolean isAir(ItemStack item); ItemStack getItemInMainHandHumanEntity(HumanEntity entity); - // Players - boolean isGliding(org.bukkit.entity.Player player); - void setGliding(org.bukkit.entity.Player player, boolean gliding); - boolean hasPermission(org.bukkit.command.CommandSender sender, String permission); - - // Events - boolean isArmorEquipAttempt(org.bukkit.event.Event event); - ItemStack getEquippedItem(org.bukkit.event.Event event); - // Commands void sendMessage(CommandSender commandSender, String text); diff --git a/src/main/java/io/github/adrianvic/nemesiseye/reflection/VersionMatcher.java b/src/main/java/io/github/adrianvic/nemesiseye/reflection/VersionMatcher.java index d8323cc..7852cd5 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/reflection/VersionMatcher.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/reflection/VersionMatcher.java @@ -94,67 +94,54 @@ public class VersionMatcher { } public Glimmer loadGlim() { - String rawVersion = null; + String rawVersion; try { - rawVersion = Bukkit.getMinecraftVersion(); - } catch (NoSuchMethodError ignored) {} - - if (rawVersion == null || rawVersion.isEmpty()) { - String v = Bukkit.getVersion(); // e.g. "git-Bukkit-0.0.0-1060-... (MC: 1.7.3)" - int start = v.lastIndexOf("MC: "); - if (start != -1) { - rawVersion = v.substring(start + 4, v.length() - 1); - } else { - rawVersion = "unknown"; - } + rawVersion = Bukkit.getMinecraftVersion(); // returns something like "1.21.10" + } catch (NoSuchMethodError e) { + return betaLoadGlim(); } String matchInfo = getVersion("release", rawVersion); if (matchInfo.isEmpty()) { - matchInfo = getVersion("beta", rawVersion); - } - - if (matchInfo.isEmpty()) { - // Fallback to b1.7.3 if everything fails, or throw error? - // User said it supports b1.7.3 and 1.21.x. - Glimmer fallback = tryInstantiate("io.github.adrianvic.nemesiseye.impl.b1_7_3"); - if (fallback != null) return fallback; - throw new IllegalStateException("No suitable implementation found for version " + rawVersion); + // TODO: Should change to something more robust, it's not beta since we have Bukkit.getMinecraftVersion() + return betaLoadGlim(); } + // split the returned string: "pattern|classSuffix" String[] partsInfo = matchInfo.split("\\|"); - String classSuffix = partsInfo[1]; + String classSuffix = partsInfo[1]; // e.g. "r1_21" - Glimmer glimmer = tryInstantiate("io.github.adrianvic.nemesiseye.impl." + classSuffix); - if (glimmer != null) return glimmer; - - // Backward search for older implementations String[] versionParts = rawVersion.split("\\."); int major = parseInt(versionParts[0]); - int minor = versionParts.length > 1 ? parseInt(versionParts[1]) : 0; + int minor = parseInt(versionParts[1]); int patch = versionParts.length > 2 ? parseInt(versionParts[2]) : 0; - while (major >= 0) { - while (minor >= 0) { - while (patch >= 0) { - String className = String.format("io.github.adrianvic.nemesiseye.impl.r%d_%d_%d", major, minor, patch); - glimmer = tryInstantiate(className); - if (glimmer != null) return glimmer; - - className = String.format("io.github.adrianvic.nemesiseye.impl.r%d_%d", major, minor); - glimmer = tryInstantiate(className); - if (glimmer != null) return glimmer; + while (true) { + String className = "io.github.adrianvic.nemesiseye.impl." + classSuffix; + Glimmer glimmer = tryInstantiate(className); + if (glimmer != null) return glimmer; - patch--; - } - minor--; - patch = 20; // Search up to .20 patch of previous minor + if (patch > 0) { + patch--; + continue; } - major--; - minor = 30; // Search up to .30 minor of previous major - } + if (minor > 0) { + minor--; + patch = 20; + continue; + } + className = "io.github.adrianvic.nemesiseye.impl.r" + major + "_" + minor; + glimmer = tryInstantiate(className); + if (glimmer != null) return glimmer; - throw new IllegalStateException("No suitable implementation found for version " + rawVersion); + throw new IllegalStateException( + "No suitable implementation found for version " + rawVersion); + } + } + + private Glimmer betaLoadGlim() { + // Bukkit.getVersion() // returns something like "1.1.10 (MC: 1.7.3)" WEIRD + return tryInstantiate("io.github.adrianvic.nemesiseye.impl.b1_7_3"); // only supported beta version for now } private Glimmer tryInstantiate(String className) { 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 index ea64591..f7bf288 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/EventListener.java @@ -6,9 +6,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -38,8 +36,5 @@ public class EventListener implements Listener { public void onPlayerMoveEvent(PlayerMoveEvent event) { Events.onPlayerMoveEvent(event); } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void onInventoryClickEvent(InventoryClickEvent event) { Events.onInventoryClickEvent(event); } - - @EventHandler - public void onCreatureSpawnEvent(CreatureSpawnEvent event) { Events.onCreatureSpawnEvent(event); } + public void onInventoryClickEvent(InventoryClickEvent event) { Events.onInventoryClickEvent(event);} } \ 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 ac1b6d7..b929d0b 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 @@ -67,84 +67,6 @@ public class r1_21 implements Glimmer { return entity.getInventory().getItemInMainHand(); } - @Override - public boolean isAir(ItemStack item) { - return item == null || item.getType().isAir(); - } - - @Override - public boolean isGliding(org.bukkit.entity.Player player) { - return player.isGliding(); - } - - @Override - public void setGliding(org.bukkit.entity.Player player, boolean gliding) { - player.setGliding(gliding); - } - - @Override - public boolean hasPermission(org.bukkit.command.CommandSender sender, String permission) { - return sender.hasPermission(permission); - } - - @Override - public boolean isArmorEquipAttempt(org.bukkit.event.Event event) { - if (!(event instanceof org.bukkit.event.inventory.InventoryClickEvent e)) { - return false; - } - - if (e.getSlotType() == org.bukkit.event.inventory.InventoryType.SlotType.ARMOR) { - return true; - } - - if (e.isShiftClick()) { - return isArmor(e.getCurrentItem()); - } - - if (e.getClick() == org.bukkit.event.inventory.ClickType.NUMBER_KEY - && e.getSlotType() == org.bukkit.event.inventory.InventoryType.SlotType.ARMOR - && e.getWhoClicked() instanceof org.bukkit.entity.Player player) { - return isArmor( - player.getInventory().getItem(e.getHotbarButton()) - ); - } - - return false; - } - - @Override - public ItemStack getEquippedItem(org.bukkit.event.Event event) { - if (event instanceof org.bukkit.event.inventory.InventoryClickEvent e) { - org.bukkit.event.inventory.InventoryType.SlotType slotType = e.getSlotType(); - - if (e.getClick() == org.bukkit.event.inventory.ClickType.NUMBER_KEY // hotbar key swap - && slotType == org.bukkit.event.inventory.InventoryType.SlotType.ARMOR - && e.getWhoClicked() instanceof org.bukkit.entity.Player player) { - return player.getInventory().getItem(e.getHotbarButton()); - } - - if (e.isShiftClick()) { - ItemStack current = e.getCurrentItem(); - if (isArmor(current)) return current; - } - - // regular click - if (slotType == org.bukkit.event.inventory.InventoryType.SlotType.ARMOR) { - ItemStack cursor = e.getCursor(); - if (isArmor(cursor)) return cursor; - } - } - - // Try Paper's PlayerArmorChangeEvent via reflection or just check if class exists - try { - if (event instanceof com.destroystokyo.paper.event.player.PlayerArmorChangeEvent e) { - return e.getNewItem(); - } - } catch (NoClassDefFoundError | Exception ignored) {} - - return null; - } - @Override public void sendMessage(CommandSender commandSender, String text) { commandSender.sendMessage(text); @@ -183,19 +105,4 @@ public class r1_21 implements Glimmer { public boolean hasAnyEnchantment(ItemStack item) { return !(item.getItemMeta().getEnchants().isEmpty()); } - - @Override - public boolean isArmor(ItemStack item) { - if (item == null || item.getType().isAir()) { - return false; - } - - String name = item.getType().name(); - - return name.endsWith("_HELMET") - || name.endsWith("_CHESTPLATE") - || name.endsWith("_LEGGINGS") - || name.endsWith("_BOOTS") - || item.getType() == org.bukkit.Material.ELYTRA; - } } diff --git a/src/test/java/io/github/adrianvic/nemesiseye/ValidatorTest.java b/src/test/java/io/github/adrianvic/nemesiseye/ValidatorTest.java deleted file mode 100644 index fe4ef52..0000000 --- a/src/test/java/io/github/adrianvic/nemesiseye/ValidatorTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.github.adrianvic.nemesiseye; - -import io.github.adrianvic.nemesiseye.policy.Action; -import io.github.adrianvic.nemesiseye.policy.Effect; -import io.github.adrianvic.nemesiseye.policy.Policy; -import io.github.adrianvic.nemesiseye.reflection.Glimmer; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; - -import java.util.Collections; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -public class ValidatorTest { - - private Glimmer mockGlim; - private Config mockConfig; - - @BeforeEach - void setUp() { - mockGlim = mock(Glimmer.class); - } - - @Test - void testValidatorCanDeny() { - Player player = mock(Player.class); - Event event = mock(Event.class); - Policy policy = mock(Policy.class); - - when(policy.applies(player)).thenReturn(true); - when(policy.matches(player, Action.BREAK, event)).thenReturn(true); - when(policy.effect()).thenReturn(Effect.DENY); - - // We need to handle the static Config.getInstance() - // This is tricky without refactoring or Mockito-inline - // For now, let's just demonstrate the concept if Validator was more testable - } -} diff --git a/src/test/java/io/github/adrianvic/nemesiseye/impl/ImplementationContractTest.java b/src/test/java/io/github/adrianvic/nemesiseye/impl/ImplementationContractTest.java deleted file mode 100644 index 763bf53..0000000 --- a/src/test/java/io/github/adrianvic/nemesiseye/impl/ImplementationContractTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.github.adrianvic.nemesiseye.impl; - -import be.seeseemelk.mockbukkit.MockBukkit; -import be.seeseemelk.mockbukkit.ServerMock; -import io.github.adrianvic.nemesiseye.reflection.Glimmer; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; - -public class ImplementationContractTest { - - private ServerMock server; - - @BeforeEach - void setUp() { - server = MockBukkit.mock(); - } - - @AfterEach - void tearDown() { - MockBukkit.unmock(); - } - - static Stream implementations() { - return Stream.of( - new b1_7_3(), - new r1_21() - ); - } - - @ParameterizedTest - @MethodSource("implementations") - void testIsArmor(Glimmer glim) { - // Helmets - assertTrue(glim.isArmor(new ItemStack(Material.IRON_HELMET))); - assertTrue(glim.isArmor(new ItemStack(Material.DIAMOND_HELMET))); - - // Chestplates - assertTrue(glim.isArmor(new ItemStack(Material.GOLDEN_CHESTPLATE))); - - // Non-armor - assertFalse(glim.isArmor(new ItemStack(Material.STICK))); - assertFalse(glim.isArmor(new ItemStack(Material.DIRT))); - - // Null/Air - assertFalse(glim.isArmor(null)); - assertFalse(glim.isArmor(new ItemStack(Material.AIR))); - } - - @ParameterizedTest - @MethodSource("implementations") - void testIsAir(Glimmer glim) { - assertTrue(glim.isAir(null)); - assertTrue(glim.isAir(new ItemStack(Material.AIR))); - assertFalse(glim.isAir(new ItemStack(Material.STONE))); - } -}