Skip to content

Commit 815b63c

Browse files
vLuckyyygemini-code-assist[bot]Jakubk15
authored
GH-188 Add support for folia-based servers. (#275)
* Release v2.3.0-SNAPSHOT * Update eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Make `CombatSchedulerAdapter` uninstantiable. * Update eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatSchedulerAdapter.java Co-authored-by: Jakub Kędziora <[email protected]> * Resolve gemini issues. --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Jakub Kędziora <[email protected]>
1 parent 410289a commit 815b63c

File tree

7 files changed

+72
-27
lines changed

7 files changed

+72
-27
lines changed

buildSrc/src/main/kotlin/eternalcombat-repositories.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ plugins {
33
}
44

55
repositories {
6+
maven("https://repo.eternalcode.pl/releases")
7+
maven("https://repo.eternalcode.pl/snapshots")
8+
69
mavenCentral()
710
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/")
811
maven("https://repo.papermc.io/repository/maven-public/")
9-
maven("https://repo.eternalcode.pl/releases")
10-
maven("https://repo.eternalcode.pl/snapshots")
1112
maven("https://storehouse.okaeri.eu/repository/maven-public/")
1213
maven("https://repo.panda-lang.org/releases")
1314
maven("https://maven.enginehub.org/repo/")

eternalcombat-plugin/build.gradle.kts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies {
2323

2424
// litecommands
2525
implementation("dev.rollczi:litecommands-bukkit:${Versions.LITE_COMMANDS}")
26+
implementation("dev.rollczi:litecommands-folia:${Versions.LITE_COMMANDS}")
2627

2728
// Okaeri configs
2829
implementation("eu.okaeri:okaeri-configs-serdes-commons:${Versions.OKAERI_CONFIGS_SERDES_COMMONS}")
@@ -37,8 +38,10 @@ dependencies {
3738
// caffeine
3839
implementation("com.github.ben-manes.caffeine:caffeine:${Versions.CAFFEINE}")
3940

40-
implementation("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}")
4141
implementation("com.eternalcode:eternalcode-commons-adventure:${Versions.ETERNALCODE_COMMONS}")
42+
implementation("com.eternalcode:eternalcode-commons-bukkit:${Versions.ETERNALCODE_COMMONS}")
43+
implementation("com.eternalcode:eternalcode-commons-shared:${Versions.ETERNALCODE_COMMONS}")
44+
implementation("com.eternalcode:eternalcode-commons-folia:${Versions.ETERNALCODE_COMMONS}")
4245

4346
// worldguard
4447
compileOnly("com.sk89q.worldguard:worldguard-bukkit:${Versions.WORLD_GUARD_BUKKIT}")
@@ -70,6 +73,8 @@ bukkit {
7073
"packetevents",
7174
)
7275
version = "${project.version}"
76+
77+
foliaSupported = true
7378
}
7479

7580
tasks {
@@ -104,7 +109,7 @@ tasks.shadowJar {
104109
"com.github.benmanes.caffeine",
105110
"com.eternalcode.commons",
106111
"com.eternalcode.multification",
107-
"io.papermc"
112+
"io.papermc.lib"
108113
).forEach { pack ->
109114
relocate(pack, "$prefix.$pack")
110115
}

eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@
4949
import com.eternalcode.combat.updater.UpdaterService;
5050
import com.eternalcode.commons.adventure.AdventureLegacyColorPostProcessor;
5151
import com.eternalcode.commons.adventure.AdventureLegacyColorPreProcessor;
52-
import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl;
52+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
5353
import com.eternalcode.commons.scheduler.Scheduler;
5454
import com.eternalcode.multification.notice.Notice;
5555
import com.google.common.base.Stopwatch;
5656
import dev.rollczi.litecommands.LiteCommands;
5757
import dev.rollczi.litecommands.bukkit.LiteBukkitFactory;
5858
import dev.rollczi.litecommands.bukkit.LiteBukkitMessages;
59+
import dev.rollczi.litecommands.folia.FoliaExtension;
60+
import java.time.Duration;
5961
import net.kyori.adventure.platform.AudienceProvider;
6062
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
6163
import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -99,10 +101,10 @@ public void onEnable() {
99101
ConfigService configService = new ConfigService();
100102

101103
EventManager eventManager = new EventManager(this);
102-
Scheduler scheduler = new BukkitSchedulerImpl(this);
103-
104104
PluginConfig pluginConfig = configService.create(PluginConfig.class, new File(dataFolder, "config.yml"));
105105

106+
MinecraftScheduler scheduler = CombatSchedulerAdapter.getAdaptiveScheduler(this);
107+
106108
this.fightManager = new FightManagerImpl(eventManager);
107109
this.fightPearlService = new FightPearlServiceImpl(pluginConfig.pearl);
108110
this.fightTagOutService = new FightTagOutServiceImpl();
@@ -149,6 +151,8 @@ public void onEnable() {
149151
new EternalCombatReloadCommand(configService, noticeService)
150152
)
151153

154+
.extension(new FoliaExtension(this))
155+
152156
.result(Notice.class, (invocation, result, chain) -> noticeService.create()
153157
.viewer(invocation.sender())
154158
.notice(result)
@@ -157,7 +161,7 @@ public void onEnable() {
157161
.build();
158162

159163
FightTask fightTask = new FightTask(server, pluginConfig, this.fightManager, noticeService);
160-
this.getServer().getScheduler().runTaskTimer(this, fightTask, 20L, 20L);
164+
scheduler.timer(fightTask, Duration.ofSeconds(1), Duration.ofSeconds(1));
161165

162166
new Metrics(this, BSTATS_METRICS_ID);
163167

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.eternalcode.combat;
2+
3+
import com.eternalcode.commons.bukkit.scheduler.BukkitSchedulerImpl;
4+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
5+
import com.eternalcode.commons.folia.scheduler.FoliaSchedulerImpl;
6+
import java.util.logging.Logger;
7+
import org.bukkit.plugin.Plugin;
8+
9+
public final class CombatSchedulerAdapter {
10+
11+
private static final String FOLIA_CLASS = "io.papermc.paper.threadedregions.RegionizedServer";
12+
13+
private CombatSchedulerAdapter() {
14+
throw new UnsupportedOperationException("This is an utility class and cannot be instantiated");
15+
}
16+
17+
public static MinecraftScheduler getAdaptiveScheduler(Plugin plugin) {
18+
Logger logger = plugin.getLogger();
19+
20+
try {
21+
Class.forName(FOLIA_CLASS);
22+
logger.info("» Detected Folia environment. Using FoliaScheduler.");
23+
return new FoliaSchedulerImpl(plugin);
24+
}
25+
catch (ClassNotFoundException exception) {
26+
logger.info("» Detected Bukkit/Paper environment. Using BukkitScheduler.");
27+
return new BukkitSchedulerImpl(plugin);
28+
}
29+
}
30+
}

eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderServiceImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.eternalcode.combat.border.event.BorderShowAsyncEvent;
55
import com.eternalcode.combat.event.EventManager;
66
import com.eternalcode.combat.region.RegionProvider;
7+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
78
import com.eternalcode.commons.scheduler.Scheduler;
89
import dev.rollczi.litecommands.shared.Lazy;
910
import java.util.ArrayList;
@@ -19,15 +20,15 @@
1920

2021
public class BorderServiceImpl implements BorderService {
2122

22-
private final Scheduler scheduler;
23+
private final MinecraftScheduler scheduler;
2324
private final EventManager eventManager;
2425

2526
private final Supplier<BorderSettings> settings;
2627

2728
private final BorderTriggerIndex borderIndexes;
2829
private final BorderActivePointsIndex activeBorderIndex = new BorderActivePointsIndex();
2930

30-
public BorderServiceImpl(Scheduler scheduler, Server server, RegionProvider provider, EventManager eventManager, Supplier<BorderSettings> settings) {
31+
public BorderServiceImpl(MinecraftScheduler scheduler, Server server, RegionProvider provider, EventManager eventManager, Supplier<BorderSettings> settings) {
3132
this.scheduler = scheduler;
3233
this.eventManager = eventManager;
3334
this.settings = settings;

eternalcombat-plugin/src/main/java/com/eternalcode/combat/border/BorderTriggerIndex.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.eternalcode.combat.region.Region;
44
import com.eternalcode.combat.region.RegionProvider;
5+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
56
import com.eternalcode.commons.scheduler.Scheduler;
67
import java.time.Duration;
78
import java.util.ArrayList;
@@ -17,13 +18,13 @@
1718
class BorderTriggerIndex {
1819

1920
private final Server server;
20-
private final Scheduler scheduler;
21+
private final MinecraftScheduler scheduler;
2122
private final RegionProvider provider;
2223
private final Supplier<BorderSettings> settings;
2324

2425
private final Map<String, BorderTriggerIndexBucket> borderIndexes = new HashMap<>();
2526

26-
private BorderTriggerIndex(Server server, Scheduler scheduler, RegionProvider provider, Supplier<BorderSettings> settings) {
27+
private BorderTriggerIndex(Server server, MinecraftScheduler scheduler, RegionProvider provider, Supplier<BorderSettings> settings) {
2728
this.server = server;
2829
this.scheduler = scheduler;
2930
this.provider = provider;
@@ -56,7 +57,7 @@ private void updateWorld(String world, Collection<Region> regions) {
5657
});
5758
}
5859

59-
static BorderTriggerIndex started(Server server, Scheduler scheduler, RegionProvider provider, Supplier<BorderSettings> settings) {
60+
static BorderTriggerIndex started(Server server, MinecraftScheduler scheduler, RegionProvider provider, Supplier<BorderSettings> settings) {
6061
BorderTriggerIndex index = new BorderTriggerIndex(server, scheduler, provider, settings);
6162
scheduler.timerAsync(() -> index.updateWorlds(), Duration.ZERO, settings.get().indexRefreshDelay());
6263
return index;

eternalcombat-plugin/src/main/java/com/eternalcode/combat/fight/knockback/KnockbackService.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,27 @@
44
import com.eternalcode.combat.region.Point;
55
import com.eternalcode.combat.region.Region;
66
import com.eternalcode.combat.region.RegionProvider;
7-
import com.eternalcode.commons.scheduler.Scheduler;
7+
import com.eternalcode.commons.bukkit.scheduler.MinecraftScheduler;
8+
import io.papermc.lib.PaperLib;
89
import java.time.Duration;
910
import java.util.HashMap;
1011
import java.util.Map;
1112
import java.util.Optional;
1213
import java.util.UUID;
1314
import org.bukkit.Location;
1415
import org.bukkit.entity.Player;
15-
import org.bukkit.event.player.PlayerTeleportEvent;
16+
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
1617
import org.bukkit.util.Vector;
1718

1819
public final class KnockbackService {
1920

2021
private final PluginConfig config;
21-
private final Scheduler scheduler;
22+
private final MinecraftScheduler scheduler;
2223
private final RegionProvider regionProvider;
2324

2425
private final Map<UUID, Region> insideRegion = new HashMap<>();
2526

26-
public KnockbackService(PluginConfig config, Scheduler scheduler, RegionProvider regionProvider) {
27+
public KnockbackService(PluginConfig config, MinecraftScheduler scheduler, RegionProvider regionProvider) {
2728
this.config = config;
2829
this.scheduler = scheduler;
2930
this.regionProvider = regionProvider;
@@ -39,17 +40,20 @@ public void forceKnockbackLater(Player player, Region region) {
3940
}
4041

4142
insideRegion.put(player.getUniqueId(), region);
42-
scheduler.runLater(() -> {
43-
insideRegion.remove(player.getUniqueId());
44-
Location playerLocation = player.getLocation();
45-
if (!region.contains(playerLocation) && !regionProvider.isInRegion(playerLocation)) {
46-
return;
47-
}
4843

49-
Location location = generate(playerLocation, Point2D.from(region.getMin()), Point2D.from(region.getMax()));
44+
scheduler.runLater(
45+
player.getLocation(), () -> {
46+
insideRegion.remove(player.getUniqueId());
47+
Location playerLocation = player.getLocation();
48+
if (!region.contains(playerLocation) && !regionProvider.isInRegion(playerLocation)) {
49+
return;
50+
}
5051

51-
player.teleport(location, PlayerTeleportEvent.TeleportCause.PLUGIN);
52-
}, this.config.knockback.forceDelay);
52+
Location location =
53+
generate(playerLocation, Point2D.from(region.getMin()), Point2D.from(region.getMax()));
54+
55+
PaperLib.teleportAsync(player, location, TeleportCause.PLUGIN);
56+
}, this.config.knockback.forceDelay);
5357
}
5458

5559
private Location generate(Location playerLocation, Point2D minX, Point2D maxX) {
@@ -73,5 +77,4 @@ public void knockback(Region region, Player player) {
7377

7478
player.setVelocity(knockbackVector.multiply(configuredVector));
7579
}
76-
7780
}

0 commit comments

Comments
 (0)