Skip to content

Commit 524fb1b

Browse files
MiniDiggerdmulloy2
authored andcommitted
Support multiple EntityTrackerEntryImpls, fixes #732 (#733)
1 parent 3ff2ccf commit 524fb1b

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

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

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.util.ArrayList;
2121
import java.util.Collection;
22+
import java.util.HashMap;
2223
import java.util.List;
2324
import java.util.Map;
2425

@@ -41,13 +42,13 @@
4142

4243
/**
4344
* Used to perform certain operations on entities.
44-
*
45+
*
4546
* @author Kristian
4647
*/
4748
class EntityUtilities {
4849
private static final boolean NEW_TRACKER = MinecraftVersion.atOrAbove(MinecraftVersion.VILLAGE_UPDATE);
4950
private static final EntityUtilities INSTANCE = new EntityUtilities();
50-
51+
5152
public static EntityUtilities getInstance() {
5253
return INSTANCE;
5354
}
@@ -58,8 +59,8 @@ private EntityUtilities() { }
5859
private FieldAccessor trackedEntitiesField;
5960
private FieldAccessor trackedPlayersField;
6061
private FieldAccessor trackerField;
61-
62-
private MethodAccessor scanPlayersMethod;
62+
63+
private Map<Class<?>, MethodAccessor> scanPlayersMethods = new HashMap<>();
6364

6465
public void updateEntity(Entity entity, List<Player> observers) {
6566
if (entity == null || !entity.isValid()) {
@@ -73,11 +74,8 @@ public void updateEntity(Entity entity, List<Player> observers) {
7374

7475
Object trackerEntry = getEntityTrackerEntry(entity.getWorld(), entity.getEntityId());
7576

76-
if (scanPlayersMethod == null) {
77-
scanPlayersMethod = findScanPlayers(trackerEntry.getClass());
78-
}
79-
80-
scanPlayersMethod.invoke(trackerEntry, nmsPlayers);
77+
// there can be multiple different entity tracker entry impls, see GH-732....
78+
scanPlayersMethods.computeIfAbsent(trackerEntry.getClass(), this::findScanPlayers).invoke(trackerEntry, nmsPlayers);
8179
}
8280

8381
private MethodAccessor findScanPlayers(Class<?> trackerClass) {
@@ -138,7 +136,7 @@ private Collection<?> getTrackedPlayers(Entity entity) {
138136
throw new IllegalStateException("trackedPlayers field was an unknown type: expected Collection or Map, but got " + value.getClass());
139137
}
140138
}
141-
139+
142140
private MethodAccessor getChunkProvider;
143141
private FieldAccessor chunkMapField;
144142

@@ -150,7 +148,7 @@ private Object getNewEntityTracker(Object worldServer, int entityId) {
150148
FuzzyReflection.fromClass(worldServer.getClass(), false).getMethod(
151149
FuzzyMethodContract.newBuilder().parameterCount(0).returnTypeExact(chunkProviderClass).build()));
152150
}
153-
151+
154152
Object chunkProvider = getChunkProvider.invoke(worldServer);
155153

156154
if (chunkMapField == null) {
@@ -159,7 +157,7 @@ private Object getNewEntityTracker(Object worldServer, int entityId) {
159157
FuzzyReflection.fromClass(chunkProvider.getClass(), false).getField(
160158
FuzzyFieldContract.newBuilder().typeExact(chunkMapClass).build()));
161159
}
162-
160+
163161
Object playerChunkMap = chunkMapField.get(chunkProvider);
164162

165163
if (trackedEntitiesField == null) {
@@ -183,7 +181,7 @@ private Object getEntityTrackerEntry(World world, int entityID) {
183181
if (entityTrackerField == null)
184182
entityTrackerField = Accessors.getFieldAccessor(FuzzyReflection.fromObject(worldServer).
185183
getFieldByType("tracker", MinecraftReflection.getEntityTrackerClass()));
186-
184+
187185
// Get the tracker
188186
Object tracker = entityTrackerField.get(worldServer);
189187

@@ -236,17 +234,17 @@ public Entity getEntityFromID(World world, int entityID) {
236234
private List<Object> unwrapBukkit(List<Player> players) {
237235
List<Object> output = Lists.newArrayList();
238236
BukkitUnwrapper unwrapper = new BukkitUnwrapper();
239-
237+
240238
// Get the NMS equivalent
241239
for (Player player : players) {
242240
Object result = unwrapper.unwrapItem(player);
243-
241+
244242
if (result != null)
245243
output.add(result);
246244
else
247245
throw new IllegalArgumentException("Cannot unwrap item " + player);
248246
}
249-
247+
250248
return output;
251249
}
252250
}

0 commit comments

Comments
 (0)