Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,10 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<version>3.5.6</version>
<configuration>
<argLine>-Dnet.bytebuddy.experimental=true</argLine>
</configuration>
</plugin>
</plugins>
<resources>
Expand Down Expand Up @@ -99,13 +102,13 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.2</version>
<version>6.1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.12.0</version>
<version>5.23.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public void onEnable() {
log.info("PlaceholderAPI hook enabled.");
}

runtime.runRepeatingGlobal(new RestrictionEnforcer(this), 0L, 100L);
runtime.runRepeatingGlobal(new RestrictionEnforcer(this), 1L, 100L);

VersionChecker versionChecker = new VersionChecker(this, runtime);
versionChecker.checkAsync();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public void start() {
if (enforceFlight) enforceNoGlide(player);
});
}
}, 0L, 20L);
}, 1L, 20L);
}

private void enforceNoGlide(Player player) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,96 +5,31 @@
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.function.Consumer;

public class FoliaRuntimeAdapter implements PlatformRuntime {
private final Plugin plugin;
private final PlatformRuntime fallback;

public FoliaRuntimeAdapter(Plugin plugin) {
this.plugin = plugin;
this.fallback = new PaperRuntimeAdapter(plugin);
}

@Override
public void runRepeatingGlobal(Runnable task, long initialDelayTicks, long periodTicks) {
try {
Object globalRegionScheduler = Bukkit.class.getMethod("getGlobalRegionScheduler").invoke(null);
Method runAtFixedRate = globalRegionScheduler.getClass().getMethod(
"runAtFixedRate",
Plugin.class,
Consumer.class,
long.class,
long.class
);
Consumer<Object> consumer = ignored -> task.run();
runAtFixedRate.invoke(globalRegionScheduler, plugin, consumer, initialDelayTicks, periodTicks);
} catch (Exception ex) {
fallback.runRepeatingGlobal(task, initialDelayTicks, periodTicks);
}
Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, i -> task.run(), initialDelayTicks, periodTicks);
}

@Override
public void runAsync(Runnable task) {
try {
Object asyncScheduler = Bukkit.class.getMethod("getAsyncScheduler").invoke(null);
Method runNow = asyncScheduler.getClass().getMethod("runNow", Plugin.class, Consumer.class);
Consumer<Object> consumer = ignored -> task.run();
runNow.invoke(asyncScheduler, plugin, consumer);
} catch (Exception ex) {
fallback.runAsync(task);
}
Bukkit.getAsyncScheduler().runNow(plugin, i -> task.run());
}

@Override
public void runLater(Runnable task, long delayTicks) {
try {
Object globalRegionScheduler = Bukkit.class.getMethod("getGlobalRegionScheduler").invoke(null);
Method runDelayed = globalRegionScheduler.getClass().getMethod(
"runDelayed",
Plugin.class,
Consumer.class,
long.class
);
Consumer<Object> consumer = ignored -> task.run();
runDelayed.invoke(globalRegionScheduler, plugin, consumer, Math.max(1L, delayTicks));
} catch (Exception ex) {
fallback.runLater(task, delayTicks);
}
Bukkit.getGlobalRegionScheduler().runDelayed(plugin, i -> task.run(), Math.max(1L, delayTicks));
}

@Override
public void runForPlayer(Player player, Runnable task) {
try {
Object entityScheduler = player.getClass().getMethod("getScheduler").invoke(player);
Method run = Arrays.stream(entityScheduler.getClass().getMethods())
.filter(m -> m.getName().equals("run"))
.filter(m -> m.getParameterCount() >= 3)
.findFirst()
.orElseThrow();
Consumer<Object> consumer = ignored -> task.run();
Object[] args = new Object[run.getParameterCount()];
Class<?>[] paramTypes = run.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
Class<?> type = paramTypes[i];
if (Plugin.class.isAssignableFrom(type)) {
args[i] = plugin;
} else if (Consumer.class.isAssignableFrom(type)) {
args[i] = consumer;
} else if (Runnable.class.isAssignableFrom(type)) {
args[i] = null;
} else if (type == long.class || type == Long.class) {
args[i] = 0L;
} else {
args[i] = null;
}
}
run.invoke(entityScheduler, args);
} catch (Exception ex) {
fallback.runForPlayer(player, task);
}
player.getScheduler().run(plugin, t -> task.run(), null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.denfry.worldAccessBlocker.runtime;

import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;

public final class PlatformRuntimeFactory {
Expand All @@ -17,7 +16,7 @@ public static PlatformRuntime create(Plugin plugin) {
public static boolean isFoliaRuntime() {
try {
Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
return Bukkit.getName().toLowerCase().contains("folia") || Bukkit.getVersion().contains("Folia");
return true;
} catch (ClassNotFoundException ignored) {
return false;
}
Expand Down