diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index bb30b962..2daa51b0 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -168,6 +168,12 @@ tasks { downloadPlugins.modrinth("WorldGuard", Versions.WORLDGUARD) downloadPlugins.modrinth("LuckPerms", "v${Versions.LUCKPERMS}-bukkit") } + + runPaper.folia.registerTask { + minecraftVersion("1.21.11") + + downloadPlugins.modrinth("PacketEvents", "${Versions.PACKETEVENTS}+spigot") + } } tasks.shadowJar { 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 8df578c9..c06fa167 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -214,6 +214,7 @@ public void onEnable() { @Override public void onDisable() { EternalCombatProvider.deinitialize(); + FoliaChecker.clearCache(); if (this.liteCommands != null) { this.liteCommands.unregister(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java index 280c8c7e..68fcae20 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java @@ -3,28 +3,19 @@ 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 UnsupportedOperationException("This is an utility class and cannot be instantiated"); } public static MinecraftScheduler getAdaptiveScheduler(Plugin plugin) { - Logger logger = plugin.getLogger(); - - try { - Class.forName(FOLIA_CLASS); - logger.info("» Detected Folia environment. Using FoliaScheduler."); + if (FoliaChecker.isFolia(plugin)) { return new FoliaSchedulerImpl(plugin); } - catch (ClassNotFoundException exception) { - logger.info("» Detected Bukkit/Paper environment. Using BukkitScheduler."); - return new BukkitSchedulerImpl(plugin); - } + + return new BukkitSchedulerImpl(plugin); } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/FoliaChecker.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/FoliaChecker.java new file mode 100644 index 00000000..d0b17c09 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/FoliaChecker.java @@ -0,0 +1,47 @@ +package com.eternalcode.combat; + +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.Nullable; + +public final class FoliaChecker { + + private static final String FOLIA_CLASS = "io.papermc.paper.threadedregions.RegionizedServer"; + private static Boolean isFoliaPresent = null; + + private FoliaChecker() { + throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); + } + + public static boolean isFolia() { + return detectFoliaEnvironment(null); + } + + public static boolean isFolia(Plugin plugin) { + return detectFoliaEnvironment(plugin); + } + + private static synchronized boolean detectFoliaEnvironment(@Nullable Plugin plugin) { + if (isFoliaPresent != null) { + return isFoliaPresent; + } + + try { + Class.forName(FOLIA_CLASS); + isFoliaPresent = true; + if (plugin != null) { + plugin.getLogger().info("» Detected Folia environment."); + } + } + catch (ClassNotFoundException exception) { + isFoliaPresent = false; + if (plugin != null) { + plugin.getLogger().info("» Detected Bukkit/Paper environment."); + } + } + return isFoliaPresent; + } + + public static void clearCache() { + isFoliaPresent = null; + } +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java index bd9a36d7..395a866c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/controller/FightTagController.java @@ -1,5 +1,6 @@ package com.eternalcode.combat.fight.controller; +import com.eternalcode.combat.FoliaChecker; import com.eternalcode.combat.WhitelistBlacklistMode; import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; @@ -55,6 +56,16 @@ void onEntityDamageByEntity(EntityDamageByEntityEvent event) { return; } + UUID attackedUniqueId = attackedPlayerByPerson.getUniqueId(); + UUID attackerUniqueId = attacker.getUniqueId(); + + if ( + attackedUniqueId.equals(attackerUniqueId) + && FoliaChecker.isFolia() + ) { + return; + } + if (this.config.combat.disableFlying) { if (attackedPlayerByPerson.isFlying()) { attackedPlayerByPerson.setFlying(false); @@ -68,8 +79,6 @@ void onEntityDamageByEntity(EntityDamageByEntityEvent event) { } Duration combatTime = this.config.settings.combatTimerDuration; - UUID attackedUniqueId = attackedPlayerByPerson.getUniqueId(); - UUID attackerUniqueId = attacker.getUniqueId(); this.fightManager.tag(attackedUniqueId, combatTime, CauseOfTag.PLAYER, attackerUniqueId); this.fightManager.tag(attackerUniqueId, combatTime, CauseOfTag.PLAYER, attackedUniqueId);