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