diff --git a/buildSrc/src/main/kotlin/eternalcombat-repositories.gradle.kts b/buildSrc/src/main/kotlin/eternalcombat-repositories.gradle.kts index 4734d358..908a66ab 100644 --- a/buildSrc/src/main/kotlin/eternalcombat-repositories.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcombat-repositories.gradle.kts @@ -3,11 +3,12 @@ plugins { } repositories { + maven("https://repo.eternalcode.pl/releases") + maven("https://repo.eternalcode.pl/snapshots") + mavenCentral() maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") maven("https://repo.papermc.io/repository/maven-public/") - maven("https://repo.eternalcode.pl/releases") - maven("https://repo.eternalcode.pl/snapshots") maven("https://storehouse.okaeri.eu/repository/maven-public/") maven("https://repo.panda-lang.org/releases") maven("https://maven.enginehub.org/repo/") diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 634f72df..4186ad89 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { // litecommands implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}") + implementation("dev.rollczi:litecommands-folia:${Versions.LITE_COMMANDS}") // Okaeri configs implementation("eu.okaeri:okaeri-configs-serdes-commons:${Versions.OKAERI_CONFIGS_SERDES_COMMONS}") @@ -37,8 +38,10 @@ dependencies { // 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}") + implementation("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}") + implementation("com.eternalcode:eternalcode-commons-shared:${Versions.ETERNALCODE_COMMONS}") + implementation("com.eternalcode:eternalcode-commons-folia:${Versions.ETERNALCODE_COMMONS}") // worldguard compileOnly("com.sk89q.worldguard:worldguard-bukkit:${Versions.WORLD_GUARD_BUKKIT}") @@ -70,6 +73,8 @@ bukkit { "packetevents", ) version = "${project.version}" + + foliaSupported = true } tasks { @@ -104,7 +109,7 @@ tasks.shadowJar { "com.github.benmanes.caffeine", "com.eternalcode.commons", "com.eternalcode.multification", - "io.papermc" + "io.papermc.lib" ).forEach { pack -> relocate(pack, "$prefix.$pack") } 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 731c784d..afff5c5c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -49,13 +49,15 @@ import com.eternalcode.combat.updater.UpdaterService; import com.eternalcode.commons.adventure.AdventureLegacyColorPostProcessor; import com.eternalcode.commons.adventure.AdventureLegacyColorPreProcessor; -import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; import com.eternalcode.commons.scheduler.Scheduler; import com.eternalcode.multification.notice.Notice; import com.google.common.base.Stopwatch; import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; 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; @@ -99,10 +101,10 @@ public void onEnable() { ConfigService configService = new ConfigService(); EventManager eventManager = new EventManager(this); - Scheduler scheduler = new BukkitSchedulerImpl(this); - PluginConfig pluginConfig = configService.create(PluginConfig.class, new File(dataFolder, "config.yml")); + MinecraftScheduler scheduler = CombatSchedulerAdapter.getAdaptiveScheduler(this); + this.fightManager = new FightManagerImpl(eventManager); this.fightPearlService = new FightPearlServiceImpl(pluginConfig.pearl); this.fightTagOutService = new FightTagOutServiceImpl(); @@ -149,6 +151,8 @@ public void onEnable() { new EternalCombatReloadCommand(configService, noticeService) ) + .extension(new FoliaExtension(this)) + .result(Notice.class, (invocation, result, chain) -> noticeService.create() .viewer(invocation.sender()) .notice(result) @@ -157,7 +161,7 @@ public void onEnable() { .build(); FightTask fightTask = new FightTask(server, pluginConfig, this.fightManager, noticeService); - this.getServer().getScheduler().runTaskTimer(this, fightTask, 20L, 20L); + scheduler.timer(fightTask, Duration.ofSeconds(1), Duration.ofSeconds(1)); new Metrics(this, BSTATS_METRICS_ID); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java new file mode 100644 index 00000000..4a1bc800 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java @@ -0,0 +1,30 @@ +package com.eternalcode.combat; + +import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; +import com.eternalcode.commons.folia.scheduler.FoliaSchedulerImpl; +import java.util.logging.Logger; +import org.bukkit.plugin.Plugin; + +public final class CombatSchedulerAdapter { + + private static final String FOLIA_CLASS = "io.papermc.paper.threadedregions.RegionizedServer"; + + private CombatSchedulerAdapter() { + throw new IllegalStateException("You can't instantiate this class"); + } + + public static MinecraftScheduler getAdaptiveScheduler(Plugin plugin) { + Logger logger = plugin.getLogger(); + + try { + Class.forName(FOLIA_CLASS); + logger.info("» Detected Folia environment. Using FoliaScheduler."); + return new FoliaSchedulerImpl(plugin); + } + catch (ClassNotFoundException exception) { + logger.info("» Detected Bukkit/Paper environment. Using BukkitScheduler."); + return new BukkitSchedulerImpl(plugin); + } + } +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderServiceImpl.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderServiceImpl.java index d5029c4c..14669313 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderServiceImpl.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderServiceImpl.java @@ -4,6 +4,7 @@ import com.eternalcode.combat.border.event.BorderShowAsyncEvent; import com.eternalcode.combat.event.EventManager; import com.eternalcode.combat.region.RegionProvider; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; import com.eternalcode.commons.scheduler.Scheduler; import dev.rollczi.litecommands.shared.Lazy; import java.util.ArrayList; @@ -19,7 +20,7 @@ public class BorderServiceImpl implements BorderService { - private final Scheduler scheduler; + private final MinecraftScheduler scheduler; private final EventManager eventManager; private final Supplier settings; @@ -27,7 +28,7 @@ public class BorderServiceImpl implements BorderService { private final BorderTriggerIndex borderIndexes; private final BorderActivePointsIndex activeBorderIndex = new BorderActivePointsIndex(); - public BorderServiceImpl(Scheduler scheduler, Server server, RegionProvider provider, EventManager eventManager, Supplier settings) { + public BorderServiceImpl(MinecraftScheduler scheduler, Server server, RegionProvider provider, EventManager eventManager, Supplier settings) { this.scheduler = scheduler; this.eventManager = eventManager; this.settings = settings; diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerIndex.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerIndex.java index 6ede40ae..4d2d65c2 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerIndex.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerIndex.java @@ -2,6 +2,7 @@ import com.eternalcode.combat.region.Region; import com.eternalcode.combat.region.RegionProvider; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; import com.eternalcode.commons.scheduler.Scheduler; import java.time.Duration; import java.util.ArrayList; @@ -17,13 +18,13 @@ class BorderTriggerIndex { private final Server server; - private final Scheduler scheduler; + private final MinecraftScheduler scheduler; private final RegionProvider provider; private final Supplier settings; private final Map borderIndexes = new HashMap<>(); - private BorderTriggerIndex(Server server, Scheduler scheduler, RegionProvider provider, Supplier settings) { + private BorderTriggerIndex(Server server, MinecraftScheduler scheduler, RegionProvider provider, Supplier settings) { this.server = server; this.scheduler = scheduler; this.provider = provider; @@ -56,7 +57,7 @@ private void updateWorld(String world, Collection regions) { }); } - static BorderTriggerIndex started(Server server, Scheduler scheduler, RegionProvider provider, Supplier settings) { + static BorderTriggerIndex started(Server server, MinecraftScheduler scheduler, RegionProvider provider, Supplier settings) { BorderTriggerIndex index = new BorderTriggerIndex(server, scheduler, provider, settings); scheduler.timerAsync(() -> index.updateWorlds(), Duration.ZERO, settings.get().indexRefreshDelay()); return index; 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 6f2dd28a..97a88624 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 @@ -4,6 +4,7 @@ import com.eternalcode.combat.region.Point; import com.eternalcode.combat.region.Region; import com.eternalcode.combat.region.RegionProvider; +import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler; import com.eternalcode.commons.scheduler.Scheduler; import java.time.Duration; import java.util.HashMap; @@ -18,12 +19,12 @@ public final class KnockbackService { private final PluginConfig config; - private final Scheduler scheduler; + private final MinecraftScheduler scheduler; private final RegionProvider regionProvider; private final Map insideRegion = new HashMap<>(); - public KnockbackService(PluginConfig config, Scheduler scheduler, RegionProvider regionProvider) { + public KnockbackService(PluginConfig config, MinecraftScheduler scheduler, RegionProvider regionProvider) { this.config = config; this.scheduler = scheduler; this.regionProvider = regionProvider; @@ -39,7 +40,8 @@ public void forceKnockbackLater(Player player, Region region) { } insideRegion.put(player.getUniqueId(), region); - scheduler.runLater(() -> { + + scheduler.runLater(player.getLocation(), () -> { insideRegion.remove(player.getUniqueId()); Location playerLocation = player.getLocation(); if (!region.contains(playerLocation) && !regionProvider.isInRegion(playerLocation)) { diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/Point2D.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/Point2D.java index ec31f567..dab8d680 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/Point2D.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/Point2D.java @@ -7,7 +7,7 @@ record Point2D(int x, int z) { Location toLocation(Location location) { World world = location.getWorld(); - int y = world.getHighestBlockYAt(x, z) + 1; + double y = location.getY(); return new Location(world, x, y, z, location.getYaw(), location.getPitch()); }