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

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-04-07 18:42:19 +08:00
committed by GitHub
3 changed files with 54 additions and 1 deletions

View File

@@ -3,16 +3,25 @@ package net.momirealms.craftengine.bukkit.plugin.injector;
import com.mojang.datafixers.util.Pair;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.description.field.FieldDescription;
import net.bytebuddy.description.method.ParameterDescription;
import net.bytebuddy.description.modifier.Visibility;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy;
import net.bytebuddy.implementation.FieldAccessor;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.implementation.Implementation;
import net.bytebuddy.implementation.MethodDelegation;
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.implementation.bytecode.assign.TypeCasting;
import net.bytebuddy.implementation.bytecode.member.FieldAccess;
import net.bytebuddy.implementation.bytecode.member.MethodReturn;
import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess;
import net.bytebuddy.matcher.ElementMatchers;
import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.block.BukkitBlockShape;
@@ -54,6 +63,7 @@ import java.lang.invoke.MethodType;
import java.lang.invoke.VarHandle;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -82,6 +92,8 @@ public class BukkitInjector {
private static Class<?> clazz$InjectedCacheChecker;
private static InternalFieldAccessor internalFieldAccessor;
public static void init() {
try {
// Paletted Container
@@ -149,6 +161,36 @@ public class BukkitInjector {
.getLoaded();
instance$OptimizedItemDisplayFactory = Objects.requireNonNull(ReflectionUtils.getConstructor(clazz$OptimizedItemDisplayFatory, 0)).newInstance();
// InternalFieldAccessor Interface
Class<?> internalFieldAccessorInterface = new ByteBuddy()
.makeInterface()
.name("net.momirealms.craftengine.bukkit.plugin.injector.InternalFieldAccessor")
.defineMethod("field$ClientboundMoveEntityPacket$entityId", int.class, Modifier.PUBLIC)
.withParameter(Object.class, "packet")
.withoutCode()
.make()
.load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
// Internal field accessor
FieldDescription moveEntityIdFieldDesc = new FieldDescription.ForLoadedField(Reflections.field$ClientboundMoveEntityPacket$entityId);
Class<?> clazz$InternalFieldAccessor = byteBuddy
.subclass(Object.class)
.name("net.minecraft.network.protocol.game.CraftEngineInternalFieldAccessor")
.implement(internalFieldAccessorInterface)
.method(ElementMatchers.named("field$ClientboundMoveEntityPacket$entityId"))
.intercept(new Implementation.Simple(
MethodVariableAccess.REFERENCE.loadFrom(1),
TypeCasting.to(TypeDescription.ForLoadedType.of(Reflections.clazz$ClientboundMoveEntityPacket)),
FieldAccess.forField(moveEntityIdFieldDesc).read(),
MethodReturn.INTEGER
))
.make()
.load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
internalFieldAccessor = (InternalFieldAccessor) clazz$InternalFieldAccessor.getConstructor().newInstance();
// CraftEngine Blocks
String packageWithName = BukkitInjector.class.getName();
String generatedClassName = packageWithName.substring(0, packageWithName.lastIndexOf('.')) + ".CraftEngineBlock";
DynamicType.Builder<?> builder = byteBuddy
@@ -293,6 +335,10 @@ public class BukkitInjector {
}
}
public static InternalFieldAccessor internalFieldAccessor() {
return internalFieldAccessor;
}
public static void injectCookingBlockEntity(Object entity) throws ReflectiveOperationException {
if (Reflections.clazz$AbstractFurnaceBlockEntity.isInstance(entity)) {
Object quickCheck = Reflections.field$AbstractFurnaceBlockEntity$quickCheck.get(entity);

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.injector;
public interface InternalFieldAccessor {
int field$ClientboundMoveEntityPacket$entityId(Object packet);
}

View File

@@ -14,6 +14,7 @@ import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager
import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.core.block.ImmutableBlockState;
@@ -737,7 +738,7 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> MOVE_ENTITY = (user, event, packet) -> {
try {
int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet);
int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet);
if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) {
event.setCancelled(true);
}