From b01c652d53c77708825d72c78d4c3813a428807f Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 14 Dec 2025 20:43:43 +0100 Subject: [PATCH 01/27] 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 31ce9ec2..20f9cd83 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -26,6 +26,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; @@ -86,6 +88,7 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private FightManager fightManager; private FightPearlService fightPearlService; + private FightTridentService fightTridentService; private FightTagOutService fightTagOutService; private FightEffectService fightEffectService; @@ -183,7 +186,8 @@ public void onEnable() { new FightBypassPermissionController(server, pluginConfig), new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), - 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 DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), new UpdaterNotificationController(updaterService, pluginConfig, miniMessage), 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 bc29665f..ce11e3a6 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 @@ -6,6 +6,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; @@ -36,6 +37,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 d423f495..e3c150ec 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 @@ -20,6 +20,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 5eb70a85c2b4b94c914045ce35b4ab5f3ec63272 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Sun, 14 Dec 2025 21:04:55 +0100 Subject: [PATCH 02/27] 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 20f9cd83..9acf4f7d 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -28,6 +28,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; @@ -117,6 +118,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 47787cdbd59a30edf931512747b813b89f82af42 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 29 Dec 2025 20:19:24 +0100 Subject: [PATCH 03/27] 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 e3c150ec..774925d9 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,7 +21,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 69ddbba7dc6ab10aaeaf8037ea19057fa5412457 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 29 Dec 2025 20:25:27 +0100 Subject: [PATCH 04/27] 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 774925d9..e3c150ec 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,7 +21,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 044eb15a2a105e5be5faaab6deb256a5c4a56da1 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 05/27] Make tridents throw check work on all tridents, regardless of enchantment --- .../eternalcode/combat/fight/trident/FightTridentController.java | 1 - 1 file changed, 1 deletion(-) 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..abee41eb 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,7 +2,6 @@ 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; From 8149a3ee9267706952dde60896af6df9dfdb33c3 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Mon, 2 Feb 2026 14:52:56 +0100 Subject: [PATCH 06/27] 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 9acf4f7d..83b4d034 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -188,8 +188,8 @@ public void onEnable() { new FightBypassPermissionController(server, pluginConfig), new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), - 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 DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), new UpdaterNotificationController(updaterService, pluginConfig, miniMessage), 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 c3f8e6f2811df47014abe037dee688b4c772f413 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Tue, 3 Feb 2026 20:55:49 +0100 Subject: [PATCH 07/27] 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 7b4f296dbcd119ca8ba8b90f51253570f1fe82bc Mon Sep 17 00:00:00 2001 From: Kowalski Date: Wed, 4 Feb 2026 16:49:39 +0100 Subject: [PATCH 08/27] 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 927e1baaa82a3c112eef8f24e6d63d65e87be464 Mon Sep 17 00:00:00 2001 From: Kowalski Date: Thu, 5 Feb 2026 22:10:02 +0100 Subject: [PATCH 09/27] 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 d98872d80eccfcb61cf759b3fd392ffb3bbbd666 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 10/27] 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 e3c150ec..774925d9 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,7 +21,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 ba4866fb4667994db9fbe78f070b1cea0870b0e6 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sat, 7 Feb 2026 22:57:11 +0100 Subject: [PATCH 11/27] 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 83b4d034..3408c4ff 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -117,8 +117,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 78c2ae9bdfb0e2d5340cd97c3fb931fa512fb16a 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 12/27] 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 3408c4ff..11782b18 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -25,7 +25,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; @@ -50,8 +50,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; @@ -88,7 +88,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; @@ -117,7 +117,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(); @@ -188,7 +188,7 @@ public void onEnable() { new FightBypassPermissionController(server, pluginConfig), new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), - new FightPearlController(pluginConfig, noticeService, this.fightManager, this.fightPearlService), + new PearlController(pluginConfig, this.pearlService, noticeService), new FightTridentController(pluginConfig, noticeService, this.fightManager, this.fightTridentService), new DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), @@ -257,8 +257,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 ce11e3a6..fa8be719 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.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; @@ -35,7 +35,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 774925d9..39cd7129 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 @@ -6,7 +6,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 feaa13a6007db9d717dcf97d5826f345a16f2afa 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 13/27] 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 2da7ab5b86911e1f3340017842b62667bdfabad7 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 14/27] 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 11782b18..546c4a8b 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -26,9 +26,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; @@ -89,7 +89,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; @@ -118,7 +118,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(); @@ -189,7 +189,7 @@ public void onEnable() { new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), new PearlController(pluginConfig, this.pearlService, noticeService), - new FightTridentController(pluginConfig, noticeService, this.fightManager, this.fightTridentService), + new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService), new DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), new UpdaterNotificationController(updaterService, pluginConfig, miniMessage), 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 fa8be719..6534cf0f 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 @@ -6,7 +6,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; @@ -42,7 +42,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 3b8677288a9070487ec8083121ed50a2b64af9af 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 15/27] 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 95f73eef7bf1a13fbbf4fb37277355c95d933adc 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 16/27] 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 d920345144cd026450714a14f953215ffa42eef7 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 17/27] 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 dc812293f95b43ccf8e51d4f03dada4d5845176f 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 18/27] 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 546c4a8b..3f10e15f 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -117,7 +117,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 b0704e3f61f31a8077c50ed0bdc424820b3e4124 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 19/27] Bump minecraft version in runServer task to 1.21.11 --- eternalcombat-plugin/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 7db2efe2..1b9e66aa 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -1,6 +1,6 @@ -import net.minecrell.pluginyml.bukkit.BukkitPluginDescription + import net.minecrell.pluginyml.paper.PaperPluginDescription -import org.gradle.kotlin.dsl.shadowJar +import net.minecrell.pluginyml.bukkit.BukkitPluginDescription plugins { `eternalcombat-java` From 0ab70885b07c6a91f6d1f2fdd5c297c5bad1fb62 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Thu, 5 Mar 2026 23:02:24 +0100 Subject: [PATCH 20/27] 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 3f10e15f..b38d1535 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -189,7 +189,7 @@ public void onEnable() { new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), new PearlController(pluginConfig, this.pearlService, noticeService), - new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService), + new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService, server), new DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), new UpdaterNotificationController(updaterService, pluginConfig, miniMessage), 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 32915fde3ca3d3edc88d7a5bba39db4b53c5daa8 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 21/27] 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 b5a6e470250464176db492c089123318d54a2f44 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 22/27] 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 edf089162dc25bc691d34f97f4c8c582af19adef 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 23/27] 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; - } - -} From 543e39da2f6454a0584a0896b918e9ea377c19e1 Mon Sep 17 00:00:00 2001 From: Jakubk15 <77227023+Jakubk15@users.noreply.github.com> Date: Sun, 8 Mar 2026 19:32:01 +0100 Subject: [PATCH 24/27] Resolve conflicts --- .../com/eternalcode/combat/CombatPlugin.java | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 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 b38d1535..1fc67d2c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -1,13 +1,21 @@ package com.eternalcode.combat; -import com.eternalcode.combat.border.BorderTriggerController; import com.eternalcode.combat.border.BorderService; import com.eternalcode.combat.border.BorderServiceImpl; +import com.eternalcode.combat.border.BorderTriggerController; import com.eternalcode.combat.border.animation.block.BorderBlockController; import com.eternalcode.combat.border.animation.particle.ParticleController; import com.eternalcode.combat.bridge.BridgeService; -import com.eternalcode.combat.crystalpvp.RespawnAnchorListener; +import com.eternalcode.combat.config.ConfigService; +import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.crystalpvp.EndCrystalListener; +import com.eternalcode.combat.crystalpvp.RespawnAnchorListener; +import com.eternalcode.combat.event.EventManager; +import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.fight.FightManagerImpl; +import com.eternalcode.combat.fight.FightTagCommand; +import com.eternalcode.combat.fight.FightTask; +import com.eternalcode.combat.fight.controller.FightActionBlockerController; import com.eternalcode.combat.fight.blocker.CommandsBlocker; import com.eternalcode.combat.fight.blocker.ElytraBlocker; import com.eternalcode.combat.fight.blocker.ElytraEquipBlocker; @@ -16,25 +24,15 @@ import com.eternalcode.combat.fight.controller.FightBypassCreativeController; import com.eternalcode.combat.fight.controller.FightBypassPermissionController; import com.eternalcode.combat.fight.blocker.InventoryContainersBlocker; +import com.eternalcode.combat.fight.controller.FightMessageController; +import com.eternalcode.combat.fight.controller.FightTagController; +import com.eternalcode.combat.fight.controller.FightUnTagController; import com.eternalcode.combat.fight.death.DeathFlareController; import com.eternalcode.combat.fight.death.DeathLightningController; -import com.eternalcode.combat.fight.drop.DropKeepInventoryService; -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.firework.FireworkController; -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.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; -import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.drop.DropController; +import com.eternalcode.combat.fight.drop.DropKeepInventoryService; import com.eternalcode.combat.fight.drop.DropKeepInventoryServiceImpl; +import com.eternalcode.combat.fight.drop.DropService; import com.eternalcode.combat.fight.drop.DropServiceImpl; import com.eternalcode.combat.fight.drop.impl.PercentDropModifier; import com.eternalcode.combat.fight.drop.impl.PlayersHealthDropModifier; @@ -44,19 +42,26 @@ import com.eternalcode.combat.fight.controller.FightTagController; import com.eternalcode.combat.fight.controller.FightUnTagController; import com.eternalcode.combat.fight.effect.FightEffectController; -import com.eternalcode.combat.event.EventManager; -import com.eternalcode.combat.fight.FightManagerImpl; -import com.eternalcode.combat.fight.FightTask; +import com.eternalcode.combat.fight.effect.FightEffectService; import com.eternalcode.combat.fight.effect.FightEffectServiceImpl; +import com.eternalcode.combat.fight.firework.FireworkController; +import com.eternalcode.combat.fight.knockback.KnockbackRegionController; +import com.eternalcode.combat.fight.knockback.KnockbackService; import com.eternalcode.combat.fight.logout.LogoutController; import com.eternalcode.combat.fight.logout.LogoutService; import com.eternalcode.combat.fight.pearl.PearlController; +import com.eternalcode.combat.fight.pearl.PearlService; import com.eternalcode.combat.fight.pearl.PearlServiceImpl; +import com.eternalcode.combat.fight.tagout.FightTagOutCommand; import com.eternalcode.combat.fight.tagout.FightTagOutController; +import com.eternalcode.combat.fight.tagout.FightTagOutService; import com.eternalcode.combat.fight.tagout.FightTagOutServiceImpl; -import com.eternalcode.combat.fight.tagout.FightTagOutCommand; +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.notification.NoticeService; -import com.eternalcode.combat.fight.knockback.KnockbackRegionController; import com.eternalcode.combat.region.RegionProvider; import com.eternalcode.combat.updater.UpdaterNotificationController; import com.eternalcode.combat.updater.UpdaterService; @@ -79,6 +84,7 @@ import org.bukkit.plugin.java.JavaPlugin; import java.io.File; +import java.time.Duration; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; From 7d1787337bb4878a6616d2acad6b1f2688029bb9 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 7 Jun 2026 22:23:47 +0200 Subject: [PATCH 25/27] CR --- .../combat/fight/trident/TridentService.java | 8 +- .../com/eternalcode/combat/CombatPlugin.java | 8 +- .../combat/fight/pearl/PearlServiceImpl.java | 2 +- .../combat/fight/pearl/PearlSettings.java | 2 +- .../fight/trident/TridentController.java | 125 ++++++------------ .../fight/trident/TridentServiceImpl.java | 34 +---- .../combat/fight/trident/TridentSettings.java | 9 +- 7 files changed, 58 insertions(+), 130 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 8f87187e..fabe6d34 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 @@ -2,7 +2,6 @@ import java.time.Duration; import java.util.UUID; -import org.bukkit.entity.Player; public interface TridentService { @@ -26,10 +25,7 @@ public interface TridentService { */ 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 handleTridentDelay(Player player); + + void removeDelay(UUID playerId); } 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 1fc67d2c..6b0e5a1e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -15,7 +15,6 @@ import com.eternalcode.combat.fight.FightManagerImpl; import com.eternalcode.combat.fight.FightTagCommand; import com.eternalcode.combat.fight.FightTask; -import com.eternalcode.combat.fight.controller.FightActionBlockerController; import com.eternalcode.combat.fight.blocker.CommandsBlocker; import com.eternalcode.combat.fight.blocker.ElytraBlocker; import com.eternalcode.combat.fight.blocker.ElytraEquipBlocker; @@ -36,11 +35,7 @@ import com.eternalcode.combat.fight.drop.DropServiceImpl; import com.eternalcode.combat.fight.drop.impl.PercentDropModifier; import com.eternalcode.combat.fight.drop.impl.PlayersHealthDropModifier; -import com.eternalcode.combat.fight.FightTagCommand; import com.eternalcode.combat.fight.blocker.PlaceBlockBlocker; -import com.eternalcode.combat.fight.controller.FightMessageController; -import com.eternalcode.combat.fight.controller.FightTagController; -import com.eternalcode.combat.fight.controller.FightUnTagController; import com.eternalcode.combat.fight.effect.FightEffectController; import com.eternalcode.combat.fight.effect.FightEffectService; import com.eternalcode.combat.fight.effect.FightEffectServiceImpl; @@ -84,7 +79,6 @@ import org.bukkit.plugin.java.JavaPlugin; import java.io.File; -import java.time.Duration; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -124,7 +118,7 @@ public void onEnable() { this.fightManager = new FightManagerImpl(eventManager); this.pearlService = new PearlServiceImpl(this.fightManager, pluginConfig, scheduler); - this.tridentService = new TridentServiceImpl(this.fightManager, pluginConfig); + this.tridentService = new TridentServiceImpl(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 978049d3..e26d796c 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 @@ -49,7 +49,7 @@ public void handleDelay(Player player) { } if (this.fightManager.isInCombat(uniqueId)) { - if (this.pluginConfig.pearl.pearlResetsTimer) { + if (this.pluginConfig.pearl.pearlExtendsCombatTag) { Duration combatTime = this.pluginConfig.settings.combatTimerDuration; this.fightManager.tag(uniqueId, combatTime, CauseOfTag.ENDER_PEARL); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java index 39cd7129..87207a89 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/PearlSettings.java @@ -21,7 +21,7 @@ public class PearlSettings 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 pearlExtendsCombatTag = false; @Comment({ "# Block throwing pearls with delay?", 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 9ceeff01..1182819f 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,7 +3,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.fight.event.FightTagEvent; +import com.eternalcode.combat.fight.event.FightUntagEvent; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import java.time.Duration; @@ -12,7 +12,6 @@ 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; @@ -24,8 +23,6 @@ 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; @@ -36,8 +33,7 @@ public TridentController( PluginConfig pluginConfig, NoticeService noticeService, FightManager fightManager, - TridentService tridentService, - Server server + TridentService tridentService, Server server ) { this.pluginConfig = pluginConfig; this.noticeService = noticeService; @@ -46,48 +42,53 @@ public TridentController( this.server = server; } - @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) { + @EventHandler(priority = EventPriority.HIGHEST) + public void onRiptideInteract(PlayerInteractEvent event) { + if (!this.isRiptideInteract(event)) { return; } - Player player = this.server.getPlayer(event.getPlayer()); - if (player == null || !player.isHandRaised()) { + Player player = event.getPlayer(); + UUID playerId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(playerId)) { return; } - ItemStack mainHandItem = player.getInventory().getItemInMainHand(); - ItemStack offHandItem = player.getInventory().getItemInOffHand(); + if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { + event.setCancelled(true); - if (!this.isRiptideTrident(mainHandItem) && !this.isRiptideTrident(offHandItem)) { + this.noticeService.create() + .player(playerId) + .notice(this.pluginConfig.trident.tridentRiptideBlocked) + .send(); return; } - if (this.isRiptideTrident(mainHandItem)) { - player.getInventory().setItemInMainHand(mainHandItem.clone()); + if (!this.tridentService.hasDelay(playerId)) { + return; } - if (this.isRiptideTrident(offHandItem)) { - player.getInventory().setItemInOffHand(offHandItem.clone()); + event.setCancelled(true); + } + + // we need to send message without ignoring canceled event because of riptide cooldown + @EventHandler(priority = EventPriority.LOWEST) + public void messageOnRiptideCooldown(PlayerInteractEvent event) { + if (!this.isRiptideInteract(event)) { + return; } - player.updateInventory(); - player.setCooldown(Material.TRIDENT, TAG_INTERRUPT_COOLDOWN_TICKS); + UUID playerId = event.getPlayer().getUniqueId(); + if (!this.tridentService.hasDelay(playerId)) { + return; + } + Duration remainingDelay = this.tridentService.getRemainingDelay(playerId); this.noticeService.create() - .player(player.getUniqueId()) - .notice(this.pluginConfig.trident.tridentRiptideBlocked) + .player(playerId) + .notice(this.pluginConfig.trident.tridentRiptideOnCooldown) + .placeholder("{TIME}", DurationUtil.format(remainingDelay)) .send(); } @@ -96,71 +97,31 @@ public void onRiptide(PlayerRiptideEvent event) { Player player = event.getPlayer(); UUID uniqueId = player.getUniqueId(); - if (!this.fightManager.isInCombat(uniqueId)) { - return; - } - if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { return; } - if (this.tridentService.hasDelay(uniqueId)) { - return; - } - - this.tridentService.handleTridentDelay(player); - - if (this.pluginConfig.trident.riptideResetsTimerEnabled) { - this.fightManager.tag(uniqueId, this.pluginConfig.settings.combatTimerDuration, CauseOfTag.TRIDENT); - } - } - - private void blockRiptideInteract(PlayerInteractEvent event, boolean sendNotice) { - if (!this.isRiptideInteract(event)) { - return; - } - - Player player = event.getPlayer(); - UUID uniqueId = player.getUniqueId(); - if (!this.fightManager.isInCombat(uniqueId)) { return; } - if (this.pluginConfig.trident.tridentRiptideDisabledDuringCombat) { - this.denyUse(event); - - if (sendNotice) { - this.noticeService.create() - .player(uniqueId) - .notice(this.pluginConfig.trident.tridentRiptideBlocked) - .send(); - } - return; - } - - if (!this.tridentService.hasDelay(uniqueId)) { + if (this.tridentService.hasDelay(uniqueId)) { return; } - this.denyUse(event); + this.tridentService.markDelay(player.getUniqueId()); + player.setCooldown(Material.TRIDENT, (int) this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); - if (!sendNotice) { - return; + if (this.pluginConfig.trident.tridentRiptideExtendsCombatTag) { + this.fightManager.tag(uniqueId, this.pluginConfig.settings.combatTimerDuration, CauseOfTag.TRIDENT); } - - 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); + @EventHandler(ignoreCancelled = true) + public void onUntag(FightUntagEvent event) { + Player player = server.getPlayer(event.getPlayer()); + player.setCooldown(Material.TRIDENT, 0); + this.tridentService.removeDelay(player.getUniqueId()); } private boolean isRiptideInteract(PlayerInteractEvent event) { 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 1b4f8587..290c6a56 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 @@ -11,39 +11,12 @@ 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; - + public TridentServiceImpl(PluginConfig pluginConfig) { this.delay = Delay.withDefault(() -> pluginConfig.trident.tridentRiptideDelay); } - @Override - public void handleTridentDelay(Player player) { - UUID uniqueId = player.getUniqueId(); - - if (this.pluginConfig.trident.tridentRiptideDelay.isZero()) { - return; - } - - if (!this.fightManager.isInCombat(uniqueId)) { - return; - } - - if (this.hasDelay(uniqueId)) { - return; - } - - - this.markDelay(uniqueId); - player.setCooldown(Material.TRIDENT, (int) this.pluginConfig.trident.tridentRiptideDelay.toMillis() / 50); - - } @Override public void markDelay(UUID uuid) { @@ -55,6 +28,11 @@ public boolean hasDelay(UUID uuid) { return this.delay.hasDelay(uuid); } + @Override + public void removeDelay(UUID playerId) { + this.delay.unmarkDelay(playerId); + } + @Override public Duration getRemainingDelay(UUID uuid) { return this.delay.getRemaining(uuid); 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 3e96381c..0b30e8da 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 @@ -1,6 +1,5 @@ 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; @@ -15,8 +14,8 @@ 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 riptideResetsTimerEnabled = false; + @Comment("# Set to true so then riptide usage during combat will extend combat tag duration, works only if riptide usage is not disabled") + public boolean tridentRiptideExtendsCombatTag = false; @Comment({ "# Should riptide enchantment be on cooldown during combat?", @@ -26,7 +25,7 @@ public class TridentSettings extends OkaeriConfig { public Duration tridentRiptideDelay = Duration.ofSeconds(10); @Comment("# Message shown when riptide is blocked during combat") - public Notice tridentRiptideBlocked = BukkitNotice.builder() + public Notice tridentRiptideBlocked = Notice.builder() .chat("Using riptide is prohibited during combat!") .build(); @@ -34,7 +33,7 @@ public class TridentSettings extends OkaeriConfig { "# 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() + public Notice tridentRiptideOnCooldown = Notice.builder() .chat("You must wait {TIME} before next riptide!") .build(); } From 9d26fb544bb9e82b8d767a86c954168bc570ba3a Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 7 Jun 2026 22:27:01 +0200 Subject: [PATCH 26/27] resolve merge --- .../combat/fight/pearl/PearlController.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 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 823e6c4b..0342b078 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 @@ -1,6 +1,7 @@ package com.eternalcode.combat.fight.pearl; import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.notification.NoticeService; import com.eternalcode.combat.util.DurationUtil; import java.time.Duration; @@ -13,20 +14,23 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.player.PlayerTeleportEvent; public class PearlController implements Listener { private final PluginConfig pluginConfig; private final PearlService pearlService; private final NoticeService noticeService; + private final FightManager fightManager; public PearlController( PluginConfig pluginConfig, - PearlService pearlService, NoticeService noticeService + PearlService pearlService, NoticeService noticeService, FightManager fightManager ) { this.pluginConfig = pluginConfig; this.pearlService = pearlService; this.noticeService = noticeService; + this.fightManager = fightManager; } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -79,4 +83,30 @@ public void onPearlDamage(EntityDamageByEntityEvent event) { event.setDamage(0.0); } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPearlTeleport(PlayerTeleportEvent event) { + if (event.getCause() != PlayerTeleportEvent.TeleportCause.ENDER_PEARL) { + return; + } + + if (!this.pluginConfig.pearl.pearlThrowDisabledDuringCombat) { + return; + } + + Player player = event.getPlayer(); + UUID playerId = player.getUniqueId(); + + if (!this.fightManager.isInCombat(playerId)) { + return; + } + + event.setCancelled(true); + + this.noticeService.create() + .player(playerId) + .notice(this.pluginConfig.pearl.pearlThrowBlockedDuringCombat) + .send(); + } + } From 4b5bf637234018ee165d10376935bbefcdadfd58 Mon Sep 17 00:00:00 2001 From: Rollczi Date: Sun, 7 Jun 2026 22:29:21 +0200 Subject: [PATCH 27/27] resolve merge conflicts and update --- .../src/main/java/com/eternalcode/combat/CombatPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6b0e5a1e..d491fba0 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -188,7 +188,7 @@ public void onEnable() { new FightBypassPermissionController(server, pluginConfig), new FightBypassCreativeController(server, pluginConfig), new PlaceBlockBlocker(this.fightManager, noticeService, pluginConfig), - new PearlController(pluginConfig, this.pearlService, noticeService), + new PearlController(pluginConfig, this.pearlService, noticeService, fightManager), new TridentController(pluginConfig, noticeService, this.fightManager, this.tridentService, server), new DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server),