summaryrefslogtreecommitdiff
path: root/src/main/java/com/encrox/zombie/ZombieWorld.java
blob: 52ddea8c5e6e68462d883db2da01fecc2609bed6 (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
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;
	}

}