-
Notifications
You must be signed in to change notification settings - Fork 497
/
MapManager.java
102 lines (82 loc) · 2.32 KB
/
MapManager.java
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
package buildcraft.robotics.map;
import java.io.File;
import java.util.Date;
import com.google.common.collect.HashBiMap;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.event.world.ChunkEvent;
public class MapManager implements Runnable {
private final HashBiMap<World, MapWorld> worldMap = HashBiMap.create();
private final File location;
private boolean stop = false;
private long lastSaveTime;
public MapManager(File location) {
this.location = location;
}
public void stop() {
stop = true;
}
public MapWorld getWorld(World world) {
if (world.isRemote) {
return null;
}
if (!worldMap.containsKey(world)) {
synchronized (worldMap) {
worldMap.put(world, new MapWorld(world, location));
}
}
return worldMap.get(world);
}
@SubscribeEvent
public void chunkLoaded(ChunkEvent.Load event) {
MapWorld world = getWorld(event.getChunk().worldObj);
if (world != null) {
world.queueChunkForUpdateIfEmpty(event.getChunk().xPosition, event.getChunk().zPosition, 99999);
}
}
@SubscribeEvent
public void blockPlaced(BlockEvent.PlaceEvent placeEvent) {
Chunk chunk = placeEvent.world.getChunkFromBlockCoords(placeEvent.x, placeEvent.z);
MapWorld world = getWorld(placeEvent.world);
if (world != null) {
world.queueChunkForUpdate(chunk.xPosition, chunk.zPosition, 512);
}
}
@SubscribeEvent
public void blockBroken(BlockEvent.BreakEvent placeEvent) {
Chunk chunk = placeEvent.world.getChunkFromBlockCoords(placeEvent.x, placeEvent.z);
MapWorld world = getWorld(placeEvent.world);
if (world != null) {
world.queueChunkForUpdate(chunk.xPosition, chunk.zPosition, 512);
}
}
public void saveAllWorlds() {
synchronized (worldMap) {
for (MapWorld world : worldMap.values()) {
world.save();
}
}
}
@Override
public void run() {
lastSaveTime = (new Date()).getTime();
while (!stop) {
synchronized (worldMap) {
for (MapWorld world : worldMap.values()) {
world.updateChunkInQueue();
}
}
long now = (new Date()).getTime();
if (now - lastSaveTime > 120000) {
saveAllWorlds();
lastSaveTime = now;
}
try {
Thread.sleep(50 * worldMap.size());
} catch (Exception e) {
}
}
}
}