From 79295bfdc86d668d91eace0673bd3f2f051818bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 20:35:51 +0000 Subject: [PATCH 1/6] dependency: Update dependency net.kyori:adventure-text-minimessage to v5 --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index a3018a3d..54da9d31 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -13,7 +13,7 @@ object Versions { const val PACKETS_EVENTS = "2.12.0" const val ADVENTURE_PLATFORM_BUKKIT = "4.4.1" - const val ADVENTURE_API = "4.26.1" + const val ADVENTURE_API = "5.0.1" const val LITE_COMMANDS = "3.10.9" const val OKAERI_CONFIGS_SERDES_COMMONS = "5.0.13" From e52da8d639faf2bb2e84996ed3c8d6fd5a82afe5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 May 2026 03:15:09 +0000 Subject: [PATCH 2/6] dependency: Update dependency net.kyori:adventure-text-minimessage to v5 --- buildSrc/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 9215063c..0e5ba378 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -13,7 +13,7 @@ object Versions { const val PACKETS_EVENTS = "2.12.1" const val ADVENTURE_PLATFORM_BUKKIT = "4.4.1" - const val ADVENTURE_API = "4.26.1" + const val ADVENTURE_API = "5.1.1" const val LITE_COMMANDS = "3.10.9" const val OKAERI_CONFIGS_SERDES_COMMONS = "5.0.13" From 3ead21f57e8774cb796c6b45cd0fc8ad7c48afc9 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 27 May 2026 20:33:15 +0200 Subject: [PATCH 3/6] refactor: migrate plugin to modern Paper API Switch build metadata to Paper plugin descriptors and paper-api from 1.19.3 onward. Use native Paper Adventure audiences, async chunk loading, and teleport APIs without relocating Adventure. Add repository guidance and bug report notes. --- AGENTS.md | 43 +++++++ bugs.md | 112 ++++++++++++++++++ buildSrc/src/main/kotlin/Versions.kt | 11 +- .../eternalcombat-java-unit-test.gradle.kts | 2 +- eternalcombat-api/build.gradle.kts | 4 +- eternalcombat-plugin/build.gradle.kts | 55 +++++---- .../com/eternalcode/combat/CombatPlugin.java | 12 +- .../border/animation/block/ChunkCache.java | 3 +- .../crystalpvp/CrystalPvpConstants.java | 30 +---- .../fight/effect/FightEffectController.java | 13 +- .../fight/knockback/KnockbackService.java | 3 +- .../combat/notification/NoticeService.java | 18 +-- .../UpdaterNotificationController.java | 9 +- .../eternalcode/combat/util/ReflectUtil.java | 27 ----- gradle.properties | 2 +- 15 files changed, 215 insertions(+), 129 deletions(-) create mode 100644 AGENTS.md create mode 100644 bugs.md delete mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/ReflectUtil.java diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..e6238865 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,43 @@ +# Repository Guidelines + +## Project Structure & Module Organization +This repository is a Gradle multi-module Java project: +- `eternalcombat-plugin/` - main Bukkit/Paper plugin implementation (`src/main/java`), runtime config/resources, and shaded jar output. +- `eternalcombat-api/` - public API module for external integrations. +- `buildSrc/` - shared Gradle convention plugins (Java toolchain, test setup, publishing, repositories). +- `assets/` - README/media assets. +- `.github/workflows/` - CI and publishing pipelines. + +Keep new code inside the appropriate module and package (`com.eternalcode...`). Avoid cross-module leakage: API contracts go in `eternalcombat-api`, implementation details stay in `eternalcombat-plugin`. + +## Build, Test, and Development Commands +Use the Gradle wrapper from repo root: +- `./gradlew clean build` - full build for all modules. +- `./gradlew test` - runs unit tests (JUnit Platform). +- `./gradlew :eternalcombat-plugin:shadowJar` - builds the distributable plugin jar. +- `./gradlew :eternalcombat-plugin:runServer` - starts a local Paper test server with required plugins. + +CI currently builds with `shadowJar`, so verify that task before opening a PR. + +## Coding Style & Naming Conventions +- Follow `.editorconfig`: UTF-8, LF, 4-space indentation (YAML: 2 spaces). +- Java toolchain is configured in Gradle conventions; keep language features compatible with the configured `release`. +- Use clear, domain-oriented class names (`FightActionBlockerController`, `CombatPlugin`). +- Keep packages lowercase and class names `PascalCase`; methods/fields `camelCase`; constants `UPPER_SNAKE_CASE`. + +## Testing Guidelines +Testing is configured through `buildSrc` with JUnit Jupiter and `useJUnitPlatform()`. +- Preferred test location: module-local `test/` directory (as defined by convention plugin). +- Name test classes `*Test` and methods by behavior (for example, `shouldBlockCommandDuringCombat`). +- Run `./gradlew test` before each PR. Add tests for bug fixes and behavior changes. + +## Commit & Pull Request Guidelines +Recent history follows Conventional Commit-style prefixes (`feat:`, `refactor:`, `dependency:`). Use concise, imperative messages. + +For pull requests: +- Describe what changed and why (required by `.github/PULL_REQUEST_TEMPLATE.md`). +- Link related issues when applicable. +- Include verification notes (commands run, test results, and, if relevant, gameplay screenshots/logs). + +## Security & Configuration Tips +Publishing uses environment tokens (for example `MODRINTH_TOKEN`, `HANGAR_API_TOKEN`). Never commit secrets; use local environment variables or CI secrets only. diff --git a/bugs.md b/bugs.md new file mode 100644 index 00000000..2ed94041 --- /dev/null +++ b/bugs.md @@ -0,0 +1,112 @@ +# Bugs Report (EternalCombat) + +## Wysoki priorytet + +### [EC-002] Błędna logika `headDropOnlyInCombat` i `headDropChance` +- Kategoria: config mismatch / gameplay bug +- Objaw: głowa dropi zawsze w combat, a poza combat może dropić mimo `headDropOnlyInCombat=true`. +- Reprodukcja: + 1. `headDropEnabled=true`, `headDropOnlyInCombat=true`, `headDropChance=1.0`. + 2. Zgiń w combat i poza combat. +- Oczekiwane: tylko w combat i z uwzględnieniem chance. +- Obecne: w combat bezwarunkowo true, poza combat wciąż losowanie. +- Ryzyko: wysokie (ekonomia/farm głów). +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java:83` + +### [EC-003] Off-by-one na granicach regionów (krawędź bypass) +- Kategoria: exploit / edge-case +- Objaw: możliwe wejście do strefy po granicznym bloku bez poprawnej blokady. +- Reprodukcja: + 1. Wejdź w combat. + 2. Wejdź dokładnie na granicę regionu (max X/Z). +- Oczekiwane: pełne pokrycie regionu. +- Obecne: `contains()` używa `< max`, a `getMax()` zwraca punkt graniczny inkluzyjny. +- Ryzyko: wysokie. +- Lokalizacja: + - `eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java:20` + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/ChunkRegion.java:24` + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/bukkit/DefaultRegionProvider.java:43` + +### [EC-004] `ignoredWorlds` nie wyłącza wszystkich restrykcji +- Kategoria: config mismatch +- Objaw: gracz tagged w innym świecie po wejściu do ignored world nadal podlega restrykcjom/krom. +- Reprodukcja: + 1. Otaguj gracza. + 2. Teleportuj go do świata z `ignoredWorlds`. + 3. Sprawdź command block / logout punishment. +- Oczekiwane: “not affected by combat rules”. +- Obecne: ignorowane światy sprawdzane głównie przy samym tagowaniu. +- Ryzyko: wysokie. +- Lokalizacja: + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java:144` + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java:127` + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java:60` + +## Średni priorytet + +### [EC-005] Utrata `allowFlight` po untag (survival fly) +- Kategoria: gameplay bug +- Objaw: gracze z legalnym `/fly` tracą możliwość lotu po combat. +- Reprodukcja: + 1. Survival + włączony fly z innego pluginu. + 2. Wejdź i wyjdź z combat. +- Oczekiwane: przywrócenie stanu lotu po untag. +- Obecne: restore tylko dla creative/spectator. +- Ryzyko: średnie/wysokie. +- Lokalizacja: + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java:61` + - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java:168` + +### [EC-006] `/combatlog tag ` działa mimo komunikatu “cannot tag self” +- Kategoria: gameplay bug +- Objaw: self-tag działa dla komendy 1-target. +- Reprodukcja: `/combatlog tag `. +- Oczekiwane: blokada self-tag. +- Obecne: check self tylko w wariancie 2-target. +- Ryzyko: średnie. +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java:55` + +### [EC-007] `tag player1 player2` nie jest atomowe +- Kategoria: gameplay bug +- Objaw: jeden gracz tagged, drugi odrzucony; komunikacja nie mówi o partial success. +- Reprodukcja: + 1. Daj A tagout. + 2. Użyj `/combatlog tag A B`. +- Oczekiwane: all-or-nothing lub jawny partial success. +- Obecne: oba tagowane przed walidacją cancel. +- Ryzyko: średnie. +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java:96` + +### [EC-008] `FightTask` przerywa tick po pierwszym expired tagu +- Kategoria: gameplay bug / edge-case +- Objaw: część graczy nie dostaje update/untag w tym samym ticku. +- Reprodukcja: wielu graczy w combat, pierwszy z iteracji wygasa. +- Oczekiwane: obsługa wszystkich wpisów. +- Obecne: `return` zamiast `continue`. +- Ryzyko: średnie. +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTask.java:38` + +### [EC-009] Możliwa utrata itemów przy respawnie (overflow inventory) +- Kategoria: data loss / edge-case +- Objaw: część itemów “zachowanych” nie wraca, gdy inventory pełne. +- Reprodukcja: + 1. Wymuś keep po drop-modifier. + 2. Respawn z pełnym inventory. +- Oczekiwane: bezstratny zwrot (inv + drop leftovers). +- Obecne: wynik `addItem` nieobsłużony. +- Ryzyko: średnie. +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java:142` + +### [EC-010] (Podejrzenie) Async reload configu +- Kategoria: edge-case / stabilność wpływająca na gameplay +- Objaw: potencjalne niespójności podczas `reload` pod obciążeniem. +- Reprodukcja: PvP spam + wielokrotne `/combatlog reload`. +- Oczekiwane: spójny reload. +- Obecne: `@Async` i współdzielony mutable config. +- Ryzyko: średnie. +- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java:31` + +## Niespójności README/config (dodatkowo) +- README mówi Java 17+, build ustawiony na Java 21. +- README nie dokumentuje `eternalcombat.untagall` i `eternalcombat.tagout`. +- Komentarz `InventorySettings`: “PLAYER/CREATIVE never blocked” nie jest twardo wymuszony w kontrolerze. diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 0e5ba378..dd9c2172 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -1,6 +1,6 @@ object Versions { - const val SPIGOT_API = "1.17.1-R0.1-SNAPSHOT" + const val PAPER_API = "1.19.3-R0.1-SNAPSHOT" const val JUNIT_JUPITER_API = "6.0.3" const val JUNIT_JUPITER_PARAMS = "6.0.3" @@ -8,13 +8,10 @@ object Versions { const val JETBRAINS_ANNOTATIONS = "26.1.0" - const val ETERNALCODE_COMMONS = "1.3.4" - const val MULTIFICATION = "1.2.4" + const val ETERNALCODE_COMMONS = "1.4.0-SNAPSHOT" + const val MULTIFICATION = "1.2.5-SNAPSHOT" const val PACKETS_EVENTS = "2.12.1" - const val ADVENTURE_PLATFORM_BUKKIT = "4.4.1" - const val ADVENTURE_API = "5.1.1" - const val LITE_COMMANDS = "3.10.9" const val OKAERI_CONFIGS_SERDES_COMMONS = "5.0.13" const val OKAERI_CONFIGS_SERDES_BUKKIT = "5.0.13" @@ -28,8 +25,6 @@ object Versions { const val PLACEHOLDER_API = "2.12.2" const val LANDS_API = "7.25.4" - const val PAPERLIB = "1.0.8" - const val WORLDEDIT = "3ISh7ADm" //cannot use numeric version bc of duplicated version on modrinth const val PACKETEVENTS = "2.11.1" const val WORLDGUARD = "7.0.15-beta-01" diff --git a/buildSrc/src/main/kotlin/eternalcombat-java-unit-test.gradle.kts b/buildSrc/src/main/kotlin/eternalcombat-java-unit-test.gradle.kts index ce8752ae..0ec46da2 100644 --- a/buildSrc/src/main/kotlin/eternalcombat-java-unit-test.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcombat-java-unit-test.gradle.kts @@ -3,7 +3,7 @@ plugins { } dependencies { - testImplementation("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + testImplementation("io.papermc.paper:paper-api:${Versions.PAPER_API}") testImplementation("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT_JUPITER_API}") testImplementation("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT_JUPITER_PARAMS}") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${Versions.JUNIT_JUPITER_ENGINE}") diff --git a/eternalcombat-api/build.gradle.kts b/eternalcombat-api/build.gradle.kts index b6911a26..a2c7c39e 100644 --- a/eternalcombat-api/build.gradle.kts +++ b/eternalcombat-api/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } dependencies { - // Spigot api - compileOnlyApi("org.spigotmc:spigot-api:${Versions.SPIGOT_API}") + // Paper api + compileOnlyApi("io.papermc.paper:paper-api:${Versions.PAPER_API}") api("org.jetbrains:annotations:${Versions.JETBRAINS_ANNOTATIONS}") } diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 3cbf3602..4d8df592 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -1,12 +1,13 @@ -import net.minecrell.pluginyml.bukkit.BukkitPluginDescription import io.papermc.hangarpublishplugin.model.Platforms +import net.minecrell.pluginyml.bukkit.BukkitPluginDescription +import net.minecrell.pluginyml.paper.PaperPluginDescription import org.gradle.kotlin.dsl.shadowJar plugins { `eternalcombat-java` `eternalcombat-repositories` - id("net.minecrell.plugin-yml.bukkit") + id("de.eldoria.plugin-yml.paper") version "0.9.0" id("com.gradleup.shadow") id("xyz.jpenilla.run-paper") id("com.modrinth.minotaur") version "2.9.0" @@ -27,14 +28,8 @@ configurations.all { dependencies { implementation(project(":eternalcombat-api")) - // kyori - implementation("net.kyori:adventure-platform-bukkit:${Versions.ADVENTURE_PLATFORM_BUKKIT}") - implementation("net.kyori:adventure-text-minimessage:${Versions.ADVENTURE_API}") - implementation("net.kyori:adventure-api") { - version { - strictly(Versions.ADVENTURE_API) - } - } + // Paper + compileOnly("io.papermc.paper:paper-api:${Versions.PAPER_API}") // litecommands implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") @@ -69,29 +64,39 @@ dependencies { compileOnly("com.github.angeschossen:LandsAPI:${Versions.LANDS_API}") // Multification - implementation("com.eternalcode:multification-bukkit:${Versions.MULTIFICATION}") + implementation("com.eternalcode:multification-paper:${Versions.MULTIFICATION}") implementation("com.eternalcode:multification-okaeri:${Versions.MULTIFICATION}") compileOnly("com.github.retrooper:packetevents-spigot:${Versions.PACKETS_EVENTS}") - implementation("io.papermc:paperlib:${Versions.PAPERLIB}") } -bukkit { +paper { main = "com.eternalcode.combat.CombatPlugin" - author = "EternalCodeTeam" - apiVersion = "1.13" + authors = listOf("EternalCodeTeam") + apiVersion = "1.19" prefix = "EternalCombat" name = "EternalCombat" + generateLibrariesJson = true load = BukkitPluginDescription.PluginLoadOrder.POSTWORLD - softDepend = listOf( - "Lands", - "WorldGuard" - ) - depend = listOf( - "packetevents", - ) version = "${project.version}" foliaSupported = true + + serverDependencies { + register("packetevents") { + required = true + load = PaperPluginDescription.RelativeLoadOrder.BEFORE + } + + register("Lands") { + required = false + load = PaperPluginDescription.RelativeLoadOrder.BEFORE + } + + register("WorldGuard") { + required = false + load = PaperPluginDescription.RelativeLoadOrder.BEFORE + } + } } tasks { @@ -115,12 +120,12 @@ tasks.shadowJar { "javax/**", "org/checkerframework/**", "com/google/errorprone/**", + "com/google/gson/**" ) val prefix = "com.eternalcode.combat.libs" listOf( "eu.okaeri", - "net.kyori", "org.bstats", "org.yaml", "dev.rollczi.litecommands", @@ -130,7 +135,7 @@ tasks.shadowJar { "com.eternalcode.commons", "com.eternalcode.multification", "com.github.cryptomorin", - "io.papermc.lib", + "com.cryptomorin", ).forEach { pack -> relocate(pack, "$prefix.$pack") } @@ -166,7 +171,7 @@ modrinth { versionType.set(if (isRelease) "release" else "beta") uploadFile.set(tasks.shadowJar) gameVersions.addAll(paperVersions) - loaders.addAll(listOf("paper", "spigot", "folia", "purpur")) + loaders.addAll(listOf("paper", "folia", "purpur")) changelog.set(changelogText) syncBodyFrom.set(rootProject.file("README.md").readText()) } 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 48874171..720ea416 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -63,8 +63,6 @@ import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; import dev.rollczi.litecommands.folia.FoliaExtension; import java.time.Duration; -import net.kyori.adventure.platform.AudienceProvider; -import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bstats.bukkit.Metrics; import org.bukkit.Server; @@ -92,7 +90,6 @@ public final class CombatPlugin extends JavaPlugin implements EternalCombatApi { private RegionProvider regionProvider; - private AudienceProvider audienceProvider; private LiteCommands liteCommands; @@ -122,13 +119,12 @@ public void onEnable() { UpdaterService updaterService = new UpdaterService(this.getDescription()); - this.audienceProvider = BukkitAudiences.create(this); MiniMessage miniMessage = MiniMessage.builder() .postProcessor(new AdventureLegacyColorPostProcessor()) .preProcessor(new AdventureLegacyColorPreProcessor()) .build(); - NoticeService noticeService = new NoticeService(this.audienceProvider, pluginConfig, miniMessage); + NoticeService noticeService = new NoticeService(pluginConfig, miniMessage); BridgeService bridgeService = new BridgeService( pluginConfig, @@ -185,7 +181,7 @@ public void onEnable() { new FightPearlController(pluginConfig.pearl, noticeService, this.fightManager, this.fightPearlService), new DeathFlareController(pluginConfig, server, scheduler, this), new DeathLightningController(pluginConfig, server), - new UpdaterNotificationController(updaterService, pluginConfig, this.audienceProvider, miniMessage), + new UpdaterNotificationController(updaterService, pluginConfig, miniMessage), new KnockbackRegionController(noticeService, this.regionProvider, this.fightManager, knockbackService, server), new FightEffectController(pluginConfig.effect, this.fightEffectService, this.fightManager, server), new FightTagOutController(this.fightTagOutService), @@ -225,10 +221,6 @@ public void onDisable() { this.liteCommands.unregister(); } - if (this.audienceProvider != null) { - this.audienceProvider.close(); - } - this.fightManager.untagAll(); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/animation/block/ChunkCache.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/animation/block/ChunkCache.java index b8f099c6..1b2cc8c4 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/animation/block/ChunkCache.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/animation/block/ChunkCache.java @@ -2,7 +2,6 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import io.papermc.lib.PaperLib; import org.bukkit.ChunkSnapshot; import org.bukkit.entity.Player; @@ -22,7 +21,7 @@ public ChunkSnapshot loadSnapshot(Player player, ChunkLocation location) { return snapshot; } - ChunkSnapshot chunkSnapshot = PaperLib.getChunkAtAsync(player.getWorld(), location.x(), location.z(), false) + ChunkSnapshot chunkSnapshot = player.getWorld().getChunkAtAsync(location.x(), location.z(), false) .thenApply(chunk -> chunk.getChunkSnapshot()) .join(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/crystalpvp/CrystalPvpConstants.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/crystalpvp/CrystalPvpConstants.java index b1c82e37..b60ea813 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/crystalpvp/CrystalPvpConstants.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/crystalpvp/CrystalPvpConstants.java @@ -3,12 +3,11 @@ 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.ReflectUtil; import java.util.List; import java.util.Optional; import java.util.UUID; import org.bukkit.Material; -import org.bukkit.block.BlockState; +import org.bukkit.block.Block; import org.bukkit.entity.EnderCrystal; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByBlockEvent; @@ -23,21 +22,6 @@ private CrystalPvpConstants() { public static final String CRYSTAL_METADATA = "eternalcombat:crystal"; public static final String ANCHOR_METADATA = "eternalcombat:anchor"; - private static final boolean HAS_DAMAGER_BLOCK_STATE = checkForDamagerBlockState(); - - private static boolean checkForDamagerBlockState() { - try { - return EntityDamageByBlockEvent.class.getDeclaredMethod("getDamagerBlockState") != null; - } - catch (NoSuchMethodException exception) { - return false; - } - } - - static boolean hasDamagerBlockState() { - return HAS_DAMAGER_BLOCK_STATE; - } - public static Optional getDamagerUniqueIdFromEndCrystal(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof EnderCrystal enderCrystal) { List metadataValues = enderCrystal.getMetadata(CRYSTAL_METADATA); @@ -52,20 +36,16 @@ public static Optional getDamagerUniqueIdFromEndCrystal(EntityDamageByEnti } public static Optional getDamagerUniqueIdFromRespawnAnchor(EntityDamageByBlockEvent event) { - if (!CrystalPvpConstants.hasDamagerBlockState()) { + Block damager = event.getDamager(); + if (damager == null) { return Optional.empty(); } - Object maybeState = ReflectUtil.invokeMethod(event, "getDamagerBlockState"); - if (!(maybeState instanceof BlockState state)) { - return Optional.empty(); - } - Material type = state.getType(); - if (!type.equals(Material.RESPAWN_ANCHOR)) { + if (damager.getType() != Material.RESPAWN_ANCHOR) { return Optional.empty(); } - return state.getMetadata(ANCHOR_METADATA).stream() + return damager.getMetadata(ANCHOR_METADATA).stream() .filter(source -> source instanceof CrystalMetadata) .map(meta -> (CrystalMetadata) meta) .findFirst() diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java index 5cc10ac9..438fb85e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/effect/FightEffectController.java @@ -4,7 +4,6 @@ import com.eternalcode.combat.fight.event.CauseOfUnTag; import com.eternalcode.combat.fight.event.FightTagEvent; import com.eternalcode.combat.fight.event.FightUntagEvent; -import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -50,9 +49,11 @@ public void onQuit(FightUntagEvent event) { } if (event.getCause() == CauseOfUnTag.LOGOUT) { - Player player = Bukkit.getPlayer(event.getPlayer()); + Player player = this.server.getPlayer(event.getPlayer()); + if (player == null) { + return; + } - assert player != null; this.effectService.clearStoredEffects(player); } } @@ -80,9 +81,11 @@ public void onDeath(FightUntagEvent event) { return; } if (event.getCause() == CauseOfUnTag.DEATH_BY_PLAYER || event.getCause() == CauseOfUnTag.DEATH) { - Player player = Bukkit.getPlayer(event.getPlayer()); + Player player = this.server.getPlayer(event.getPlayer()); + if (player == null) { + return; + } - assert player != null; this.effectService.clearStoredEffects(player); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java index bae8afab..a1ac3f39 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java @@ -5,7 +5,6 @@ import com.eternalcode.combat.region.Region; import com.eternalcode.combat.region.RegionProvider; import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; -import io.papermc.lib.PaperLib; import java.time.Duration; import java.util.HashMap; import java.util.Map; @@ -55,7 +54,7 @@ public void forceKnockbackLater(Player player, Region region) { Location location = generate(playerLocation, Point2D.from(region.getMin()), Point2D.from(region.getMax())); - PaperLib.teleportAsync(player, location, TeleportCause.PLUGIN); + player.teleportAsync(location, TeleportCause.PLUGIN); }, this.config.knockback.forceDelay); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NoticeService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NoticeService.java index 2ada96b8..3bbed108 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NoticeService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/notification/NoticeService.java @@ -2,24 +2,20 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.multification.adventure.AudienceConverter; -import com.eternalcode.multification.bukkit.BukkitMultification; +import com.eternalcode.multification.paper.PaperMultification; import com.eternalcode.multification.translation.TranslationProvider; -import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.ComponentSerializer; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -public final class NoticeService extends BukkitMultification { +public final class NoticeService extends PaperMultification { - private final AudienceProvider audienceProvider; private final PluginConfig pluginConfig; private final MiniMessage miniMessage; - public NoticeService(AudienceProvider audienceProvider, PluginConfig pluginConfig, MiniMessage miniMessage) { - this.audienceProvider = audienceProvider; + public NoticeService(PluginConfig pluginConfig, MiniMessage miniMessage) { this.pluginConfig = pluginConfig; this.miniMessage = miniMessage; } @@ -36,13 +32,7 @@ public NoticeService(AudienceProvider audienceProvider, PluginConfig pluginConfi @Override protected @NotNull AudienceConverter audienceConverter() { - return commandSender -> { - if (commandSender instanceof Player player) { - return this.audienceProvider.player(player.getUniqueId()); - } - - return this.audienceProvider.console(); - }; + return commandSender -> commandSender; } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java index 4c0c770b..65c28744 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/updater/UpdaterNotificationController.java @@ -2,8 +2,6 @@ import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.commons.concurrent.FutureHandler; -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -16,20 +14,17 @@ public class UpdaterNotificationController implements Listener { private final UpdaterService updaterService; private final PluginConfig pluginConfig; - private final AudienceProvider audienceProvider; private final MiniMessage miniMessage; - public UpdaterNotificationController(UpdaterService updaterService, PluginConfig pluginConfig, AudienceProvider audienceProvider, MiniMessage miniMessage) { + public UpdaterNotificationController(UpdaterService updaterService, PluginConfig pluginConfig, MiniMessage miniMessage) { this.updaterService = updaterService; this.pluginConfig = pluginConfig; - this.audienceProvider = audienceProvider; this.miniMessage = miniMessage; } @EventHandler void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - Audience audience = this.audienceProvider.player(player.getUniqueId()); if (!shouldNotify(player)) { return; @@ -38,7 +33,7 @@ void onJoin(PlayerJoinEvent event) { this.updaterService.checkForUpdate() .thenAccept(result -> { if (result.isUpdateAvailable()) { - audience.sendMessage(this.miniMessage.deserialize(NEW_VERSION_AVAILABLE)); + player.sendMessage(this.miniMessage.deserialize(NEW_VERSION_AVAILABLE)); } }) .exceptionally(FutureHandler::handleException); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/ReflectUtil.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/ReflectUtil.java deleted file mode 100644 index 1d963087..00000000 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/util/ReflectUtil.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.eternalcode.combat.util; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -public final class ReflectUtil { - - private ReflectUtil() { - } - - @SuppressWarnings("unchecked") - public static T invokeMethod(Object object, String name) { - try { - if (object == null) { - return null; - } - - Method method = object.getClass().getDeclaredMethod(name); - method.setAccessible(true); - return (T) method.invoke(object); - } - catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException exception) { - throw new RuntimeException(exception); - } - } - -} diff --git a/gradle.properties b/gradle.properties index 74ab9c9b..415a9938 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,4 +4,4 @@ org.gradle.configuration-cache=true org.gradle.configuration-cache.parallel=true # Platforms -paperVersion=1.17,1.17.1,1.18,1.18.1,1.18.2,1.19,1.19.1,1.19.2,1.19.3,1.19.4,1.20,1.20.1,1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11 +paperVersion=1.19.3,1.19.4,1.20,1.20.1,1.20.2,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11,26.1.1,26.1.2 From a4ae1c5cef770661c5dc33b5985e2604e2c4c37a Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 27 May 2026 20:34:06 +0200 Subject: [PATCH 4/6] Fix. --- AGENTS.md | 43 --------------------- bugs.md | 112 ------------------------------------------------------ 2 files changed, 155 deletions(-) delete mode 100644 AGENTS.md delete mode 100644 bugs.md diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index e6238865..00000000 --- a/AGENTS.md +++ /dev/null @@ -1,43 +0,0 @@ -# Repository Guidelines - -## Project Structure & Module Organization -This repository is a Gradle multi-module Java project: -- `eternalcombat-plugin/` - main Bukkit/Paper plugin implementation (`src/main/java`), runtime config/resources, and shaded jar output. -- `eternalcombat-api/` - public API module for external integrations. -- `buildSrc/` - shared Gradle convention plugins (Java toolchain, test setup, publishing, repositories). -- `assets/` - README/media assets. -- `.github/workflows/` - CI and publishing pipelines. - -Keep new code inside the appropriate module and package (`com.eternalcode...`). Avoid cross-module leakage: API contracts go in `eternalcombat-api`, implementation details stay in `eternalcombat-plugin`. - -## Build, Test, and Development Commands -Use the Gradle wrapper from repo root: -- `./gradlew clean build` - full build for all modules. -- `./gradlew test` - runs unit tests (JUnit Platform). -- `./gradlew :eternalcombat-plugin:shadowJar` - builds the distributable plugin jar. -- `./gradlew :eternalcombat-plugin:runServer` - starts a local Paper test server with required plugins. - -CI currently builds with `shadowJar`, so verify that task before opening a PR. - -## Coding Style & Naming Conventions -- Follow `.editorconfig`: UTF-8, LF, 4-space indentation (YAML: 2 spaces). -- Java toolchain is configured in Gradle conventions; keep language features compatible with the configured `release`. -- Use clear, domain-oriented class names (`FightActionBlockerController`, `CombatPlugin`). -- Keep packages lowercase and class names `PascalCase`; methods/fields `camelCase`; constants `UPPER_SNAKE_CASE`. - -## Testing Guidelines -Testing is configured through `buildSrc` with JUnit Jupiter and `useJUnitPlatform()`. -- Preferred test location: module-local `test/` directory (as defined by convention plugin). -- Name test classes `*Test` and methods by behavior (for example, `shouldBlockCommandDuringCombat`). -- Run `./gradlew test` before each PR. Add tests for bug fixes and behavior changes. - -## Commit & Pull Request Guidelines -Recent history follows Conventional Commit-style prefixes (`feat:`, `refactor:`, `dependency:`). Use concise, imperative messages. - -For pull requests: -- Describe what changed and why (required by `.github/PULL_REQUEST_TEMPLATE.md`). -- Link related issues when applicable. -- Include verification notes (commands run, test results, and, if relevant, gameplay screenshots/logs). - -## Security & Configuration Tips -Publishing uses environment tokens (for example `MODRINTH_TOKEN`, `HANGAR_API_TOKEN`). Never commit secrets; use local environment variables or CI secrets only. diff --git a/bugs.md b/bugs.md deleted file mode 100644 index 2ed94041..00000000 --- a/bugs.md +++ /dev/null @@ -1,112 +0,0 @@ -# Bugs Report (EternalCombat) - -## Wysoki priorytet - -### [EC-002] Błędna logika `headDropOnlyInCombat` i `headDropChance` -- Kategoria: config mismatch / gameplay bug -- Objaw: głowa dropi zawsze w combat, a poza combat może dropić mimo `headDropOnlyInCombat=true`. -- Reprodukcja: - 1. `headDropEnabled=true`, `headDropOnlyInCombat=true`, `headDropChance=1.0`. - 2. Zgiń w combat i poza combat. -- Oczekiwane: tylko w combat i z uwzględnieniem chance. -- Obecne: w combat bezwarunkowo true, poza combat wciąż losowanie. -- Ryzyko: wysokie (ekonomia/farm głów). -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java:83` - -### [EC-003] Off-by-one na granicach regionów (krawędź bypass) -- Kategoria: exploit / edge-case -- Objaw: możliwe wejście do strefy po granicznym bloku bez poprawnej blokady. -- Reprodukcja: - 1. Wejdź w combat. - 2. Wejdź dokładnie na granicę regionu (max X/Z). -- Oczekiwane: pełne pokrycie regionu. -- Obecne: `contains()` używa `< max`, a `getMax()` zwraca punkt graniczny inkluzyjny. -- Ryzyko: wysokie. -- Lokalizacja: - - `eternalcombat-api/src/main/java/com/eternalcode/combat/region/Region.java:20` - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/ChunkRegion.java:24` - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/region/bukkit/DefaultRegionProvider.java:43` - -### [EC-004] `ignoredWorlds` nie wyłącza wszystkich restrykcji -- Kategoria: config mismatch -- Objaw: gracz tagged w innym świecie po wejściu do ignored world nadal podlega restrykcjom/krom. -- Reprodukcja: - 1. Otaguj gracza. - 2. Teleportuj go do świata z `ignoredWorlds`. - 3. Sprawdź command block / logout punishment. -- Oczekiwane: “not affected by combat rules”. -- Obecne: ignorowane światy sprawdzane głównie przy samym tagowaniu. -- Ryzyko: wysokie. -- Lokalizacja: - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java:144` - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java:127` - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/logout/LogoutController.java:60` - -## Średni priorytet - -### [EC-005] Utrata `allowFlight` po untag (survival fly) -- Kategoria: gameplay bug -- Objaw: gracze z legalnym `/fly` tracą możliwość lotu po combat. -- Reprodukcja: - 1. Survival + włączony fly z innego pluginu. - 2. Wejdź i wyjdź z combat. -- Oczekiwane: przywrócenie stanu lotu po untag. -- Obecne: restore tylko dla creative/spectator. -- Ryzyko: średnie/wysokie. -- Lokalizacja: - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java:61` - - `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightActionBlockerController.java:168` - -### [EC-006] `/combatlog tag ` działa mimo komunikatu “cannot tag self” -- Kategoria: gameplay bug -- Objaw: self-tag działa dla komendy 1-target. -- Reprodukcja: `/combatlog tag `. -- Oczekiwane: blokada self-tag. -- Obecne: check self tylko w wariancie 2-target. -- Ryzyko: średnie. -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java:55` - -### [EC-007] `tag player1 player2` nie jest atomowe -- Kategoria: gameplay bug -- Objaw: jeden gracz tagged, drugi odrzucony; komunikacja nie mówi o partial success. -- Reprodukcja: - 1. Daj A tagout. - 2. Użyj `/combatlog tag A B`. -- Oczekiwane: all-or-nothing lub jawny partial success. -- Obecne: oba tagowane przed walidacją cancel. -- Ryzyko: średnie. -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTagCommand.java:96` - -### [EC-008] `FightTask` przerywa tick po pierwszym expired tagu -- Kategoria: gameplay bug / edge-case -- Objaw: część graczy nie dostaje update/untag w tym samym ticku. -- Reprodukcja: wielu graczy w combat, pierwszy z iteracji wygasa. -- Oczekiwane: obsługa wszystkich wpisów. -- Obecne: `return` zamiast `continue`. -- Ryzyko: średnie. -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/FightTask.java:38` - -### [EC-009] Możliwa utrata itemów przy respawnie (overflow inventory) -- Kategoria: data loss / edge-case -- Objaw: część itemów “zachowanych” nie wraca, gdy inventory pełne. -- Reprodukcja: - 1. Wymuś keep po drop-modifier. - 2. Respawn z pełnym inventory. -- Oczekiwane: bezstratny zwrot (inv + drop leftovers). -- Obecne: wynik `addItem` nieobsłużony. -- Ryzyko: średnie. -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/drop/DropController.java:142` - -### [EC-010] (Podejrzenie) Async reload configu -- Kategoria: edge-case / stabilność wpływająca na gameplay -- Objaw: potencjalne niespójności podczas `reload` pod obciążeniem. -- Reprodukcja: PvP spam + wielokrotne `/combatlog reload`. -- Oczekiwane: spójny reload. -- Obecne: `@Async` i współdzielony mutable config. -- Ryzyko: średnie. -- Lokalizacja: `eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java:31` - -## Niespójności README/config (dodatkowo) -- README mówi Java 17+, build ustawiony na Java 21. -- README nie dokumentuje `eternalcombat.untagall` i `eternalcombat.tagout`. -- Komentarz `InventorySettings`: “PLAYER/CREATIVE never blocked” nie jest twardo wymuszony w kontrolerze. From 61baf4f759c5549d7a60e4a9e5fbc6447d684966 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 27 May 2026 20:40:33 +0200 Subject: [PATCH 5/6] fix: disable config cache for paper plugin descriptor task The plugin-yml paper generator reads Task.project during task execution, which Gradle 9.5 rejects when storing configuration cache state. Declare the generated descriptor task incompatible with configuration cache so CI can complete while keeping cache enabled for the rest of the build. --- eternalcombat-plugin/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 4d8df592..5afe79ac 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -100,6 +100,10 @@ paper { } tasks { + named("generatePaperPluginDescription") { + notCompatibleWithConfigurationCache("The plugin-yml paper generator reads Task.project during execution.") + } + runServer { minecraftVersion("1.21.11") downloadPlugins.modrinth("WorldEdit", Versions.WORLDEDIT) From 6ef3f9b928abc7e99c015122ee01b47190ebb0a5 Mon Sep 17 00:00:00 2001 From: Martin Sulikowski Date: Wed, 27 May 2026 20:53:07 +0200 Subject: [PATCH 6/6] fix: use paper-compatible multification notices Replace BukkitNotice builders with core Notice builders after moving to multification-paper. Use the Adventure sound resolver so config serialization no longer depends on multification-bukkit classes. --- .../com/eternalcode/combat/EternalCombatReloadCommand.java | 3 +-- .../java/com/eternalcode/combat/config/ConfigService.java | 4 ++-- .../combat/config/implementation/MessagesSettings.java | 3 +-- .../eternalcode/combat/fight/pearl/FightPearlSettings.java | 5 ++--- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java index 9bcf62d0..7b2393e3 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java @@ -2,7 +2,6 @@ import com.eternalcode.combat.config.ConfigService; import com.eternalcode.combat.notification.NoticeService; -import com.eternalcode.multification.bukkit.notice.BukkitNotice; import com.eternalcode.multification.notice.Notice; import com.google.common.base.Stopwatch; import dev.rollczi.litecommands.annotations.async.Async; @@ -16,7 +15,7 @@ @Command(name = "combatlog", aliases = "combat") public class EternalCombatReloadCommand { - private static final Notice RELOAD_MESSAGE = BukkitNotice.builder() + private static final Notice RELOAD_MESSAGE = Notice.builder() .chat("EternalCombat: Reloaded EternalCombat in {TIME}ms!") .build(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java index 4ef3edf2..b1d377f9 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/ConfigService.java @@ -3,9 +3,9 @@ import com.eternalcode.combat.border.animation.block.BlockTypeTransformer; import com.eternalcode.combat.border.animation.particle.ParticleColorTransformer; import com.eternalcode.combat.border.animation.particle.ParticleTypeTransformer; -import com.eternalcode.multification.bukkit.notice.resolver.sound.SoundBukkitResolver; import com.eternalcode.multification.notice.resolver.NoticeResolverDefaults; import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry; +import com.eternalcode.multification.notice.resolver.sound.SoundAdventureResolver; import com.eternalcode.multification.okaeri.MultificationSerdesPack; import eu.okaeri.configs.ConfigManager; import eu.okaeri.configs.OkaeriConfig; @@ -28,7 +28,7 @@ public T create(Class config, File file) { YamlSnakeYamlConfigurer configurer = new YamlSnakeYamlConfigurer(); NoticeResolverRegistry noticeRegistry = NoticeResolverDefaults.createRegistry() - .registerResolver(new SoundBukkitResolver()); + .registerResolver(new SoundAdventureResolver()); configFile.withConfigurer(configurer, new SerdesCommons(), diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/MessagesSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/MessagesSettings.java index d7a8849a..d4434017 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/MessagesSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/MessagesSettings.java @@ -1,6 +1,5 @@ package com.eternalcode.combat.config.implementation; -import com.eternalcode.multification.bukkit.notice.BukkitNotice; import com.eternalcode.multification.notice.Notice; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; @@ -19,7 +18,7 @@ public class MessagesSettings extends OkaeriConfig { "# You can use the {TIME} variable to display the remaining combat time.", " ", }) - public Notice combatNotification = BukkitNotice.builder() + public Notice combatNotification = Notice.builder() .actionBar("Combat ends in: {TIME}") .build(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/pearl/FightPearlSettings.java index 4cb29803..d423f495 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 @@ -1,6 +1,5 @@ package com.eternalcode.combat.fight.pearl; -import com.eternalcode.multification.bukkit.notice.BukkitNotice; import com.eternalcode.multification.notice.Notice; import eu.okaeri.configs.OkaeriConfig; import eu.okaeri.configs.annotation.Comment; @@ -28,12 +27,12 @@ public class FightPearlSettings extends OkaeriConfig { public Duration pearlThrowDelay = Duration.ofSeconds(3); @Comment("# Message sent when player tries to throw ender pearl, but are disabled") - public Notice pearlThrowBlockedDuringCombat = BukkitNotice.builder() + public Notice pearlThrowBlockedDuringCombat = Notice.builder() .chat("Throwing ender pearls is prohibited during combat!") .build(); @Comment("# Message sent when player tries to throw ender pearl, but has delay") - public Notice pearlThrowBlockedDelayDuringCombat = BukkitNotice.builder() + public Notice pearlThrowBlockedDelayDuringCombat = Notice.builder() .chat("You must wait {TIME} before next throw!") .build();