From 5f7e9120c4f15b2c338ed037429bfbb90167f308 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 21 Feb 2025 21:55:35 +0100 Subject: [PATCH 01/14] Add plot artillery type --- api-internal/pom.xml | 6 +++ cannons-bukkit/pom.xml | 10 ++++ .../java/at/pavlov/cannons/config/Config.java | 3 ++ .../pavlov/cannons/hooks/towny/TownyHook.java | 49 +++++++++++++++++++ .../cannons/hooks/towny/TownyListeners.java | 29 +++++++++++ cannons-bukkit/src/main/resources/config.yml | 2 + cannons-bukkit/src/main/resources/plugin.yml | 2 +- 7 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java create mode 100644 cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java diff --git a/api-internal/pom.xml b/api-internal/pom.xml index 49cc600b..aa108e74 100644 --- a/api-internal/pom.xml +++ b/api-internal/pom.xml @@ -21,6 +21,12 @@ gson 2.11.0 + + org.jetbrains + annotations + 24.0.0 + compile + diff --git a/cannons-bukkit/pom.xml b/cannons-bukkit/pom.xml index 75debaa4..380c9a96 100644 --- a/cannons-bukkit/pom.xml +++ b/cannons-bukkit/pom.xml @@ -65,6 +65,10 @@ true + + glaremasters repo + https://repo.glaremasters.me/repository/towny/ + @@ -149,6 +153,12 @@ 2.11.6 provided + + com.palmergames.bukkit.towny + towny + 0.101.1.0 + provided + diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java index 3c7df816..5c2bbeec 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java @@ -39,6 +39,8 @@ //movecraft private boolean movecraftEnabled; private boolean movecraftCannonEnabled; + + private boolean isTownyEnabled; //endregion //build limits @@ -132,6 +134,7 @@ public void loadConfig() { setEconomyDisabled(!config.getBoolean("hooks.vault.enabled", true)); setMovecraftEnabled(config.getBoolean("hooks.movecraft.enabled", true)); setMovecraftCannonEnabled(config.getBoolean("hooks.movecraftCombat.enabled", true)); + setTownyEnabled(config.getBoolean("hooks.towny.enabled", true)); setRelayExplosionEvent(config.getBoolean("general.relayExplosionEvent", false)); setClaimEdgeLength(config.getInt("general.claimEdgeLength", 60)); diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java new file mode 100644 index 00000000..70eb03bb --- /dev/null +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java @@ -0,0 +1,49 @@ +package at.pavlov.cannons.hooks.towny; + +import at.pavlov.cannons.Cannons; +import at.pavlov.cannons.hooks.BukkitHook; +import at.pavlov.internal.Hook; +import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.object.TownBlockType; +import com.palmergames.bukkit.towny.object.TownBlockTypeHandler; +import lombok.Getter; +import lombok.SneakyThrows; +import org.bukkit.plugin.PluginManager; + +public class TownyHook extends BukkitHook { + @Getter + private static TownBlockType artilleryType; + + public TownyHook(Cannons plugin) { + super(plugin); + } + + @SneakyThrows + @Override + public void onEnable() { + + if (!plugin.getMyConfig().isTownyEnabled()) { + return; + } + + PluginManager pluginManager = plugin.getServer().getPluginManager(); + if (!pluginManager.isPluginEnabled("Towny")) { + plugin.logDebug("Towny not found or disabled"); + return; + } + + hook = TownyAPI.getInstance(); + artilleryType = new TownBlockType("Artillery Position"); + TownBlockTypeHandler.registerType(artilleryType); + } + + @Override + public void onDisable() { + + } + + @Override + public Class> getTypeClass() { + return TownyHook.class; + } +} diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java new file mode 100644 index 00000000..e3c6bb8c --- /dev/null +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java @@ -0,0 +1,29 @@ +package at.pavlov.cannons.hooks.towny; + +import at.pavlov.cannons.cannon.CannonManager; +import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.event.actions.TownyActionEvent; +import com.palmergames.bukkit.towny.object.TownBlock; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class TownyListeners implements Listener { + + private static final CannonManager manager = CannonManager.getInstance(); + + @EventHandler + public void onAction(TownyActionEvent event) { + TownyAPI api = TownyAPI.getInstance(); + Location location = event.getLocation(); + TownBlock townBlock = api.getTownBlock(location); + if (townBlock == null) return; + + if (!townBlock.getType().equals(TownyHook.getArtilleryType())) return; + + boolean isCannon = manager.getCannon(location, event.getPlayer().getUniqueId()) != null; + if (isCannon) { + event.setCancelled(false); + } + } +} diff --git a/cannons-bukkit/src/main/resources/config.yml b/cannons-bukkit/src/main/resources/config.yml index d6657686..ae9eb146 100644 --- a/cannons-bukkit/src/main/resources/config.yml +++ b/cannons-bukkit/src/main/resources/config.yml @@ -21,6 +21,8 @@ hooks: enabled: true movecraftCombat: enabled: true + towny: + enabled: true cannonLimits: diff --git a/cannons-bukkit/src/main/resources/plugin.yml b/cannons-bukkit/src/main/resources/plugin.yml index 14c3a02e..d065f0ab 100644 --- a/cannons-bukkit/src/main/resources/plugin.yml +++ b/cannons-bukkit/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ main: at.pavlov.cannons.Cannons api-version: 1.13 version: ${version} depend: [WorldEdit] -softdepend: [Vault, Movecraft, Movecraft-Combat, PlaceholderAPI] +softdepend: [Vault, Movecraft, Movecraft-Combat, PlaceholderAPI, Towny] authors: [DerPavlov, Vaan1310] description: Fire block build cannons and smash your enemies folia-supported: true From 319098669432d109114d6fa8bd3eecd97dbbfde9 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 28 Feb 2025 21:30:15 +0100 Subject: [PATCH 02/14] Register towny hook --- .../src/main/java/at/pavlov/cannons/Cannons.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java index c05cf266..5b41f839 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java @@ -18,6 +18,7 @@ import at.pavlov.cannons.hooks.VaultHook; import at.pavlov.cannons.hooks.movecraft.type.MaxCannonsProperty; import at.pavlov.cannons.hooks.movecraftcombat.MovecraftCombatHook; +import at.pavlov.cannons.hooks.towny.TownyHook; import at.pavlov.cannons.listener.*; import at.pavlov.cannons.projectile.Projectile; import at.pavlov.cannons.projectile.ProjectileManager; @@ -206,6 +207,10 @@ public void onEnable() PlaceholderAPIHook placeholderAPIHook = new PlaceholderAPIHook(this); hookManager.registerHook(placeholderAPIHook); + logDebug("Loading TownyHook"); + TownyHook townyHook = new TownyHook(this); + hookManager.registerHook(townyHook); + logDebug("Time to enable hooks: " + new DecimalFormat("0.00").format(System.currentTimeMillis() - startTime) + "ms"); startTime = System.nanoTime(); @@ -306,10 +311,7 @@ public void onEnable() " You don't need to add Movecraft-Cannons anymore as Movecraft support is now embedded," + " we suggest you stop using it as in the future it might stop work properly."); - if (hookManager.isRegistered(MovecraftCombatHook.class)) { - - } - movecraftHook.onDisable(); + movecraftHook.onDisable(); }, 1L); } From d19ec9eafca18c6e22f7e2858b973256803b0bcf Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 28 Feb 2025 21:30:27 +0100 Subject: [PATCH 03/14] Change field name --- .../src/main/java/at/pavlov/cannons/config/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java index 5c2bbeec..769c9e01 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java @@ -40,7 +40,7 @@ private boolean movecraftEnabled; private boolean movecraftCannonEnabled; - private boolean isTownyEnabled; + private boolean townyEnabled; //endregion //build limits From c6734edf5438d19f2d20ab06a1a968a82c1f8f1f Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 28 Feb 2025 21:31:11 +0100 Subject: [PATCH 04/14] Add method to fast process an hook's value --- .../java/at/pavlov/internal/HookManager.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/HookManager.java b/api-internal/src/main/java/at/pavlov/internal/HookManager.java index fb2d17c6..5f660e33 100644 --- a/api-internal/src/main/java/at/pavlov/internal/HookManager.java +++ b/api-internal/src/main/java/at/pavlov/internal/HookManager.java @@ -1,10 +1,12 @@ package at.pavlov.internal; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; public class HookManager { private final Map>, Hook> hooks = new HashMap<>(); @@ -30,7 +32,7 @@ public boolean isRegistered(@NotNull Class> type) { return false; } - public > @NotNull T getHook(@NotNull Class type) { + public > @Nullable T getHook(@NotNull Class type) { Hook hook = this.hooks.get(type); if (hook != null) { return type.cast(hook); @@ -42,7 +44,21 @@ public boolean isRegistered(@NotNull Class> type) { } } - throw new IllegalArgumentException("No registered hook of type " + type.getName() + "!"); + return null; + } + + public > void processIfPresent(@NotNull Class type, Consumer consumer) { + T hook = getHook(type); + if (hook == null) { + return; + } + + C hookContent = hook.hook(); + if (hookContent == null) { + return; + } + + consumer.accept(hookContent); } /** From fa1a0b7d46f34d03d7fdff433ca601dda1dd22d0 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 28 Feb 2025 21:32:08 +0100 Subject: [PATCH 05/14] Grace residents of the town where the cannon is --- .../main/java/at/pavlov/cannons/Aiming.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index 8b2ea83a..ff4a9d25 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -18,10 +18,12 @@ import at.pavlov.cannons.event.CannonLinkAimingEvent; import at.pavlov.cannons.event.CannonTargetEvent; import at.pavlov.cannons.event.CannonUseEvent; +import at.pavlov.cannons.hooks.towny.TownyHook; import at.pavlov.cannons.projectile.Projectile; import at.pavlov.cannons.scheduler.FakeBlockHandler; import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.SoundUtils; +import com.palmergames.bukkit.towny.object.Resident; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -42,7 +44,9 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Random; import java.util.UUID; @@ -651,7 +655,7 @@ private void findSuitableTarget(Cannon cannon, Map targets) { return; } - ArrayList possibleTargets = new ArrayList<>(); + LinkedList possibleTargets = new LinkedList<>(); for (Target t : targets.values()) { TargetType type = t.targetType(); @@ -667,6 +671,21 @@ private void findSuitableTarget(Cannon cannon, Map targets) { if (cannon.isWhitelisted(t.uniqueId())) continue; //Player if (type == TargetType.PLAYER) { + LinkedList gracedPlayer = new LinkedList<>(); + + Cannons.getPlugin().getHookManager().processIfPresent(TownyHook.class, townyApi -> { + var town = townyApi.getTown(cannon.getLocation()); + if (town == null) { + return; + } + + town.getResidents().stream() + .map(Resident::getPlayer) + .filter(Objects::nonNull) + .map(Target::new) + .forEach(gracedPlayer::add); + }); + possibleTargets.removeAll(gracedPlayer); // get solution handlePossibleTarget(cannon, t, possibleTargets); continue; @@ -697,7 +716,7 @@ private void findSuitableTarget(Cannon cannon, Map targets) { } } - private void handlePossibleTarget(Cannon cannon, Target t, ArrayList possibleTargets) { + private void handlePossibleTarget(Cannon cannon, Target t, List possibleTargets) { if (canFindTargetSolution(cannon, t)) { possibleTargets.add(t); } From dd499cc95ef3429b4349b1620e9b980f11cf746a Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sat, 1 Mar 2025 14:19:34 +0100 Subject: [PATCH 06/14] Cleanup CannonUseEvent --- .../pavlov/cannons/event/CannonUseEvent.java | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/event/CannonUseEvent.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/event/CannonUseEvent.java index cc763eb4..35c8f507 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/event/CannonUseEvent.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/event/CannonUseEvent.java @@ -2,43 +2,28 @@ import at.pavlov.cannons.Enum.InteractAction; import at.pavlov.cannons.cannon.Cannon; +import lombok.Getter; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import java.util.UUID; -public class CannonUseEvent extends Event -{ +@Getter +public class CannonUseEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); private final Cannon cannon; private final UUID player; private final InteractAction action; private boolean cancelled; - public CannonUseEvent(Cannon cannon, UUID player, InteractAction action) - { + public CannonUseEvent(Cannon cannon, UUID player, InteractAction action) { this.cannon = cannon; this.player = player; this.action = action; this.cancelled = false; } - public Cannon getCannon() { - return cannon; - } - - public UUID getPlayer() { - return player; - } - - public InteractAction getAction() { - return action; - } - - public boolean isCancelled() { - return cancelled; - } - public void setCancelled(boolean cancelled) { this.cancelled = cancelled; } From fb84aa307735d8d505995c8cd86962ff6650d81a Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 2 Mar 2025 11:31:34 +0100 Subject: [PATCH 07/14] Add TownyAllowCannon for cannon interactions --- .../java/at/pavlov/cannons/config/Config.java | 4 ++++ .../cannons/hooks/towny/TownyAllowCannon.java | 21 +++++++++++++++++++ cannons-bukkit/src/main/resources/config.yml | 5 +++++ 3 files changed, 30 insertions(+) create mode 100644 cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyAllowCannon.java diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java index 769c9e01..35a3c449 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/config/Config.java @@ -5,6 +5,7 @@ import at.pavlov.cannons.builders.ParticleBuilder; import at.pavlov.cannons.cannon.CannonManager; import at.pavlov.cannons.container.ItemHolder; +import at.pavlov.cannons.hooks.towny.TownyAllowCannon; import at.pavlov.cannons.utils.ArmorCalculationUtil; import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.FileUtils; @@ -41,6 +42,7 @@ private boolean movecraftCannonEnabled; private boolean townyEnabled; + private TownyAllowCannon townyAllowedPlayers; //endregion //build limits @@ -134,7 +136,9 @@ public void loadConfig() { setEconomyDisabled(!config.getBoolean("hooks.vault.enabled", true)); setMovecraftEnabled(config.getBoolean("hooks.movecraft.enabled", true)); setMovecraftCannonEnabled(config.getBoolean("hooks.movecraftCombat.enabled", true)); + setTownyEnabled(config.getBoolean("hooks.towny.enabled", true)); + setTownyAllowedPlayers(TownyAllowCannon.fromConfig(config, "hooks.towny")); setRelayExplosionEvent(config.getBoolean("general.relayExplosionEvent", false)); setClaimEdgeLength(config.getInt("general.claimEdgeLength", 60)); diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyAllowCannon.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyAllowCannon.java new file mode 100644 index 00000000..3a86b109 --- /dev/null +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyAllowCannon.java @@ -0,0 +1,21 @@ +package at.pavlov.cannons.hooks.towny; + +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.Locale; + +public enum TownyAllowCannon { + ALL, + TOWN, + ALLIES; + + public static TownyAllowCannon fromConfig(FileConfiguration config, String key) { + String result = config.getString(key, "TOWN"); + + try { + return TownyAllowCannon.valueOf(result.toUpperCase(Locale.ROOT)); + } catch (Exception ignored) { + return TOWN; + } + } +} diff --git a/cannons-bukkit/src/main/resources/config.yml b/cannons-bukkit/src/main/resources/config.yml index ae9eb146..f2a6fac2 100644 --- a/cannons-bukkit/src/main/resources/config.yml +++ b/cannons-bukkit/src/main/resources/config.yml @@ -23,6 +23,11 @@ hooks: enabled: true towny: enabled: true + # Possible values of allowedPlayers: + # ALL : all player can use cannons in a town. + # TOWN : all residents can use the cannons in a town. + # ALLIES : all residents and allies can use the cannons in a town. + allowedPlayers: TOWN cannonLimits: From 3cf8bc291f4612730e46047edd30fcee2432fcdb Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 2 Mar 2025 11:32:47 +0100 Subject: [PATCH 08/14] Fix turret ally check (ty LlmDl) --- .../main/java/at/pavlov/cannons/Aiming.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index ff4a9d25..bc701d7d 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -24,6 +24,7 @@ import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.SoundUtils; import com.palmergames.bukkit.towny.object.Resident; +import com.palmergames.bukkit.towny.utils.CombatUtil; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -39,14 +40,12 @@ import org.bukkit.util.Vector; import java.text.DecimalFormat; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Random; import java.util.UUID; @@ -671,21 +670,26 @@ private void findSuitableTarget(Cannon cannon, Map targets) { if (cannon.isWhitelisted(t.uniqueId())) continue; //Player if (type == TargetType.PLAYER) { - LinkedList gracedPlayer = new LinkedList<>(); + final boolean[] skip = new boolean[1]; Cannons.getPlugin().getHookManager().processIfPresent(TownyHook.class, townyApi -> { - var town = townyApi.getTown(cannon.getLocation()); - if (town == null) { + Resident ownerResident = townyApi.getResident(cannon.getOwner()); + if (ownerResident == null) { return; } - town.getResidents().stream() - .map(Resident::getPlayer) - .filter(Objects::nonNull) - .map(Target::new) - .forEach(gracedPlayer::add); + Resident residentTarget = townyApi.getResident(t.uniqueId()); + if (residentTarget == null) { + return; + } + + if (CombatUtil.isAlly(residentTarget, ownerResident)) { + skip[0] = true; + } }); - possibleTargets.removeAll(gracedPlayer); + + if (skip[0]) continue; + // get solution handlePossibleTarget(cannon, t, possibleTargets); continue; From 5d6ad2f121825b15c335f1574721cbdc678e2629 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 2 Mar 2025 11:33:10 +0100 Subject: [PATCH 09/14] Remove plot type in favor of TownyAllowCannon --- .../pavlov/cannons/hooks/towny/TownyHook.java | 8 +-- .../cannons/hooks/towny/TownyListeners.java | 64 +++++++++++++++---- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java index 70eb03bb..dba64253 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java @@ -4,15 +4,10 @@ import at.pavlov.cannons.hooks.BukkitHook; import at.pavlov.internal.Hook; import com.palmergames.bukkit.towny.TownyAPI; -import com.palmergames.bukkit.towny.object.TownBlockType; -import com.palmergames.bukkit.towny.object.TownBlockTypeHandler; -import lombok.Getter; import lombok.SneakyThrows; import org.bukkit.plugin.PluginManager; public class TownyHook extends BukkitHook { - @Getter - private static TownBlockType artilleryType; public TownyHook(Cannons plugin) { super(plugin); @@ -33,8 +28,7 @@ public void onEnable() { } hook = TownyAPI.getInstance(); - artilleryType = new TownBlockType("Artillery Position"); - TownBlockTypeHandler.registerType(artilleryType); + pluginManager.registerEvents(new TownyListeners(), plugin); } @Override diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java index e3c6bb8c..c0050fe0 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java @@ -1,29 +1,65 @@ package at.pavlov.cannons.hooks.towny; -import at.pavlov.cannons.cannon.CannonManager; +import at.pavlov.cannons.config.Config; +import at.pavlov.cannons.event.CannonUseEvent; import com.palmergames.bukkit.towny.TownyAPI; -import com.palmergames.bukkit.towny.event.actions.TownyActionEvent; -import com.palmergames.bukkit.towny.object.TownBlock; +import com.palmergames.bukkit.towny.object.Resident; +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.utils.CombatUtil; import org.bukkit.Location; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -public class TownyListeners implements Listener { +import java.util.UUID; - private static final CannonManager manager = CannonManager.getInstance(); +public class TownyListeners implements Listener { + private static final Config config = Config.getInstance(); + private static final TownyAPI api = TownyAPI.getInstance(); @EventHandler - public void onAction(TownyActionEvent event) { - TownyAPI api = TownyAPI.getInstance(); - Location location = event.getLocation(); - TownBlock townBlock = api.getTownBlock(location); - if (townBlock == null) return; + public void onAction(CannonUseEvent event) { + Location location = event.getCannon().getLocation(); + TownyAllowCannon tac = config.getTownyAllowedPlayers(); + if (tac == TownyAllowCannon.ALL) { + return; + } + + Town town = api.getTown(location); + if (town == null) { + return; + } + + UUID playerUUID = event.getPlayer(); + for (Resident resident : town.getResidents()) { + if (resident.getUUID() == playerUUID) { + return; + } + } - if (!townBlock.getType().equals(TownyHook.getArtilleryType())) return; + if (tac == TownyAllowCannon.TOWN) { + event.setCancelled(true); + return; + } + + Resident resident = api.getResident(playerUUID); + if (resident == null) { + //this shouldn't happen tbh + return; + } - boolean isCannon = manager.getCannon(location, event.getPlayer().getUniqueId()) != null; - if (isCannon) { - event.setCancelled(false); + Town otherTown; + try { + otherTown = resident.getTown(); + } catch (Exception e) { + event.setCancelled(true); + return; } + + if (CombatUtil.isAlly(town, otherTown)) { + return; + } + + event.setCancelled(true); } + } From e117529bd0a344d3576170e82d2c810bc9844281 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 2 Mar 2025 11:41:52 +0100 Subject: [PATCH 10/14] Add active check --- api-internal/src/main/java/at/pavlov/internal/HookManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/HookManager.java b/api-internal/src/main/java/at/pavlov/internal/HookManager.java index 5f660e33..d278dcb4 100644 --- a/api-internal/src/main/java/at/pavlov/internal/HookManager.java +++ b/api-internal/src/main/java/at/pavlov/internal/HookManager.java @@ -49,7 +49,7 @@ public boolean isRegistered(@NotNull Class> type) { public > void processIfPresent(@NotNull Class type, Consumer consumer) { T hook = getHook(type); - if (hook == null) { + if (hook == null || !hook.active()) { return; } From 9cfdc7ec6c93e209e944ec120eae70884ef9d2a1 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Mon, 3 Mar 2025 17:50:29 +0100 Subject: [PATCH 11/14] Add comment --- .../main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java index c0050fe0..0fe81ae9 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java @@ -36,6 +36,7 @@ public void onAction(CannonUseEvent event) { } } + // we already did town check, if it failed and tac is set to TOWN we are done here if (tac == TownyAllowCannon.TOWN) { event.setCancelled(true); return; From 5e60ada0eadb6a781604ba5d8be471b4926ba585 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Mon, 3 Mar 2025 21:39:40 +0100 Subject: [PATCH 12/14] Make onDisable default to nothing, as 99% of the time nothing needs to be done --- api-internal/src/main/java/at/pavlov/internal/Hook.java | 2 +- .../src/main/java/at/pavlov/cannons/hooks/VaultHook.java | 3 --- .../at/pavlov/cannons/hooks/movecraft/MovecraftHook.java | 7 ------- .../cannons/hooks/movecraftcombat/MovecraftCombatHook.java | 5 ----- .../at/pavlov/cannons/hooks/papi/PlaceholderAPIHook.java | 5 ----- .../main/java/at/pavlov/cannons/hooks/towny/TownyHook.java | 5 ----- 6 files changed, 1 insertion(+), 26 deletions(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/Hook.java b/api-internal/src/main/java/at/pavlov/internal/Hook.java index 9d492071..b44afc95 100644 --- a/api-internal/src/main/java/at/pavlov/internal/Hook.java +++ b/api-internal/src/main/java/at/pavlov/internal/Hook.java @@ -9,7 +9,7 @@ default boolean active() { } void onEnable(); - void onDisable(); + default void onDisable() {} Class> getTypeClass(); default @NotNull String enabledMessage() { diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/VaultHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/VaultHook.java index e155698a..6d23cc6f 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/VaultHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/VaultHook.java @@ -34,9 +34,6 @@ public void onEnable() { plugin.logInfo(ChatColor.GREEN + enabledMessage()); } - @Override - public void onDisable() { } - @Override public Class> getTypeClass() { return VaultHook.class; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraft/MovecraftHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraft/MovecraftHook.java index 3667bcc2..00356e20 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraft/MovecraftHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraft/MovecraftHook.java @@ -43,13 +43,6 @@ public void onEnable() { plugin.logInfo(ChatColor.GREEN + enabledMessage()); } - @Override - public void onDisable() { - HandlerList.unregisterAll(new CraftDetectListener()); - HandlerList.unregisterAll(new TranslationListener()); - HandlerList.unregisterAll(new RotationListener()); - } - @Override public Class> getTypeClass() { return MovecraftHook.class; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraftcombat/MovecraftCombatHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraftcombat/MovecraftCombatHook.java index 7019053c..c8e8695c 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraftcombat/MovecraftCombatHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/movecraftcombat/MovecraftCombatHook.java @@ -29,11 +29,6 @@ public void onEnable() { plugin.logInfo(ChatColor.GREEN + enabledMessage()); } - @Override - public void onDisable() { - HandlerList.unregisterAll(new ProjectileImpactListener()); - } - @Override public Class> getTypeClass() { return MovecraftCombatHook.class; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/papi/PlaceholderAPIHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/papi/PlaceholderAPIHook.java index 1a831118..9708ec28 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/papi/PlaceholderAPIHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/papi/PlaceholderAPIHook.java @@ -29,11 +29,6 @@ public void onEnable() { plugin.logInfo(ChatColor.GREEN + enabledMessage()); } - @Override - public void onDisable() { - - } - @Override public boolean active() { return working; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java index dba64253..6448f407 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyHook.java @@ -31,11 +31,6 @@ public void onEnable() { pluginManager.registerEvents(new TownyListeners(), plugin); } - @Override - public void onDisable() { - - } - @Override public Class> getTypeClass() { return TownyHook.class; From 9caf3b7f2b1edf03fb1ac9fd153bc83a420cabc2 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Mon, 10 Mar 2025 20:41:07 +0100 Subject: [PATCH 13/14] Fix permission print --- .../cannons/hooks/towny/TownyListeners.java | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java index 0fe81ae9..4122e173 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/hooks/towny/TownyListeners.java @@ -6,12 +6,17 @@ import com.palmergames.bukkit.towny.object.Resident; import com.palmergames.bukkit.towny.object.Town; import com.palmergames.bukkit.towny.utils.CombatUtil; +import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import java.util.UUID; +import static at.pavlov.cannons.Enum.InteractAction.adjustPlayer; +import static at.pavlov.cannons.Enum.InteractAction.fireRightClickTigger; + public class TownyListeners implements Listener { private static final Config config = Config.getInstance(); private static final TownyAPI api = TownyAPI.getInstance(); @@ -30,29 +35,41 @@ public void onAction(CannonUseEvent event) { } UUID playerUUID = event.getPlayer(); - for (Resident resident : town.getResidents()) { - if (resident.getUUID() == playerUUID) { - return; - } + if (playerUUID == null) { + return; + } + + Player player = Bukkit.getPlayer(playerUUID); + if (player == null) { + event.setCancelled(true); + return; + } + + if (player.hasPermission("cannons.admin.*")) { + return; + } + + if (town.hasResident(playerUUID)) { + return; } - // we already did town check, if it failed and tac is set to TOWN we are done here + // we already did town check, + // if it failed and tac is set to TOWN we are done here if (tac == TownyAllowCannon.TOWN) { event.setCancelled(true); + player.sendMessage("§4[Cannons] No permission to interact with this cannons. (TownyAllowCannon.TOWN)"); return; } Resident resident = api.getResident(playerUUID); - if (resident == null) { - //this shouldn't happen tbh + if (resident == null) { //this shouldn't happen tbh return; } - Town otherTown; - try { - otherTown = resident.getTown(); - } catch (Exception e) { + Town otherTown = resident.getTownOrNull();; + if (otherTown == null) { event.setCancelled(true); + player.sendMessage("§4[Cannons] No permission to interact with this cannons. (No town)"); return; } @@ -61,6 +78,7 @@ public void onAction(CannonUseEvent event) { } event.setCancelled(true); + player.sendMessage("§4[Cannons] No permission to interact with this cannons. (TownyAllowCannon.ALLY)"); } } From 1e4742e045a00687f83e09b9d7f693e3e4d9bf60 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 11 Mar 2025 20:31:51 +0100 Subject: [PATCH 14/14] Check cannon owner on whitelist --- cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index d7a68f06..9de780a8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -697,6 +697,7 @@ private void findSuitableTarget(Cannon cannon, Map targets) { Cannon tCannon = CannonManager.getCannon(t.uniqueId()); if (tCannon == null) continue; + if (cannon.isWhitelisted(tCannon.getOwner())) continue; //Cannons & Other have same handling //check if the owner is whitelisted if (type == TargetType.CANNON || type == TargetType.OTHER) {