Skip to content

Commit 80ebe64

Browse files
committed
Improve API design and reduce duplicate code
1 parent 84c5692 commit 80ebe64

File tree

6 files changed

+258
-90
lines changed

6 files changed

+258
-90
lines changed

worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/PaperweightFaweAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import org.bukkit.entity.Player;
8989

9090
import javax.annotation.Nullable;
91+
import java.lang.invoke.MethodHandle;
9192
import java.lang.ref.WeakReference;
9293
import java.lang.reflect.Field;
9394
import java.util.ArrayList;
@@ -555,6 +556,11 @@ protected ServerLevel getServerLevel(final World world) {
555556
return ((CraftWorld) world).getHandle();
556557
}
557558

559+
@Override
560+
protected MethodHandle getCurrentWorldData() {
561+
return null;
562+
}
563+
558564
@Override
559565
public List<org.bukkit.entity.Entity> getEntities(org.bukkit.World world) {
560566
// Quickly add each entity to a list copy.

worldedit-bukkit/adapters/adapter-1_18_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R2/PaperweightFaweAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
import org.bukkit.entity.Player;
9090

9191
import javax.annotation.Nullable;
92+
import java.lang.invoke.MethodHandle;
9293
import java.lang.ref.WeakReference;
9394
import java.lang.reflect.Field;
9495
import java.util.ArrayList;
@@ -547,6 +548,11 @@ protected ServerLevel getServerLevel(final World world) {
547548
return ((CraftWorld) world).getHandle();
548549
}
549550

551+
@Override
552+
protected MethodHandle getCurrentWorldData() {
553+
return null;
554+
}
555+
550556
@Override
551557
public List<org.bukkit.entity.Entity> getEntities(org.bukkit.World world) {
552558
// Quickly add each entity to a list copy.

worldedit-bukkit/adapters/adapter-1_19_4/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R3/PaperweightFaweAdapter.java

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.bukkit.block.data.BlockData;
7979
import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
8080
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
81+
import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlockState;
8182
import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData;
8283
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
8384
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
@@ -129,45 +130,8 @@ public final class PaperweightFaweAdapter extends FaweAdapter<net.minecraft.nbt.
129130
private boolean initialised = false;
130131
private Map<String, List<Property<?>>> allBlockProperties = null;
131132

132-
// Folia - START
133-
private MethodHandle currentWorldData;
134-
135-
private Class<?> regionizedWorldData;
136-
137-
private Field captureTreeGeneration;
138-
private Field captureBlockStates;
139-
private Field capturedBlockStates;
140-
141133
public PaperweightFaweAdapter() throws NoSuchFieldException, NoSuchMethodException {
142134
this.parent = new PaperweightAdapter();
143-
if (this.parent.isFolia()) {
144-
Method getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
145-
"getCurrentWorldData"
146-
);
147-
getCurrentWorldData.setAccessible(true);
148-
try {
149-
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
150-
} catch (IllegalAccessException e) {
151-
}
152-
153-
try {
154-
regionizedWorldData = Class.forName("io.papermc.paper.threadedregions.RegionizedWorldData");
155-
} catch (ClassNotFoundException e) {
156-
}
157-
if (regionizedWorldData != null) {
158-
final Field captureTreeGeneration = regionizedWorldData.getDeclaredField("captureTreeGeneration");
159-
captureTreeGeneration.setAccessible(true);
160-
this.captureTreeGeneration = captureTreeGeneration;
161-
162-
final Field captureBlockStates = regionizedWorldData.getDeclaredField("captureBlockStates");
163-
captureBlockStates.setAccessible(true);
164-
this.captureBlockStates = captureBlockStates;
165-
166-
final Field capturedBlockStates = regionizedWorldData.getDeclaredField("capturedBlockStates");
167-
capturedBlockStates.setAccessible(true);
168-
this.capturedBlockStates = capturedBlockStates;
169-
}
170-
}
171135
}
172136

173137
@Nullable
@@ -630,25 +594,74 @@ private boolean wasAccessibleSinceLastSave(ChunkHolder holder) {
630594

631595
@Override
632596
protected void preCaptureStates(final ServerLevel serverLevel) {
633-
serverLevel.captureTreeGeneration = true;
634-
serverLevel.captureBlockStates = true;
597+
if (this.isFolia()) {
598+
try {
599+
var data = currentWorldData.invoke(serverLevel);
600+
captureBlockStates.setBoolean(data, true);
601+
captureTreeGeneration.setBoolean(data, true);
602+
} catch (Throwable e) {
603+
throw new RuntimeException(e);
604+
}
605+
} else {
606+
serverLevel.captureTreeGeneration = true;
607+
serverLevel.captureBlockStates = true;
608+
}
609+
635610
}
636611

637612
@Override
638613
protected List<org.bukkit.block.BlockState> getCapturedBlockStatesCopy(final ServerLevel serverLevel) {
639614
return new ArrayList<>(serverLevel.capturedBlockStates.values());
640615
}
641616

617+
// Folia - Start
642618
@Override
643619
protected void postCaptureBlockStates(final ServerLevel serverLevel) {
644-
serverLevel.captureBlockStates = false;
645-
serverLevel.captureTreeGeneration = false;
646-
serverLevel.capturedBlockStates.clear();
620+
if (this.isFolia()) {
621+
try {
622+
var data = currentWorldData.invoke(serverLevel);
623+
captureBlockStates.setBoolean(data, false);
624+
captureTreeGeneration.setBoolean(data, false);
625+
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
626+
} catch (Throwable e) {
627+
throw new RuntimeException(e);
628+
}
629+
} else {
630+
serverLevel.captureBlockStates = false;
631+
serverLevel.captureTreeGeneration = false;
632+
serverLevel.capturedBlockStates.clear();
633+
}
647634
}
648635

636+
// Folia - End
637+
649638
@Override
650639
protected ServerLevel getServerLevel(final World world) {
651640
return ((CraftWorld) world).getHandle();
652641
}
653642

643+
// Folia - Start
644+
@Override
645+
protected MethodHandle getCurrentWorldData() {
646+
if (this.isFolia()) {
647+
Method getCurrentWorldData;
648+
try {
649+
getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
650+
"getCurrentWorldData"
651+
);
652+
} catch (NoSuchMethodException e) {
653+
return null;
654+
}
655+
getCurrentWorldData.setAccessible(true);
656+
657+
try {
658+
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
659+
} catch (IllegalAccessException e) {
660+
}
661+
}
662+
return null;
663+
}
664+
665+
// Folia - End
666+
654667
}

worldedit-bukkit/adapters/adapter-1_20/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_20_R1/PaperweightFaweAdapter.java

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
import org.bukkit.block.data.BlockData;
7878
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
7979
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
80+
import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlockState;
8081
import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData;
8182
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
8283
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
@@ -128,47 +129,9 @@ public final class PaperweightFaweAdapter extends FaweAdapter<net.minecraft.nbt.
128129
private boolean initialised = false;
129130
private Map<String, List<Property<?>>> allBlockProperties = null;
130131

131-
// Folia - START
132-
private MethodHandle currentWorldData;
133-
134-
private Class<?> regionizedWorldData;
135-
136-
private Field captureTreeGeneration;
137-
private Field captureBlockStates;
138-
private Field capturedBlockStates;
139-
140132

141133
public PaperweightFaweAdapter() throws NoSuchFieldException, NoSuchMethodException {
142134
this.parent = new PaperweightAdapter();
143-
144-
if (this.parent.isFolia()) {
145-
Method getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
146-
"getCurrentWorldData"
147-
);
148-
getCurrentWorldData.setAccessible(true);
149-
try {
150-
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
151-
} catch (IllegalAccessException e) {
152-
}
153-
154-
try {
155-
regionizedWorldData = Class.forName("io.papermc.paper.threadedregions.RegionizedWorldData");
156-
} catch (ClassNotFoundException e) {
157-
}
158-
if (regionizedWorldData != null) {
159-
final Field captureTreeGeneration = regionizedWorldData.getDeclaredField("captureTreeGeneration");
160-
captureTreeGeneration.setAccessible(true);
161-
this.captureTreeGeneration = captureTreeGeneration;
162-
163-
final Field captureBlockStates = regionizedWorldData.getDeclaredField("captureBlockStates");
164-
captureBlockStates.setAccessible(true);
165-
this.captureBlockStates = captureBlockStates;
166-
167-
final Field capturedBlockStates = regionizedWorldData.getDeclaredField("capturedBlockStates");
168-
capturedBlockStates.setAccessible(true);
169-
this.capturedBlockStates = capturedBlockStates;
170-
}
171-
}
172135
}
173136

174137
@Nullable
@@ -528,29 +491,79 @@ public org.bukkit.inventory.ItemStack adapt(BaseItemStack baseItemStack) {
528491
return CraftItemStack.asCraftMirror(stack);
529492
}
530493

494+
// Folia - Start
531495
@Override
532496
protected void preCaptureStates(final ServerLevel serverLevel) {
533-
serverLevel.captureTreeGeneration = true;
534-
serverLevel.captureBlockStates = true;
497+
if (this.isFolia()) {
498+
try {
499+
var data = currentWorldData.invoke(serverLevel);
500+
captureBlockStates.setBoolean(data, true);
501+
captureTreeGeneration.setBoolean(data, true);
502+
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
503+
} catch (Throwable e) {
504+
throw new RuntimeException(e);
505+
}
506+
} else {
507+
serverLevel.captureTreeGeneration = true;
508+
serverLevel.captureBlockStates = true;
509+
}
535510
}
511+
// Folia - End
536512

537513
@Override
538514
protected List<org.bukkit.block.BlockState> getCapturedBlockStatesCopy(final ServerLevel serverLevel) {
539515
return new ArrayList<>(serverLevel.capturedBlockStates.values());
540516
}
541517

518+
// Folia - Start
542519
@Override
543520
protected void postCaptureBlockStates(final ServerLevel serverLevel) {
544-
serverLevel.captureBlockStates = false;
545-
serverLevel.captureTreeGeneration = false;
546-
serverLevel.capturedBlockStates.clear();
521+
if (this.isFolia()) {
522+
try {
523+
var data = currentWorldData.invoke(serverLevel);
524+
captureBlockStates.setBoolean(data, false);
525+
captureTreeGeneration.setBoolean(data, false);
526+
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
527+
} catch (Throwable e) {
528+
throw new RuntimeException(e);
529+
}
530+
} else {
531+
serverLevel.captureBlockStates = false;
532+
serverLevel.captureTreeGeneration = false;
533+
serverLevel.capturedBlockStates.clear();
534+
}
547535
}
536+
// Folia - End
548537

549538
@Override
550539
protected ServerLevel getServerLevel(final World world) {
551540
return ((CraftWorld) world).getHandle();
552541
}
553542

543+
// Folia - Start
544+
@Override
545+
protected MethodHandle getCurrentWorldData() {
546+
if (this.isFolia()) {
547+
Method getCurrentWorldData;
548+
try {
549+
getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
550+
"getCurrentWorldData"
551+
);
552+
} catch (NoSuchMethodException e) {
553+
return null;
554+
}
555+
getCurrentWorldData.setAccessible(true);
556+
557+
try {
558+
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
559+
} catch (IllegalAccessException e) {
560+
}
561+
}
562+
return null;
563+
}
564+
565+
// Folia - End
566+
554567
@Override
555568
public BaseItemStack adapt(org.bukkit.inventory.ItemStack itemStack) {
556569
final ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);

0 commit comments

Comments
 (0)