Update to 1.17.1

Fixes #1315
This commit is contained in:
Dan Mulloy 2021-07-08 23:22:56 -04:00
parent 263ec8a36e
commit 153dd61994
No known key found for this signature in database
GPG Key ID: 2B62F7DACFF133E8
9 changed files with 129 additions and 68 deletions

View File

@ -17,7 +17,7 @@
<project.fullVersion>${project.version}</project.fullVersion>
<powermock.version>2.0.7</powermock.version>
<spigot.version>1.17-R0.1-SNAPSHOT</spigot.version>
<spigot.version>1.17.1-R0.1-SNAPSHOT</spigot.version>
</properties>
<build>

View File

@ -11,6 +11,7 @@ import java.util.function.Consumer;
import com.comphenix.protocol.PacketTypeLookup.ClassLookup;
import com.comphenix.protocol.events.ConnectionSide;
import com.comphenix.protocol.injector.packet.PacketRegistry;
import com.comphenix.protocol.utility.Constants;
import com.comphenix.protocol.utility.MinecraftReflection;
import com.comphenix.protocol.utility.MinecraftVersion;
import com.google.common.base.Preconditions;
@ -653,7 +654,7 @@ public class PacketType implements Serializable, Cloneable, Comparable<PacketTyp
/**
* Protocol version of all the current IDs.
*/
private static final MinecraftVersion PROTOCOL_VERSION = MinecraftVersion.CAVES_CLIFFS_1;
private static final MinecraftVersion PROTOCOL_VERSION = Constants.CURRENT_VERSION;
private final Protocol protocol;
private final Sender sender;

View File

@ -38,12 +38,12 @@ public class ProtocolLibrary {
/**
* The maximum version ProtocolLib has been tested with.
*/
public static final String MAXIMUM_MINECRAFT_VERSION = "1.17";
public static final String MAXIMUM_MINECRAFT_VERSION = "1.17.1";
/**
* The date (with ISO 8601 or YYYY-MM-DD) when the most recent version (1.17) was released.
* The date (with ISO 8601 or YYYY-MM-DD) when the most recent version (1.17.1) was released.
*/
public static final String MINECRAFT_LAST_RELEASE_DATE = "2021-06-08";
public static final String MINECRAFT_LAST_RELEASE_DATE = "2021-07-06";
/**
* Plugins that are currently incompatible with ProtocolLib.

View File

@ -914,6 +914,16 @@ public abstract class AbstractStructure {
);
}
public StructureModifier<List<Integer>> getIntLists() {
return structureModifier.withType(
List.class,
BukkitConverters.getListConverter(
MinecraftReflection.getIntArrayListClass(),
Converters.passthrough(int.class)
)
);
}
/**
* Retrieve a read/write structure for the Map class.
* @param keyConverter Converter for map keys

View File

@ -75,6 +75,7 @@ public class MinecraftProtocolVersion {
map.put(new MinecraftVersion(1, 16, 5), 754);
map.put(new MinecraftVersion(1, 17, 0), 755);
map.put(new MinecraftVersion(1, 17, 1), 756);
return map;
}

View File

@ -2250,17 +2250,21 @@ public class MinecraftReflection {
return getMinecraftClass("world.entity.ai.attributes.AttributeBase", "AttributeBase");
}
public static Class<?> getInt2ObjectMapClass() {
public static Class<?> getFastUtilClass(String className) {
try {
return getMinecraftLibraryClass("it.unimi.dsi.fastutil.ints.Int2ObjectMap");
return getMinecraftLibraryClass("it.unimi.dsi.fastutil." + className);
} catch (RuntimeException ex) {
try {
Class<?> clazz = getMinecraftLibraryClass("org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectMap");
setMinecraftLibraryClass("it.unimi.dsi.fastutil.ints.Int2ObjectMap", clazz);
return clazz;
} catch (RuntimeException ignored) {
throw ex;
}
Class<?> clazz = getMinecraftLibraryClass("org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil." + className);
setMinecraftLibraryClass("it.unimi.dsi.fastutil." + className, clazz);
return clazz;
}
}
public static Class<?> getInt2ObjectMapClass() {
return getFastUtilClass("ints.Int2ObjectMap");
}
public static Class<?> getIntArrayListClass() {
return getFastUtilClass("ints.IntArrayList");
}
}

View File

@ -267,7 +267,86 @@ public class BukkitConverters {
};
}
private static Map<Class<?>, Supplier<List<Object>>> LIST_SUPPLIERS = new ConcurrentHashMap<>();
private static final Map<Class<?>, Supplier<List<Object>>> LIST_SUPPLIERS = new ConcurrentHashMap<>();
private static <T> Object getGenericList(Class<?> listClass, List<T> specific, EquivalentConverter<T> itemConverter) {
List<Object> newList;
Supplier<List<Object>> supplier = LIST_SUPPLIERS.get(listClass);
if (supplier == null) {
try {
Constructor<?> ctor = listClass.getConstructor();
newList = (List<Object>) ctor.newInstance();
supplier = () -> {
try {
return (List<Object>) ctor.newInstance();
} catch (ReflectiveOperationException ex) {
throw new RuntimeException(ex);
}
};
} catch (ReflectiveOperationException ex) {
ex.printStackTrace();
supplier = ArrayList::new;
newList = new ArrayList<>();
}
LIST_SUPPLIERS.put(listClass, supplier);
} else {
newList = supplier.get();
}
// Convert each object
for (T position : specific) {
if (position != null) {
Object converted = itemConverter.getGeneric(position);
if (converted != null) {
newList.add(converted);
}
} else {
newList.add(null);
}
}
return newList;
}
private static <T> List<T> getSpecificList(Object generic, EquivalentConverter<T> itemConverter) {
if (generic instanceof Collection) {
List<T> items = new ArrayList<>();
// Copy everything to a new list
for (Object item : (Collection<Object>) generic) {
T result = itemConverter.getSpecific(item);
if (item != null)
items.add(result);
}
return items;
}
// Not valid
return null;
}
public static <T> EquivalentConverter<List<T>> getListConverter(final Class<?> listClass, final EquivalentConverter<T> itemConverter) {
return ignoreNull(new EquivalentConverter<List<T>>() {
@Override
public List<T> getSpecific(Object generic) {
return getSpecificList(generic, itemConverter);
}
@Override
public Object getGeneric(List<T> specific) {
return getGenericList(listClass, specific, itemConverter);
}
@Override
public Class<List<T>> getSpecificType() {
// Damn you Java
Class<?> dummy = List.class;
return (Class<List<T>>) dummy;
}
});
}
/**
* Retrieve an equivalent converter for a list of generic items.
@ -280,61 +359,12 @@ public class BukkitConverters {
return ignoreNull(new EquivalentConverter<List<T>>() {
@Override
public List<T> getSpecific(Object generic) {
if (generic instanceof Collection) {
List<T> items = new ArrayList<>();
// Copy everything to a new list
for (Object item : (Collection<Object>) generic) {
T result = itemConverter.getSpecific(item);
if (item != null)
items.add(result);
}
return items;
}
// Not valid
return null;
return getSpecificList(generic, itemConverter);
}
@Override
public Object getGeneric(List<T> specific) {
List<Object> newList;
Supplier<List<Object>> supplier = LIST_SUPPLIERS.get(specific.getClass());
if (supplier == null) {
try {
Constructor<?> ctor = specific.getClass().getConstructor();
newList = (List<Object>) ctor.newInstance();
supplier = () -> {
try {
return (List<Object>) ctor.newInstance();
} catch (ReflectiveOperationException ex) {
throw new RuntimeException(ex);
}
};
} catch (ReflectiveOperationException ex) {
supplier = ArrayList::new;
newList = new ArrayList<>();
}
LIST_SUPPLIERS.put(specific.getClass(), supplier);
} else {
newList = supplier.get();
}
// Convert each object
for (T position : specific) {
if (position != null) {
Object converted = itemConverter.getGeneric(position);
if (converted != null) {
newList.add(converted);
}
} else {
newList.add(null);
}
}
return newList;
return getGenericList(specific.getClass(), specific, itemConverter);
}
@Override

View File

@ -385,6 +385,19 @@ public class PacketContainerTest {
assertEquals("Test", copy.getStrings().read(0));
}
@Test
public void testIntList() {
PacketContainer destroy = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
destroy.getIntLists().write(0, new ArrayList<Integer>() {{
add(420);
add(69);
}});
List<Integer> back = destroy.getIntLists().read(0);
assertEquals(back.size(), 2);
assertEquals((int) back.get(0), 420);
assertEquals((int) back.get(1), 69);
}
@Test
public void testAttributeList() {
PacketContainer attribute = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES);

View File

@ -3,6 +3,7 @@ package com.comphenix.protocol.reflect.cloning;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
@ -20,7 +21,7 @@ public class AggregateClonerTest {
@BeforeClass
public static void initializeBukkit() {
BukkitInitialization.initializePackage();
BukkitInitialization.initializeItemMeta();
}
@Test
@ -29,7 +30,8 @@ public class AggregateClonerTest {
assertEquals(input, AggregateCloner.DEFAULT.clone(input));
}
@Test
// @Test
// Usages of NonNullList were removed in 1.17.1
public void testNonNullList() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.WINDOW_ITEMS);