From 3fa5bfa4a02b65a905e3dc4ce23a16a5e64f388f Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 14 Dec 2025 20:43:43 +0100 Subject: [PATCH 01/24] I've added new options to Pearl and Trident that reset the timer when we use them --- .../fight/trident/FightTridentService.java | 16 +++ .../com/eternalcode/combat/CombatPlugin.java | 6 +- .../config/implementation/PluginConfig.java | 8 ++ .../fight/pearl/FightPearlController.java | 13 ++- .../fight/pearl/FightPearlSettings.java | 3 + .../fight/trident/FightTridentController.java | 99 +++++++++++++++++++ .../trident/FightTridentServiceImpl.java | 50 ++++++++++ .../fight/trident/FightTridentSettings.java | 39 ++++++++ 8 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java new file mode 100644 index 00000000..9ff19dd3 --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java @@ -0,0 +1,16 @@ +package com.eternalcode.combat.fight.trident; + +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + +public interface FightTridentService { + + Instant getDelay(UUID uuid); + + Duration getRemainingDelay(UUID uuid); + + boolean hasDelay(UUID uuid); + + void markDelay(UUID uuid); +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index c2de7b8d..0bb42590 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -16,6 +16,8 @@ import com.eternalcode.combat.fight.knockback.KnockbackService; import com.eternalcode.combat.fight.tagout.FightTagOutService; import com.eternalcode.combat.fight.pearl.FightPearlService; +import com.eternalcode.combat.fight.trident.FightTridentController; +import com.eternalcode.combat.fight.trident.FightTridentService; import com.eternalcode.combat.handler.InvalidUsageHandlerImpl; import com.eternalcode.combat.handler.MissingPermissionHandlerImpl; import com.eternalcode.combat.config.ConfigService; @@ -78,6 +80,7 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private FightManager fightManager; private FightPearlService fightPearlService; + private FightTridentService fightTridentService; private FightTagOutService fightTagOutService; private FightEffectService fightEffectService; @@ -173,7 +176,8 @@ public void onEnable() { new FightTagController(this.fightManager, pluginConfig), new FightUnTagController(this.fightManager, pluginConfig, logoutService), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), - new FightPearlController(pluginConfig.pearl, noticeService, this.fightManager, this.fightPearlService), + new FightPearlController(pluginConfig.pearl, noticeService, this.fightManager, this.fightPearlService, pluginConfig), + new FightTridentController(pluginConfig.trident, noticeService, this.fightManager, this.fightTridentService, pluginConfig), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, this.getServer()), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index ac46f959..3aeb8cad 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -5,6 +5,7 @@ import com.eternalcode.combat.fight.effect.FightEffectSettings; import com.eternalcode.combat.fight.knockback.KnockbackSettings; import com.eternalcode.combat.fight.pearl.FightPearlSettings; +import com.eternalcode.combat.fight.trident.FightTridentSettings; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import java.time.Duration; @@ -35,6 +36,13 @@ public class PluginConfig extends OkaeriConfig { }) public FightPearlSettings pearl = new FightPearlSettings(); + @Comment({ + " ", + "# Settings related to Trident", + "# Configure cooldowns, restrictions, and other behaviors for Trident during combat." + }) + public FightTridentSettings trident = new FightTridentSettings(); + @Comment({ " ", "# Custom effects applied during combat.", diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index bfd35700..92d065e6 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -1,6 +1,8 @@ package com.eternalcode.combat.fight.pearl; +import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import java.time.Duration; @@ -14,7 +16,6 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; -import org.bukkit.inventory.ItemStack; public class FightPearlController implements Listener { @@ -22,17 +23,20 @@ public class FightPearlController implements Listener { private final NoticeService noticeService; private final FightManager fightManager; private final FightPearlService fightPearlService; + private final PluginConfig config; public FightPearlController( FightPearlSettings settings, NoticeService noticeService, FightManager fightManager, - FightPearlService fightPearlService + FightPearlService fightPearlService, + PluginConfig config ) { this.settings = settings; this.noticeService = noticeService; this.fightManager = fightManager; this.fightPearlService = fightPearlService; + this.config = config; } @EventHandler(priority = EventPriority.HIGHEST) @@ -63,6 +67,11 @@ public void onPearlThrow(ProjectileLaunchEvent event) { if (this.settings.pearlCooldownEnabled) { handlePearlCooldown(event, player, playerId); } + + if (this.settings.pearlResetsTimerEnabled) { + Duration combatTime = this.config.settings.combatTimerDuration; + this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + } } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java index 4cb29803..d38ad5a3 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java @@ -21,6 +21,9 @@ public class FightPearlSettings extends OkaeriConfig { @Comment("# Set true, If you want add cooldown to pearls") public boolean pearlCooldownEnabled = false; + @Comment("# Set true, If you want to reset timer when player throws ender pearl") + public boolean pearlResetsTimerEnabled = true; + @Comment({ "# Block throwing pearls with delay?", "# If you set this to for example 3s, player will have to wait 3 seconds before throwing another pearl" diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java new file mode 100644 index 00000000..88632395 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -0,0 +1,99 @@ +package com.eternalcode.combat.fight.trident; + +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.FightManager; + +import com.eternalcode.combat.fight.event.CauseOfTag; +import com.eternalcode.combat.notification.NoticeService; +import com.eternalcode.combat.util.DurationUtil; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import javax.swing.*; +import java.time.Duration; +import java.util.UUID; + +public class FightTridentController implements Listener { + + private final FightTridentSettings settings; + private final NoticeService noticeService; + private final FightManager fightManager; + private final FightTridentService fightTridentService; + private final PluginConfig config; + + public FightTridentController( + FightTridentSettings settings, + NoticeService noticeService, + FightManager fightManager, + FightTridentService fightTridentService, + PluginConfig config + ) { + this.settings = settings; + this.noticeService = noticeService; + this.fightManager = fightManager; + this.fightTridentService = fightTridentService; + this.config = config; + } + + + @EventHandler(priority = EventPriority.HIGHEST) + public void onTridentInteract(PlayerInteractEvent event) { + ItemStack item = event.getItem(); + + if (item == null || item.getType() != Material.TRIDENT) { + return; + } + + Player player = event.getPlayer(); + UUID playerId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(playerId)) { + return; + } + + if (this.settings.tridentThrowDisabledDuringCombat) { + event.setCancelled(true); + this.noticeService.create() + .player(playerId) + .notice(this.settings.tridentThrowBlockedDuringCombat) + .send(); + return; + } + + if (this.settings.tridentCooldownEnabled) { + this.handleTridentCooldown(event, player, playerId); + } + + if (this.settings.tridentResetsTimerEnabled) { + Duration combatTime = this.config.settings.combatTimerDuration; + this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + } + } + + private void handleTridentCooldown(PlayerInteractEvent event, Player player, UUID playerId) { + if (this.settings.tridentThrowDelay.isZero()) { + return; + } + + if (this.fightTridentService.hasDelay(playerId)) { + event.setCancelled(true); + Duration remainingDelay = this.fightTridentService.getRemainingDelay(playerId); + + this.noticeService.create() + .player(playerId) + .notice(this.settings.tridentThrowBlockedDelayDuringCombat) + .placeholder("{TIME}", DurationUtil.format(remainingDelay)) + .send(); + return; + } + + this.fightTridentService.markDelay(playerId); + int cooldownTicks = (int) (this.settings.tridentThrowDelay.toMillis() / 50); + player.setCooldown(Material.TRIDENT, cooldownTicks); + } +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java new file mode 100644 index 00000000..98655ea8 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -0,0 +1,50 @@ +package com.eternalcode.combat.fight.trident; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; + +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + +public class FightTridentServiceImpl implements FightTridentService { + private final FightTridentSettings tridentSettings; + private final Cache pearlStartTimes; + + public FightTridentServiceImpl(FightTridentSettings pearlSettings) { + this.tridentSettings = pearlSettings; + this.pearlStartTimes = Caffeine.newBuilder() + .expireAfterWrite(pearlSettings.tridentThrowDelay) + .build(); + } + + @Override + public void markDelay(UUID uuid) { + this.pearlStartTimes.put(uuid, Instant.now()); + } + + @Override + public boolean hasDelay(UUID uuid) { + return this.pearlStartTimes.getIfPresent(uuid) != null; + } + + @Override + public Duration getRemainingDelay(UUID uuid) { + Instant startTime = this.pearlStartTimes.getIfPresent(uuid); + if (startTime == null) { + return Duration.ZERO; + } + + Duration elapsed = Duration.between(startTime, Instant.now()); + Duration remaining = this.tridentSettings.tridentThrowDelay.minus(elapsed); + + return remaining.isNegative() ? Duration.ZERO : remaining; + } + + @Override + public Instant getDelay(UUID uuid) { + Instant startTime = this.pearlStartTimes.getIfPresent(uuid); + return startTime != null ? startTime.plus(this.tridentSettings.tridentThrowDelay) : Instant.MIN; + } +} + diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java new file mode 100644 index 00000000..707d28e0 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -0,0 +1,39 @@ +package com.eternalcode.combat.fight.trident; + +import com.eternalcode.multification.bukkit.notice.BukkitNotice; +import com.eternalcode.multification.notice.Notice; +import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; + +import java.time.Duration; + +public class FightTridentSettings extends OkaeriConfig { + + @Comment({ + "# Set true, If you want to disable throwing trident during combat", + "# This will work globally, but can be overridden by region settings" + }) + public boolean tridentThrowDisabledDuringCombat = true; + + @Comment("# Set true, If you want add cooldown to pearls") + public boolean tridentCooldownEnabled = false; + + @Comment("# Set true, If you want to reset timer when player uses trident") + public boolean tridentResetsTimerEnabled = true; + + @Comment({ + "# Block throwing trident with delay?", + "# If you set this to for example 3s, player will have to wait 3 seconds before throwing another pearl" + }) + public Duration tridentThrowDelay = Duration.ofSeconds(3); + + @Comment("# Message sent when player tries to throw trident, but are disabled") + public Notice tridentThrowBlockedDuringCombat = BukkitNotice.builder() + .chat("Throwing trident is prohibited during combat!") + .build(); + + @Comment("# Message sent when player tries to throw ender pearl, but has delay") + public Notice tridentThrowBlockedDelayDuringCombat = BukkitNotice.builder() + .chat("You must wait {TIME} before next throw!") + .build(); +} From fa7e22011171e3798f21d526e4dfd28ee066e7d3 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 14 Dec 2025 21:04:55 +0100 Subject: [PATCH 02/24] I made the corrections that gemini noticed --- .../java/com/eternalcode/combat/CombatPlugin.java | 2 ++ .../combat/fight/trident/FightTridentController.java | 1 - .../fight/trident/FightTridentServiceImpl.java | 12 ++++++------ .../combat/fight/trident/FightTridentSettings.java | 6 +++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 0bb42590..8286caf7 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -18,6 +18,7 @@ import com.eternalcode.combat.fight.pearl.FightPearlService; import com.eternalcode.combat.fight.trident.FightTridentController; import com.eternalcode.combat.fight.trident.FightTridentService; +import com.eternalcode.combat.fight.trident.FightTridentServiceImpl; import com.eternalcode.combat.handler.InvalidUsageHandlerImpl; import com.eternalcode.combat.handler.MissingPermissionHandlerImpl; import com.eternalcode.combat.config.ConfigService; @@ -109,6 +110,7 @@ public void onEnable() { this.fightManager = new FightManagerImpl(eventManager); this.fightPearlService = new FightPearlServiceImpl(pluginConfig.pearl); + this.fightTridentService = new FightTridentServiceImpl(pluginConfig.trident); this.fightTagOutService = new FightTagOutServiceImpl(); this.fightEffectService = new FightEffectServiceImpl(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 88632395..7f0b0117 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -14,7 +14,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -import javax.swing.*; import java.time.Duration; import java.util.UUID; diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 98655ea8..279e0aee 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -9,28 +9,28 @@ public class FightTridentServiceImpl implements FightTridentService { private final FightTridentSettings tridentSettings; - private final Cache pearlStartTimes; + private final Cache tridentStartTimes; public FightTridentServiceImpl(FightTridentSettings pearlSettings) { this.tridentSettings = pearlSettings; - this.pearlStartTimes = Caffeine.newBuilder() + this.tridentStartTimes = Caffeine.newBuilder() .expireAfterWrite(pearlSettings.tridentThrowDelay) .build(); } @Override public void markDelay(UUID uuid) { - this.pearlStartTimes.put(uuid, Instant.now()); + this.tridentStartTimes.put(uuid, Instant.now()); } @Override public boolean hasDelay(UUID uuid) { - return this.pearlStartTimes.getIfPresent(uuid) != null; + return this.tridentStartTimes.getIfPresent(uuid) != null; } @Override public Duration getRemainingDelay(UUID uuid) { - Instant startTime = this.pearlStartTimes.getIfPresent(uuid); + Instant startTime = this.tridentStartTimes.getIfPresent(uuid); if (startTime == null) { return Duration.ZERO; } @@ -43,7 +43,7 @@ public Duration getRemainingDelay(UUID uuid) { @Override public Instant getDelay(UUID uuid) { - Instant startTime = this.pearlStartTimes.getIfPresent(uuid); + Instant startTime = this.tridentStartTimes.getIfPresent(uuid); return startTime != null ? startTime.plus(this.tridentSettings.tridentThrowDelay) : Instant.MIN; } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index 707d28e0..f62cbc90 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -15,7 +15,7 @@ public class FightTridentSettings extends OkaeriConfig { }) public boolean tridentThrowDisabledDuringCombat = true; - @Comment("# Set true, If you want add cooldown to pearls") + @Comment("# Set true, If you want add cooldown to trident") public boolean tridentCooldownEnabled = false; @Comment("# Set true, If you want to reset timer when player uses trident") @@ -23,7 +23,7 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ "# Block throwing trident with delay?", - "# If you set this to for example 3s, player will have to wait 3 seconds before throwing another pearl" + "# If you set this to for example 3s, player will have to wait 3 seconds before throwing trident" }) public Duration tridentThrowDelay = Duration.ofSeconds(3); @@ -32,7 +32,7 @@ public class FightTridentSettings extends OkaeriConfig { .chat("Throwing trident is prohibited during combat!") .build(); - @Comment("# Message sent when player tries to throw ender pearl, but has delay") + @Comment("# Message sent when player tries to throw trident, but has delay") public Notice tridentThrowBlockedDelayDuringCombat = BukkitNotice.builder() .chat("You must wait {TIME} before next throw!") .build(); From e48a01fb98dfae8b0c7ffcdd0add50d666fe5c8e Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 29 Dec 2025 20:19:24 +0100 Subject: [PATCH 03/24] The improvements suggested by the team have been implemented --- .../fight/pearl/FightPearlController.java | 4 ++-- .../fight/pearl/FightPearlSettings.java | 2 +- .../fight/trident/FightTridentController.java | 22 ++++++++++++++++--- .../trident/FightTridentServiceImpl.java | 9 ++++---- .../fight/trident/FightTridentSettings.java | 18 +++++++-------- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 92d065e6..1fc3b4ca 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -68,9 +68,9 @@ public void onPearlThrow(ProjectileLaunchEvent event) { handlePearlCooldown(event, player, playerId); } - if (this.settings.pearlResetsTimerEnabled) { + if (this.settings.pearlResetsTimer) { Duration combatTime = this.config.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + this.fightManager.tag(playerId, combatTime, CauseOfTag.NON_PLAYER); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java index d38ad5a3..67e9f6d4 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java @@ -22,7 +22,7 @@ public class FightPearlSettings extends OkaeriConfig { public boolean pearlCooldownEnabled = false; @Comment("# Set true, If you want to reset timer when player throws ender pearl") - public boolean pearlResetsTimerEnabled = true; + public boolean pearlResetsTimer = true; @Comment({ "# Block throwing pearls with delay?", diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 7f0b0117..9efe0210 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -7,12 +7,15 @@ import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerRiptideEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import java.time.Duration; import java.util.UUID; @@ -39,7 +42,6 @@ public FightTridentController( this.config = config; } - @EventHandler(priority = EventPriority.HIGHEST) public void onTridentInteract(PlayerInteractEvent event) { ItemStack item = event.getItem(); @@ -48,6 +50,10 @@ public void onTridentInteract(PlayerInteractEvent event) { return; } + if (!item.hasItemMeta() || !item.getItemMeta().hasEnchant(Enchantment.RIPTIDE)) { + return; + } + Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); @@ -67,10 +73,20 @@ public void onTridentInteract(PlayerInteractEvent event) { if (this.settings.tridentCooldownEnabled) { this.handleTridentCooldown(event, player, playerId); } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onTridentRiptide(PlayerRiptideEvent event) { + Player player = event.getPlayer(); + UUID playerId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(playerId)) { + return; + } - if (this.settings.tridentResetsTimerEnabled) { + if (this.settings.tridentResetsTimer) { Duration combatTime = this.config.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + this.fightManager.tag(playerId, combatTime, CauseOfTag.NON_PLAYER); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 279e0aee..0f1ef247 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -2,6 +2,7 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import org.jetbrains.annotations.NotNull; import java.time.Duration; import java.time.Instant; @@ -9,12 +10,12 @@ public class FightTridentServiceImpl implements FightTridentService { private final FightTridentSettings tridentSettings; - private final Cache tridentStartTimes; + private final Cache<@NotNull UUID, Instant> tridentStartTimes; - public FightTridentServiceImpl(FightTridentSettings pearlSettings) { - this.tridentSettings = pearlSettings; + public FightTridentServiceImpl(FightTridentSettings tridentSettings) { + this.tridentSettings = tridentSettings; this.tridentStartTimes = Caffeine.newBuilder() - .expireAfterWrite(pearlSettings.tridentThrowDelay) + .expireAfterWrite(tridentSettings.tridentThrowDelay) .build(); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index f62cbc90..a76ce925 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -10,29 +10,29 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ - "# Set true, If you want to disable throwing trident during combat", + "# Set to true to disable throwing tridents during combat.", "# This will work globally, but can be overridden by region settings" }) - public boolean tridentThrowDisabledDuringCombat = true; + public boolean tridentThrowDisabledDuringCombat = false; - @Comment("# Set true, If you want add cooldown to trident") + @Comment("# Set to true so throwing trident will result in cooldown - delay between throws") public boolean tridentCooldownEnabled = false; - @Comment("# Set true, If you want to reset timer when player uses trident") - public boolean tridentResetsTimerEnabled = true; + @Comment("# Set to true, so the users will get combat log when they throw tridents") + public boolean tridentResetsTimer = false; @Comment({ - "# Block throwing trident with delay?", - "# If you set this to for example 3s, player will have to wait 3 seconds before throwing trident" + "# Should throwing trident be on cooldown?", + "# Setting this option to 3s will make players wait 3 seconds between trident throws" }) public Duration tridentThrowDelay = Duration.ofSeconds(3); - @Comment("# Message sent when player tries to throw trident, but are disabled") + @Comment("# Message sent to the player when throwing trident is disabled") public Notice tridentThrowBlockedDuringCombat = BukkitNotice.builder() .chat("Throwing trident is prohibited during combat!") .build(); - @Comment("# Message sent when player tries to throw trident, but has delay") + @Comment("# Message marking delay between trident throws") public Notice tridentThrowBlockedDelayDuringCombat = BukkitNotice.builder() .chat("You must wait {TIME} before next throw!") .build(); From f4bdbb7f23a46c38eed394e94a58df45f0bc96a0 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 29 Dec 2025 20:25:27 +0100 Subject: [PATCH 04/24] Implemented suggestions from the team --- .../fight/pearl/FightPearlController.java | 4 ++-- .../fight/pearl/FightPearlSettings.java | 2 +- .../fight/trident/FightTridentController.java | 22 +++---------------- .../trident/FightTridentServiceImpl.java | 9 ++++---- .../fight/trident/FightTridentSettings.java | 18 +++++++-------- 5 files changed, 19 insertions(+), 36 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 1fc3b4ca..92d065e6 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -68,9 +68,9 @@ public void onPearlThrow(ProjectileLaunchEvent event) { handlePearlCooldown(event, player, playerId); } - if (this.settings.pearlResetsTimer) { + if (this.settings.pearlResetsTimerEnabled) { Duration combatTime = this.config.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.NON_PLAYER); + this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java index 67e9f6d4..d38ad5a3 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java @@ -22,7 +22,7 @@ public class FightPearlSettings extends OkaeriConfig { public boolean pearlCooldownEnabled = false; @Comment("# Set true, If you want to reset timer when player throws ender pearl") - public boolean pearlResetsTimer = true; + public boolean pearlResetsTimerEnabled = true; @Comment({ "# Block throwing pearls with delay?", diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 9efe0210..7f0b0117 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -7,15 +7,12 @@ import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerRiptideEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import java.time.Duration; import java.util.UUID; @@ -42,6 +39,7 @@ public FightTridentController( this.config = config; } + @EventHandler(priority = EventPriority.HIGHEST) public void onTridentInteract(PlayerInteractEvent event) { ItemStack item = event.getItem(); @@ -50,10 +48,6 @@ public void onTridentInteract(PlayerInteractEvent event) { return; } - if (!item.hasItemMeta() || !item.getItemMeta().hasEnchant(Enchantment.RIPTIDE)) { - return; - } - Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); @@ -73,20 +67,10 @@ public void onTridentInteract(PlayerInteractEvent event) { if (this.settings.tridentCooldownEnabled) { this.handleTridentCooldown(event, player, playerId); } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onTridentRiptide(PlayerRiptideEvent event) { - Player player = event.getPlayer(); - UUID playerId = player.getUniqueId(); - - if (!this.fightManager.isInCombat(playerId)) { - return; - } - if (this.settings.tridentResetsTimer) { + if (this.settings.tridentResetsTimerEnabled) { Duration combatTime = this.config.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.NON_PLAYER); + this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 0f1ef247..279e0aee 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -2,7 +2,6 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; -import org.jetbrains.annotations.NotNull; import java.time.Duration; import java.time.Instant; @@ -10,12 +9,12 @@ public class FightTridentServiceImpl implements FightTridentService { private final FightTridentSettings tridentSettings; - private final Cache<@NotNull UUID, Instant> tridentStartTimes; + private final Cache tridentStartTimes; - public FightTridentServiceImpl(FightTridentSettings tridentSettings) { - this.tridentSettings = tridentSettings; + public FightTridentServiceImpl(FightTridentSettings pearlSettings) { + this.tridentSettings = pearlSettings; this.tridentStartTimes = Caffeine.newBuilder() - .expireAfterWrite(tridentSettings.tridentThrowDelay) + .expireAfterWrite(pearlSettings.tridentThrowDelay) .build(); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index a76ce925..f62cbc90 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -10,29 +10,29 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ - "# Set to true to disable throwing tridents during combat.", + "# Set true, If you want to disable throwing trident during combat", "# This will work globally, but can be overridden by region settings" }) - public boolean tridentThrowDisabledDuringCombat = false; + public boolean tridentThrowDisabledDuringCombat = true; - @Comment("# Set to true so throwing trident will result in cooldown - delay between throws") + @Comment("# Set true, If you want add cooldown to trident") public boolean tridentCooldownEnabled = false; - @Comment("# Set to true, so the users will get combat log when they throw tridents") - public boolean tridentResetsTimer = false; + @Comment("# Set true, If you want to reset timer when player uses trident") + public boolean tridentResetsTimerEnabled = true; @Comment({ - "# Should throwing trident be on cooldown?", - "# Setting this option to 3s will make players wait 3 seconds between trident throws" + "# Block throwing trident with delay?", + "# If you set this to for example 3s, player will have to wait 3 seconds before throwing trident" }) public Duration tridentThrowDelay = Duration.ofSeconds(3); - @Comment("# Message sent to the player when throwing trident is disabled") + @Comment("# Message sent when player tries to throw trident, but are disabled") public Notice tridentThrowBlockedDuringCombat = BukkitNotice.builder() .chat("Throwing trident is prohibited during combat!") .build(); - @Comment("# Message marking delay between trident throws") + @Comment("# Message sent when player tries to throw trident, but has delay") public Notice tridentThrowBlockedDelayDuringCombat = BukkitNotice.builder() .chat("You must wait {TIME} before next throw!") .build(); From 51d4e346cb6de89fe58b56a51c79b2f7a8a30278 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:17:10 +0100 Subject: [PATCH 05/24] Bump packetevents version to support future MC versions --- buildSrc/src/main/kotlin/Versions.kt | 2 +- eternalcombat-plugin/build.gradle.kts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index de70921e..08c6c74d 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -10,7 +10,7 @@ object Versions { const val ETERNALCODE_COMMONS = "1.3.1" const val MULTIFICATION = "1.2.2" - const val PACKETS_EVENTS = "2.9.5" + const val PACKETS_EVENTS = "2.11.1" const val ADVENTURE_PLATFORM_BUKKIT = "4.4.1" const val ADVENTURE_API = "4.25.0" diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 77d94a62..98f8539d 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -88,9 +88,9 @@ bukkit { tasks { runServer { - minecraftVersion("1.21.8") + minecraftVersion("1.21.10") downloadPlugins.url("https://cdn.modrinth.com/data/1u6JkXh5/versions/Jk1z2u7n/worldedit-bukkit-7.3.16.jar") - downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.9.5/packetevents-spigot-2.9.5.jar") + downloadPlugins.modrinth("packetevents", "${Versions.PACKETS_EVENTS}+spigot") downloadPlugins.url("https://cdn.modrinth.com/data/DKY9btbd/versions/PO4MKx7e/worldguard-bukkit-7.0.14-dist.jar") } } From 2e899de8e18f9049787325f25d56f740675ffec8 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:18:41 +0100 Subject: [PATCH 06/24] Make tridents throw check work on all tridents, regardless of enchantment --- .../combat/fight/trident/FightTridentController.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 9efe0210..42037a4e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -2,12 +2,10 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; - import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -15,7 +13,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerRiptideEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import java.time.Duration; import java.util.UUID; @@ -50,10 +47,6 @@ public void onTridentInteract(PlayerInteractEvent event) { return; } - if (!item.hasItemMeta() || !item.getItemMeta().hasEnchant(Enchantment.RIPTIDE)) { - return; - } - Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); From ab4e80475b1a986397719413d0438e78672960d3 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 2 Feb 2026 14:52:56 +0100 Subject: [PATCH 07/24] Implemented suggestions from the team and fixed `FightTridentController` logic --- .../com/eternalcode/combat/CombatPlugin.java | 4 +- .../fight/pearl/FightPearlController.java | 29 ++++---- .../fight/trident/FightTridentController.java | 72 +++++++++++-------- 3 files changed, 56 insertions(+), 49 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 8286caf7..6f81911e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -178,8 +178,8 @@ public void onEnable() { new FightTagController(this.fightManager, pluginConfig), new FightUnTagController(this.fightManager, pluginConfig, logoutService), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), - new FightPearlController(pluginConfig.pearl, noticeService, this.fightManager, this.fightPearlService, pluginConfig), - new FightTridentController(pluginConfig.trident, noticeService, this.fightManager, this.fightTridentService, pluginConfig), + new FightPearlController(pluginConfig, noticeService, this.fightManager, this.fightPearlService), + new FightTridentController(pluginConfig, noticeService, this.fightManager, this.fightTridentService), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, this.getServer()), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 92d065e6..26bb2575 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -19,24 +19,21 @@ public class FightPearlController implements Listener { - private final FightPearlSettings settings; + private final PluginConfig pluginConfig; private final NoticeService noticeService; private final FightManager fightManager; private final FightPearlService fightPearlService; - private final PluginConfig config; public FightPearlController( - FightPearlSettings settings, + PluginConfig pluginConfig, NoticeService noticeService, FightManager fightManager, - FightPearlService fightPearlService, - PluginConfig config + FightPearlService fightPearlService ) { - this.settings = settings; + this.pluginConfig = pluginConfig; this.noticeService = noticeService; this.fightManager = fightManager; this.fightPearlService = fightPearlService; - this.config = config; } @EventHandler(priority = EventPriority.HIGHEST) @@ -55,28 +52,28 @@ public void onPearlThrow(ProjectileLaunchEvent event) { return; } - if (this.settings.pearlThrowDisabledDuringCombat) { + if (this.pluginConfig.pearl.pearlThrowDisabledDuringCombat) { event.setCancelled(true); this.noticeService.create() .player(playerId) - .notice(this.settings.pearlThrowBlockedDuringCombat) + .notice(this.pluginConfig.pearl.pearlThrowBlockedDuringCombat) .send(); return; } - if (this.settings.pearlCooldownEnabled) { + if (this.pluginConfig.pearl.pearlCooldownEnabled) { handlePearlCooldown(event, player, playerId); } - if (this.settings.pearlResetsTimerEnabled) { - Duration combatTime = this.config.settings.combatTimerDuration; + if (this.pluginConfig.pearl.pearlResetsTimerEnabled) { + Duration combatTime = this.pluginConfig.settings.combatTimerDuration; this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); } } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPearlDamage(EntityDamageByEntityEvent event) { - if (this.settings.pearlThrowDamageEnabled) { + if (this.pluginConfig.pearl.pearlThrowDamageEnabled) { return; } @@ -90,7 +87,7 @@ public void onPearlDamage(EntityDamageByEntityEvent event) { } private void handlePearlCooldown(ProjectileLaunchEvent event, Player player, UUID playerId) { - if (this.settings.pearlThrowDelay.isZero()) { + if (this.pluginConfig.pearl.pearlThrowDelay.isZero()) { return; } @@ -100,14 +97,14 @@ private void handlePearlCooldown(ProjectileLaunchEvent event, Player player, UUI this.noticeService.create() .player(playerId) - .notice(this.settings.pearlThrowBlockedDelayDuringCombat) + .notice(this.pluginConfig.pearl.pearlThrowBlockedDelayDuringCombat) .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); return; } this.fightPearlService.markDelay(playerId); - int cooldownTicks = (int) (this.settings.pearlThrowDelay.toMillis() / 50); + int cooldownTicks = (int) (this.pluginConfig.pearl.pearlThrowDelay.toMillis() / 50); player.setCooldown(Material.ENDER_PEARL, cooldownTicks); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index abee41eb..795e153f 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -8,42 +8,58 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerRiptideEvent; import java.time.Duration; import java.util.UUID; public class FightTridentController implements Listener { - private final FightTridentSettings settings; + private final PluginConfig pluginConfig; private final NoticeService noticeService; private final FightManager fightManager; private final FightTridentService fightTridentService; - private final PluginConfig config; public FightTridentController( - FightTridentSettings settings, + PluginConfig pluginConfig, NoticeService noticeService, FightManager fightManager, - FightTridentService fightTridentService, - PluginConfig config + FightTridentService fightTridentService ) { - this.settings = settings; + this.pluginConfig = pluginConfig; this.noticeService = noticeService; this.fightManager = fightManager; this.fightTridentService = fightTridentService; - this.config = config; } + @EventHandler + public void onRiptide(PlayerRiptideEvent event) { + Player player = event.getPlayer(); + UUID playerId = player.getUniqueId(); - @EventHandler(priority = EventPriority.HIGHEST) - public void onTridentInteract(PlayerInteractEvent event) { - ItemStack item = event.getItem(); + if (!this.fightManager.isInCombat(playerId)) { + return; + } - if (item == null || item.getType() != Material.TRIDENT) { + if (this.pluginConfig.trident.tridentThrowDisabledDuringCombat) { + return; + } + + if (this.pluginConfig.trident.tridentCooldownEnabled) { + this.handleTridentCooldown(player, playerId); + } + + if (this.pluginConfig.trident.tridentResetsTimerEnabled) { + Duration combatTime = pluginConfig.settings.combatTimerDuration; + this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + } + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerMove(PlayerMoveEvent event) { + if (event.getFrom().distanceSquared(event.getTo()) == 0) { return; } @@ -54,44 +70,38 @@ public void onTridentInteract(PlayerInteractEvent event) { return; } - if (this.settings.tridentThrowDisabledDuringCombat) { - event.setCancelled(true); - this.noticeService.create() - .player(playerId) - .notice(this.settings.tridentThrowBlockedDuringCombat) - .send(); + if (!player.isRiptiding()) { return; } - if (this.settings.tridentCooldownEnabled) { - this.handleTridentCooldown(event, player, playerId); - } + if (this.pluginConfig.trident.tridentThrowDisabledDuringCombat) { + event.setCancelled(true); - if (this.settings.tridentResetsTimerEnabled) { - Duration combatTime = this.config.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + this.noticeService.create() + .player(playerId) + .notice(this.pluginConfig.trident.tridentThrowBlockedDuringCombat) + .send(); } } - private void handleTridentCooldown(PlayerInteractEvent event, Player player, UUID playerId) { - if (this.settings.tridentThrowDelay.isZero()) { + private void handleTridentCooldown(Player player, UUID playerId) { + if (this.pluginConfig.trident.tridentThrowDelay.isZero()) { return; } if (this.fightTridentService.hasDelay(playerId)) { - event.setCancelled(true); Duration remainingDelay = this.fightTridentService.getRemainingDelay(playerId); this.noticeService.create() .player(playerId) - .notice(this.settings.tridentThrowBlockedDelayDuringCombat) + .notice(this.pluginConfig.trident.tridentThrowBlockedDelayDuringCombat) .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); return; } this.fightTridentService.markDelay(playerId); - int cooldownTicks = (int) (this.settings.tridentThrowDelay.toMillis() / 50); + int cooldownTicks = (int) (this.pluginConfig.trident.tridentThrowDelay.toMillis() / 50); player.setCooldown(Material.TRIDENT, cooldownTicks); } } From 5ec350aa94a8e7a98b7d8592383c7121f6d13183 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Tue, 3 Feb 2026 20:55:49 +0100 Subject: [PATCH 08/24] Corrected comments and field names --- .../fight/trident/FightTridentController.java | 12 ++++---- .../trident/FightTridentServiceImpl.java | 10 +++---- .../fight/trident/FightTridentSettings.java | 30 +++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 795e153f..76e67af9 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -43,7 +43,7 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - if (this.pluginConfig.trident.tridentThrowDisabledDuringCombat) { + if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { return; } @@ -74,18 +74,18 @@ public void onPlayerMove(PlayerMoveEvent event) { return; } - if (this.pluginConfig.trident.tridentThrowDisabledDuringCombat) { + if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { event.setCancelled(true); this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.trident.tridentThrowBlockedDuringCombat) + .notice(this.pluginConfig.trident.tridentRiptideBlockedDuringCombat) .send(); } } private void handleTridentCooldown(Player player, UUID playerId) { - if (this.pluginConfig.trident.tridentThrowDelay.isZero()) { + if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { return; } @@ -94,14 +94,14 @@ private void handleTridentCooldown(Player player, UUID playerId) { this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.trident.tridentThrowBlockedDelayDuringCombat) + .notice(this.pluginConfig.trident.tridentRiptideBlockedDelayDuringCombat) .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); return; } this.fightTridentService.markDelay(playerId); - int cooldownTicks = (int) (this.pluginConfig.trident.tridentThrowDelay.toMillis() / 50); + int cooldownTicks = (int) (this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); player.setCooldown(Material.TRIDENT, cooldownTicks); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 279e0aee..7b994a86 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -11,10 +11,10 @@ public class FightTridentServiceImpl implements FightTridentService { private final FightTridentSettings tridentSettings; private final Cache tridentStartTimes; - public FightTridentServiceImpl(FightTridentSettings pearlSettings) { - this.tridentSettings = pearlSettings; + public FightTridentServiceImpl(FightTridentSettings tridentSettings) { + this.tridentSettings = tridentSettings; this.tridentStartTimes = Caffeine.newBuilder() - .expireAfterWrite(pearlSettings.tridentThrowDelay) + .expireAfterWrite(tridentSettings.tridentRiptideDelay) .build(); } @@ -36,7 +36,7 @@ public Duration getRemainingDelay(UUID uuid) { } Duration elapsed = Duration.between(startTime, Instant.now()); - Duration remaining = this.tridentSettings.tridentThrowDelay.minus(elapsed); + Duration remaining = this.tridentSettings.tridentRiptideDelay.minus(elapsed); return remaining.isNegative() ? Duration.ZERO : remaining; } @@ -44,7 +44,7 @@ public Duration getRemainingDelay(UUID uuid) { @Override public Instant getDelay(UUID uuid) { Instant startTime = this.tridentStartTimes.getIfPresent(uuid); - return startTime != null ? startTime.plus(this.tridentSettings.tridentThrowDelay) : Instant.MIN; + return startTime != null ? startTime.plus(this.tridentSettings.tridentRiptideDelay) : Instant.MIN; } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index f62cbc90..d52f83c4 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -10,30 +10,30 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ - "# Set true, If you want to disable throwing trident during combat", - "# This will work globally, but can be overridden by region settings" + "# Set to true to disable riptide usage during combat", + "# This setting works globally, but can be overridden by region settings" }) - public boolean tridentThrowDisabledDuringCombat = true; + public boolean tridentRiptideDisabledDuringCombat = true; - @Comment("# Set true, If you want add cooldown to trident") + @Comment("# Set to true so throwing trident will result in cooldown - delay between uses") public boolean tridentCooldownEnabled = false; - @Comment("# Set true, If you want to reset timer when player uses trident") - public boolean tridentResetsTimerEnabled = true; + @Comment("# Set to true so the users will get combat log when they use riptide") + public boolean tridentResetsTimerEnabled = false; @Comment({ - "# Block throwing trident with delay?", - "# If you set this to for example 3s, player will have to wait 3 seconds before throwing trident" + "# Should riptide enchantment be on cooldown?", + "# Setting this option to 3s will make players wait 3 seconds between trident throws" }) - public Duration tridentThrowDelay = Duration.ofSeconds(3); + public Duration tridentRiptideDelay = Duration.ofSeconds(3); - @Comment("# Message sent when player tries to throw trident, but are disabled") - public Notice tridentThrowBlockedDuringCombat = BukkitNotice.builder() - .chat("Throwing trident is prohibited during combat!") + @Comment("# Message shown when riptide is blocked during combat") + public Notice tridentRiptideBlockedDuringCombat = BukkitNotice.builder() + .chat("Using riptide is prohibited during combat!") .build(); - @Comment("# Message sent when player tries to throw trident, but has delay") - public Notice tridentThrowBlockedDelayDuringCombat = BukkitNotice.builder() - .chat("You must wait {TIME} before next throw!") + @Comment("# Message sent to the player when riptide is on cooldown") + public Notice tridentRiptideBlockedDelayDuringCombat = BukkitNotice.builder() + .chat("You must wait {TIME} before next usage!") .build(); } From ee6cac512dea7c9726d3cf33d8587a4214100304 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Wed, 4 Feb 2026 16:49:39 +0100 Subject: [PATCH 09/24] Implemented CitralFlo suggestions --- .../combat/fight/trident/FightTridentController.java | 11 +++++------ .../combat/fight/trident/FightTridentSettings.java | 3 ++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 76e67af9..2ea8ab5b 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -59,24 +59,23 @@ public void onRiptide(PlayerRiptideEvent event) { @EventHandler(ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { - if (event.getFrom().distanceSquared(event.getTo()) == 0) { + if (event.getFrom().distanceSquared( event.getTo()) == 0) { return; } Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); - if (!this.fightManager.isInCombat(playerId)) { - return; - } - if (!player.isRiptiding()) { return; } if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { - event.setCancelled(true); + if (!this.fightManager.isInCombat(playerId)) { + return; + } + event.setCancelled(true); this.noticeService.create() .player(playerId) .notice(this.pluginConfig.trident.tridentRiptideBlockedDuringCombat) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index d52f83c4..21ead4b1 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -23,7 +23,8 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ "# Should riptide enchantment be on cooldown?", - "# Setting this option to 3s will make players wait 3 seconds between trident throws" + "# Setting this option to 3s will make players wait 3 seconds between trident throws", + "# but if you set it to 0s, it removes the cooldown" }) public Duration tridentRiptideDelay = Duration.ofSeconds(3); From 68fb2ef13e131c9cba21ebae913d2b0c2899af66 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Thu, 5 Feb 2026 22:10:02 +0100 Subject: [PATCH 10/24] Implemented CitralFlo suggestions again --- .../combat/fight/event/CauseOfTag.java | 11 ++++ .../fight/trident/FightTridentService.java | 16 ++++- .../fight/pearl/FightPearlController.java | 2 +- .../fight/trident/FightTridentController.java | 16 ++--- .../trident/FightTridentServiceImpl.java | 39 ++++--------- .../fight/trident/FightTridentSettings.java | 15 ++--- .../eternalcode/combat/util/delay/Delay.java | 58 +++++++++++++++++++ .../combat/util/delay/InstantExpiry.java | 39 +++++++++++++ 8 files changed, 149 insertions(+), 47 deletions(-) create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfTag.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfTag.java index 32ec7eaa..9cbc001e 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfTag.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfTag.java @@ -23,6 +23,17 @@ public enum CauseOfTag { */ CRYSTAL, + /** + * Trident usage extending combat tag. + */ + TRIDENT, + + /** + * Ender pearl usage extending combat tag. + */ + ENDER_PEARL, + + /** * A custom cause, typically defined by external plugins or systems, applied the combat tag. */ diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java index 9ff19dd3..af8c23cb 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java @@ -6,11 +6,23 @@ public interface FightTridentService { - Instant getDelay(UUID uuid); - + /** + * returns remaining delay for the player to use trident again + * @param uuid unique id of the player + * @return remaining duration left to use trident again by the player + */ Duration getRemainingDelay(UUID uuid); + /** + * checks if player still has delay left to use trident + * @param uuid unique id of the player + * @return true if user still has cooldown left to use trident + */ boolean hasDelay(UUID uuid); + /** + * marks start of the delay for the user + * @param uuid unique id of the player + */ void markDelay(UUID uuid); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 26bb2575..7814d285 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -67,7 +67,7 @@ public void onPearlThrow(ProjectileLaunchEvent event) { if (this.pluginConfig.pearl.pearlResetsTimerEnabled) { Duration combatTime = this.pluginConfig.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + this.fightManager.tag(playerId, combatTime, CauseOfTag.ENDER_PEARL); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java index 2ea8ab5b..fd6d6176 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java @@ -47,19 +47,21 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - if (this.pluginConfig.trident.tridentCooldownEnabled) { - this.handleTridentCooldown(player, playerId); - } + this.handleTridentCooldown(player, playerId); if (this.pluginConfig.trident.tridentResetsTimerEnabled) { Duration combatTime = pluginConfig.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.CUSTOM); + this.fightManager.tag(playerId, combatTime, CauseOfTag.TRIDENT); } } @EventHandler(ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { - if (event.getFrom().distanceSquared( event.getTo()) == 0) { + if (event.getTo() == null) { + return; + } + + if (event.getFrom().distanceSquared(event.getTo()) == 0) { return; } @@ -78,7 +80,7 @@ public void onPlayerMove(PlayerMoveEvent event) { event.setCancelled(true); this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.trident.tridentRiptideBlockedDuringCombat) + .notice(this.pluginConfig.trident.tridentRiptideBlocked) .send(); } } @@ -93,7 +95,7 @@ private void handleTridentCooldown(Player player, UUID playerId) { this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.trident.tridentRiptideBlockedDelayDuringCombat) + .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); return; diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 7b994a86..58cb08d0 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -1,50 +1,33 @@ package com.eternalcode.combat.fight.trident; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +import com.eternalcode.combat.util.delay.Delay; import java.time.Duration; -import java.time.Instant; import java.util.UUID; public class FightTridentServiceImpl implements FightTridentService { - private final FightTridentSettings tridentSettings; - private final Cache tridentStartTimes; - - public FightTridentServiceImpl(FightTridentSettings tridentSettings) { - this.tridentSettings = tridentSettings; - this.tridentStartTimes = Caffeine.newBuilder() - .expireAfterWrite(tridentSettings.tridentRiptideDelay) - .build(); + + private final FightTridentSettings delaySettings; + private final Delay delay; + + public FightTridentServiceImpl(FightTridentSettings delaySettings) { + this.delaySettings = delaySettings; + this.delay = Delay.withDefault(() -> this.delaySettings.tridentRiptideDelay); } @Override public void markDelay(UUID uuid) { - this.tridentStartTimes.put(uuid, Instant.now()); + this.delay.markDelay(uuid); } @Override public boolean hasDelay(UUID uuid) { - return this.tridentStartTimes.getIfPresent(uuid) != null; + return this.delay.hasDelay(uuid); } @Override public Duration getRemainingDelay(UUID uuid) { - Instant startTime = this.tridentStartTimes.getIfPresent(uuid); - if (startTime == null) { - return Duration.ZERO; - } - - Duration elapsed = Duration.between(startTime, Instant.now()); - Duration remaining = this.tridentSettings.tridentRiptideDelay.minus(elapsed); - - return remaining.isNegative() ? Duration.ZERO : remaining; - } - - @Override - public Instant getDelay(UUID uuid) { - Instant startTime = this.tridentStartTimes.getIfPresent(uuid); - return startTime != null ? startTime.plus(this.tridentSettings.tridentRiptideDelay) : Instant.MIN; + return this.delay.getRemaining(uuid); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java index 21ead4b1..3ab3bb77 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java @@ -13,10 +13,7 @@ public class FightTridentSettings extends OkaeriConfig { "# Set to true to disable riptide usage during combat", "# This setting works globally, but can be overridden by region settings" }) - public boolean tridentRiptideDisabledDuringCombat = true; - - @Comment("# Set to true so throwing trident will result in cooldown - delay between uses") - public boolean tridentCooldownEnabled = false; + public boolean tridentRiptideDisabledDuringCombat = false; @Comment("# Set to true so the users will get combat log when they use riptide") public boolean tridentResetsTimerEnabled = false; @@ -24,17 +21,17 @@ public class FightTridentSettings extends OkaeriConfig { @Comment({ "# Should riptide enchantment be on cooldown?", "# Setting this option to 3s will make players wait 3 seconds between trident throws", - "# but if you set it to 0s, it removes the cooldown" + "# Setting this to 0s will remove cooldown" }) - public Duration tridentRiptideDelay = Duration.ofSeconds(3); + public Duration tridentRiptideDelay = Duration.ofSeconds(10); @Comment("# Message shown when riptide is blocked during combat") - public Notice tridentRiptideBlockedDuringCombat = BukkitNotice.builder() + public Notice tridentRiptideBlocked = BukkitNotice.builder() .chat("Using riptide is prohibited during combat!") .build(); @Comment("# Message sent to the player when riptide is on cooldown") - public Notice tridentRiptideBlockedDelayDuringCombat = BukkitNotice.builder() - .chat("You must wait {TIME} before next usage!") + public Notice tridentRiptideOnCooldown = BukkitNotice.builder() + .chat("You must wait {TIME} before next riptide!") .build(); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java new file mode 100644 index 00000000..b7544fdd --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java @@ -0,0 +1,58 @@ +package com.eternalcode.combat.util.delay; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import java.time.Duration; +import java.time.Instant; +import java.util.function.Supplier; + +public class Delay { + + private final Cache cache; + private final Supplier defaultDelay; + + private Delay(Supplier defaultDelay) { + if (defaultDelay == null) { + throw new IllegalArgumentException("defaultDelay cannot be null"); + } + + this.defaultDelay = defaultDelay; + this.cache = Caffeine.newBuilder() + .expireAfter(new InstantExpiry()) + .build(); + } + + public void markDelay(T key, Duration delay) { + if (delay.isZero() || delay.isNegative()) { + this.cache.invalidate(key); + } + + this.cache.put(key, Instant.now().plus(delay)); + } + + public void markDelay(T key) { + this.markDelay(key, this.defaultDelay.get()); + } + + public void unmarkDelay(T key) { + this.cache.invalidate(key); + } + + public boolean hasDelay(T key) { + Instant delayExpireMoment = this.getExpireAt(key); + return Instant.now().isBefore(delayExpireMoment); + } + + public Duration getRemaining(T key) { + return Duration.between(Instant.now(), this.getExpireAt(key)); + } + + private Instant getExpireAt(T key) { + return this.cache.asMap().getOrDefault(key, Instant.MIN); + } + + public static Delay withDefault(Supplier defaultDelay) { + return new Delay<>(defaultDelay); + } + +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java new file mode 100644 index 00000000..ccd213dd --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java @@ -0,0 +1,39 @@ +package com.eternalcode.combat.util.delay; + +import com.github.benmanes.caffeine.cache.Expiry; +import java.time.Duration; +import java.time.Instant; +import org.jetbrains.annotations.NotNull; + +class InstantExpiry implements Expiry<@NotNull T, @NotNull Instant> { + + @Override + public long expireAfterCreate(@NotNull T key, @NotNull Instant expireTime, long currentTime) { + return timeToExpire(expireTime); + } + + @Override + public long expireAfterUpdate(@NotNull T key, @NotNull Instant newExpireTime, long currentTime, long currentDuration) { + return timeToExpire(newExpireTime); + } + + @Override + public long expireAfterRead(@NotNull T key, @NotNull Instant value, long currentTime, long currentDuration) { + return currentDuration; + } + + private static long timeToExpire(Instant expireTime) { + Duration toExpire = Duration.between(Instant.now(), expireTime); + if (toExpire.isNegative()) { + return 0; + } + + long nanos = toExpire.toNanos(); + if (nanos == 0) { + return 1; + } + + return nanos; + } + +} From 0841c22f944d22e2ae0b4d2e420901c70ea224b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Fri, 6 Feb 2026 23:15:12 +0100 Subject: [PATCH 11/24] Follow igoyek's review from 21.10.25 --- .../eternalcode/combat/fight/pearl/FightPearlController.java | 2 +- .../com/eternalcode/combat/fight/pearl/FightPearlSettings.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 7814d285..7f992cbc 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -65,7 +65,7 @@ public void onPearlThrow(ProjectileLaunchEvent event) { handlePearlCooldown(event, player, playerId); } - if (this.pluginConfig.pearl.pearlResetsTimerEnabled) { + if (this.pluginConfig.pearl.pearlResetsTimer) { Duration combatTime = this.pluginConfig.settings.combatTimerDuration; this.fightManager.tag(playerId, combatTime, CauseOfTag.ENDER_PEARL); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java index d38ad5a3..67e9f6d4 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java @@ -22,7 +22,7 @@ public class FightPearlSettings extends OkaeriConfig { public boolean pearlCooldownEnabled = false; @Comment("# Set true, If you want to reset timer when player throws ender pearl") - public boolean pearlResetsTimerEnabled = true; + public boolean pearlResetsTimer = true; @Comment({ "# Block throwing pearls with delay?", From 76e84ab04913a1c7b3b181d8a29fb9b90fec001c Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 7 Feb 2026 22:57:11 +0100 Subject: [PATCH 12/24] CR --- .../combat/fight/pearl/FightPearlService.java | 3 -- .../com/eternalcode/combat/CombatPlugin.java | 4 +-- .../fight/pearl/FightPearlServiceImpl.java | 34 +++++-------------- .../trident/FightTridentServiceImpl.java | 7 ++-- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java index 18d2b84f..757d1641 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java @@ -1,13 +1,10 @@ package com.eternalcode.combat.fight.pearl; import java.time.Duration; -import java.time.Instant; import java.util.UUID; public interface FightPearlService { - Instant getDelay(UUID uuid); - Duration getRemainingDelay(UUID uuid); boolean hasDelay(UUID uuid); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 171718be..4ad54717 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -112,8 +112,8 @@ public void onEnable() { MinecraftScheduler scheduler = CombatSchedulerAdapter.getAdaptiveScheduler(this); this.fightManager = new FightManagerImpl(eventManager); - this.fightPearlService = new FightPearlServiceImpl(pluginConfig.pearl); - this.fightTridentService = new FightTridentServiceImpl(pluginConfig.trident); + this.fightPearlService = new FightPearlServiceImpl(pluginConfig); + this.fightTridentService = new FightTridentServiceImpl(pluginConfig); this.fightTagOutService = new FightTagOutServiceImpl(); this.fightEffectService = new FightEffectServiceImpl(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java index 584d275d..3e267f2f 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java @@ -1,50 +1,32 @@ package com.eternalcode.combat.fight.pearl; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.util.delay.Delay; import java.time.Duration; -import java.time.Instant; import java.util.UUID; public class FightPearlServiceImpl implements FightPearlService { - private final FightPearlSettings pearlSettings; - private final Cache pearlStartTimes; + private final Delay pearlStartTimes; - public FightPearlServiceImpl(FightPearlSettings pearlSettings) { - this.pearlSettings = pearlSettings; - this.pearlStartTimes = Caffeine.newBuilder() - .expireAfterWrite(pearlSettings.pearlThrowDelay) - .build(); + public FightPearlServiceImpl(PluginConfig config) { + this.pearlStartTimes = Delay.withDefault(() -> config.pearl.pearlThrowDelay); } @Override public void markDelay(UUID uuid) { - this.pearlStartTimes.put(uuid, Instant.now()); + this.pearlStartTimes.markDelay(uuid); } @Override public boolean hasDelay(UUID uuid) { - return this.pearlStartTimes.getIfPresent(uuid) != null; + return this.pearlStartTimes.hasDelay(uuid); } @Override public Duration getRemainingDelay(UUID uuid) { - Instant startTime = this.pearlStartTimes.getIfPresent(uuid); - if (startTime == null) { - return Duration.ZERO; - } - - Duration elapsed = Duration.between(startTime, Instant.now()); - Duration remaining = this.pearlSettings.pearlThrowDelay.minus(elapsed); - - return remaining.isNegative() ? Duration.ZERO : remaining; + return this.pearlStartTimes.getRemaining(uuid); } - @Override - public Instant getDelay(UUID uuid) { - Instant startTime = this.pearlStartTimes.getIfPresent(uuid); - return startTime != null ? startTime.plus(this.pearlSettings.pearlThrowDelay) : Instant.MIN; - } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java index 58cb08d0..45511644 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java @@ -1,5 +1,6 @@ package com.eternalcode.combat.fight.trident; +import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.util.delay.Delay; import java.time.Duration; @@ -7,12 +8,10 @@ public class FightTridentServiceImpl implements FightTridentService { - private final FightTridentSettings delaySettings; private final Delay delay; - public FightTridentServiceImpl(FightTridentSettings delaySettings) { - this.delaySettings = delaySettings; - this.delay = Delay.withDefault(() -> this.delaySettings.tridentRiptideDelay); + public FightTridentServiceImpl(PluginConfig config) { + this.delay = Delay.withDefault(() -> config.trident.tridentRiptideDelay); } @Override From 07ab30698229306f1c4fcfcc3cdd969fb44daa89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 00:20:27 +0100 Subject: [PATCH 13/24] Simplify naming - extract logic to service for Pearls --- .../eternalcode/combat/EternalCombatApi.java | 4 +- ...ghtPearlService.java => PearlService.java} | 6 +- .../com/eternalcode/combat/CombatPlugin.java | 16 ++--- .../config/implementation/PluginConfig.java | 4 +- .../fight/pearl/FightPearlServiceImpl.java | 32 --------- ...rlController.java => PearlController.java} | 69 ++++++------------- .../combat/fight/pearl/PearlServiceImpl.java | 62 +++++++++++++++++ ...tPearlSettings.java => PearlSettings.java} | 2 +- 8 files changed, 100 insertions(+), 95 deletions(-) rename eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/{FightPearlService.java => PearlService.java} (61%) delete mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java rename eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/{FightPearlController.java => PearlController.java} (50%) create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java rename eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/{FightPearlSettings.java => PearlSettings.java} (96%) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java index a45af55d..55e1fbc5 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java @@ -4,7 +4,7 @@ import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.drop.DropService; import com.eternalcode.combat.fight.effect.FightEffectService; -import com.eternalcode.combat.fight.pearl.FightPearlService; +import com.eternalcode.combat.fight.pearl.PearlService; import com.eternalcode.combat.region.RegionProvider; import com.eternalcode.combat.fight.tagout.FightTagOutService; @@ -14,7 +14,7 @@ public interface EternalCombatApi { RegionProvider getRegionProvider(); - FightPearlService getFightPearlService(); + PearlService getFightPearlService(); FightTagOutService getFightTagOutService(); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java similarity index 61% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java index 757d1641..dbb632d4 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java @@ -3,11 +3,13 @@ import java.time.Duration; import java.util.UUID; -public interface FightPearlService { +public interface PearlService { + + boolean shouldCancelEvent(UUID playerId); Duration getRemainingDelay(UUID uuid); boolean hasDelay(UUID uuid); - void markDelay(UUID uuid); + void handleDelay(UUID uuid); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 4ad54717..2f31d050 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -18,7 +18,7 @@ import com.eternalcode.combat.fight.firework.FireworkController; import com.eternalcode.combat.fight.knockback.KnockbackService; import com.eternalcode.combat.fight.tagout.FightTagOutService; -import com.eternalcode.combat.fight.pearl.FightPearlService; +import com.eternalcode.combat.fight.pearl.PearlService; import com.eternalcode.combat.fight.trident.FightTridentController; import com.eternalcode.combat.fight.trident.FightTridentService; import com.eternalcode.combat.fight.trident.FightTridentServiceImpl; @@ -43,8 +43,8 @@ import com.eternalcode.combat.fight.effect.FightEffectServiceImpl; import com.eternalcode.combat.fight.logout.LogoutController; import com.eternalcode.combat.fight.logout.LogoutService; -import com.eternalcode.combat.fight.pearl.FightPearlController; -import com.eternalcode.combat.fight.pearl.FightPearlServiceImpl; +import com.eternalcode.combat.fight.pearl.PearlController; +import com.eternalcode.combat.fight.pearl.PearlServiceImpl; import com.eternalcode.combat.fight.tagout.FightTagOutController; import com.eternalcode.combat.fight.tagout.FightTagOutServiceImpl; import com.eternalcode.combat.fight.tagout.FightTagOutCommand; @@ -83,7 +83,7 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private static final int BSTATS_METRICS_ID = 17803; private FightManager fightManager; - private FightPearlService fightPearlService; + private PearlService pearlService; private FightTridentService fightTridentService; private FightTagOutService fightTagOutService; private FightEffectService fightEffectService; @@ -112,7 +112,7 @@ public void onEnable() { MinecraftScheduler scheduler = CombatSchedulerAdapter.getAdaptiveScheduler(this); this.fightManager = new FightManagerImpl(eventManager); - this.fightPearlService = new FightPearlServiceImpl(pluginConfig); + this.pearlService = new PearlServiceImpl(this.fightManager, pluginConfig); this.fightTridentService = new FightTridentServiceImpl(pluginConfig); this.fightTagOutService = new FightTagOutServiceImpl(); this.fightEffectService = new FightEffectServiceImpl(); @@ -184,7 +184,7 @@ public void onEnable() { new FightBypassPermissionController(server, pluginConfig), new FightBypassCreativeController(server, pluginConfig), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), - new FightPearlController(pluginConfig, noticeService, this.fightManager, this.fightPearlService), + new PearlController(pluginConfig, this.pearlService, noticeService), new FightTridentController(pluginConfig, noticeService, this.fightManager, this.fightTridentService), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), @@ -243,8 +243,8 @@ public RegionProvider getRegionProvider() { } @Override - public FightPearlService getFightPearlService() { - return this.fightPearlService; + public PearlService getFightPearlService() { + return this.pearlService; } @Override diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 3aeb8cad..866948de 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -4,7 +4,7 @@ import com.eternalcode.combat.fight.drop.DropSettings; import com.eternalcode.combat.fight.effect.FightEffectSettings; import com.eternalcode.combat.fight.knockback.KnockbackSettings; -import com.eternalcode.combat.fight.pearl.FightPearlSettings; +import com.eternalcode.combat.fight.pearl.PearlSettings; import com.eternalcode.combat.fight.trident.FightTridentSettings; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; @@ -34,7 +34,7 @@ public class PluginConfig extends OkaeriConfig { "# Settings related to Ender Pearls.", "# Configure cooldowns, restrictions, and other behaviors for Ender Pearls during combat." }) - public FightPearlSettings pearl = new FightPearlSettings(); + public PearlSettings pearl = new PearlSettings(); @Comment({ " ", diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java deleted file mode 100644 index 3e267f2f..00000000 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.eternalcode.combat.fight.pearl; - -import com.eternalcode.combat.config.implementation.PluginConfig; -import com.eternalcode.combat.util.delay.Delay; - -import java.time.Duration; -import java.util.UUID; - -public class FightPearlServiceImpl implements FightPearlService { - - private final Delay pearlStartTimes; - - public FightPearlServiceImpl(PluginConfig config) { - this.pearlStartTimes = Delay.withDefault(() -> config.pearl.pearlThrowDelay); - } - - @Override - public void markDelay(UUID uuid) { - this.pearlStartTimes.markDelay(uuid); - } - - @Override - public boolean hasDelay(UUID uuid) { - return this.pearlStartTimes.hasDelay(uuid); - } - - @Override - public Duration getRemainingDelay(UUID uuid) { - return this.pearlStartTimes.getRemaining(uuid); - } - -} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java similarity index 50% rename from eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java index 7f992cbc..7db63553 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java @@ -1,13 +1,10 @@ package com.eternalcode.combat.fight.pearl; import com.eternalcode.combat.config.implementation.PluginConfig; -import com.eternalcode.combat.fight.FightManager; -import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import java.time.Duration; import java.util.UUID; -import org.bukkit.Material; import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -17,26 +14,22 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; -public class FightPearlController implements Listener { +public class PearlController implements Listener { private final PluginConfig pluginConfig; + private final PearlService pearlService; private final NoticeService noticeService; - private final FightManager fightManager; - private final FightPearlService fightPearlService; - public FightPearlController( + public PearlController( PluginConfig pluginConfig, - NoticeService noticeService, - FightManager fightManager, - FightPearlService fightPearlService + PearlService pearlService, NoticeService noticeService ) { this.pluginConfig = pluginConfig; + this.pearlService = pearlService; this.noticeService = noticeService; - this.fightManager = fightManager; - this.fightPearlService = fightPearlService; } - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPearlThrow(ProjectileLaunchEvent event) { if (!(event.getEntity() instanceof EnderPearl)) { return; @@ -48,27 +41,28 @@ public void onPearlThrow(ProjectileLaunchEvent event) { UUID playerId = player.getUniqueId(); - if (!this.fightManager.isInCombat(playerId)) { - return; - } - - if (this.pluginConfig.pearl.pearlThrowDisabledDuringCombat) { + if (this.pearlService.shouldCancelEvent(playerId)) { event.setCancelled(true); + + Duration remainingDelay = this.pearlService.getRemainingDelay(playerId); + + if (remainingDelay.isZero()) { + this.noticeService.create() + .player(playerId) + .notice(this.pluginConfig.pearl.pearlThrowBlockedDuringCombat) + .send(); + return; + } + this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.pearl.pearlThrowBlockedDuringCombat) + .notice(this.pluginConfig.pearl.pearlThrowBlockedDelayDuringCombat) + .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); - return; - } - if (this.pluginConfig.pearl.pearlCooldownEnabled) { - handlePearlCooldown(event, player, playerId); } - if (this.pluginConfig.pearl.pearlResetsTimer) { - Duration combatTime = this.pluginConfig.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.ENDER_PEARL); - } + this.pearlService.handleDelay(playerId); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -86,25 +80,4 @@ public void onPearlDamage(EntityDamageByEntityEvent event) { event.setDamage(0.0); } - private void handlePearlCooldown(ProjectileLaunchEvent event, Player player, UUID playerId) { - if (this.pluginConfig.pearl.pearlThrowDelay.isZero()) { - return; - } - - if (this.fightPearlService.hasDelay(playerId)) { - event.setCancelled(true); - Duration remainingDelay = this.fightPearlService.getRemainingDelay(playerId); - - this.noticeService.create() - .player(playerId) - .notice(this.pluginConfig.pearl.pearlThrowBlockedDelayDuringCombat) - .placeholder("{TIME}", DurationUtil.format(remainingDelay)) - .send(); - return; - } - - this.fightPearlService.markDelay(playerId); - int cooldownTicks = (int) (this.pluginConfig.pearl.pearlThrowDelay.toMillis() / 50); - player.setCooldown(Material.ENDER_PEARL, cooldownTicks); - } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java new file mode 100644 index 00000000..8b3fc72a --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java @@ -0,0 +1,62 @@ +package com.eternalcode.combat.fight.pearl; + +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.fight.event.CauseOfTag; +import com.eternalcode.combat.notification.NoticeService; +import com.eternalcode.combat.util.DurationUtil; +import com.eternalcode.combat.util.delay.Delay; + +import java.time.Duration; +import java.util.UUID; + +public class PearlServiceImpl implements PearlService { + + private final FightManager fightManager; + private final PluginConfig pluginConfig; + + private final Delay pearlStartTimes; + + public PearlServiceImpl(FightManager fightManager, PluginConfig pluginConfig) { + this.fightManager = fightManager; + this.pluginConfig = pluginConfig; + + this.pearlStartTimes = Delay.withDefault(() -> pluginConfig.pearl.pearlThrowDelay); + } + + @Override + public boolean shouldCancelEvent(UUID playerId) { + if (fightManager.isInCombat(playerId)) { + if (this.pluginConfig.pearl.pearlCooldownEnabled) { + return this.pearlStartTimes.hasDelay(playerId); + } + + return pluginConfig.pearl.pearlThrowDisabledDuringCombat; + } + + return false; + } + + @Override + public void handleDelay(UUID playerId) { + if (this.pluginConfig.pearl.pearlResetsTimer) { + Duration combatTime = this.pluginConfig.settings.combatTimerDuration; + this.fightManager.tag(playerId, combatTime, CauseOfTag.ENDER_PEARL); + } + + if (!this.pluginConfig.pearl.pearlThrowDelay.isZero()) { + this.pearlStartTimes.markDelay(playerId); + } + } + + @Override + public boolean hasDelay(UUID uuid) { + return this.pearlStartTimes.hasDelay(uuid); + } + + @Override + public Duration getRemainingDelay(UUID uuid) { + return this.pearlStartTimes.getRemaining(uuid); + } + +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java similarity index 96% rename from eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java index 67e9f6d4..0c25c2e7 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java @@ -7,7 +7,7 @@ import java.time.Duration; -public class FightPearlSettings extends OkaeriConfig { +public class PearlSettings extends OkaeriConfig { @Comment({ "# Is pearl damage to be enabled?", "# This will work globally" }) public boolean pearlThrowDamageEnabled = true; From 795c7b6db014587563fc286ccd081af27919fa23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 00:25:26 +0100 Subject: [PATCH 14/24] make it more logical --- .../com/eternalcode/combat/fight/pearl/PearlController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java index 7db63553..4bbb84b1 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java @@ -46,7 +46,7 @@ public void onPearlThrow(ProjectileLaunchEvent event) { Duration remainingDelay = this.pearlService.getRemainingDelay(playerId); - if (remainingDelay.isZero()) { + if (this.pluginConfig.pearl.pearlThrowDisabledDuringCombat) { this.noticeService.create() .player(playerId) .notice(this.pluginConfig.pearl.pearlThrowBlockedDuringCombat) From 984449b67327c511bb4bf4551513b4d21dc0c240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 00:41:50 +0100 Subject: [PATCH 15/24] Refactor trident-related classes and services for improved clarity and consistency --- ...ridentService.java => TridentService.java} | 11 +++- .../com/eternalcode/combat/CombatPlugin.java | 12 ++-- .../config/implementation/PluginConfig.java | 4 +- .../combat/fight/pearl/PearlController.java | 3 +- .../trident/FightTridentServiceImpl.java | 32 ---------- ...Controller.java => TridentController.java} | 56 ++++++----------- .../fight/trident/TridentServiceImpl.java | 62 +++++++++++++++++++ ...dentSettings.java => TridentSettings.java} | 2 +- 8 files changed, 101 insertions(+), 81 deletions(-) rename eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/{FightTridentService.java => TridentService.java} (68%) delete mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java rename eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/{FightTridentController.java => TridentController.java} (65%) create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java rename eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/{FightTridentSettings.java => TridentSettings.java} (96%) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java similarity index 68% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java index af8c23cb..39f1bcbd 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/FightTridentService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java @@ -1,10 +1,10 @@ package com.eternalcode.combat.fight.trident; import java.time.Duration; -import java.time.Instant; import java.util.UUID; +import org.bukkit.entity.Player; -public interface FightTridentService { +public interface TridentService { /** * returns remaining delay for the player to use trident again @@ -25,4 +25,11 @@ public interface FightTridentService { * @param uuid unique id of the player */ void markDelay(UUID uuid); + + /** + * handles the trident cooldown for the player, should be called when player uses riptide in combat + * @param player the player who used riptide in combat needed to apply cooldown to item + */ + void handleTridentCooldown(Player player); + } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 2f31d050..32aec3a1 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -19,9 +19,9 @@ import com.eternalcode.combat.fight.knockback.KnockbackService; import com.eternalcode.combat.fight.tagout.FightTagOutService; import com.eternalcode.combat.fight.pearl.PearlService; -import com.eternalcode.combat.fight.trident.FightTridentController; -import com.eternalcode.combat.fight.trident.FightTridentService; -import com.eternalcode.combat.fight.trident.FightTridentServiceImpl; +import com.eternalcode.combat.fight.trident.TridentController; +import com.eternalcode.combat.fight.trident.TridentService; +import com.eternalcode.combat.fight.trident.TridentServiceImpl; import com.eternalcode.combat.handler.InvalidUsageHandlerImpl; import com.eternalcode.combat.handler.MissingPermissionHandlerImpl; import com.eternalcode.combat.config.ConfigService; @@ -84,7 +84,7 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private FightManager fightManager; private PearlService pearlService; - private FightTridentService fightTridentService; + private TridentService tridentService; private FightTagOutService fightTagOutService; private FightEffectService fightEffectService; @@ -113,7 +113,7 @@ public void onEnable() { this.fightManager = new FightManagerImpl(eventManager); this.pearlService = new PearlServiceImpl(this.fightManager, pluginConfig); - this.fightTridentService = new FightTridentServiceImpl(pluginConfig); + this.tridentService = new TridentServiceImpl(this.fightManager, pluginConfig); this.fightTagOutService = new FightTagOutServiceImpl(); this.fightEffectService = new FightEffectServiceImpl(); @@ -185,7 +185,7 @@ public void onEnable() { new FightBypassCreativeController(server, pluginConfig), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), new PearlController(pluginConfig, this.pearlService, noticeService), - new FightTridentController(pluginConfig, noticeService, this.fightManager, this.fightTridentService), + new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, server), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 866948de..8d557a24 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -5,7 +5,7 @@ import com.eternalcode.combat.fight.effect.FightEffectSettings; import com.eternalcode.combat.fight.knockback.KnockbackSettings; import com.eternalcode.combat.fight.pearl.PearlSettings; -import com.eternalcode.combat.fight.trident.FightTridentSettings; +import com.eternalcode.combat.fight.trident.TridentSettings; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; import java.time.Duration; @@ -41,7 +41,7 @@ public class PluginConfig extends OkaeriConfig { "# Settings related to Trident", "# Configure cooldowns, restrictions, and other behaviors for Trident during combat." }) - public FightTridentSettings trident = new FightTridentSettings(); + public TridentSettings trident = new TridentSettings(); @Comment({ " ", diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java index 4bbb84b1..2fe88db8 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java @@ -44,8 +44,6 @@ public void onPearlThrow(ProjectileLaunchEvent event) { if (this.pearlService.shouldCancelEvent(playerId)) { event.setCancelled(true); - Duration remainingDelay = this.pearlService.getRemainingDelay(playerId); - if (this.pluginConfig.pearl.pearlThrowDisabledDuringCombat) { this.noticeService.create() .player(playerId) @@ -54,6 +52,7 @@ public void onPearlThrow(ProjectileLaunchEvent event) { return; } + Duration remainingDelay = this.pearlService.getRemainingDelay(playerId); this.noticeService.create() .player(playerId) .notice(this.pluginConfig.pearl.pearlThrowBlockedDelayDuringCombat) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java deleted file mode 100644 index 45511644..00000000 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.eternalcode.combat.fight.trident; - -import com.eternalcode.combat.config.implementation.PluginConfig; -import com.eternalcode.combat.util.delay.Delay; - -import java.time.Duration; -import java.util.UUID; - -public class FightTridentServiceImpl implements FightTridentService { - - private final Delay delay; - - public FightTridentServiceImpl(PluginConfig config) { - this.delay = Delay.withDefault(() -> config.trident.tridentRiptideDelay); - } - - @Override - public void markDelay(UUID uuid) { - this.delay.markDelay(uuid); - } - - @Override - public boolean hasDelay(UUID uuid) { - return this.delay.hasDelay(uuid); - } - - @Override - public Duration getRemainingDelay(UUID uuid) { - return this.delay.getRemaining(uuid); - } -} - diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java similarity index 65% rename from eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java index fd6d6176..47cec14d 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java @@ -2,10 +2,8 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; -import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -15,23 +13,23 @@ import java.time.Duration; import java.util.UUID; -public class FightTridentController implements Listener { +public class TridentController implements Listener { private final PluginConfig pluginConfig; private final NoticeService noticeService; private final FightManager fightManager; - private final FightTridentService fightTridentService; + private final TridentService tridentService; - public FightTridentController( + public TridentController( PluginConfig pluginConfig, NoticeService noticeService, FightManager fightManager, - FightTridentService fightTridentService + TridentService tridentService ) { this.pluginConfig = pluginConfig; this.noticeService = noticeService; this.fightManager = fightManager; - this.fightTridentService = fightTridentService; + this.tridentService = tridentService; } @EventHandler @@ -47,12 +45,19 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - this.handleTridentCooldown(player, playerId); + Duration remainingDelay = this.tridentService.getRemainingDelay(playerId); + if (!remainingDelay.isZero()) { - if (this.pluginConfig.trident.tridentResetsTimerEnabled) { - Duration combatTime = pluginConfig.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.TRIDENT); + this.noticeService.create() + .player(playerId) + .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) + .placeholder("{TIME}", DurationUtil.format(remainingDelay)) + .send(); + + return; } + + this.tridentService.handleTridentCooldown(player); } @EventHandler(ignoreCancelled = true) @@ -72,37 +77,16 @@ public void onPlayerMove(PlayerMoveEvent event) { return; } - if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { - if (!this.fightManager.isInCombat(playerId)) { - return; - } - - event.setCancelled(true); - this.noticeService.create() - .player(playerId) - .notice(this.pluginConfig.trident.tridentRiptideBlocked) - .send(); - } - } - - private void handleTridentCooldown(Player player, UUID playerId) { - if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { + if (!this.fightManager.isInCombat(playerId)) { return; } - if (this.fightTridentService.hasDelay(playerId)) { - Duration remainingDelay = this.fightTridentService.getRemainingDelay(playerId); - + if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { + event.setCancelled(true); this.noticeService.create() .player(playerId) - .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) - .placeholder("{TIME}", DurationUtil.format(remainingDelay)) + .notice(this.pluginConfig.trident.tridentRiptideBlocked) .send(); - return; } - - this.fightTridentService.markDelay(playerId); - int cooldownTicks = (int) (this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); - player.setCooldown(Material.TRIDENT, cooldownTicks); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java new file mode 100644 index 00000000..e5b9bcd7 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java @@ -0,0 +1,62 @@ +package com.eternalcode.combat.fight.trident; + +import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.util.delay.Delay; + +import java.time.Duration; +import java.util.UUID; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +public class TridentServiceImpl implements TridentService { + + private final FightManager fightManager; + private final PluginConfig pluginConfig; + + private final Delay delay; + + public TridentServiceImpl(FightManager fightManager, PluginConfig pluginConfig) { + this.fightManager = fightManager; + this.pluginConfig = pluginConfig; + + this.delay = Delay.withDefault(() -> pluginConfig.trident.tridentRiptideDelay); + } + + @Override + public void handleTridentCooldown(Player player) { + UUID uniqueId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(uniqueId)) { + return; + } + + if (this.hasDelay(uniqueId)) { + return; + } + + if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { + return; + } + + this.markDelay(uniqueId); + player.setCooldown(Material.TRIDENT, (int) this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); + + } + + @Override + public void markDelay(UUID uuid) { + this.delay.markDelay(uuid); + } + + @Override + public boolean hasDelay(UUID uuid) { + return this.delay.hasDelay(uuid); + } + + @Override + public Duration getRemainingDelay(UUID uuid) { + return this.delay.getRemaining(uuid); + } +} + diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java similarity index 96% rename from eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java index 3ab3bb77..bc263c28 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/FightTridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java @@ -7,7 +7,7 @@ import java.time.Duration; -public class FightTridentSettings extends OkaeriConfig { +public class TridentSettings extends OkaeriConfig { @Comment({ "# Set to true to disable riptide usage during combat", From 3b0bd1589bc4428659301697f758b5956b2d2524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 00:43:30 +0100 Subject: [PATCH 16/24] Rename trident cooldown methods to improve clarity and update comments for riptide usage --- .../com/eternalcode/combat/fight/trident/TridentService.java | 2 +- .../eternalcode/combat/fight/trident/TridentController.java | 2 +- .../eternalcode/combat/fight/trident/TridentServiceImpl.java | 2 +- .../eternalcode/combat/fight/trident/TridentSettings.java | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java index 39f1bcbd..05aae5cf 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java @@ -30,6 +30,6 @@ public interface TridentService { * handles the trident cooldown for the player, should be called when player uses riptide in combat * @param player the player who used riptide in combat needed to apply cooldown to item */ - void handleTridentCooldown(Player player); + void handleTridentDelay(Player player); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java index 47cec14d..e0d2ccc9 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java @@ -57,7 +57,7 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - this.tridentService.handleTridentCooldown(player); + this.tridentService.handleTridentDelay(player); } @EventHandler(ignoreCancelled = true) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java index e5b9bcd7..aa143480 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java @@ -24,7 +24,7 @@ public TridentServiceImpl(FightManager fightManager, PluginConfig pluginConfig) } @Override - public void handleTridentCooldown(Player player) { + public void handleTridentDelay(Player player) { UUID uniqueId = player.getUniqueId(); if (!this.fightManager.isInCombat(uniqueId)) { diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java index bc263c28..a318e67e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java @@ -30,7 +30,10 @@ public class TridentSettings extends OkaeriConfig { .chat("Using riptide is prohibited during combat!") .build(); - @Comment("# Message sent to the player when riptide is on cooldown") + @Comment({ + "# Message sent to the player when riptide is on cooldown", + "# Available placeholder: {TIME} - remaining time left to use riptide again" + }) public Notice tridentRiptideOnCooldown = BukkitNotice.builder() .chat("You must wait {TIME} before next riptide!") .build(); From 486789d8482ce0a6cc84133ce562749b3c7ba8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 01:21:54 +0100 Subject: [PATCH 17/24] Fixes after tests - everything should be working now! --- .../combat/fight/pearl/PearlService.java | 3 ++- .../combat/fight/trident/TridentService.java | 2 +- .../combat/fight/pearl/PearlController.java | 4 +-- .../combat/fight/pearl/PearlServiceImpl.java | 25 ++++++++++++++----- .../fight/trident/TridentController.java | 16 ++++++++---- .../combat/fight/trident/TridentSettings.java | 2 +- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java index dbb632d4..f0f29cd2 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/PearlService.java @@ -2,6 +2,7 @@ import java.time.Duration; import java.util.UUID; +import org.bukkit.entity.Player; public interface PearlService { @@ -11,5 +12,5 @@ public interface PearlService { boolean hasDelay(UUID uuid); - void handleDelay(UUID uuid); + void handleDelay(Player uuid); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java index 05aae5cf..8f87187e 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/trident/TridentService.java @@ -9,7 +9,7 @@ public interface TridentService { /** * returns remaining delay for the player to use trident again * @param uuid unique id of the player - * @return remaining duration left to use trident again by the player + * @return remaining duration left to use trident again by the player or zero */ Duration getRemainingDelay(UUID uuid); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java index 2fe88db8..823e6c4b 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlController.java @@ -61,7 +61,7 @@ public void onPearlThrow(ProjectileLaunchEvent event) { } - this.pearlService.handleDelay(playerId); + this.pearlService.handleDelay(player); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -72,7 +72,7 @@ public void onPearlDamage(EntityDamageByEntityEvent event) { if (!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof EnderPearl) || - event.getCause() != EntityDamageEvent.DamageCause.FALL) { + event.getCause() != EntityDamageEvent.DamageCause.PROJECTILE) { return; } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java index 8b3fc72a..6c0cad15 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java @@ -9,6 +9,8 @@ import java.time.Duration; import java.util.UUID; +import org.bukkit.Material; +import org.bukkit.entity.Player; public class PearlServiceImpl implements PearlService { @@ -38,14 +40,25 @@ public boolean shouldCancelEvent(UUID playerId) { } @Override - public void handleDelay(UUID playerId) { - if (this.pluginConfig.pearl.pearlResetsTimer) { - Duration combatTime = this.pluginConfig.settings.combatTimerDuration; - this.fightManager.tag(playerId, combatTime, CauseOfTag.ENDER_PEARL); + public void handleDelay(Player player) { + UUID uniqueId = player.getUniqueId(); + + if (this.hasDelay(uniqueId)) { + return; } - if (!this.pluginConfig.pearl.pearlThrowDelay.isZero()) { - this.pearlStartTimes.markDelay(playerId); + if (this.fightManager.isInCombat(uniqueId)) { + if (this.pluginConfig.pearl.pearlResetsTimer) { + Duration combatTime = this.pluginConfig.settings.combatTimerDuration; + this.fightManager.tag(uniqueId, combatTime, CauseOfTag.ENDER_PEARL); + } + + if (this.pluginConfig.pearl.pearlCooldownEnabled) { + if (!this.pluginConfig.pearl.pearlThrowDelay.isZero()) { + this.pearlStartTimes.markDelay(uniqueId); + // player.setCooldown(Material.ENDER_PEARL, (int) this.pluginConfig.pearl.pearlThrowDelay.toMillis() / 50); + } + } } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java index e0d2ccc9..18ca0eb6 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java @@ -2,6 +2,7 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import org.bukkit.entity.Player; @@ -35,9 +36,9 @@ public TridentController( @EventHandler public void onRiptide(PlayerRiptideEvent event) { Player player = event.getPlayer(); - UUID playerId = player.getUniqueId(); + UUID uniqueId = player.getUniqueId(); - if (!this.fightManager.isInCombat(playerId)) { + if (!this.fightManager.isInCombat(uniqueId)) { return; } @@ -45,11 +46,12 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - Duration remainingDelay = this.tridentService.getRemainingDelay(playerId); - if (!remainingDelay.isZero()) { + + if (this.tridentService.hasDelay(uniqueId)) { + Duration remainingDelay = this.tridentService.getRemainingDelay(uniqueId); this.noticeService.create() - .player(playerId) + .player(uniqueId) .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); @@ -58,6 +60,10 @@ public void onRiptide(PlayerRiptideEvent event) { } this.tridentService.handleTridentDelay(player); + + if (this.pluginConfig.trident.riptideResetsTimerEnabled) { + this.fightManager.tag(uniqueId, this.pluginConfig.settings.combatTimerDuration, CauseOfTag.TRIDENT); + } } @EventHandler(ignoreCancelled = true) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java index a318e67e..d496cac0 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java @@ -16,7 +16,7 @@ public class TridentSettings extends OkaeriConfig { public boolean tridentRiptideDisabledDuringCombat = false; @Comment("# Set to true so the users will get combat log when they use riptide") - public boolean tridentResetsTimerEnabled = false; + public boolean riptideResetsTimerEnabled = false; @Comment({ "# Should riptide enchantment be on cooldown?", From 70b3c7b60be003b8fe0f139e5a385b0ceac52cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 01:25:55 +0100 Subject: [PATCH 18/24] Remove commented line --- .../eternalcode/combat/fight/pearl/PearlServiceImpl.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java index 6c0cad15..d1b83692 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java @@ -53,12 +53,10 @@ public void handleDelay(Player player) { this.fightManager.tag(uniqueId, combatTime, CauseOfTag.ENDER_PEARL); } - if (this.pluginConfig.pearl.pearlCooldownEnabled) { - if (!this.pluginConfig.pearl.pearlThrowDelay.isZero()) { + if (this.pluginConfig.pearl.pearlCooldownEnabled && !this.pluginConfig.pearl.pearlThrowDelay.isZero()) { this.pearlStartTimes.markDelay(uniqueId); - // player.setCooldown(Material.ENDER_PEARL, (int) this.pluginConfig.pearl.pearlThrowDelay.toMillis() / 50); } - } + } } From 996e95ca8e834baee07160e653909b189b891420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Sun, 8 Feb 2026 01:40:17 +0100 Subject: [PATCH 19/24] Add cooldown to enderpearl - hack by:https://www.spigotmc.org/threads/modify-vanilla-ender-pearl-cooldown.629232/ --- .../com/eternalcode/combat/CombatPlugin.java | 2 +- .../combat/fight/pearl/PearlServiceImpl.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 32aec3a1..65b324df 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -112,7 +112,7 @@ public void onEnable() { MinecraftScheduler scheduler = CombatSchedulerAdapter.getAdaptiveScheduler(this); this.fightManager = new FightManagerImpl(eventManager); - this.pearlService = new PearlServiceImpl(this.fightManager, pluginConfig); + this.pearlService = new PearlServiceImpl(this.fightManager, pluginConfig, scheduler); this.tridentService = new TridentServiceImpl(this.fightManager, pluginConfig); this.fightTagOutService = new FightTagOutServiceImpl(); this.fightEffectService = new FightEffectServiceImpl(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java index d1b83692..2f5d1943 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java @@ -3,10 +3,9 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.event.CauseOfTag; -import com.eternalcode.combat.notification.NoticeService; -import com.eternalcode.combat.util.DurationUtil; import com.eternalcode.combat.util.delay.Delay; +import com.eternalcode.commons.scheduler.Scheduler; import java.time.Duration; import java.util.UUID; import org.bukkit.Material; @@ -16,14 +15,16 @@ public class PearlServiceImpl implements PearlService { private final FightManager fightManager; private final PluginConfig pluginConfig; + private final Scheduler scheduler; private final Delay pearlStartTimes; - public PearlServiceImpl(FightManager fightManager, PluginConfig pluginConfig) { + public PearlServiceImpl(FightManager fightManager, PluginConfig pluginConfig, Scheduler scheduler) { this.fightManager = fightManager; this.pluginConfig = pluginConfig; this.pearlStartTimes = Delay.withDefault(() -> pluginConfig.pearl.pearlThrowDelay); + this.scheduler = scheduler; } @Override @@ -54,8 +55,15 @@ public void handleDelay(Player player) { } if (this.pluginConfig.pearl.pearlCooldownEnabled && !this.pluginConfig.pearl.pearlThrowDelay.isZero()) { - this.pearlStartTimes.markDelay(uniqueId); - } + this.pearlStartTimes.markDelay(uniqueId); + this.scheduler.runLater( + () -> player.setCooldown( + Material.ENDER_PEARL, + (int) this.pluginConfig.pearl.pearlThrowDelay.toMillis() / 50 + ), Duration.ofMillis(50) + ); + + } } } From 3b19294581f1cfbb216410549d9f27f0553a7afc Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sun, 8 Feb 2026 11:43:11 +0100 Subject: [PATCH 20/24] Bump minecraft version in runServer task to 1.21.11 --- eternalcombat-plugin/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index fcd7c2ad..293582b6 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -1,6 +1,6 @@ -import net.minecrell.pluginyml.bukkit.BukkitPluginDescription + import io.papermc.hangarpublishplugin.model.Platforms -import org.gradle.kotlin.dsl.shadowJar +import net.minecrell.pluginyml.bukkit.BukkitPluginDescription plugins { `eternalcombat-java` @@ -93,7 +93,7 @@ bukkit { tasks { runServer { - minecraftVersion("1.21.10") + minecraftVersion("1.21.11") downloadPlugins.modrinth("WorldEdit", Versions.WORLDEDIT) downloadPlugins.modrinth("PacketEvents", "${Versions.PACKETEVENTS}+spigot") downloadPlugins.modrinth("WorldGuard", Versions.WORLDGUARD) From c7588e52d3d339bf03534419dd36c49e72a2bc0c Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Thu, 5 Mar 2026 23:02:24 +0100 Subject: [PATCH 21/24] Add combat restrictions for Riptide tridents and improve event handling --- .../com/eternalcode/combat/CombatPlugin.java | 2 +- .../fight/trident/TridentController.java | 145 ++++++++++++++---- 2 files changed, 117 insertions(+), 30 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 65b324df..66cad4c9 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -185,7 +185,7 @@ public void onEnable() { new FightBypassCreativeController(server, pluginConfig), new FightActionBlockerController(this.fightManager, noticeService, pluginConfig, server), new PearlController(pluginConfig, this.pearlService, noticeService), - new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService), + new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService, server), new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, server), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java index 18ca0eb6..9ceeff01 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentController.java @@ -3,37 +3,95 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.event.CauseOfTag; +import com.eternalcode.combat.fight.event.FightTagEvent; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; +import java.time.Duration; +import java.util.UUID; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerRiptideEvent; - -import java.time.Duration; -import java.util.UUID; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; public class TridentController implements Listener { + private static final int TAG_INTERRUPT_COOLDOWN_TICKS = 4; + private final PluginConfig pluginConfig; private final NoticeService noticeService; private final FightManager fightManager; private final TridentService tridentService; + private final Server server; public TridentController( PluginConfig pluginConfig, NoticeService noticeService, FightManager fightManager, - TridentService tridentService + TridentService tridentService, + Server server ) { this.pluginConfig = pluginConfig; this.noticeService = noticeService; this.fightManager = fightManager; this.tridentService = tridentService; + this.server = server; } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onRiptideInteractLow(PlayerInteractEvent event) { + this.blockRiptideInteract(event, true); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) + public void onRiptideInteractHigh(PlayerInteractEvent event) { + this.blockRiptideInteract(event, false); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onFightTag(FightTagEvent event) { + if (!this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { + return; + } + + Player player = this.server.getPlayer(event.getPlayer()); + if (player == null || !player.isHandRaised()) { + return; + } + + ItemStack mainHandItem = player.getInventory().getItemInMainHand(); + ItemStack offHandItem = player.getInventory().getItemInOffHand(); + + if (!this.isRiptideTrident(mainHandItem) && !this.isRiptideTrident(offHandItem)) { + return; + } + + if (this.isRiptideTrident(mainHandItem)) { + player.getInventory().setItemInMainHand(mainHandItem.clone()); + } + + if (this.isRiptideTrident(offHandItem)) { + player.getInventory().setItemInOffHand(offHandItem.clone()); + } + + player.updateInventory(); + player.setCooldown(Material.TRIDENT, TAG_INTERRUPT_COOLDOWN_TICKS); + + this.noticeService.create() + .player(player.getUniqueId()) + .notice(this.pluginConfig.trident.tridentRiptideBlocked) + .send(); + } + + @EventHandler(ignoreCancelled = true) public void onRiptide(PlayerRiptideEvent event) { Player player = event.getPlayer(); UUID uniqueId = player.getUniqueId(); @@ -46,16 +104,7 @@ public void onRiptide(PlayerRiptideEvent event) { return; } - if (this.tridentService.hasDelay(uniqueId)) { - Duration remainingDelay = this.tridentService.getRemainingDelay(uniqueId); - - this.noticeService.create() - .player(uniqueId) - .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) - .placeholder("{TIME}", DurationUtil.format(remainingDelay)) - .send(); - return; } @@ -66,33 +115,71 @@ public void onRiptide(PlayerRiptideEvent event) { } } - @EventHandler(ignoreCancelled = true) - public void onPlayerMove(PlayerMoveEvent event) { - if (event.getTo() == null) { + private void blockRiptideInteract(PlayerInteractEvent event, boolean sendNotice) { + if (!this.isRiptideInteract(event)) { return; } - if (event.getFrom().distanceSquared(event.getTo()) == 0) { + Player player = event.getPlayer(); + UUID uniqueId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(uniqueId)) { return; } - Player player = event.getPlayer(); - UUID playerId = player.getUniqueId(); + if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { + this.denyUse(event); + + if (sendNotice) { + this.noticeService.create() + .player(uniqueId) + .notice(this.pluginConfig.trident.tridentRiptideBlocked) + .send(); + } + return; + } - if (!player.isRiptiding()) { + if (!this.tridentService.hasDelay(uniqueId)) { return; } - if (!this.fightManager.isInCombat(playerId)) { + this.denyUse(event); + + if (!sendNotice) { return; } - if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { - event.setCancelled(true); - this.noticeService.create() - .player(playerId) - .notice(this.pluginConfig.trident.tridentRiptideBlocked) - .send(); + Duration remainingDelay = this.tridentService.getRemainingDelay(uniqueId); + this.noticeService.create() + .player(uniqueId) + .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) + .placeholder("{TIME}", DurationUtil.format(remainingDelay)) + .send(); + } + + private void denyUse(PlayerInteractEvent event) { + event.setUseInteractedBlock(Event.Result.DENY); + event.setUseItemInHand(Event.Result.DENY); + event.setCancelled(true); + } + + private boolean isRiptideInteract(PlayerInteractEvent event) { + EquipmentSlot hand = event.getHand(); + if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + return false; + } + + Action action = event.getAction(); + if (action != Action.RIGHT_CLICK_AIR && action != Action.RIGHT_CLICK_BLOCK) { + return false; } + + return this.isRiptideTrident(event.getItem()); + } + + private boolean isRiptideTrident(ItemStack itemStack) { + return itemStack != null + && itemStack.getType() == Material.TRIDENT + && itemStack.containsEnchantment(Enchantment.RIPTIDE); } } From 70f6a5fab35ee3e438075964874af0c383e6bed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20K=C4=99dziora?= <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:15:57 +0100 Subject: [PATCH 22/24] Update eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java --- .../com/eternalcode/combat/fight/trident/TridentSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java index d496cac0..bb9d3175 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java @@ -21,7 +21,7 @@ public class TridentSettings extends OkaeriConfig { @Comment({ "# Should riptide enchantment be on cooldown?", "# Setting this option to 3s will make players wait 3 seconds between trident throws", - "# Setting this to 0s will remove cooldown" + "# Setting this to 0s or below will remove cooldown" }) public Duration tridentRiptideDelay = Duration.ofSeconds(10); From 1bdeaf6709851f1dc143d77698d17d6325beab49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20K=C4=99dziora?= <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:16:44 +0100 Subject: [PATCH 23/24] Apply suggestion from @Jakubk15 --- .../com/eternalcode/combat/fight/trident/TridentSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java index bb9d3175..3e96381c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentSettings.java @@ -19,7 +19,7 @@ public class TridentSettings extends OkaeriConfig { public boolean riptideResetsTimerEnabled = false; @Comment({ - "# Should riptide enchantment be on cooldown?", + "# Should riptide enchantment be on cooldown during combat?", "# Setting this option to 3s will make players wait 3 seconds between trident throws", "# Setting this to 0s or below will remove cooldown" }) From 4a8cf178d4805f93fbd047eecf610aed61cb35f1 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sat, 7 Mar 2026 11:43:45 +0100 Subject: [PATCH 24/24] Migrate to commons delay --- .../combat/fight/pearl/PearlServiceImpl.java | 8 +-- .../fight/trident/TridentServiceImpl.java | 13 +++-- .../eternalcode/combat/util/delay/Delay.java | 58 ------------------- .../combat/util/delay/InstantExpiry.java | 39 ------------- 4 files changed, 11 insertions(+), 107 deletions(-) delete mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java delete mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java index 2f5d1943..978049d3 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlServiceImpl.java @@ -3,14 +3,14 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.event.CauseOfTag; -import com.eternalcode.combat.util.delay.Delay; - +import com.eternalcode.commons.delay.Delay; import com.eternalcode.commons.scheduler.Scheduler; -import java.time.Duration; -import java.util.UUID; import org.bukkit.Material; import org.bukkit.entity.Player; +import java.time.Duration; +import java.util.UUID; + public class PearlServiceImpl implements PearlService { private final FightManager fightManager; diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java index aa143480..1b4f8587 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/trident/TridentServiceImpl.java @@ -2,12 +2,12 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; -import com.eternalcode.combat.util.delay.Delay; +import com.eternalcode.commons.delay.Delay; +import org.bukkit.Material; +import org.bukkit.entity.Player; import java.time.Duration; import java.util.UUID; -import org.bukkit.Material; -import org.bukkit.entity.Player; public class TridentServiceImpl implements TridentService { @@ -27,18 +27,19 @@ public TridentServiceImpl(FightManager fightManager, PluginConfig pluginConfig) public void handleTridentDelay(Player player) { UUID uniqueId = player.getUniqueId(); - if (!this.fightManager.isInCombat(uniqueId)) { + if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { return; } - if (this.hasDelay(uniqueId)) { + if (!this.fightManager.isInCombat(uniqueId)) { return; } - if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { + if (this.hasDelay(uniqueId)) { return; } + this.markDelay(uniqueId); player.setCooldown(Material.TRIDENT, (int) this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java deleted file mode 100644 index b7544fdd..00000000 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/Delay.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.eternalcode.combat.util.delay; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import java.time.Duration; -import java.time.Instant; -import java.util.function.Supplier; - -public class Delay { - - private final Cache cache; - private final Supplier defaultDelay; - - private Delay(Supplier defaultDelay) { - if (defaultDelay == null) { - throw new IllegalArgumentException("defaultDelay cannot be null"); - } - - this.defaultDelay = defaultDelay; - this.cache = Caffeine.newBuilder() - .expireAfter(new InstantExpiry()) - .build(); - } - - public void markDelay(T key, Duration delay) { - if (delay.isZero() || delay.isNegative()) { - this.cache.invalidate(key); - } - - this.cache.put(key, Instant.now().plus(delay)); - } - - public void markDelay(T key) { - this.markDelay(key, this.defaultDelay.get()); - } - - public void unmarkDelay(T key) { - this.cache.invalidate(key); - } - - public boolean hasDelay(T key) { - Instant delayExpireMoment = this.getExpireAt(key); - return Instant.now().isBefore(delayExpireMoment); - } - - public Duration getRemaining(T key) { - return Duration.between(Instant.now(), this.getExpireAt(key)); - } - - private Instant getExpireAt(T key) { - return this.cache.asMap().getOrDefault(key, Instant.MIN); - } - - public static Delay withDefault(Supplier defaultDelay) { - return new Delay<>(defaultDelay); - } - -} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java deleted file mode 100644 index ccd213dd..00000000 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/delay/InstantExpiry.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.eternalcode.combat.util.delay; - -import com.github.benmanes.caffeine.cache.Expiry; -import java.time.Duration; -import java.time.Instant; -import org.jetbrains.annotations.NotNull; - -class InstantExpiry implements Expiry<@NotNull T, @NotNull Instant> { - - @Override - public long expireAfterCreate(@NotNull T key, @NotNull Instant expireTime, long currentTime) { - return timeToExpire(expireTime); - } - - @Override - public long expireAfterUpdate(@NotNull T key, @NotNull Instant newExpireTime, long currentTime, long currentDuration) { - return timeToExpire(newExpireTime); - } - - @Override - public long expireAfterRead(@NotNull T key, @NotNull Instant value, long currentTime, long currentDuration) { - return currentDuration; - } - - private static long timeToExpire(Instant expireTime) { - Duration toExpire = Duration.between(Instant.now(), expireTime); - if (toExpire.isNegative()) { - return 0; - } - - long nanos = toExpire.toNanos(); - if (nanos == 0) { - return 1; - } - - return nanos; - } - -}