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
|
package com.encrox.zombie;
import java.util.ArrayList;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
import com.encrox.instancedregions.InstancedProtectedCuboidRegion;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class ZombieWorld {
private Plugin plugin;
private World world;
private ArrayList<ProtectedRegion> regions;
private int lastX;
public ZombieWorld(Plugin plugin, World world) {
this.world = world;
this.plugin = plugin;
regions = new ArrayList<ProtectedRegion>();
lastX = 0;
}
public InstancedProtectedCuboidRegion allocate(int width, int length) {
BlockVector min, max;
InstancedProtectedCuboidRegion region;
for(int i = 0; true; i+=16) {
if(new ProtectedCuboidRegion("current", (min = new BlockVector(lastX+i, 0, 0)), (max = new BlockVector(lastX+i+width, 255, length))).getIntersectingRegions(regions).isEmpty()) {
region = new InstancedProtectedCuboidRegion(plugin, world, ""+min.getBlockX(), min, max);
regions.add(region);
return region;
}
}
}
public InstancedProtectedCuboidRegion allocate(Schematic schematic) {
BlockVector min, max;
InstancedProtectedCuboidRegion region;
for(int i = 0; true; i+=16) {
if(new ProtectedCuboidRegion("current", (min = new BlockVector(lastX+i, 0, 0)), (max = new BlockVector(lastX+i+schematic.width, 255, schematic.length))).getIntersectingRegions(regions).isEmpty()) {
region = new InstancedProtectedCuboidRegion(plugin, world, ""+min.getBlockX(), min, max);
schematic.reset();
for(int y = 0; y<schematic.height; y++) {
for(int z = 0; z<schematic.length; z++) {
for(int x = 0; x<schematic.width; x++) {
//System.out.println("block set at: (" + (min.getBlockX()+x) + ", " + (64+y) + ", " + (min.getBlockZ()+z) + ")");
world.getBlockAt(min.getBlockX()+x, 64+y, min.getBlockZ()+z).setType(Material.getMaterial(schematic.getBlockIdAt(x, y, z)));
world.getBlockAt(min.getBlockX()+x, 64+y, min.getBlockZ()+z).setData(schematic.getDataAt(x, y, z));;
}
}
}
regions.add(region);
return region;
}
}
}
//YOU STILL HAVE TO DISPOSE THE INSTANCED REGION MANUALLY!
public void deallocate(InstancedProtectedCuboidRegion region) {
BlockVector min = region.getMinimumPoint(), max = region.getMaximumPoint();
for(int y = min.getBlockY(), ymax = max.getBlockY(); y<ymax; y++) {
for(int z = min.getBlockZ(), zmax = max.getBlockZ(); z<zmax; z++) {
for(int x = min.getBlockX(), xmax = max.getBlockX(); x<xmax; x++) {
world.getBlockAt(x, y, z).setType(Material.AIR);
}
}
}
regions.remove(region);
}
public World getWorld() {
return world;
}
}
|