-
-
Notifications
You must be signed in to change notification settings - Fork 88
Expand file tree
/
Copy pathChunkManager.java
More file actions
105 lines (81 loc) · 3.3 KB
/
ChunkManager.java
File metadata and controls
105 lines (81 loc) · 3.3 KB
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
package net.countercraft.movecraft.craft;
import jakarta.inject.Inject;
import net.countercraft.movecraft.Movecraft;
import net.countercraft.movecraft.MovecraftChunk;
import net.countercraft.movecraft.MovecraftLocation;
import net.countercraft.movecraft.config.Settings;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
@Deprecated
public class ChunkManager implements Listener {
@Inject
public ChunkManager(){}
private static final Set<MovecraftChunk> chunks = new HashSet<>();
public static void addChunksToLoad(Iterable<MovecraftChunk> list) {
for (MovecraftChunk chunk : list) {
if (chunks.add(chunk)) {
if (!chunk.isLoaded()) {
chunk.toBukkit().load(true);
}
}
}
// remove chunks after 10 seconds
new BukkitRunnable() {
@Override
public void run() {
ChunkManager.removeChunksToLoad(list);
}
}.runTaskLaterAsynchronously(Movecraft.getInstance(), 200L);
}
private static void removeChunksToLoad(Iterable<MovecraftChunk> list) {
for (MovecraftChunk chunk : list) {
chunks.remove(chunk);
}
}
@EventHandler
public void onChunkUnload(ChunkUnloadEvent event) {
Chunk chunk = event.getChunk();
MovecraftChunk c = new MovecraftChunk(chunk.getX(), chunk.getZ(), chunk.getWorld());
// if (chunks.contains(c)) event.setCancelled(true);
}
public static Set<MovecraftChunk> getChunks(Iterable<MovecraftLocation> hitBox, World world) {
return getChunks(hitBox, world, 0,0,0);
}
public static Set<MovecraftChunk> getChunks(Iterable<MovecraftLocation> oldHitBox, World world, int dx, int dy, int dz) {
Set<MovecraftChunk> chunks = new HashSet<>();
for (MovecraftLocation oldLocation : oldHitBox) {
var location = oldLocation.translate(dx, dy, dz);
int chunkX = location.getX() / 16;
if (location.getX() < 0) chunkX--;
int chunkZ = location.getZ() / 16;
if (location.getZ() < 0) chunkZ--;
MovecraftChunk chunk = new MovecraftChunk(chunkX, chunkZ, world);
chunks.add(chunk);
}
return chunks;
}
public static void checkChunks(Set<MovecraftChunk> chunks) {
chunks.removeIf(MovecraftChunk::isLoaded);
}
public static Future<Boolean> syncLoadChunks(Set<MovecraftChunk> chunks) {
if (Settings.Debug)
Movecraft.getInstance().getLogger().info("Loading " + chunks.size() + " chunks...");
if(Bukkit.isPrimaryThread()){
ChunkManager.addChunksToLoad(chunks);
return CompletableFuture.completedFuture(true);
}
return Bukkit.getScheduler().callSyncMethod(Movecraft.getInstance(), () -> {
ChunkManager.addChunksToLoad(chunks);
return true;
});
}
}