mirror of
https://github.com/dmulloy2/ProtocolLib.git
synced 2024-11-24 03:25:29 +01:00
Unwrap collections in the packet constructor.
This commit is contained in:
parent
2b90acf53e
commit
cecab6a169
@ -3,6 +3,7 @@ package com.comphenix.protocol.injector;
|
|||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -11,6 +12,7 @@ import net.minecraft.server.Packet;
|
|||||||
|
|
||||||
import com.comphenix.protocol.events.PacketContainer;
|
import com.comphenix.protocol.events.PacketContainer;
|
||||||
import com.comphenix.protocol.reflect.FieldAccessException;
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
|
import com.comphenix.protocol.reflect.instances.DefaultInstances;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
@ -178,9 +180,15 @@ public class PacketConstructor {
|
|||||||
|
|
||||||
private static Map<Class<?>, Method> cache = new ConcurrentHashMap<Class<?>, Method>();
|
private static Map<Class<?>, Method> cache = new ConcurrentHashMap<Class<?>, Method>();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Override
|
@Override
|
||||||
public Object unwrapItem(Object wrappedObject) {
|
public Object unwrapItem(Object wrappedObject) {
|
||||||
|
|
||||||
|
// Special case
|
||||||
|
if (wrappedObject instanceof Collection) {
|
||||||
|
return handleCollection((Collection<Object>) wrappedObject);
|
||||||
|
}
|
||||||
|
|
||||||
Class<?> currentClass = wrappedObject.getClass();
|
Class<?> currentClass = wrappedObject.getClass();
|
||||||
Method cachedMethod = initializeCache(currentClass);
|
Method cachedMethod = initializeCache(currentClass);
|
||||||
|
|
||||||
@ -202,6 +210,24 @@ public class PacketConstructor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object handleCollection(Collection<Object> wrappedObject) {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Collection<Object> copy = DefaultInstances.DEFAULT.getDefault(wrappedObject.getClass());
|
||||||
|
|
||||||
|
if (copy != null) {
|
||||||
|
// Unwrap every element
|
||||||
|
for (Object element : wrappedObject) {
|
||||||
|
copy.add(unwrapItem(element));
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Impossible
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Method initializeCache(Class<?> type) {
|
private Method initializeCache(Class<?> type) {
|
||||||
|
|
||||||
// See if we're already determined this
|
// See if we're already determined this
|
||||||
|
Loading…
Reference in New Issue
Block a user