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:
@@ -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);
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package net.momirealms.craftengine.bukkit.plugin.injector;
|
||||
|
||||
public interface InternalFieldAccessor {
|
||||
|
||||
int field$ClientboundMoveEntityPacket$entityId(Object packet);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user