diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index c31d3012..22074a2e 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -6,6 +6,8 @@ object Versions { const val JUNIT_JUPITER_PARAMS = "5.10.3" const val JUNIT_JUPITER_ENGINE = "5.10.3" + const val JETBRAINS_ANNOTATIONS = "24.1.0" + const val ETERNALCODE_COMMONS = "1.1.3" // TODO: Multification. diff --git a/eternalcombat-api/build.gradle.kts b/eternalcombat-api/build.gradle.kts index 3ddc75f2..b6911a26 100644 --- a/eternalcombat-api/build.gradle.kts +++ b/eternalcombat-api/build.gradle.kts @@ -8,41 +8,5 @@ plugins { dependencies { // Spigot api compileOnlyApi("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") - - // kyori - api("net.kyori:adventure-platform-bukkit:${Versions.ADVENTURE_PLATFORM_BUKKIT}") - api("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_TEXT_MINIMESSAGE}") - - // litecommands - api("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") - - // Okaeri configs - api("eu.okaeri:okaeri-configs-yaml-bukkit:${Versions.OKAERI_CONFIGS_YAML_BUKKIT}") - api("eu.okaeri:okaeri-configs-serdes-commons:${Versions.OKAERI_CONFIGS_SERDES_COMMONS}") - api("eu.okaeri:okaeri-configs-serdes-bukkit:${Versions.OKAERI_CONFIGS_SERDES_BUKKIT}") - - // Panda utilities - api("org.panda-lang:panda-utilities:${Versions.PANDA_UTILITIES}") - - // GitCheck - api("com.eternalcode:gitcheck:${Versions.GIT_CHECK}") - - // commons - api("commons-io:commons-io:${Versions.APACHE_COMMONS}") - - // bstats - api("org.bstats:bstats-bukkit:${Versions.B_STATS_BUKKIT}") - - // caffeine - api("com.github.ben-manes.caffeine:caffeine:${Versions.CAFFEINE}") - - api("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}") - api("com.eternalcode:eternalcode-commons-adventure:${Versions.ETERNALCODE_COMMONS}") - - // worldguard - compileOnly("com.sk89q.worldguard:worldguard-bukkit:${Versions.WORLD_GUARD_BUKKIT}") - - // PlaceholderAPI - compileOnlyApi("me.clip:placeholderapi:${Versions.PLACEHOLDER_API}") - + api("org.jetbrains:annotations:${Versions.JETBRAINS_ANNOTATIONS}") } 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 bdd26e26..a45af55d 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatApi.java @@ -1,13 +1,12 @@ package com.eternalcode.combat; -import com.eternalcode.combat.config.implementation.PluginConfig; -import com.eternalcode.combat.drop.DropKeepInventoryManager; -import com.eternalcode.combat.drop.DropManager; +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.pearl.FightPearlManager; -import com.eternalcode.combat.fight.tagout.FightTagOutService; +import com.eternalcode.combat.fight.pearl.FightPearlService; import com.eternalcode.combat.region.RegionProvider; +import com.eternalcode.combat.fight.tagout.FightTagOutService; public interface EternalCombatApi { @@ -15,16 +14,14 @@ public interface EternalCombatApi { RegionProvider getRegionProvider(); - FightPearlManager getFightPearlManager(); + FightPearlService getFightPearlService(); FightTagOutService getFightTagOutService(); FightEffectService getFightEffectService(); - DropManager getDropManager(); - - DropKeepInventoryManager getDropKeepInventoryManager(); + DropService getDropService(); - PluginConfig getPluginConfig(); + DropKeepInventoryService getDropKeepInventoryService(); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightManager.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightManager.java index ffb636c4..49a58967 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightManager.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightManager.java @@ -4,76 +4,26 @@ import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.fight.event.FightTagEvent; import com.eternalcode.combat.fight.event.FightUntagEvent; -import com.eternalcode.combat.event.EventCaller; - import java.time.Duration; -import java.time.Instant; import java.util.Collection; -import java.util.Collections; -import java.util.Map; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -public class FightManager { - - private final Map fights = new ConcurrentHashMap<>(); - private final EventCaller eventCaller; - - public FightManager(EventCaller eventCaller) { - this.eventCaller = eventCaller; - } - - public boolean isInCombat(UUID player) { - if (!this.fights.containsKey(player)) { - return false; - } - - FightTag fightTag = this.fights.get(player); +public interface FightManager { - return !fightTag.isExpired(); - } + boolean isInCombat(UUID player); - public FightUntagEvent untag(UUID player, CauseOfUnTag causeOfUnTag) { - FightUntagEvent event = this.eventCaller.publishEvent(new FightUntagEvent(player, causeOfUnTag)); - if (event.isCancelled()) { - return event; - } + FightTag getTag(UUID target); - this.fights.remove(player); - return event; - } - - public FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag) { - return this.tag(target, delay, causeOfTag, null); - } + Collection getFights(); @ApiStatus.Experimental - public FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag, @Nullable UUID tagger) { - FightTagEvent event = this.eventCaller.publishEvent(new FightTagEvent(target, causeOfTag)); - - if (event.isCancelled()) { - return event; - } - Instant now = Instant.now(); - Instant endOfCombatLog = now.plus(delay); - - FightTag fightTag = new FightTag(target, endOfCombatLog, tagger); - - this.fights.put(target, fightTag); - return event; - } + FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag, @Nullable UUID tagger); - public Collection getFights() { - return Collections.unmodifiableCollection(this.fights.values()); - } + FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag); - public FightTag getTag(UUID target) { - return this.fights.get(target); - } + FightUntagEvent untag(UUID player, CauseOfUnTag causeOfUnTag); - public void untagAll() { - this.fights.clear(); - } + void untagAll(); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTag.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTag.java index c28bbcb8..f16103f0 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTag.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTag.java @@ -6,44 +6,17 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -public class FightTag { +public interface FightTag { - private final UUID taggedPlayer; - private final Instant endOfCombatLog; - private final @Nullable UUID tagger; - - FightTag(UUID personToAddCombat, Instant endOfCombatLog, @Nullable UUID tagger) { - this.taggedPlayer = personToAddCombat; - this.endOfCombatLog = endOfCombatLog; - this.tagger = tagger; - } - - public UUID getTaggedPlayer() { - return this.taggedPlayer; - } - - public Instant getEndOfCombatLog() { - return this.endOfCombatLog; - } - - public boolean isExpired() { - return Instant.now().isAfter(this.endOfCombatLog); - } - - public Duration getRemainingDuration() { - Duration between = Duration.between(Instant.now(), this.endOfCombatLog); + @Nullable + @ApiStatus.Experimental + UUID getTagger(); - if (between.isNegative()) { - return Duration.ZERO; - } + Duration getRemainingDuration(); - return between; - } + boolean isExpired(); - @Nullable - @ApiStatus.Experimental - public UUID getTagger() { - return this.tagger; - } + Instant getEndOfCombatLog(); + UUID getTaggedPlayer(); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/Drop.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/Drop.java similarity index 97% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/Drop.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/Drop.java index 92839d4e..b8d75438 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/Drop.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/Drop.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryService.java new file mode 100644 index 00000000..9b98816e --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryService.java @@ -0,0 +1,16 @@ +package com.eternalcode.combat.fight.drop; + +import java.util.List; +import java.util.UUID; +import org.bukkit.inventory.ItemStack; + +public interface DropKeepInventoryService { + + List nextItems(UUID uuid); + + boolean hasItems(UUID uuid); + + void addItems(UUID uuid, List item); + + void addItem(UUID uuid, ItemStack item); +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropModifier.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropModifier.java similarity index 70% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropModifier.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropModifier.java index 7c126601..47ec6524 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropModifier.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropModifier.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; public interface DropModifier { diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropResult.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropResult.java similarity index 91% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropResult.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropResult.java index 15dd56ec..74963bc0 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropResult.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropResult.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; import org.bukkit.inventory.ItemStack; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropService.java new file mode 100644 index 00000000..77528cb7 --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropService.java @@ -0,0 +1,8 @@ +package com.eternalcode.combat.fight.drop; + +public interface DropService { + + DropResult modify(DropType dropType, Drop drop); + + void registerModifier(DropModifier dropModifier); +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropType.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropType.java similarity index 63% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropType.java rename to eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropType.java index 1e0b9153..46abeed7 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropType.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/drop/DropType.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; public enum DropType { diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectService.java index 13910444..5ad1ae8f 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectService.java @@ -1,75 +1,25 @@ package com.eternalcode.combat.fight.effect; +import java.util.List; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.List; -import java.util.ArrayList; - -public class FightEffectService { - - private final Map> activeEffects = new HashMap<>(); - private static final int INFINITE_DURATION = -1; - - public void storeActiveEffect(Player player, PotionEffect effect) { - List effects = this.activeEffects.computeIfAbsent(player.getUniqueId(), k -> new ArrayList<>()); - - effects.add(effect); - } - - public void restoreActiveEffects(Player player) { - List currentEffects = this.getCurrentEffects(player); - - for (PotionEffect effect : currentEffects) { - player.addPotionEffect(effect); - } - - this.clearStoredEffects(player); - } - - public void clearStoredEffects(Player player) { - this.activeEffects.remove(player.getUniqueId()); - } - - public List getCurrentEffects(Player player) { - return this.activeEffects.getOrDefault(player.getUniqueId(), new ArrayList<>()); - } - - public void applyCustomEffect(Player player, PotionEffectType type, Integer amplifier) { - PotionEffect activeEffect = player.getPotionEffect(type); - - if (activeEffect == null) { - player.addPotionEffect(new PotionEffect(type, INFINITE_DURATION, amplifier)); - return; - } - - if (activeEffect.getAmplifier() > amplifier) { - return; - } +/** + * Manages custom potion effects on players during combat. + * Active effects before combat are stored and restored after combat ends. + */ +public interface FightEffectService { - if (activeEffect.getDuration() == -1) { - return; - } + void removeCustomEffect(Player player, PotionEffectType type, Integer amplifier); - this.storeActiveEffect(player, activeEffect); - player.addPotionEffect(new PotionEffect(type, INFINITE_DURATION, amplifier)); - } + void applyCustomEffect(Player player, PotionEffectType type, Integer amplifier); - public void removeCustomEffect(Player player, PotionEffectType type, Integer amplifier) { - PotionEffect activeEffect = player.getPotionEffect(type); + List getCurrentEffects(Player player); - if (activeEffect == null) { - return; - } + void clearStoredEffects(Player player); - if (activeEffect.getAmplifier() != amplifier) { - return; - } + void restoreActiveEffects(Player player); - player.removePotionEffect(type); - } + void storeActiveEffect(Player player, PotionEffect effect); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java new file mode 100644 index 00000000..3bd1c7c4 --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CancelTagReason.java @@ -0,0 +1,7 @@ +package com.eternalcode.combat.fight.event; + +public enum CancelTagReason { + + TAGOUT + +} 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 5e62c959..940117c6 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 @@ -1,8 +1,25 @@ package com.eternalcode.combat.fight.event; public enum CauseOfTag { + + /** + * The player was tagged in combat as a result of an attack by another player. + */ PLAYER, + + /** + * The player was tagged in combat due to an interaction with a non-player entity + * (e.g., mobs or environmental damage). + */ NON_PLAYER, + + /** + * A command was executed to apply a combat tag to the player. + */ COMMAND, + + /** + * A custom cause, typically defined by external plugins or systems, applied the combat tag. + */ CUSTOM } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfUnTag.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfUnTag.java index 6cf7958b..52e331cf 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfUnTag.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/CauseOfUnTag.java @@ -1,11 +1,38 @@ package com.eternalcode.combat.fight.event; public enum CauseOfUnTag { + /** + * The combat tag expired after a set duration. + */ TIME_EXPIRED, + + /** + * The player died, which resulted in the removal of the combat tag. + */ DEATH, + + /** + * The player was killed by another player, causing the combat tag to be removed. + */ DEATH_BY_PLAYER, + + /** + * The player logged out, triggering the removal of the combat tag. + */ LOGOUT, + + /** + * A command was executed to remove the player's combat tag. + */ COMMAND, + + /** + * The attacker released the player, ending the combat and removing the tag. + */ ATTACKER_RELEASE, + + /** + * A custom cause, typically defined by external plugins or systems. + */ CUSTOM } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightTagEvent.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightTagEvent.java index 0775d9b3..0871c195 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightTagEvent.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightTagEvent.java @@ -5,59 +5,80 @@ import org.bukkit.event.HandlerList; import java.util.UUID; +import org.jetbrains.annotations.NotNull; +/** + * This event is triggered when a player is tagged in a fight. + */ public class FightTagEvent extends Event implements Cancellable { - private static final HandlerList handlers = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList(); private final UUID player; private final CauseOfTag cause; - private boolean isCancelled = false; - private String cancelMessage = ""; + private boolean cancelled = false; + private CancelTagReason cancelReason; public FightTagEvent(UUID player, CauseOfTag cause) { + super(false); + this.player = player; this.cause = cause; } + /** + * Gets the UUID of the player who was tagged. + * + * @return The UUID of the tagged player. + */ public UUID getPlayer() { return this.player; } + /** + * Gets the reason why the player was tagged. + * + * @return The cause of the combat tag as a {@link CauseOfTag}. + */ public CauseOfTag getCause() { return this.cause; } @Override public boolean isCancelled() { - return this.isCancelled; + return this.cancelled; } @Override public void setCancelled(boolean cancelled) { - throw new UnsupportedOperationException("Use #cancel(String) instead"); - } - - public void cancel(String cancelMessage) { - this.isCancelled = true; - this.cancelMessage = cancelMessage; + this.cancelled = cancelled; } - public void allow() { - this.isCancelled = false; - this.cancelMessage = ""; + /** + * Gets the reason why the event was cancelled. + * + * @return The cancel reason. + */ + public CancelTagReason getCancelReason() { + return this.cancelReason; } - public String getCancelMessage() { - return this.cancelMessage; + /** + * Sets the reason why the event was cancelled. + * + * @param cancelReason The cancel reason. + */ + public void setCancelReason(CancelTagReason cancelReason) { + this.cancelReason = cancelReason; } + @NotNull @Override public HandlerList getHandlers() { - return handlers; + return HANDLER_LIST; } public static HandlerList getHandlerList() { - return handlers; + return HANDLER_LIST; } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightUntagEvent.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightUntagEvent.java index 18fdfd11..f9913767 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightUntagEvent.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/event/FightUntagEvent.java @@ -5,43 +5,61 @@ import org.bukkit.event.HandlerList; import java.util.UUID; +import org.jetbrains.annotations.NotNull; +/** + * This event is triggered when a player is untagged during a fight. + */ public class FightUntagEvent extends Event implements Cancellable { - private static final HandlerList handlers = new HandlerList(); + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final UUID player; private final CauseOfUnTag cause; - private boolean isCancelled = false; + private boolean cancelled; public FightUntagEvent(UUID player, CauseOfUnTag cause) { + super(false); + this.player = player; this.cause = cause; } + /** + * Gets the UUID of the player who was untagged. + * + * @return The UUID of the untagged player. + */ public UUID getPlayer() { return this.player; } - + + /** + * Gets the reason for why the player was untagged. + * + * @return The cause of untagging as a {@link CauseOfUnTag}. + */ public CauseOfUnTag getCause() { return this.cause; } @Override public boolean isCancelled() { - return this.isCancelled; + return this.cancelled; } @Override public void setCancelled(boolean cancelled) { - this.isCancelled = cancelled; + this.cancelled = cancelled; } + @NotNull @Override public HandlerList getHandlers() { - return handlers; + return HANDLER_LIST; } public static HandlerList getHandlerList() { - return handlers; + return HANDLER_LIST; } } 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 new file mode 100644 index 00000000..18d2b84f --- /dev/null +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlService.java @@ -0,0 +1,16 @@ +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); + + void markDelay(UUID uuid); +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutService.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutService.java index 9acec882..1565afa2 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutService.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutService.java @@ -1,34 +1,13 @@ package com.eternalcode.combat.fight.tagout; import java.time.Duration; -import java.time.Instant; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; -public class FightTagOutService { +public interface FightTagOutService { - private final Map tagOuts = new HashMap<>(); + boolean isTaggedOut(UUID player); - public void tagOut(UUID player, Duration duration) { - Instant endTime = Instant.now().plus(duration); - - this.tagOuts.put(player, endTime); - } - - public void unTagOut(UUID player) { - this.tagOuts.remove(player); - } - - public boolean isTaggedOut(UUID player) { - Instant endTime = this.tagOuts.get(player); - - if (endTime == null) { - return false; - } - Instant now = Instant.now(); - - return now.isBefore(endTime); - } + void unTagOut(UUID player); + void tagOut(UUID player, Duration duration); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java index a60c7fe9..b4baf695 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java +++ b/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionProvider.java @@ -8,7 +8,7 @@ public interface RegionProvider { Optional getRegion(Location location); default boolean isInRegion(Location location) { - return getRegion(location).isPresent(); + return this.getRegion(location).isPresent(); } } diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 41afd517..16039c64 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -9,6 +9,42 @@ plugins { dependencies { implementation(project(":eternalcombat-api")) + + // kyori + implementation("net.kyori:adventure-platform-bukkit:${Versions.ADVENTURE_PLATFORM_BUKKIT}") + implementation("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_TEXT_MINIMESSAGE}") + + // litecommands + implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") + + // Okaeri configs + implementation("eu.okaeri:okaeri-configs-yaml-bukkit:${Versions.OKAERI_CONFIGS_YAML_BUKKIT}") + implementation("eu.okaeri:okaeri-configs-serdes-commons:${Versions.OKAERI_CONFIGS_SERDES_COMMONS}") + implementation("eu.okaeri:okaeri-configs-serdes-bukkit:${Versions.OKAERI_CONFIGS_SERDES_BUKKIT}") + + // Panda utilities + implementation("org.panda-lang:panda-utilities:${Versions.PANDA_UTILITIES}") + + // GitCheck + implementation("com.eternalcode:gitcheck:${Versions.GIT_CHECK}") + + // commons + implementation("commons-io:commons-io:${Versions.APACHE_COMMONS}") + + // bstats + implementation("org.bstats:bstats-bukkit:${Versions.B_STATS_BUKKIT}") + + // caffeine + implementation("com.github.ben-manes.caffeine:caffeine:${Versions.CAFFEINE}") + + implementation("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}") + implementation("com.eternalcode:eternalcode-commons-adventure:${Versions.ETERNALCODE_COMMONS}") + + // worldguard + compileOnly("com.sk89q.worldguard:worldguard-bukkit:${Versions.WORLD_GUARD_BUKKIT}") + + // PlaceholderAPI + compileOnly("me.clip:placeholderapi:${Versions.PLACEHOLDER_API}") } bukkit { 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 4c30af7a..c948ea00 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -1,15 +1,21 @@ package com.eternalcode.combat; import com.eternalcode.combat.bridge.BridgeService; -import com.eternalcode.combat.command.handler.InvalidUsageHandlerImpl; -import com.eternalcode.combat.command.handler.MissingPermissionHandlerImpl; +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.tagout.FightTagOutService; +import com.eternalcode.combat.fight.pearl.FightPearlService; +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.drop.DropController; -import com.eternalcode.combat.drop.DropKeepInventoryManager; -import com.eternalcode.combat.drop.DropManager; -import com.eternalcode.combat.drop.impl.PercentDropModifier; -import com.eternalcode.combat.drop.impl.PlayersHealthDropModifier; +import com.eternalcode.combat.fight.drop.DropController; +import com.eternalcode.combat.fight.drop.DropKeepInventoryServiceImpl; +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.controller.FightActionBlockerController; import com.eternalcode.combat.fight.controller.FightMessageController; @@ -17,16 +23,16 @@ import com.eternalcode.combat.fight.controller.FightUnTagController; import com.eternalcode.combat.fight.effect.FightEffectController; import com.eternalcode.combat.event.EventCaller; -import com.eternalcode.combat.fight.FightManager; +import com.eternalcode.combat.fight.FightManagerImpl; import com.eternalcode.combat.fight.FightTask; import com.eternalcode.combat.fight.bossbar.FightBossBarService; -import com.eternalcode.combat.fight.effect.FightEffectService; +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.FightPearlManager; +import com.eternalcode.combat.fight.pearl.FightPearlServiceImpl; 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.notification.NotificationAnnouncer; import com.eternalcode.combat.region.RegionController; @@ -57,14 +63,14 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private static final int BSTATS_METRICS_ID = 17803; private FightManager fightManager; - private FightPearlManager fightPearlManager; + private FightPearlService fightPearlService; private FightTagOutService fightTagOutService; private FightEffectService fightEffectService; private LogoutService logoutService; - private DropManager dropManager; - private DropKeepInventoryManager dropKeepInventoryManager; + private DropService dropService; + private DropKeepInventoryService dropKeepInventoryService; private RegionProvider regionProvider; @@ -86,13 +92,13 @@ public void onEnable() { this.pluginConfig = configService.create(PluginConfig.class, new File(dataFolder, "config.yml")); - this.fightManager = new FightManager(eventCaller); - this.fightPearlManager = new FightPearlManager(this.pluginConfig.pearl); - this.fightTagOutService = new FightTagOutService(); - this.fightEffectService = new FightEffectService(); + this.fightManager = new FightManagerImpl(eventCaller); + this.fightPearlService = new FightPearlServiceImpl(this.pluginConfig.pearl); + this.fightTagOutService = new FightTagOutServiceImpl(); + this.fightEffectService = new FightEffectServiceImpl(); this.logoutService = new LogoutService(); - this.dropManager = new DropManager(); - this.dropKeepInventoryManager = new DropKeepInventoryManager(); + this.dropService = new DropServiceImpl(); + this.dropKeepInventoryService = new DropKeepInventoryServiceImpl(); UpdaterService updaterService = new UpdaterService(this.getDescription()); @@ -133,20 +139,20 @@ public void onEnable() { Stream.of( new PercentDropModifier(this.pluginConfig.dropSettings), new PlayersHealthDropModifier(this.pluginConfig.dropSettings, this.logoutService) - ).forEach(this.dropManager::registerModifier); + ).forEach(this.dropService::registerModifier); Stream.of( - new DropController(this.dropManager, this.dropKeepInventoryManager, this.pluginConfig.dropSettings, this.fightManager), + new DropController(this.dropService, this.dropKeepInventoryService, this.pluginConfig.dropSettings, this.fightManager), new FightTagController(this.fightManager, this.pluginConfig), new LogoutController(this.fightManager, this.logoutService, notificationAnnouncer, this.pluginConfig), new FightUnTagController(this.fightManager, this.pluginConfig, this.logoutService), new FightActionBlockerController(this.fightManager, notificationAnnouncer, this.pluginConfig), - new FightPearlController(this.pluginConfig.pearl, notificationAnnouncer, this.fightManager, this.fightPearlManager), + new FightPearlController(this.pluginConfig.pearl, notificationAnnouncer, this.fightManager, this.fightPearlService), new UpdaterNotificationController(updaterService, this.pluginConfig, this.audienceProvider, miniMessage), new RegionController(notificationAnnouncer, this.regionProvider, this.fightManager, this.pluginConfig), new FightEffectController(this.pluginConfig.effect, this.fightEffectService, this.fightManager, this.getServer()), - new FightTagOutController(this.fightTagOutService, this.pluginConfig), + new FightTagOutController(this.fightTagOutService), new FightMessageController(this.fightManager, notificationAnnouncer, fightBossBarService, this.pluginConfig, this.getServer()) ).forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this)); @@ -182,8 +188,8 @@ public RegionProvider getRegionProvider() { } @Override - public FightPearlManager getFightPearlManager() { - return this.fightPearlManager; + public FightPearlService getFightPearlService() { + return this.fightPearlService; } @Override @@ -197,17 +203,12 @@ public FightEffectService getFightEffectService() { } @Override - public DropManager getDropManager() { - return this.dropManager; - } - - @Override - public DropKeepInventoryManager getDropKeepInventoryManager() { - return this.dropKeepInventoryManager; + public DropService getDropService() { + return this.dropService; } @Override - public PluginConfig getPluginConfig() { - return this.pluginConfig; + public DropKeepInventoryService getDropKeepInventoryService() { + return this.dropKeepInventoryService; } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/WhitelistBlacklistMode.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/WhitelistBlacklistMode.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/WhitelistBlacklistMode.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/WhitelistBlacklistMode.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeInitializer.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeInitializer.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeInitializer.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeInitializer.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java similarity index 98% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java index 665362bd..036c5b45 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/BridgeService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java @@ -38,7 +38,7 @@ public void init(FightManager fightManager, Server server) { }); this.initialize("PlaceholderAPI", - () -> new FightTagPlaceholder(fightManager, server, plugin).register(), + () -> new FightTagPlaceholder(fightManager, server, this.plugin).register(), () -> this.logger.warning("PlaceholderAPI is not installed, placeholders will not be registered.") ); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java similarity index 87% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index f605c356..b4e9a051 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -38,19 +38,19 @@ public boolean canRegister() { @Override public @NotNull String getAuthor() { - return plugin.getDescription().getAuthors().get(0); + return this.plugin.getDescription().getAuthors().get(0); } @Override public @NotNull String getVersion() { - return plugin.getDescription().getVersion(); + return this.plugin.getDescription().getVersion(); } @Override public String onRequest(OfflinePlayer player, String identifier) { if (identifier.equals("remaining_seconds")) { return this.getFightTag(player) - .map(fightTag -> DurationUtil.format(fightTag.getRemainingDuration())) + .map(fightTagInter -> DurationUtil.format(fightTagInter.getRemainingDuration())) .orElse(""); } @@ -61,13 +61,13 @@ public String onRequest(OfflinePlayer player, String identifier) { } if (identifier.equals("opponent")) { - return getTagger(player) + return this.getTagger(player) .map(tagger -> tagger.getName()) .orElse(""); } if (identifier.equals("opponent_health")) { - return getTagger(player) + return this.getTagger(player) .map(tagger -> String.format("%.2f", tagger.getHealth())) .orElse(""); } @@ -77,7 +77,7 @@ public String onRequest(OfflinePlayer player, String identifier) { private @NotNull Optional getTagger(OfflinePlayer player) { return this.getFightTag(player) - .map(fightTag -> fightTag.getTagger()) + .map(fightTagInter -> fightTagInter.getTagger()) .map(taggerId -> this.server.getPlayer(taggerId)); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/ConfigService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/config/ConfigService.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java similarity index 99% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index 830e2137..c4bc3716 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -1,7 +1,7 @@ package com.eternalcode.combat.config.implementation; import com.eternalcode.combat.WhitelistBlacklistMode; -import com.eternalcode.combat.drop.DropSettings; +import com.eternalcode.combat.fight.drop.DropSettings; import com.eternalcode.combat.fight.effect.FightEffectSettings; import com.eternalcode.combat.fight.pearl.FightPearlSettings; import com.eternalcode.combat.notification.Notification; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/event/EventCaller.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/event/EventCaller.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/event/EventCaller.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/event/EventCaller.java diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightManagerImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightManagerImpl.java new file mode 100644 index 00000000..67ad0643 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightManagerImpl.java @@ -0,0 +1,86 @@ +package com.eternalcode.combat.fight; + +import com.eternalcode.combat.event.EventCaller; + +import com.eternalcode.combat.fight.event.CauseOfTag; +import com.eternalcode.combat.fight.event.CauseOfUnTag; +import com.eternalcode.combat.fight.event.FightTagEvent; +import com.eternalcode.combat.fight.event.FightUntagEvent; +import java.time.Duration; +import java.time.Instant; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +public class FightManagerImpl implements FightManager { + + private final Map fights = new ConcurrentHashMap<>(); + private final EventCaller eventCaller; + + public FightManagerImpl(EventCaller eventCaller) { + this.eventCaller = eventCaller; + } + + @Override + public boolean isInCombat(UUID player) { + if (!this.fights.containsKey(player)) { + return false; + } + + FightTag fightTag = this.fights.get(player); + + return !fightTag.isExpired(); + } + + @Override + public FightUntagEvent untag(UUID player, CauseOfUnTag causeOfUnTag) { + FightUntagEvent event = this.eventCaller.publishEvent(new FightUntagEvent(player, causeOfUnTag)); + if (event.isCancelled()) { + return event; + } + + this.fights.remove(player); + return event; + } + + @Override + public FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag) { + return this.tag(target, delay, causeOfTag, null); + } + + @ApiStatus.Experimental + @Override + public FightTagEvent tag(UUID target, Duration delay, CauseOfTag causeOfTag, @Nullable UUID tagger) { + FightTagEvent event = this.eventCaller.publishEvent(new FightTagEvent(target, causeOfTag)); + + if (event.isCancelled()) { + return event; + } + Instant now = Instant.now(); + Instant endOfCombatLog = now.plus(delay); + + FightTag fightTag = new FightTagImpl(target, endOfCombatLog, tagger); + + this.fights.put(target, fightTag); + return event; + } + + @Override + public Collection getFights() { + return Collections.unmodifiableCollection(this.fights.values()); + } + + @Override + public FightTag getTag(UUID target) { + return this.fights.get(target); + } + + @Override + public void untagAll() { + this.fights.clear(); + } +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java similarity index 83% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java index 3cb42920..6fe5b198 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java @@ -1,6 +1,7 @@ package com.eternalcode.combat.fight; import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.event.CancelTagReason; import com.eternalcode.combat.fight.event.CauseOfTag; import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.fight.event.FightTagEvent; @@ -56,7 +57,13 @@ void tag(@Context CommandSender sender, @Arg Player target) { FightTagEvent event = this.fightManager.tag(targetUniqueId, time, CauseOfTag.COMMAND); if (event.isCancelled()) { - this.announcer.sendMessage(sender, event.getCancelMessage()); + CancelTagReason cancelReason = event.getCancelReason(); + + if (cancelReason == CancelTagReason.TAGOUT) { + this.announcer.sendMessage(sender, this.config.messages.admin.adminTagOutCanceled); + return; + } + return; } @@ -85,11 +92,25 @@ void tagMultiple(@Context CommandSender sender, @Arg Player firstTarget, @Arg Pl String format = formatter.format(messages.admin.adminTagMultiplePlayers); if (firstTagEvent.isCancelled()) { - this.announcer.sendMessage(sender, firstTagEvent.getCancelMessage()); + CancelTagReason cancelReason = firstTagEvent.getCancelReason(); + + if (cancelReason == CancelTagReason.TAGOUT) { + this.announcer.sendMessage(sender, this.config.messages.admin.adminTagOutCanceled); + return; + } + + return; } if (secondTagEvent.isCancelled()) { - this.announcer.sendMessage(sender, firstTagEvent.getCancelMessage()); + CancelTagReason cancelReason = secondTagEvent.getCancelReason(); + + if (cancelReason == CancelTagReason.TAGOUT) { + this.announcer.sendMessage(sender, this.config.messages.admin.adminTagOutCanceled); + return; + } + + return; } if (firstTagEvent.isCancelled() && secondTagEvent.isCancelled()) { diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagImpl.java new file mode 100644 index 00000000..3e71b3f2 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagImpl.java @@ -0,0 +1,53 @@ +package com.eternalcode.combat.fight; + +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +public class FightTagImpl implements FightTag { + + private final UUID taggedPlayer; + private final Instant endOfCombatLog; + private final @Nullable UUID tagger; + + FightTagImpl(UUID personToAddCombat, Instant endOfCombatLog, @Nullable UUID tagger) { + this.taggedPlayer = personToAddCombat; + this.endOfCombatLog = endOfCombatLog; + this.tagger = tagger; + } + + @Override + public UUID getTaggedPlayer() { + return this.taggedPlayer; + } + + @Override + public Instant getEndOfCombatLog() { + return this.endOfCombatLog; + } + + @Override + public boolean isExpired() { + return Instant.now().isAfter(this.endOfCombatLog); + } + + @Override + public Duration getRemainingDuration() { + Duration between = Duration.between(Instant.now(), this.endOfCombatLog); + + if (between.isNegative()) { + return Duration.ZERO; + } + + return between; + } + + @ApiStatus.Experimental + @Override + public @Nullable UUID getTagger() { + return this.tagger; + } + +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTask.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTask.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTask.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTask.java index 6b4fa79c..0ffe7bd9 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/FightTask.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTask.java @@ -1,8 +1,8 @@ package com.eternalcode.combat.fight; -import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.bossbar.FightBossBarService; +import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.notification.Notification; import com.eternalcode.combat.notification.NotificationAnnouncer; import com.eternalcode.combat.notification.implementation.BossBarNotification; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBar.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBar.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBar.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBar.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarRegistry.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarRegistry.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarRegistry.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarRegistry.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarService.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarService.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/bossbar/FightBossBarService.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java similarity index 98% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java index 9432b6ce..ff3b7459 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java @@ -50,7 +50,7 @@ void onPlace(BlockPlaceEvent event) { List specificBlocksToPreventPlacing = this.config.settings.specificBlocksToPreventPlacing; - boolean isPlacementBlocked = isPlacementBlocked(level); + boolean isPlacementBlocked = this.isPlacementBlocked(level); Formatter formatter = new Formatter() .register("{Y}", this.config.settings.blockPlacingYCoordinate) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightMessageController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightMessageController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightMessageController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightMessageController.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java index 1e0157b1..a84e6025 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightUnTagController.java @@ -1,8 +1,8 @@ package com.eternalcode.combat.fight.controller; +import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.config.implementation.PluginConfig; -import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.logout.LogoutService; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java similarity index 85% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java index d1fb05ad..1c3ce344 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; import com.eternalcode.combat.fight.FightManager; import org.bukkit.entity.Player; @@ -15,13 +15,13 @@ public class DropController implements Listener { - private final DropManager dropManager; - private final DropKeepInventoryManager keepInventoryManager; + private final DropService dropService; + private final DropKeepInventoryService keepInventoryManager; private final DropSettings dropSettings; private final FightManager fightManager; - public DropController(DropManager dropManager, DropKeepInventoryManager keepInventoryManager, DropSettings dropSettings, FightManager fightManager) { - this.dropManager = dropManager; + public DropController(DropService dropService, DropKeepInventoryService keepInventoryManager, DropSettings dropSettings, FightManager fightManager) { + this.dropService = dropService; this.keepInventoryManager = keepInventoryManager; this.dropSettings = dropSettings; this.fightManager = fightManager; @@ -45,7 +45,7 @@ void onPlayerDeath(PlayerDeathEvent event) { .droppedExp(player.getTotalExperience()) .build(); - DropResult result = this.dropManager.modify(dropType, drop); + DropResult result = this.dropService.modify(dropType, drop); if (result == null) { return; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropKeepInventoryManager.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryServiceImpl.java similarity index 84% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropKeepInventoryManager.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryServiceImpl.java index 093b710e..98a1fb2d 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropKeepInventoryManager.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropKeepInventoryServiceImpl.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; import org.bukkit.inventory.ItemStack; @@ -9,22 +9,26 @@ import java.util.Map; import java.util.UUID; -public class DropKeepInventoryManager { +public class DropKeepInventoryServiceImpl implements DropKeepInventoryService { private final Map> itemsToGiveAfterRespawn = new HashMap<>(); + @Override public void addItem(UUID uuid, ItemStack item) { this.itemsToGiveAfterRespawn.computeIfAbsent(uuid, k -> new ArrayList<>()).add(item); } + @Override public void addItems(UUID uuid, List item) { item.forEach(i -> this.addItem(uuid, i)); } + @Override public boolean hasItems(UUID uuid) { return this.itemsToGiveAfterRespawn.containsKey(uuid); } + @Override public List nextItems(UUID uuid) { List itemStacks = this.itemsToGiveAfterRespawn.remove(uuid); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropManager.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropServiceImpl.java similarity index 86% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropManager.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropServiceImpl.java index 1e924ca2..2df9fc5b 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropManager.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropServiceImpl.java @@ -1,16 +1,17 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; import java.util.HashMap; import java.util.Map; -public class DropManager { +public class DropServiceImpl implements DropService { private final Map modifiers; - public DropManager() { + public DropServiceImpl() { this.modifiers = new HashMap<>(); } + @Override public void registerModifier(DropModifier dropModifier) { DropType dropType = dropModifier.getDropType(); @@ -25,6 +26,7 @@ public void registerModifier(DropModifier dropModifier) { this.modifiers.put(dropType, dropModifier); } + @Override public DropResult modify(DropType dropType, Drop drop) { if (!this.modifiers.containsKey(dropType)) { throw new RuntimeException("No drop modifier found for type '%s'".formatted(dropType.name())); diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropSettings.java similarity index 92% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropSettings.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropSettings.java index f373ee50..caa65cb4 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/DropSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropSettings.java @@ -1,5 +1,6 @@ -package com.eternalcode.combat.drop; +package com.eternalcode.combat.fight.drop; +import com.eternalcode.combat.fight.drop.DropType; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PercentDropModifier.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PercentDropModifier.java similarity index 78% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PercentDropModifier.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PercentDropModifier.java index 81774fbf..f891e937 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PercentDropModifier.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PercentDropModifier.java @@ -1,10 +1,10 @@ -package com.eternalcode.combat.drop.impl; +package com.eternalcode.combat.fight.drop.impl; -import com.eternalcode.combat.drop.Drop; -import com.eternalcode.combat.drop.DropModifier; -import com.eternalcode.combat.drop.DropResult; -import com.eternalcode.combat.drop.DropSettings; -import com.eternalcode.combat.drop.DropType; +import com.eternalcode.combat.fight.drop.Drop; +import com.eternalcode.combat.fight.drop.DropModifier; +import com.eternalcode.combat.fight.drop.DropResult; +import com.eternalcode.combat.fight.drop.DropSettings; +import com.eternalcode.combat.fight.drop.DropType; import com.eternalcode.combat.util.InventoryUtil; import com.eternalcode.combat.util.MathUtil; import com.eternalcode.combat.util.RemoveItemResult; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PlayersHealthDropModifier.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PlayersHealthDropModifier.java similarity index 86% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PlayersHealthDropModifier.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PlayersHealthDropModifier.java index d6f4ba15..e0ccfdbf 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/drop/impl/PlayersHealthDropModifier.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/impl/PlayersHealthDropModifier.java @@ -1,10 +1,10 @@ -package com.eternalcode.combat.drop.impl; +package com.eternalcode.combat.fight.drop.impl; -import com.eternalcode.combat.drop.Drop; -import com.eternalcode.combat.drop.DropModifier; -import com.eternalcode.combat.drop.DropResult; -import com.eternalcode.combat.drop.DropSettings; -import com.eternalcode.combat.drop.DropType; +import com.eternalcode.combat.fight.drop.Drop; +import com.eternalcode.combat.fight.drop.DropModifier; +import com.eternalcode.combat.fight.drop.DropResult; +import com.eternalcode.combat.fight.drop.DropSettings; +import com.eternalcode.combat.fight.drop.DropType; import com.eternalcode.combat.fight.logout.Logout; import com.eternalcode.combat.fight.logout.LogoutService; import com.eternalcode.combat.util.InventoryUtil; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectServiceImpl.java new file mode 100644 index 00000000..f9d4ab02 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectServiceImpl.java @@ -0,0 +1,81 @@ +package com.eternalcode.combat.fight.effect; + +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.List; +import java.util.ArrayList; + +public class FightEffectServiceImpl implements FightEffectService { + + private final Map> activeEffects = new HashMap<>(); + private static final int INFINITE_DURATION = -1; + + @Override + public void storeActiveEffect(Player player, PotionEffect effect) { + List effects = this.activeEffects.computeIfAbsent(player.getUniqueId(), k -> new ArrayList<>()); + + effects.add(effect); + } + + @Override + public void restoreActiveEffects(Player player) { + List currentEffects = this.getCurrentEffects(player); + + for (PotionEffect effect : currentEffects) { + player.addPotionEffect(effect); + } + + this.clearStoredEffects(player); + } + + @Override + public void clearStoredEffects(Player player) { + this.activeEffects.remove(player.getUniqueId()); + } + + @Override + public List getCurrentEffects(Player player) { + return this.activeEffects.getOrDefault(player.getUniqueId(), new ArrayList<>()); + } + + @Override + public void applyCustomEffect(Player player, PotionEffectType type, Integer amplifier) { + PotionEffect activeEffect = player.getPotionEffect(type); + + if (activeEffect == null) { + player.addPotionEffect(new PotionEffect(type, INFINITE_DURATION, amplifier)); + return; + } + + if (activeEffect.getAmplifier() > amplifier) { + return; + } + + if (activeEffect.getDuration() == -1) { + return; + } + + this.storeActiveEffect(player, activeEffect); + player.addPotionEffect(new PotionEffect(type, INFINITE_DURATION, amplifier)); + } + + @Override + public void removeCustomEffect(Player player, PotionEffectType type, Integer amplifier) { + PotionEffect activeEffect = player.getPotionEffect(type); + + if (activeEffect == null) { + return; + } + + if (activeEffect.getAmplifier() != amplifier) { + return; + } + + player.removePotionEffect(type); + } +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectSettings.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/effect/FightEffectSettings.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectSettings.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/Logout.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/Logout.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/Logout.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/Logout.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/LogoutService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutService.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/logout/LogoutService.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutService.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java similarity index 89% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java index 28282b91..8343bc24 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlController.java @@ -24,13 +24,13 @@ public class FightPearlController implements Listener { private final FightPearlSettings settings; private final NotificationAnnouncer announcer; private final FightManager fightManager; - private final FightPearlManager fightPearlManager; + private final FightPearlService fightPearlService; - public FightPearlController(FightPearlSettings settings, NotificationAnnouncer announcer, FightManager fightManager, FightPearlManager fightPearlManager) { + public FightPearlController(FightPearlSettings settings, NotificationAnnouncer announcer, FightManager fightManager, FightPearlService fightPearlService) { this.settings = settings; this.announcer = announcer; this.fightManager = fightManager; - this.fightPearlManager = fightPearlManager; + this.fightPearlService = fightPearlService; } @EventHandler @@ -62,10 +62,10 @@ void onInteract(PlayerInteractEvent event) { return; } - if (this.fightPearlManager.hasDelay(uniqueId)) { + if (this.fightPearlService.hasDelay(uniqueId)) { event.setCancelled(true); - Duration remainingPearlDelay = this.fightPearlManager.getRemainingDelay(uniqueId); + Duration remainingPearlDelay = this.fightPearlService.getRemainingDelay(uniqueId); Formatter formatter = new Formatter() .register("{TIME}", DurationUtil.format(remainingPearlDelay)); @@ -75,7 +75,7 @@ void onInteract(PlayerInteractEvent event) { return; } - this.fightPearlManager.markDelay(uniqueId); + this.fightPearlService.markDelay(uniqueId); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlManager.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java similarity index 84% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlManager.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java index 5cdaf423..4101a87b 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlManager.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlServiceImpl.java @@ -7,30 +7,34 @@ import java.time.Instant; import java.util.UUID; -public class FightPearlManager { +public class FightPearlServiceImpl implements FightPearlService { private final FightPearlSettings pearlSettings; private final Cache pearlDelays; - public FightPearlManager(FightPearlSettings pearlSettings) { + public FightPearlServiceImpl(FightPearlSettings pearlSettings) { this.pearlSettings = pearlSettings; this.pearlDelays = Caffeine.newBuilder() .expireAfterWrite(pearlSettings.pearlThrowDelay) .build(); } + @Override public void markDelay(UUID uuid) { this.pearlDelays.put(uuid, Instant.now().plus(this.pearlSettings.pearlThrowDelay)); } + @Override public boolean hasDelay(UUID uuid) { return Instant.now().isBefore(this.getDelay(uuid)); } + @Override public Duration getRemainingDelay(UUID uuid) { return Duration.between(Instant.now(), this.getDelay(uuid)); } + @Override public Instant getDelay(UUID uuid) { return this.pearlDelays.asMap().getOrDefault(uuid, Instant.MIN); } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutCommand.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutCommand.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutCommand.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutCommand.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java similarity index 71% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java index 1815583f..dd520444 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutController.java @@ -1,6 +1,6 @@ package com.eternalcode.combat.fight.tagout; -import com.eternalcode.combat.config.implementation.PluginConfig; +import com.eternalcode.combat.fight.event.CancelTagReason; import com.eternalcode.combat.fight.event.FightTagEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -10,11 +10,9 @@ public class FightTagOutController implements Listener { private final FightTagOutService tagOutService; - private final PluginConfig config; - public FightTagOutController(FightTagOutService tagOutService, PluginConfig config) { + public FightTagOutController(FightTagOutService tagOutService) { this.tagOutService = tagOutService; - this.config = config; } @EventHandler @@ -22,7 +20,8 @@ void onTagOut(FightTagEvent event) { UUID uniqueId = event.getPlayer(); if (this.tagOutService.isTaggedOut(uniqueId)) { - event.cancel(this.config.messages.admin.adminTagOutCanceled); + event.setCancelReason(CancelTagReason.TAGOUT); + event.setCancelled(true); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutServiceImpl.java new file mode 100644 index 00000000..548e6d1a --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/tagout/FightTagOutServiceImpl.java @@ -0,0 +1,37 @@ +package com.eternalcode.combat.fight.tagout; + +import java.time.Duration; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class FightTagOutServiceImpl implements FightTagOutService { + + private final Map tagOuts = new HashMap<>(); + + @Override + public void tagOut(UUID player, Duration duration) { + Instant endTime = Instant.now().plus(duration); + + this.tagOuts.put(player, endTime); + } + + @Override + public void unTagOut(UUID player) { + this.tagOuts.remove(player); + } + + @Override + public boolean isTaggedOut(UUID player) { + Instant endTime = this.tagOuts.get(player); + + if (endTime == null) { + return false; + } + Instant now = Instant.now(); + + return now.isBefore(endTime); + } + +} diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/InvalidUsageHandlerImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/InvalidUsageHandlerImpl.java similarity index 96% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/InvalidUsageHandlerImpl.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/InvalidUsageHandlerImpl.java index 8aebba22..a9546f74 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/InvalidUsageHandlerImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/InvalidUsageHandlerImpl.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.command.handler; +package com.eternalcode.combat.handler; import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.notification.NotificationAnnouncer; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/MissingPermissionHandlerImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/MissingPermissionHandlerImpl.java similarity index 96% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/MissingPermissionHandlerImpl.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/MissingPermissionHandlerImpl.java index 93f669f3..0466f22b 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/command/handler/MissingPermissionHandlerImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/handler/MissingPermissionHandlerImpl.java @@ -1,4 +1,4 @@ -package com.eternalcode.combat.command.handler; +package com.eternalcode.combat.handler; import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.notification.NotificationAnnouncer; diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/Notification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/Notification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/Notification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/Notification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NotificationAnnouncer.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationType.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NotificationType.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/NotificationType.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NotificationType.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/ActionBarNotification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/ActionBarNotification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/ActionBarNotification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/ActionBarNotification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/BossBarNotification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/BossBarNotification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/BossBarNotification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/BossBarNotification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/ChatNotification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/ChatNotification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/ChatNotification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/ChatNotification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/SubTitleNotification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/SubTitleNotification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/SubTitleNotification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/SubTitleNotification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/TitleNotification.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/TitleNotification.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/implementation/TitleNotification.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/implementation/TitleNotification.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/notification/serializer/NotificationSerializer.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/serializer/NotificationSerializer.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/notification/serializer/NotificationSerializer.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/serializer/NotificationSerializer.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/DefaultRegionProvider.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/RegionController.java similarity index 97% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/RegionController.java index 9039be19..1023c981 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/RegionController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/RegionController.java @@ -45,7 +45,7 @@ void onPlayerMove(PlayerMoveEvent event) { int zFrom = locationFrom.getBlockZ(); if (xTo != xFrom || yTo != yFrom || zTo != zFrom) { - Optional regionOptional = regionProvider.getRegion(locationTo); + Optional regionOptional = this.regionProvider.getRegion(locationTo); if (regionOptional.isEmpty()) { return; } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java similarity index 89% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java index 96ecef4b..94067277 100644 --- a/eternalcombat-api/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/WorldGuardRegionProvider.java @@ -33,7 +33,7 @@ public Optional getRegion(Location location) { ApplicableRegionSet applicableRegions = regionQuery.getApplicableRegions(BukkitAdapter.adapt(location)); for (ProtectedRegion region : applicableRegions.getRegions()) { - if (!isCombatRegion(region)) { + if (!this.isCombatRegion(region)) { continue; } @@ -62,13 +62,13 @@ private boolean isCombatRegion(ProtectedRegion region) { private record RegionImpl(Location contextLocation, ProtectedRegion region) implements Region { @Override public Location getCenter() { - BlockVector3 min = region.getMinimumPoint(); - BlockVector3 max = region.getMaximumPoint(); + BlockVector3 min = this.region.getMinimumPoint(); + BlockVector3 max = this.region.getMaximumPoint(); double x = (double) (min.getX() + max.getX()) / 2; double z = (double) (min.getZ() + max.getZ()) / 2; - return new Location(contextLocation.getWorld(), x, contextLocation.getY(), z); + return new Location(this.contextLocation.getWorld(), x, this.contextLocation.getY(), z); } } diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/updater/UpdaterService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterService.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/updater/UpdaterService.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterService.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/util/DurationUtil.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/DurationUtil.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/util/DurationUtil.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/DurationUtil.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/util/InventoryUtil.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/InventoryUtil.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/util/InventoryUtil.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/InventoryUtil.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/util/MathUtil.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/MathUtil.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/util/MathUtil.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/MathUtil.java diff --git a/eternalcombat-api/src/main/java/com/eternalcode/combat/util/RemoveItemResult.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/RemoveItemResult.java similarity index 100% rename from eternalcombat-api/src/main/java/com/eternalcode/combat/util/RemoveItemResult.java rename to eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/RemoveItemResult.java