|
79 | 79 | ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler().chunkHolderManager.autoSave(); // Paper - rewrite chunk system |
80 | 80 | } |
81 | 81 |
|
82 | | -@@ -702,7 +_,7 @@ |
| 82 | +@@ -703,7 +_,7 @@ |
83 | 83 | } |
84 | 84 |
|
85 | 85 | // Paper start - optimise chunk tick iteration |
|
88 | 88 | final ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkData chunkData = ((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemLevelChunk)levelChunk).moonrise$getChunkHolder().holderData; |
89 | 89 | final ca.spottedleaf.moonrise.common.misc.NearbyPlayers.TrackedChunk nearbyPlayers = chunkData.nearbyPlayers; |
90 | 90 | if (nearbyPlayers == null) { |
91 | | -@@ -722,6 +_,7 @@ |
| 91 | +@@ -723,6 +_,7 @@ |
92 | 92 |
|
93 | 93 | Objects.checkFromIndexSize(0, len, raw.length); |
94 | 94 | for (int i = 0; i < len; ++i) { |
95 | 95 | + try { // ShreddedPaper - concurrent modification |
96 | 96 | // Paper start - PlayerNaturallySpawnCreaturesEvent |
97 | 97 | com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = raw[i].playerNaturallySpawnedEvent; |
98 | 98 | if (event == null || event.isCancelled()) { |
99 | | -@@ -732,31 +_,34 @@ |
| 99 | +@@ -733,31 +_,34 @@ |
100 | 100 | // Paper end - PlayerNaturallySpawnCreaturesEvent |
101 | 101 | return true; |
102 | 102 | } |
|
150 | 150 |
|
151 | 151 | public void forEachBlockTickingChunk(final Consumer<LevelChunk> tickingChunkConsumer) { |
152 | 152 | this.distanceManager.forEachEntityTickingChunk(chunkPos -> { |
153 | | -@@ -814,7 +_,9 @@ |
| 153 | +@@ -815,7 +_,9 @@ |
154 | 154 |
|
155 | 155 | Objects.checkFromIndexSize(0, len, raw.length); |
156 | 156 | for (int i = 0; i < len; ++i) { |
|
160 | 160 | // Paper start - PlayerNaturallySpawnCreaturesEvent |
161 | 161 | com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event; |
162 | 162 | blockRange = 16384.0; |
163 | | -@@ -827,6 +_,7 @@ |
| 163 | +@@ -828,6 +_,7 @@ |
164 | 164 | // Paper end - PlayerNaturallySpawnCreaturesEvent |
165 | 165 | return true; |
166 | 166 | } |
167 | 167 | + } catch (IndexOutOfBoundsException ignored) {} // ShreddedPaper - concurrent modification |
168 | 168 | } |
169 | 169 |
|
170 | 170 | return false; |
171 | | -@@ -849,7 +_,9 @@ |
| 171 | +@@ -850,7 +_,9 @@ |
172 | 172 |
|
173 | 173 | Objects.checkFromIndexSize(0, len, raw.length); |
174 | 174 | for (int i = 0; i < len; ++i) { |
|
178 | 178 | if (this.playerIsCloseEnoughForSpawning(player, pos, 16384.0D)) { // Spigot |
179 | 179 | if (ret == null) { |
180 | 180 | ret = new ArrayList<>(len - i); |
181 | | -@@ -858,6 +_,7 @@ |
| 181 | +@@ -859,6 +_,7 @@ |
182 | 182 | ret.add(player); |
183 | 183 | } |
184 | 184 | } |
185 | 185 | + } catch (IndexOutOfBoundsException ignored) {} // ShreddedPaper - concurrent modification |
186 | 186 | } |
187 | 187 |
|
188 | 188 | return ret == null ? new ArrayList<>() : ret; |
189 | | -@@ -983,9 +_,9 @@ |
| 189 | +@@ -984,9 +_,9 @@ |
190 | 190 | protected void addEntity(final Entity entity) { |
191 | 191 | org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot |
192 | 192 | // Paper start - ignore and warn about illegal addEntity calls instead of crashing server |
|
198 | 198 | return; |
199 | 199 | } |
200 | 200 | // Paper end - ignore and warn about illegal addEntity calls instead of crashing server |
201 | | -@@ -996,12 +_,13 @@ |
| 201 | +@@ -997,12 +_,13 @@ |
202 | 202 | range = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, range); // Spigot |
203 | 203 | if (range != 0) { |
204 | 204 | int updateInterval = type.updateInterval(); |
|
214 | 214 | // Paper start - optimise entity tracker |
215 | 215 | if (((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$getTrackedEntity() != null) { |
216 | 216 | throw new IllegalStateException("Entity is already tracked"); |
217 | | -@@ -1011,8 +_,9 @@ |
| 217 | +@@ -1012,8 +_,9 @@ |
218 | 218 | trackedEntity.updatePlayers(this.level.players()); |
219 | 219 | if (entity instanceof ServerPlayer player) { |
220 | 220 | this.updatePlayerStatus(player, true); |
|
225 | 225 | if (e.entity != player) { |
226 | 226 | e.updatePlayer(player); |
227 | 227 | } |
228 | | -@@ -1027,13 +_,14 @@ |
| 228 | +@@ -1028,13 +_,14 @@ |
229 | 229 | if (entity instanceof ServerPlayer player) { |
230 | 230 | this.updatePlayerStatus(player, false); |
231 | 231 |
|
|
242 | 242 | trackedEntity.broadcastRemoved(); |
243 | 243 | } |
244 | 244 | ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$setTrackedEntity(null); // Paper - optimise entity tracker |
245 | | -@@ -1041,22 +_,25 @@ |
| 245 | +@@ -1042,22 +_,25 @@ |
246 | 246 |
|
247 | 247 | // Paper start - optimise entity tracker |
248 | 248 | private void newTrackerTick() { |
|
282 | 282 | } |
283 | 283 | // Paper end - optimise entity tracker |
284 | 284 |
|
285 | | -@@ -1072,7 +_,7 @@ |
| 285 | +@@ -1073,7 +_,7 @@ |
286 | 286 | List<ServerPlayer> movedPlayers = Lists.newArrayList(); |
287 | 287 | List<ServerPlayer> players = this.level.players(); |
288 | 288 |
|
|
291 | 291 | SectionPos oldPos = trackedEntity.lastSectionPos; |
292 | 292 | SectionPos newPos = SectionPos.of(trackedEntity.entity); |
293 | 293 | boolean sectionPosChanged = !Objects.equals(oldPos, newPos); |
294 | | -@@ -1091,14 +_,14 @@ |
| 294 | +@@ -1092,14 +_,14 @@ |
295 | 295 | } |
296 | 296 |
|
297 | 297 | if (!movedPlayers.isEmpty()) { |
|
308 | 308 | if (trackedEntity != null) { |
309 | 309 | trackedEntity.sendToTrackingPlayers(packet); |
310 | 310 | } |
311 | | -@@ -1107,26 +_,26 @@ |
| 311 | +@@ -1108,26 +_,26 @@ |
312 | 312 | public void sendToTrackingPlayersFiltered( |
313 | 313 | final Entity entity, final Packet<? super ClientGamePacketListener> packet, final Predicate<ServerPlayer> targetPredicate |
314 | 314 | ) { |
|
339 | 339 | if (entity.seenBy.contains(player.connection)) { |
340 | 340 | consumer.accept(entity.entity); |
341 | 341 | } |
342 | | -@@ -1212,6 +_,7 @@ |
| 342 | +@@ -1213,6 +_,7 @@ |
343 | 343 | private final int range; |
344 | 344 | private SectionPos lastSectionPos; |
345 | 345 | public final Set<ServerPlayerConnection> seenBy = new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>(); // Paper - Perf: optimise map impl |
346 | 346 | + public final ReentrantLock seenByLock = new ReentrantLock(); // ShreddedPaper - seenBy thread safety |
347 | 347 |
|
348 | 348 | // Paper start - optimise entity tracker |
349 | 349 | private long lastChunkUpdate = -1L; |
350 | | -@@ -1237,21 +_,33 @@ |
| 350 | +@@ -1238,21 +_,33 @@ |
351 | 351 | this.lastChunkUpdate = currChunkUpdate; |
352 | 352 | this.lastTrackedChunk = chunk; |
353 | 353 |
|
|
382 | 382 | } |
383 | 383 | } |
384 | 384 |
|
385 | | -@@ -1302,6 +_,91 @@ |
| 385 | +@@ -1303,6 +_,91 @@ |
386 | 386 | this.range = range; |
387 | 387 | this.lastSectionPos = SectionPos.of(entity); |
388 | 388 | } |
|
474 | 474 |
|
475 | 475 | @Override |
476 | 476 | public boolean equals(final Object obj) { |
477 | | -@@ -1315,9 +_,13 @@ |
| 477 | +@@ -1316,9 +_,13 @@ |
478 | 478 |
|
479 | 479 | @Override |
480 | 480 | public void sendToTrackingPlayers(final Packet<? super ClientGamePacketListener> packet) { |
|
488 | 488 | } |
489 | 489 |
|
490 | 490 | @Override |
491 | | -@@ -1330,27 +_,33 @@ |
| 491 | +@@ -1331,27 +_,33 @@ |
492 | 492 |
|
493 | 493 | @Override |
494 | 494 | public void sendToTrackingPlayersFiltered(final Packet<? super ClientGamePacketListener> packet, final Predicate<ServerPlayer> targetPredicate) { |
|
522 | 522 | } |
523 | 523 |
|
524 | 524 | public void updatePlayer(final ServerPlayer player) { |
525 | | -@@ -1384,6 +_,7 @@ |
| 525 | +@@ -1385,6 +_,7 @@ |
526 | 526 | } |
527 | 527 | // CraftBukkit end |
528 | 528 | if (visibleToPlayer) { |
529 | 529 | + this.seenByLock.lock(); try { // ShreddedPaper - seenBy thread safety |
530 | 530 | if (this.seenBy.add(player.connection)) { |
531 | 531 | // Paper start - entity tracking events |
532 | 532 | if (io.papermc.paper.event.player.PlayerTrackEntityEvent.getHandlerList().getRegisteredListeners().length == 0 || new io.papermc.paper.event.player.PlayerTrackEntityEvent(player.getBukkitEntity(), this.entity.getBukkitEntity()).callEvent()) { |
533 | | -@@ -1397,6 +_,7 @@ |
| 533 | +@@ -1398,6 +_,7 @@ |
534 | 534 | // Paper end - entity tracking events |
535 | 535 | this.serverEntity.onPlayerAdd(); // Paper - fix desync when a player is added to the tracker |
536 | 536 | } |
|
0 commit comments