9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-20 07:29:17 +00:00

optimizzze

This commit is contained in:
XiaoMoMi
2025-03-27 02:57:37 +08:00
parent 57034934b5
commit 46d87688a1
9 changed files with 45 additions and 16 deletions

View File

@@ -23,7 +23,6 @@ import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.NoteBlock;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View File

@@ -9,7 +9,10 @@ import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy;
import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.FieldAccessor;
import net.bytebuddy.implementation.FixedValue; import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.implementation.bind.annotation.*; import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.implementation.bind.annotation.This;
import net.bytebuddy.matcher.ElementMatchers; import net.bytebuddy.matcher.ElementMatchers;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.BukkitBlockShape; import net.momirealms.craftengine.bukkit.block.BukkitBlockShape;
@@ -48,6 +51,7 @@ import org.jetbrains.annotations.Nullable;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
import java.lang.invoke.VarHandle;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
@@ -62,6 +66,8 @@ public class BukkitInjector {
private static Class<?> clazz$InjectedPalettedContainer; private static Class<?> clazz$InjectedPalettedContainer;
private static VarHandle varHandle$InjectedPalettedContainer$target;
private static Class<?> clazz$OptimizedItemDisplay; private static Class<?> clazz$OptimizedItemDisplay;
private static Constructor<?> constructor$OptimizedItemDisplay; private static Constructor<?> constructor$OptimizedItemDisplay;
@@ -83,10 +89,10 @@ public class BukkitInjector {
.subclass(Reflections.clazz$PalettedContainer) .subclass(Reflections.clazz$PalettedContainer)
.name("net.minecraft.world.level.chunk.InjectedPalettedContainer") .name("net.minecraft.world.level.chunk.InjectedPalettedContainer")
.implement(InjectedPalettedContainerHolder.class) .implement(InjectedPalettedContainerHolder.class)
.defineField("target", Object.class, Visibility.PUBLIC) .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PRIVATE)
.defineField("cesection", CESection.class, Visibility.PUBLIC) .defineField("cesection", CESection.class, Visibility.PRIVATE)
.defineField("ceworld", CEWorld.class, Visibility.PUBLIC) .defineField("ceworld", CEWorld.class, Visibility.PRIVATE)
.defineField("cepos", SectionPos.class, Visibility.PUBLIC) .defineField("cepos", SectionPos.class, Visibility.PRIVATE)
.method(ElementMatchers.any() .method(ElementMatchers.any()
.and(ElementMatchers.not(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet))) .and(ElementMatchers.not(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet)))
.and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class))) .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class)))
@@ -105,6 +111,9 @@ public class BukkitInjector {
.make() .make()
.load(BukkitInjector.class.getClassLoader()) .load(BukkitInjector.class.getClassLoader())
.getLoaded(); .getLoaded();
varHandle$InjectedPalettedContainer$target = Objects.requireNonNull(ReflectionUtils.findVarHandle(clazz$InjectedPalettedContainer, "target", Reflections.clazz$PalettedContainer));
// State Predicate // State Predicate
DynamicType.Unloaded<?> alwaysTrue = byteBuddy DynamicType.Unloaded<?> alwaysTrue = byteBuddy
.subclass(Reflections.clazz$StatePredicate) .subclass(Reflections.clazz$StatePredicate)
@@ -311,11 +320,11 @@ public class BukkitInjector {
Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection); Object container = FastNMS.INSTANCE.field$LevelChunkSection$states(targetSection);
if (!clazz$InjectedPalettedContainer.isInstance(container)) { if (!clazz$InjectedPalettedContainer.isInstance(container)) {
InjectedPalettedContainerHolder injectedObject = (InjectedPalettedContainerHolder) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); InjectedPalettedContainerHolder injectedObject = (InjectedPalettedContainerHolder) Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer);
injectedObject.target(container); varHandle$InjectedPalettedContainer$target.set(injectedObject, container);
injectedObject.ceSection(ceSection); injectedObject.ceSection(ceSection);
injectedObject.ceWorld(ceWorld); injectedObject.ceWorld(ceWorld);
injectedObject.cePos(pos); injectedObject.cePos(pos);
Reflections.field$PalettedContainer$data.set(injectedObject, Reflections.field$PalettedContainer$data.get(container)); Reflections.varHandle$PalettedContainer$data.setVolatile(injectedObject, Reflections.varHandle$PalettedContainer$data.get(container));
Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject);
} }
} catch (Exception e) { } catch (Exception e) {

View File

@@ -11,7 +11,6 @@ import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPhysicsEvent;
import java.lang.reflect.InvocationTargetException;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.List; import java.util.List;

View File

@@ -27,6 +27,7 @@ import org.jetbrains.annotations.Nullable;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.lang.invoke.VarHandle;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.time.Instant; import java.time.Instant;
import java.util.*; import java.util.*;
@@ -1679,6 +1680,10 @@ public class Reflections {
) )
); );
public static final VarHandle varHandle$PalettedContainer$data = requireNonNull(
ReflectionUtils.findVarHandle(field$PalettedContainer$data)
);
public static final Field field$PalettedContainer$Data$storage = requireNonNull( public static final Field field$PalettedContainer$Data$storage = requireNonNull(
ReflectionUtils.getDeclaredField( ReflectionUtils.getDeclaredField(
clazz$PalettedContainer$Data, clazz$BitStorage, 0 clazz$PalettedContainer$Data, clazz$BitStorage, 0

View File

@@ -253,7 +253,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
Object section = sections[i]; Object section = sections[i];
if (ConfigManager.syncCustomBlocks()) { if (ConfigManager.syncCustomBlocks()) {
Object statesContainer = FastNMS.INSTANCE.field$LevelChunkSection$states(section); Object statesContainer = FastNMS.INSTANCE.field$LevelChunkSection$states(section);
Object data = Reflections.field$PalettedContainer$data.get(statesContainer); Object data = Reflections.varHandle$PalettedContainer$data.get(statesContainer);
Object palette = Reflections.field$PalettedContainer$Data$palette.get(data); Object palette = Reflections.field$PalettedContainer$Data$palette.get(data);
boolean requiresSync = false; boolean requiresSync = false;
if (Reflections.clazz$SingleValuePalette.isInstance(palette)) { if (Reflections.clazz$SingleValuePalette.isInstance(palette)) {

View File

@@ -3,7 +3,6 @@ package net.momirealms.craftengine.fabric;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.piston.PistonBehavior;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.momirealms.craftengine.fabric.client.config.ModConfig; import net.momirealms.craftengine.fabric.client.config.ModConfig;
import net.momirealms.craftengine.fabric.util.BlockUtils; import net.momirealms.craftengine.fabric.util.BlockUtils;

View File

@@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -467,4 +468,22 @@ public class ReflectionUtils {
return LOOKUP.unreflect(method); return LOOKUP.unreflect(method);
} }
} }
public static VarHandle findVarHandle(Class<?> clazz, String name, Class<?> type) {
try {
return MethodHandles.privateLookupIn(clazz, LOOKUP)
.findVarHandle(clazz, name, type);
} catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
return null;
}
}
public static VarHandle findVarHandle(Field field) {
try {
return MethodHandles.privateLookupIn(field.getDeclaringClass(), LOOKUP)
.findVarHandle(field.getDeclaringClass(), field.getName(), field.getType());
} catch (IllegalAccessException | NoSuchFieldException e) {
return null;
}
}
} }

View File

@@ -7,8 +7,6 @@ public interface InjectedPalettedContainerHolder {
Object target(); Object target();
void target(Object target);
CESection ceSection(); CESection ceSection();
void ceSection(CESection section); void ceSection(CESection section);

View File

@@ -10,15 +10,16 @@ import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.ScheduledTickAccess; import net.minecraft.world.level.ScheduledTickAccess;
import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.BonemealableBlock;
import net.minecraft.world.level.block.Fallable;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.momirealms.craftengine.mod.util.NoteBlockUtils; import net.momirealms.craftengine.mod.util.NoteBlockUtils;
import net.momirealms.craftengine.shared.ObjectHolder; import net.momirealms.craftengine.shared.ObjectHolder;
import net.momirealms.craftengine.shared.block.*; import net.momirealms.craftengine.shared.block.*;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class CraftEngineBlock public class CraftEngineBlock