|
25 | 25 | import java.util.Collection;
|
26 | 26 | import java.util.HashSet;
|
27 | 27 | import java.util.List;
|
| 28 | +import java.util.Map; |
28 | 29 | import java.util.Set;
|
29 | 30 |
|
30 | 31 | import org.bukkit.World;
|
@@ -52,6 +53,17 @@ class EntityUtilities {
|
52 | 53 |
|
53 | 54 | private static Method scanPlayersMethod;
|
54 | 55 |
|
| 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 | + |
55 | 67 | /*
|
56 | 68 | * While this function may look pretty bad, it's essentially just a reflection-warped
|
57 | 69 | * version of the following:
|
@@ -94,7 +106,7 @@ public static void updateEntity(Entity entity, List<Player> observers) throws Fi
|
94 | 106 | }
|
95 | 107 |
|
96 | 108 | // Phew, finally there.
|
97 |
| - Collection<?> trackedPlayers = (Collection<?>) FieldUtils.readField(trackedPlayersField, trackerEntry, false); |
| 109 | + Collection<?> trackedPlayers = getCollection(FieldUtils.readField(trackedPlayersField, trackerEntry, false)); |
98 | 110 | List<Object> nmsPlayers = unwrapBukkit(observers);
|
99 | 111 |
|
100 | 112 | // trackEntity.trackedPlayers.clear();
|
@@ -140,7 +152,7 @@ public static List<Player> getEntityTrackers(Entity entity) {
|
140 | 152 | trackedPlayersField = FuzzyReflection.fromObject(trackerEntry).getFieldByType("java\\.util\\..*");
|
141 | 153 | }
|
142 | 154 |
|
143 |
| - Collection<?> trackedPlayers = (Collection<?>) FieldUtils.readField(trackedPlayersField, trackerEntry, false); |
| 155 | + Collection<?> trackedPlayers = getCollection(FieldUtils.readField(trackedPlayersField, trackerEntry, false)); |
144 | 156 |
|
145 | 157 | // Wrap every player - we also ensure that the underlying tracker list is immutable
|
146 | 158 | for (Object tracker : trackedPlayers) {
|
|
0 commit comments