Change block converter to use reflection again
Dieser Commit ist enthalten in:
Ursprung
6c3654ef40
Commit
778031c105
@ -41,21 +41,17 @@ import com.comphenix.protocol.reflect.accessors.MethodAccessor;
|
|||||||
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
|
import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
|
||||||
import com.comphenix.protocol.utility.MinecraftReflection;
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||||
import com.comphenix.protocol.wrappers.nbt.NbtBase;
|
import com.comphenix.protocol.wrappers.nbt.NbtBase;
|
||||||
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
|
|
||||||
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
|
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import net.minecraft.server.v1_13_R1.Block;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.WorldType;
|
import org.bukkit.WorldType;
|
||||||
import org.bukkit.advancement.Advancement;
|
import org.bukkit.advancement.Advancement;
|
||||||
import org.bukkit.craftbukkit.v1_13_R1.util.CraftMagicNumbers;
|
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
@ -77,7 +73,6 @@ public class BukkitConverters {
|
|||||||
private static boolean hasAttributeSnapshot = false;
|
private static boolean hasAttributeSnapshot = false;
|
||||||
|
|
||||||
// The static maps
|
// The static maps
|
||||||
private static Map<Class<?>, EquivalentConverter<Object>> specificConverters;
|
|
||||||
private static Map<Class<?>, EquivalentConverter<Object>> genericConverters;
|
private static Map<Class<?>, EquivalentConverter<Object>> genericConverters;
|
||||||
private static List<Unwrapper> unwrappers;
|
private static List<Unwrapper> unwrappers;
|
||||||
|
|
||||||
@ -85,10 +80,6 @@ public class BukkitConverters {
|
|||||||
private static Method worldTypeName;
|
private static Method worldTypeName;
|
||||||
private static Method worldTypeGetType;
|
private static Method worldTypeGetType;
|
||||||
|
|
||||||
// Used to get block instances
|
|
||||||
private static MethodAccessor GET_BLOCK;
|
|
||||||
private static MethodAccessor GET_BLOCK_ID;
|
|
||||||
|
|
||||||
// Used for potion effect conversion
|
// Used for potion effect conversion
|
||||||
private static volatile Constructor<?> mobEffectConstructor;
|
private static volatile Constructor<?> mobEffectConstructor;
|
||||||
private static volatile StructureModifier<Object> mobEffectModifier;
|
private static volatile StructureModifier<Object> mobEffectModifier;
|
||||||
@ -702,20 +693,43 @@ public class BukkitConverters {
|
|||||||
return ignoreNull(handle(WrappedStatistic::getHandle, WrappedStatistic::fromHandle));
|
return ignoreNull(handle(WrappedStatistic::getHandle, WrappedStatistic::fromHandle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static MethodAccessor BLOCK_FROM_MATERIAL;
|
||||||
|
private static MethodAccessor MATERIAL_FROM_BLOCK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve a converter for block instances.
|
* Retrieve a converter for block instances.
|
||||||
* @return A converter for block instances.
|
* @return A converter for block instances.
|
||||||
*/
|
*/
|
||||||
public static EquivalentConverter<Material> getBlockConverter() {
|
public static EquivalentConverter<Material> getBlockConverter() {
|
||||||
|
if (BLOCK_FROM_MATERIAL == null || MATERIAL_FROM_BLOCK == null) {
|
||||||
|
Class<?> magicNumbers = MinecraftReflection.getCraftBukkitClass("util.CraftMagicNumbers");
|
||||||
|
Class<?> block = MinecraftReflection.getBlockClass();
|
||||||
|
|
||||||
|
FuzzyReflection fuzzy = FuzzyReflection.fromClass(magicNumbers);
|
||||||
|
FuzzyMethodContract.Builder builder = FuzzyMethodContract
|
||||||
|
.newBuilder()
|
||||||
|
.requireModifier(Modifier.STATIC)
|
||||||
|
.returnTypeExact(Material.class)
|
||||||
|
.parameterExactArray(block);
|
||||||
|
MATERIAL_FROM_BLOCK = Accessors.getMethodAccessor(fuzzy.getMethod(builder.build()));
|
||||||
|
|
||||||
|
builder = FuzzyMethodContract
|
||||||
|
.newBuilder()
|
||||||
|
.requireModifier(Modifier.STATIC)
|
||||||
|
.returnTypeExact(block)
|
||||||
|
.parameterExactArray(Material.class);
|
||||||
|
BLOCK_FROM_MATERIAL = Accessors.getMethodAccessor(fuzzy.getMethod(builder.build()));
|
||||||
|
}
|
||||||
|
|
||||||
return ignoreNull(new EquivalentConverter<Material>() {
|
return ignoreNull(new EquivalentConverter<Material>() {
|
||||||
@Override
|
@Override
|
||||||
public Object getGeneric(Material specific) {
|
public Object getGeneric(Material specific) {
|
||||||
return CraftMagicNumbers.getBlock(specific);
|
return BLOCK_FROM_MATERIAL.invoke(null, specific);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Material getSpecific(Object generic) {
|
public Material getSpecific(Object generic) {
|
||||||
return CraftMagicNumbers.getMaterial((Block) generic);
|
return (Material) MATERIAL_FROM_BLOCK.invoke(null, generic);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren