Skip to content

Commit

Permalink
handle end tick support for folia better & try to use paper's end tic…
Browse files Browse the repository at this point in the history
…k event if reflection fails
  • Loading branch information
AoElite committed Feb 14, 2025
1 parent 94d4739 commit 2932f0a
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 19 deletions.
17 changes: 11 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,6 @@ group = "ac.grim.grimac"
version = "2.3.71"
description = "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0."

java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}

// Set to false for debug builds
// You cannot live reload classes if the jar relocates dependencies
// Checks Project properties -> environment variable -> defaults true
Expand All @@ -41,7 +37,10 @@ val relocate: Boolean = project.findProperty("relocate")?.toString()?.toBoolean(
?: true

repositories {
mavenLocal()
maven {
name = "papermc"
url = uri("https://repo.papermc.io/repository/maven-public/")
}
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // Spigot
maven("https://jitpack.io/") { // Grim API
content {
Expand All @@ -62,6 +61,7 @@ repositories {
}

dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT")
implementation("com.github.retrooper:packetevents-spigot:2.7.1-SNAPSHOT")
implementation("co.aikar:acf-paper:0.5.1-SNAPSHOT")
implementation("club.minnced:discord-webhooks:0.8.0") // Newer versions include kotlin-stdlib, which leads to incompatibility with plugins that use Kotlin
Expand All @@ -78,7 +78,6 @@ dependencies {

implementation("org.jetbrains:annotations:24.1.0")
compileOnly("org.geysermc.floodgate:api:2.0-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT")
compileOnly("com.viaversion:viaversion-api:5.0.4-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.6")
compileOnly("io.netty:netty-all:4.1.85.Final")
Expand Down Expand Up @@ -175,6 +174,12 @@ tasks.build {

tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
options.release.set(17)
}

java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
disableAutoTargetJvm()
}

publishing.publications.create<MavenPublication>("maven") {
Expand Down
55 changes: 42 additions & 13 deletions src/main/java/ac/grim/grimac/manager/init/start/TickEndEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,15 @@
import ac.grim.grimac.player.GrimPlayer;
import ac.grim.grimac.utils.anticheat.LogUtil;
import ac.grim.grimac.utils.lists.HookedListWrapper;
import ac.grim.grimac.utils.reflection.PaperUtils;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.util.reflection.Reflection;
import io.github.retrooper.packetevents.util.SpigotReflectionUtil;
import io.github.retrooper.packetevents.util.folia.FoliaScheduler;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import sun.misc.Unsafe;

import java.lang.reflect.Field;
Expand All @@ -17,26 +22,48 @@

// Copied from: https://github.com/ThomasOM/Pledge/blob/master/src/main/java/dev/thomazz/pledge/inject/ServerInjector.java
@SuppressWarnings(value = {"unchecked", "deprecated"})
public class TickEndEvent implements Initable {
boolean hasTicked = true;

private static void tickRelMove() {
for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) {
if (player.disableGrim) continue; // If we aren't active don't spam extra transactions
player.checkManager.getEntityReplication().onEndOfTickEvent();
}
}
public class TickEndEvent implements Initable, Listener {

@Override
public void start() {
if (!GrimAPI.INSTANCE.getConfigManager().getConfig().getBooleanElse("Reach.enable-post-packet", false)) {
return;
}

if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThan(ServerVersion.V_1_11_2) && !Boolean.getBoolean("paper.explicit-flush")) {
LogUtil.warn("Reach.enable-post-packet=true but paper.explicit-flush=false, add \"-Dpaper.explicit-flush=true\" to your server's startup flags for fully functional extra reach accuracy.");
}
// this is necessary for folia
if (FoliaScheduler.isFolia()) {
PaperUtils.registerTickEndEvent(this, this::tickAllFoliaPlayers);
return;
}
// if it fails to inject, try to use paper's event
if (!injectWithReflection() && !PaperUtils.registerTickEndEvent(this, this::tickAllPlayers)) {
LogUtil.error("Failed to inject into the end of tick event!");
}
}

private void onEndOfTick(GrimPlayer player) {
player.checkManager.getEntityReplication().onEndOfTickEvent();
}

private void tickAllPlayers() {
for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) {
if (player.disableGrim) continue;
onEndOfTick(player);
}
}

private void tickAllFoliaPlayers() {
for (GrimPlayer player : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) {
if (player.disableGrim) continue;
Player p = player.bukkitPlayer;
if (p == null || !Bukkit.isOwnedByCurrentRegion(p)) continue;
onEndOfTick(player);
}
}

private boolean injectWithReflection() {
// Inject so we can add the final transaction pre-flush event
try {
Object connection = SpigotReflectionUtil.getMinecraftServerConnectionInstance();
Expand All @@ -52,8 +79,7 @@ public void start() {
List<?> wrapper = Collections.synchronizedList(new HookedListWrapper<>(endOfTickObject) {
@Override
public void onIterator() {
hasTicked = true;
tickRelMove();
tickAllPlayers();
}
});

Expand All @@ -62,7 +88,10 @@ public void onIterator() {
Unsafe unsafe = (Unsafe) unsafeField.get(null);
unsafe.putObject(connection, unsafe.objectFieldOffset(connectionsList), wrapper);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
LogUtil.exception("Failed to inject into the end of tick event via reflection", e);
return false;
}
return true;
}

}
23 changes: 23 additions & 0 deletions src/main/java/ac/grim/grimac/utils/reflection/PaperUtils.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package ac.grim.grimac.utils.reflection;

import ac.grim.grimac.GrimAPI;
import ac.grim.grimac.utils.anticheat.LogUtil;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.event.Event;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

import java.util.concurrent.CompletableFuture;

Expand All @@ -25,4 +30,22 @@ public static CompletableFuture<Boolean> teleportAsync(final Entity entity, fina
}
}

@SuppressWarnings("unchecked")
public static boolean registerTickEndEvent(Listener listener, Runnable runnable) {
if (TICK_END_EVENT) {
try {
Class<?> clazz = ReflectionUtils.getClass("com.destroystokyo.paper.event.server.ServerTickEndEvent");
if (clazz == null) return false;
GrimAPI.INSTANCE.getPlugin().getServer().getPluginManager().registerEvent((Class<? extends Event>) clazz,
listener,
EventPriority.NORMAL,
(l, event) -> runnable.run(), GrimAPI.INSTANCE.getPlugin());
return true;
} catch (Exception e) {
LogUtil.exception("Failed to register tick end event", e);
}
}
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,12 @@ public static boolean hasMethod(Class<?> clazz, String methodName, Class<?>... p
}
}

public static Class<?> getClass(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
return null;
}
}

}

0 comments on commit 2932f0a

Please sign in to comment.