diff options
Diffstat (limited to 'patch-remap/og/net/minecraft/server/level/ChunkMapDistance.patch')
-rw-r--r-- | patch-remap/og/net/minecraft/server/level/ChunkMapDistance.patch | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/patch-remap/og/net/minecraft/server/level/ChunkMapDistance.patch b/patch-remap/og/net/minecraft/server/level/ChunkMapDistance.patch new file mode 100644 index 0000000000..327db5593a --- /dev/null +++ b/patch-remap/og/net/minecraft/server/level/ChunkMapDistance.patch @@ -0,0 +1,137 @@ +--- a/net/minecraft/server/level/ChunkMapDistance.java ++++ b/net/minecraft/server/level/ChunkMapDistance.java +@@ -122,10 +122,25 @@ + } + + if (!this.chunksToUpdateFutures.isEmpty()) { +- this.chunksToUpdateFutures.forEach((playerchunk) -> { ++ // CraftBukkit start ++ // Iterate pending chunk updates with protection against concurrent modification exceptions ++ java.util.Iterator<PlayerChunk> iter = this.chunksToUpdateFutures.iterator(); ++ int expectedSize = this.chunksToUpdateFutures.size(); ++ do { ++ PlayerChunk playerchunk = iter.next(); ++ iter.remove(); ++ expectedSize--; ++ + playerchunk.updateFutures(playerchunkmap, this.mainThreadExecutor); +- }); +- this.chunksToUpdateFutures.clear(); ++ ++ // Reset iterator if set was modified using add() ++ if (this.chunksToUpdateFutures.size() != expectedSize) { ++ expectedSize = this.chunksToUpdateFutures.size(); ++ iter = this.chunksToUpdateFutures.iterator(); ++ } ++ } while (iter.hasNext()); ++ // CraftBukkit end ++ + return true; + } else { + if (!this.ticketsToRelease.isEmpty()) { +@@ -161,7 +176,7 @@ + } + } + +- void addTicket(long i, Ticket<?> ticket) { ++ boolean addTicket(long i, Ticket<?> ticket) { // CraftBukkit - void -> boolean + ArraySetSorted<Ticket<?>> arraysetsorted = this.getTickets(i); + int j = getTicketLevelAt(arraysetsorted); + Ticket<?> ticket1 = (Ticket) arraysetsorted.addOrGet(ticket); +@@ -171,13 +186,15 @@ + this.ticketTracker.update(i, ticket.getTicketLevel(), true); + } + ++ return ticket == ticket1; // CraftBukkit + } + +- void removeTicket(long i, Ticket<?> ticket) { ++ boolean removeTicket(long i, Ticket<?> ticket) { // CraftBukkit - void -> boolean + ArraySetSorted<Ticket<?>> arraysetsorted = this.getTickets(i); + ++ boolean removed = false; // CraftBukkit + if (arraysetsorted.remove(ticket)) { +- ; ++ removed = true; // CraftBukkit + } + + if (arraysetsorted.isEmpty()) { +@@ -185,6 +202,7 @@ + } + + this.ticketTracker.update(i, getTicketLevelAt(arraysetsorted), false); ++ return removed; // CraftBukkit + } + + public <T> void addTicket(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { +@@ -198,19 +216,33 @@ + } + + public <T> void addRegionTicket(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { ++ // CraftBukkit start ++ addRegionTicketAtDistance(tickettype, chunkcoordintpair, i, t0); ++ } ++ ++ public <T> boolean addRegionTicketAtDistance(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { ++ // CraftBukkit end + Ticket<T> ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0); + long j = chunkcoordintpair.toLong(); + +- this.addTicket(j, ticket); ++ boolean added = this.addTicket(j, ticket); // CraftBukkit + this.tickingTicketsTracker.addTicket(j, ticket); ++ return added; // CraftBukkit + } + + public <T> void removeRegionTicket(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { ++ // CraftBukkit start ++ removeRegionTicketAtDistance(tickettype, chunkcoordintpair, i, t0); ++ } ++ ++ public <T> boolean removeRegionTicketAtDistance(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { ++ // CraftBukkit end + Ticket<T> ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0); + long j = chunkcoordintpair.toLong(); + +- this.removeTicket(j, ticket); ++ boolean removed = this.removeTicket(j, ticket); // CraftBukkit + this.tickingTicketsTracker.removeTicket(j, ticket); ++ return removed; // CraftBukkit + } + + private ArraySetSorted<Ticket<?>> getTickets(long i) { +@@ -249,6 +281,7 @@ + ChunkCoordIntPair chunkcoordintpair = sectionposition.chunk(); + long i = chunkcoordintpair.toLong(); + ObjectSet<EntityPlayer> objectset = (ObjectSet) this.playersPerChunk.get(i); ++ if (objectset == null) return; // CraftBukkit - SPIGOT-6208 + + objectset.remove(entityplayer); + if (objectset.isEmpty()) { +@@ -378,6 +411,26 @@ + return !this.tickets.isEmpty(); + } + ++ // CraftBukkit start ++ public <T> void removeAllTicketsFor(TicketType<T> ticketType, int ticketLevel, T ticketIdentifier) { ++ Ticket<T> target = new Ticket<>(ticketType, ticketLevel, ticketIdentifier); ++ ++ for (java.util.Iterator<Entry<ArraySetSorted<Ticket<?>>>> iterator = this.tickets.long2ObjectEntrySet().fastIterator(); iterator.hasNext();) { ++ Entry<ArraySetSorted<Ticket<?>>> entry = iterator.next(); ++ ArraySetSorted<Ticket<?>> tickets = entry.getValue(); ++ if (tickets.remove(target)) { ++ // copied from removeTicket ++ this.ticketTracker.update(entry.getLongKey(), getTicketLevelAt(tickets), false); ++ ++ // can't use entry after it's removed ++ if (tickets.isEmpty()) { ++ iterator.remove(); ++ } ++ } ++ } ++ } ++ // CraftBukkit end ++ + private class a extends ChunkMap { + + private static final int MAX_LEVEL = ChunkLevel.MAX_LEVEL + 1; |