From 3e887908927656aea1c7e5c28408e630f8bdd052 Mon Sep 17 00:00:00 2001
From: TheMeinerLP
Date: Tue, 6 Jun 2023 10:45:35 +0200
Subject: [PATCH] Implements method handles for folia
---
.../fawe/v1_19_R3/PaperweightFaweAdapter.java | 80 ++++++++++++++++---
1 file changed, 70 insertions(+), 10 deletions(-)
diff --git a/worldedit-bukkit/adapters/adapter-1_19_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R3/PaperweightFaweAdapter.java b/worldedit-bukkit/adapters/adapter-1_19_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R3/PaperweightFaweAdapter.java
index ea818e106..c2e0e2595 100644
--- a/worldedit-bukkit/adapters/adapter-1_19_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R3/PaperweightFaweAdapter.java
+++ b/worldedit-bukkit/adapters/adapter-1_19_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R3/PaperweightFaweAdapter.java
@@ -16,6 +16,7 @@ import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter;
+import com.sk89q.worldedit.bukkit.adapter.Refraction;
import com.sk89q.worldedit.bukkit.adapter.ext.fawe.v1_19_R3.PaperweightAdapter;
import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_19_R3.nbt.PaperweightLazyCompoundTag;
import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_19_R3.regen.PaperweightRegen;
@@ -85,6 +86,8 @@ import org.bukkit.craftbukkit.v1_19_R3.util.CraftNamespacedKey;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@@ -126,8 +129,45 @@ public final class PaperweightFaweAdapter extends FaweAdapter>> allBlockProperties = null;
+ // Folia - START
+ private MethodHandle currentWorldData;
+
+ private Class> regionizedWorldData;
+
+ private Field captureTreeGeneration;
+ private Field captureBlockStates;
+ private Field capturedBlockStates;
+
public PaperweightFaweAdapter() throws NoSuchFieldException, NoSuchMethodException {
this.parent = new PaperweightAdapter();
+ if (this.parent.isFolia()) {
+ Method getCurrentWorldData = ServerLevel.class.getDeclaredMethod(
+ "getCurrentWorldData"
+ );
+ getCurrentWorldData.setAccessible(true);
+ try {
+ currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
+ } catch (IllegalAccessException e) {
+ }
+
+ try {
+ regionizedWorldData = Class.forName("io.papermc.paper.threadedregions.RegionizedWorldData");
+ } catch (ClassNotFoundException e) {
+ }
+ if (regionizedWorldData != null) {
+ final Field captureTreeGeneration = regionizedWorldData.getDeclaredField("captureTreeGeneration");
+ captureTreeGeneration.setAccessible(true);
+ this.captureTreeGeneration = captureTreeGeneration;
+
+ final Field captureBlockStates = regionizedWorldData.getDeclaredField("captureBlockStates");
+ captureBlockStates.setAccessible(true);
+ this.captureBlockStates = captureBlockStates;
+
+ final Field capturedBlockStates = regionizedWorldData.getDeclaredField("capturedBlockStates");
+ capturedBlockStates.setAccessible(true);
+ this.capturedBlockStates = capturedBlockStates;
+ }
+ }
}
@Nullable
@@ -504,17 +544,37 @@ public final class PaperweightFaweAdapter extends FaweAdapter placed = TaskManager.taskManager().sync(() -> {
- serverLevel.captureTreeGeneration = true;
- serverLevel.captureBlockStates = true;
- try {
- if (!bukkitWorld.generateTree(BukkitAdapter.adapt(bukkitWorld, finalBlockVector), bukkitType)) {
- return null;
+ if (this.parent.isFolia()) {
+ try {
+ var data = currentWorldData.invoke(serverLevel);
+ captureBlockStates.setBoolean(data, true);
+ captureTreeGeneration.setBoolean(data, true);
+ try {
+ if (!bukkitWorld.generateTree(BukkitAdapter.adapt(bukkitWorld, finalBlockVector), bukkitType)) {
+ return null;
+ }
+ return ImmutableMap.copyOf((Map) capturedBlockStates.get(data));
+ } finally {
+ captureBlockStates.setBoolean(data, false);
+ captureTreeGeneration.setBoolean(data, false);
+ ((Map) capturedBlockStates.get(data)).clear();
+ }
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ serverLevel.captureTreeGeneration = true;
+ serverLevel.captureBlockStates = true;
+ try {
+ if (!bukkitWorld.generateTree(BukkitAdapter.adapt(bukkitWorld, finalBlockVector), bukkitType)) {
+ return null;
+ }
+ return ImmutableMap.copyOf(serverLevel.capturedBlockStates);
+ } finally {
+ serverLevel.captureBlockStates = false;
+ serverLevel.captureTreeGeneration = false;
+ serverLevel.capturedBlockStates.clear();
}
- return ImmutableMap.copyOf(serverLevel.capturedBlockStates);
- } finally {
- serverLevel.captureBlockStates = false;
- serverLevel.captureTreeGeneration = false;
- serverLevel.capturedBlockStates.clear();
}
});
if (placed == null || placed.isEmpty()) {