Skip to content

Commit 04c41dc

Browse files
committed
Fix Entity tracking with PaperSpigot
1 parent f1cb43b commit 04c41dc

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

ProtocolLib/src/main/java/com/comphenix/protocol/injector/EntityUtilities.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Collection;
2626
import java.util.HashSet;
2727
import java.util.List;
28+
import java.util.Map;
2829
import java.util.Set;
2930

3031
import org.bukkit.World;
@@ -52,6 +53,17 @@ class EntityUtilities {
5253

5354
private static Method scanPlayersMethod;
5455

56+
// Fix: PaperSpigot changed the trackedPlayers field
57+
private static Collection<?> getCollection(Object value) {
58+
if (value instanceof Collection<?>) {
59+
return (Collection<?>) value;
60+
} else if (value instanceof Map<?, ?>) {
61+
return ((Map<?, ?>) value).keySet();
62+
} else {
63+
throw new IllegalArgumentException("Expected Collection or Map but got " + value.getClass());
64+
}
65+
}
66+
5567
/*
5668
* While this function may look pretty bad, it's essentially just a reflection-warped
5769
* version of the following:
@@ -94,7 +106,7 @@ public static void updateEntity(Entity entity, List<Player> observers) throws Fi
94106
}
95107

96108
// Phew, finally there.
97-
Collection<?> trackedPlayers = (Collection<?>) FieldUtils.readField(trackedPlayersField, trackerEntry, false);
109+
Collection<?> trackedPlayers = getCollection(FieldUtils.readField(trackedPlayersField, trackerEntry, false));
98110
List<Object> nmsPlayers = unwrapBukkit(observers);
99111

100112
// trackEntity.trackedPlayers.clear();
@@ -140,7 +152,7 @@ public static List<Player> getEntityTrackers(Entity entity) {
140152
trackedPlayersField = FuzzyReflection.fromObject(trackerEntry).getFieldByType("java\\.util\\..*");
141153
}
142154

143-
Collection<?> trackedPlayers = (Collection<?>) FieldUtils.readField(trackedPlayersField, trackerEntry, false);
155+
Collection<?> trackedPlayers = getCollection(FieldUtils.readField(trackedPlayersField, trackerEntry, false));
144156

145157
// Wrap every player - we also ensure that the underlying tracker list is immutable
146158
for (Object tracker : trackedPlayers) {

0 commit comments

Comments
 (0)