summaryrefslogtreecommitdiffstats
path: root/nms-patches/ChunkProviderServer.patch
blob: 01b456d2b14d25dced936a9a717c417bdd7f9784 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
--- a/net/minecraft/server/ChunkProviderServer.java
+++ b/net/minecraft/server/ChunkProviderServer.java
@@ -18,12 +18,17 @@
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
+// CraftBukkit start
+import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor;
+import org.bukkit.event.world.ChunkUnloadEvent;
+// CraftBukkit end
+
 public class ChunkProviderServer implements IChunkProvider {
 
     private static final Logger a = LogManager.getLogger();
     public final LongSet unloadQueue = new LongOpenHashSet();
     public final ChunkGenerator<?> chunkGenerator;
-    private final IChunkLoader chunkLoader;
+    public final IChunkLoader chunkLoader; // PAIL
     public final Long2ObjectMap<Chunk> chunks = Long2ObjectMaps.synchronize(new ChunkMap(8192));
     private Chunk lastChunk;
     private final ChunkTaskScheduler chunkScheduler;
@@ -36,7 +41,7 @@
         this.chunkLoader = ichunkloader;
         this.chunkGenerator = chunkgenerator;
         this.asyncTaskHandler = iasynctaskhandler;
-        this.chunkScheduler = new ChunkTaskScheduler(2, worldserver, chunkgenerator, ichunkloader, iasynctaskhandler);
+        this.chunkScheduler = new ChunkTaskScheduler(0, worldserver, chunkgenerator, ichunkloader, iasynctaskhandler); // CraftBukkit - very buggy, broken in lots of __subtle__ ways. Same goes for async chunk loading. Also Bukkit API / plugins can't handle async events at all anyway.
         this.batchScheduler = new SchedulerBatch(this.chunkScheduler);
     }
 
@@ -86,9 +91,10 @@
 
             if (flag) {
                 try {
-                    chunk = this.chunkLoader.a(this.world, i, j, (chunk) -> {
-                        chunk.setLastSaved(this.world.getTime());
-                        this.chunks.put(ChunkCoordIntPair.a(i, j), chunk);
+                    // CraftBukkit - decompile error
+                    chunk = this.chunkLoader.a(this.world, i, j, (chunk1) -> {
+                        chunk1.setLastSaved(this.world.getTime());
+                        this.chunks.put(ChunkCoordIntPair.a(i, j), chunk1);
                     });
                 } catch (Exception exception) {
                     ChunkProviderServer.a.error("Couldn\'t load chunk", exception);
@@ -103,7 +109,7 @@
             try {
                 this.batchScheduler.b();
                 this.batchScheduler.a(new ChunkCoordIntPair(i, j));
-                CompletableFuture completablefuture = this.batchScheduler.c();
+                CompletableFuture<ProtoChunk> completablefuture = this.batchScheduler.c(); // CraftBukkit - decompile error
 
                 return (Chunk) completablefuture.thenApply(this::a).join();
             } catch (RuntimeException runtimeexception) {
@@ -114,6 +120,22 @@
         }
     }
 
+    // CraftBukkit start
+    public Chunk generateChunk(int x, int z) {
+        try {
+            this.batchScheduler.b();
+            ChunkCoordIntPair pos = new ChunkCoordIntPair(x, z);
+            this.chunkScheduler.forcePolluteCache(pos);
+            this.batchScheduler.a(pos);
+            CompletableFuture<ProtoChunk> completablefuture = this.batchScheduler.c();
+
+            return (Chunk) completablefuture.thenApply(this::a).join();
+        } catch (RuntimeException runtimeexception) {
+            throw this.a(x, z, (Throwable) runtimeexception);
+        }
+    }
+    // CraftBukkit end
+
     public IChunkAccess a(int i, int j, boolean flag) {
         Chunk chunk = this.getChunkAt(i, j, true, false);
 
@@ -251,10 +273,12 @@
                         Chunk chunk = (Chunk) this.chunks.get(olong);
 
                         if (chunk != null) {
-                            chunk.removeEntities();
-                            this.saveChunk(chunk);
-                            this.chunks.remove(olong);
-                            this.lastChunk = null;
+                            // CraftBukkit start - move unload logic to own method
+                            if (!unloadChunk(chunk, true)) {
+                                continue;
+                            }
+                            // CraftBukkit end
+
                             ++i;
                         }
                     }
@@ -267,6 +291,42 @@
         return false;
     }
 
+    // CraftBukkit start
+    public boolean unloadChunk(Chunk chunk, boolean save) {
+        ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk, save);
+        this.world.getServer().getPluginManager().callEvent(event);
+        if (event.isCancelled()) {
+            return false;
+        }
+        save = event.isSaveChunk();
+
+        // Update neighbor counts
+        for (int x = -2; x < 3; x++) {
+            for (int z = -2; z < 3; z++) {
+                if (x == 0 && z == 0) {
+                    continue;
+                }
+
+                Chunk neighbor = this.getChunkAt(chunk.locX + x, chunk.locZ + z, false, false);
+                if (neighbor != null) {
+                    neighbor.setNeighborUnloaded(-x, -z);
+                    chunk.setNeighborUnloaded(x, z);
+                }
+            }
+        }
+        // Moved from unloadChunks above
+        synchronized (this.chunkLoader) {
+            chunk.removeEntities();
+            if (save) {
+                this.saveChunk(chunk);
+            }
+            this.chunks.remove(chunk.chunkKey);
+            this.lastChunk = null;
+        }
+        return true;
+    }
+    // CraftBukkit end
+
     public boolean d() {
         return !this.world.savingDisabled;
     }