#644: Fix ChunkMapDistance#removeAllTicketsFor not propagating ticket level updates

Now call the method used in removeTicket for propagating the change,
so that chunks are guaranteed to unload
This commit is contained in:
Spottedleaf 2020-03-22 20:02:22 +11:00 committed by md_5
parent a6f809378c
commit 796eb15a5b

View File

@ -110,7 +110,7 @@
} }
public <T> void addTicket(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { public <T> void addTicket(TicketType<T> tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) {
@@ -251,6 +281,21 @@ @@ -251,6 +281,26 @@
return this.i.a(); return this.i.a();
} }
@ -118,21 +118,26 @@
+ public <T> void removeAllTicketsFor(TicketType<T> ticketType, int ticketLevel, T ticketIdentifier) { + public <T> void removeAllTicketsFor(TicketType<T> ticketType, int ticketLevel, T ticketIdentifier) {
+ Ticket<T> target = new Ticket<>(ticketType, ticketLevel, ticketIdentifier); + Ticket<T> target = new Ticket<>(ticketType, ticketLevel, ticketIdentifier);
+ +
+ for (java.util.Iterator<ArraySetSorted<Ticket<?>>> iterator = this.tickets.values().iterator(); iterator.hasNext();) { + for (java.util.Iterator<Entry<ArraySetSorted<Ticket<?>>>> iterator = this.tickets.long2ObjectEntrySet().fastIterator(); iterator.hasNext();) {
+ ArraySetSorted<Ticket<?>> tickets = iterator.next(); + Entry<ArraySetSorted<Ticket<?>>> entry = iterator.next();
+ tickets.remove(target); + ArraySetSorted<Ticket<?>> tickets = entry.getValue();
+ if (tickets.remove(target)) {
+ // copied from removeTicket
+ this.e.b(entry.getLongKey(), a(tickets), false); // PAIL ticketLevelTracker // PAIL update // PAIL getLowestTicketLevel
+ +
+ // can't use entry after it's removed
+ if (tickets.isEmpty()) { + if (tickets.isEmpty()) {
+ iterator.remove(); + iterator.remove();
+ } + }
+ } + }
+ } + }
+ }
+ // CraftBukkit end + // CraftBukkit end
+ +
class a extends ChunkMap { class a extends ChunkMap {
public a() { public a() {
@@ -331,13 +376,13 @@ @@ -331,13 +381,13 @@
Ticket<?> ticket = new Ticket<>(TicketType.PLAYER, ChunkMapDistance.b, new ChunkCoordIntPair(i)); Ticket<?> ticket = new Ticket<>(TicketType.PLAYER, ChunkMapDistance.b, new ChunkCoordIntPair(i));
if (flag1) { if (flag1) {
@ -148,7 +153,7 @@
}, i, false)); }, i, false));
} }
@@ -346,7 +391,7 @@ @@ -346,7 +396,7 @@
return j; return j;
})); }));
} else { } else {