Skip to content

Commit

Permalink
Improve API design and reduce duplicate code
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMeinerLP committed Dec 3, 2023
1 parent 84c5692 commit 80ebe64
Show file tree
Hide file tree
Showing 6 changed files with 258 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
import org.bukkit.entity.Player;

import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.util.ArrayList;
Expand Down Expand Up @@ -555,6 +556,11 @@ protected ServerLevel getServerLevel(final World world) {
return ((CraftWorld) world).getHandle();
}

@Override
protected MethodHandle getCurrentWorldData() {
return null;
}

@Override
public List<org.bukkit.entity.Entity> getEntities(org.bukkit.World world) {
// Quickly add each entity to a list copy.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
import org.bukkit.entity.Player;

import javax.annotation.Nullable;
import java.lang.invoke.MethodHandle;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.util.ArrayList;
Expand Down Expand Up @@ -547,6 +548,11 @@ protected ServerLevel getServerLevel(final World world) {
return ((CraftWorld) world).getHandle();
}

@Override
protected MethodHandle getCurrentWorldData() {
return null;
}

@Override
public List<org.bukkit.entity.Entity> getEntities(org.bukkit.World world) {
// Quickly add each entity to a list copy.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlockState;
import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
Expand Down Expand Up @@ -129,45 +130,8 @@ public final class PaperweightFaweAdapter extends FaweAdapter<net.minecraft.nbt.
private boolean initialised = false;
private Map<String, List<Property<?>>> 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.getSuperclass().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
Expand Down Expand Up @@ -630,25 +594,74 @@ private boolean wasAccessibleSinceLastSave(ChunkHolder holder) {

@Override
protected void preCaptureStates(final ServerLevel serverLevel) {
serverLevel.captureTreeGeneration = true;
serverLevel.captureBlockStates = true;
if (this.isFolia()) {
try {
var data = currentWorldData.invoke(serverLevel);
captureBlockStates.setBoolean(data, true);
captureTreeGeneration.setBoolean(data, true);
} catch (Throwable e) {
throw new RuntimeException(e);
}
} else {
serverLevel.captureTreeGeneration = true;
serverLevel.captureBlockStates = true;
}

}

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

// Folia - Start
@Override
protected void postCaptureBlockStates(final ServerLevel serverLevel) {
serverLevel.captureBlockStates = false;
serverLevel.captureTreeGeneration = false;
serverLevel.capturedBlockStates.clear();
if (this.isFolia()) {
try {
var data = currentWorldData.invoke(serverLevel);
captureBlockStates.setBoolean(data, false);
captureTreeGeneration.setBoolean(data, false);
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
} catch (Throwable e) {
throw new RuntimeException(e);
}
} else {
serverLevel.captureBlockStates = false;
serverLevel.captureTreeGeneration = false;
serverLevel.capturedBlockStates.clear();
}
}

// Folia - End

@Override
protected ServerLevel getServerLevel(final World world) {
return ((CraftWorld) world).getHandle();
}

// Folia - Start
@Override
protected MethodHandle getCurrentWorldData() {
if (this.isFolia()) {
Method getCurrentWorldData;
try {
getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
"getCurrentWorldData"
);
} catch (NoSuchMethodException e) {
return null;
}
getCurrentWorldData.setAccessible(true);

try {
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
} catch (IllegalAccessException e) {
}
}
return null;
}

// Folia - End

}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlockState;
import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
Expand Down Expand Up @@ -128,47 +129,9 @@ public final class PaperweightFaweAdapter extends FaweAdapter<net.minecraft.nbt.
private boolean initialised = false;
private Map<String, List<Property<?>>> 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.getSuperclass().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
Expand Down Expand Up @@ -528,29 +491,79 @@ public org.bukkit.inventory.ItemStack adapt(BaseItemStack baseItemStack) {
return CraftItemStack.asCraftMirror(stack);
}

// Folia - Start
@Override
protected void preCaptureStates(final ServerLevel serverLevel) {
serverLevel.captureTreeGeneration = true;
serverLevel.captureBlockStates = true;
if (this.isFolia()) {
try {
var data = currentWorldData.invoke(serverLevel);
captureBlockStates.setBoolean(data, true);
captureTreeGeneration.setBoolean(data, true);
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
} catch (Throwable e) {
throw new RuntimeException(e);
}
} else {
serverLevel.captureTreeGeneration = true;
serverLevel.captureBlockStates = true;
}
}
// Folia - End

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

// Folia - Start
@Override
protected void postCaptureBlockStates(final ServerLevel serverLevel) {
serverLevel.captureBlockStates = false;
serverLevel.captureTreeGeneration = false;
serverLevel.capturedBlockStates.clear();
if (this.isFolia()) {
try {
var data = currentWorldData.invoke(serverLevel);
captureBlockStates.setBoolean(data, false);
captureTreeGeneration.setBoolean(data, false);
((Map<BlockPos, CraftBlockState>) capturedBlockStates.get(data)).clear();
} catch (Throwable e) {
throw new RuntimeException(e);
}
} else {
serverLevel.captureBlockStates = false;
serverLevel.captureTreeGeneration = false;
serverLevel.capturedBlockStates.clear();
}
}
// Folia - End

@Override
protected ServerLevel getServerLevel(final World world) {
return ((CraftWorld) world).getHandle();
}

// Folia - Start
@Override
protected MethodHandle getCurrentWorldData() {
if (this.isFolia()) {
Method getCurrentWorldData;
try {
getCurrentWorldData = ServerLevel.class.getSuperclass().getDeclaredMethod(
"getCurrentWorldData"
);
} catch (NoSuchMethodException e) {
return null;
}
getCurrentWorldData.setAccessible(true);

try {
currentWorldData = MethodHandles.lookup().unreflect(getCurrentWorldData);
} catch (IllegalAccessException e) {
}
}
return null;
}

// Folia - End

@Override
public BaseItemStack adapt(org.bukkit.inventory.ItemStack itemStack) {
final ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
Expand Down
Loading

0 comments on commit 80ebe64

Please sign in to comment.