// Path: src/net/zhuoweizhang/pocketinveditor/material/MaterialKey.java
// public final class MaterialKey {
// 
// 	public short typeId;
// 
// 	public short damage;
// 
// 	/**
// 	 * @param damage the damage/data value of the material. -1 is a pseudo-value that tells any replacement routines to match all data values.
// 	 */
// 	public MaterialKey(short typeId, short damage) {
// 		this.typeId = typeId;
// 		this.damage = damage;
// 	}
// 
// 	public MaterialKey(MaterialKey other) {
// 		this(other.typeId, other.damage);
// 	}
// 
// 	@Override
// 	public boolean equals(Object other) {
// 		if (other == this) return true;
// 		if (!(other instanceof MaterialKey)) return false;
// 		MaterialKey another = (MaterialKey) other;
// 		return another.typeId == this.typeId && another.damage == this.damage;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + typeId;
// 		result = prime * result + damage;
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "MaterialKey[typeId=" + typeId + ";damage=" + damage + "]";
// 	}
// 
// 	public static MaterialKey parse(String str, int radix) {
// 		String[] parts = str.split(":");
// 		if (parts.length == 0) throw new IllegalArgumentException("Why is the string blank?!");
// 		else if (parts.length == 1) {
// 			return new MaterialKey(Short.parseShort(parts[0], radix), (short) -1);
// 		} else {
// 			return new MaterialKey(Short.parseShort(parts[0], radix), Short.parseShort(parts[1], radix));
// 		}
// 	}
// }
// 
// Path: src/net/zhuoweizhang/pocketinveditor/material/MaterialCount.java
// public class MaterialCount {
// 
// 	public MaterialKey key;
// 
// 	public int count;
// 
// 	public MaterialCount(MaterialKey key, int count) {
// 
// 		this.key = key;
// 		this.count = count;
// 
// 	}
// 
// 	public String toString() {
// 		return "[" + key.typeId + ":" + key.damage + "]: " + count;
// 	}
// }
// 
// Path: src/net/zhuoweizhang/pocketinveditor/util/Vector3f.java
// public class Vector3f {
// 	
// 	public float x, y, z;
// 
// 	public Vector3f() {
// 		this(0f, 0f, 0f);
// 	}
// 	
// 	public Vector3f(float x, float y, float z) {
// 		this.x = x;
// 		this.y = y;
// 		this.z = z;
// 	}
// 
// 	public float getX() {
// 		return x;
// 	}
// 
// 	public Vector3f setX(float x) {
// 		this.x = x;
// 		return this;
// 	}
// 
// 	public float getY() {
// 		return y;
// 	}
// 
// 	public Vector3f setY(float y) {
// 		this.y = y;
// 		return this;
// 	}
// 
// 	public float getZ() {
// 		return z;
// 	}
// 
// 	public Vector3f setZ(float z) {
// 		this.z = z;
// 		return this;
// 	}
// 
// 	public int getBlockX() {
// 		return (int) x;
// 	}
// 
// 	public int getBlockY() {
// 		return (int) y;
// 	}
// 
// 	public int getBlockZ() {
// 		return (int) z;
// 	}
// 
// 	public double distSquared(Vector3f other) {
// 		return Math.pow(other.x - (double) this.x, 2) + Math.pow(other.y - (double) this.y, 2) + Math.pow(other.z - (double) this.z, 2);
// 	}
// 
// }


import java.util.HashMap;
import java.util.Map;
import net.zhuoweizhang.pocketinveditor.material.MaterialKey;
import net.zhuoweizhang.pocketinveditor.material.MaterialCount;
import net.zhuoweizhang.pocketinveditor.util.Vector3f;
					}
				}
			}
		}
		return replacedCount;

	}

	public static int makeDome(AreaBlockAccess mgr, Vector3f center, int radius, MaterialKey to, boolean hollow) {
		return makeDome(mgr, center.getBlockX(), center.getBlockY(), center.getBlockZ(), radius, to, hollow);
	}

	public static int makeDome(AreaBlockAccess mgr, int centerX, int centerY, int centerZ, int radius, MaterialKey to, boolean hollow) {
		int replacedCount = 0;

		int radiusSquared = radius * radius;
		int hollowRadiusSquared = (radius - 1) * (radius - 1);
		
		for (int x = -radius; x < radius; ++x) {
			for (int z = -radius; z < radius; ++z) {
				for (int y = 0; y < radius; ++y) {
					double distFromCenter = Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2);
					if (distFromCenter <= radiusSquared && (!hollow || distFromCenter >= hollowRadiusSquared)) {
						mgr.setBlockTypeId(centerX + x, centerY + y, centerZ + z, to.typeId);
						mgr.setBlockData(centerX + x, centerY + y, centerZ + z, to.damage);
						++replacedCount;
					}
				}
			}
		}
// Path: src/net/zhuoweizhang/pocketinveditor/material/MaterialKey.java
// public final class MaterialKey {
// 
// 	public short typeId;
// 
// 	public short damage;
// 
// 	/**
// 	 * @param damage the damage/data value of the material. -1 is a pseudo-value that tells any replacement routines to match all data values.
// 	 */
// 	public MaterialKey(short typeId, short damage) {
// 		this.typeId = typeId;
// 		this.damage = damage;
// 	}
// 
// 	public MaterialKey(MaterialKey other) {
// 		this(other.typeId, other.damage);
// 	}
// 
// 	@Override
// 	public boolean equals(Object other) {
// 		if (other == this) return true;
// 		if (!(other instanceof MaterialKey)) return false;
// 		MaterialKey another = (MaterialKey) other;
// 		return another.typeId == this.typeId && another.damage == this.damage;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + typeId;
// 		result = prime * result + damage;
// 		return result;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "MaterialKey[typeId=" + typeId + ";damage=" + damage + "]";
// 	}
// 
// 	public static MaterialKey parse(String str, int radix) {
// 		String[] parts = str.split(":");
// 		if (parts.length == 0) throw new IllegalArgumentException("Why is the string blank?!");
// 		else if (parts.length == 1) {
// 			return new MaterialKey(Short.parseShort(parts[0], radix), (short) -1);
// 		} else {
// 			return new MaterialKey(Short.parseShort(parts[0], radix), Short.parseShort(parts[1], radix));
// 		}
// 	}
// }
// 
// Path: src/net/zhuoweizhang/pocketinveditor/material/MaterialCount.java
// public class MaterialCount {
// 
// 	public MaterialKey key;
// 
// 	public int count;
// 
// 	public MaterialCount(MaterialKey key, int count) {
// 
// 		this.key = key;
// 		this.count = count;
// 
// 	}
// 
// 	public String toString() {
// 		return "[" + key.typeId + ":" + key.damage + "]: " + count;
// 	}
// }
// 
// Path: src/net/zhuoweizhang/pocketinveditor/util/Vector3f.java
// public class Vector3f {
// 	
// 	public float x, y, z;
// 
// 	public Vector3f() {
// 		this(0f, 0f, 0f);
// 	}
// 	
// 	public Vector3f(float x, float y, float z) {
// 		this.x = x;
// 		this.y = y;
// 		this.z = z;
// 	}
// 
// 	public float getX() {
// 		return x;
// 	}
// 
// 	public Vector3f setX(float x) {
// 		this.x = x;
// 		return this;
// 	}
// 
// 	public float getY() {
// 		return y;
// 	}
// 
// 	public Vector3f setY(float y) {
// 		this.y = y;
// 		return this;
// 	}
// 
// 	public float getZ() {
// 		return z;
// 	}
// 
// 	public Vector3f setZ(float z) {
// 		this.z = z;
// 		return this;
// 	}
// 
// 	public int getBlockX() {
// 		return (int) x;
// 	}
// 
// 	public int getBlockY() {
// 		return (int) y;
// 	}
// 
// 	public int getBlockZ() {
// 		return (int) z;
// 	}
// 
// 	public double distSquared(Vector3f other) {
// 		return Math.pow(other.x - (double) this.x, 2) + Math.pow(other.y - (double) this.y, 2) + Math.pow(other.z - (double) this.z, 2);
// 	}
// 
// }


// Path: src/net/zhuoweizhang/pocketinveditor/geo/GeoUtils.java
import java.util.HashMap;
import java.util.Map;
import net.zhuoweizhang.pocketinveditor.material.MaterialKey;
import net.zhuoweizhang.pocketinveditor.material.MaterialCount;
import net.zhuoweizhang.pocketinveditor.util.Vector3f;

					}
				}
			}
		}
		return replacedCount;

	}

	public static int makeDome(AreaBlockAccess mgr, Vector3f center, int radius, MaterialKey to, boolean hollow) {
		return makeDome(mgr, center.getBlockX(), center.getBlockY(), center.getBlockZ(), radius, to, hollow);
	}

	public static int makeDome(AreaBlockAccess mgr, int centerX, int centerY, int centerZ, int radius, MaterialKey to, boolean hollow) {
		int replacedCount = 0;

		int radiusSquared = radius * radius;
		int hollowRadiusSquared = (radius - 1) * (radius - 1);
		
		for (int x = -radius; x < radius; ++x) {
			for (int z = -radius; z < radius; ++z) {
				for (int y = 0; y < radius; ++y) {
					double distFromCenter = Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2);
					if (distFromCenter <= radiusSquared && (!hollow || distFromCenter >= hollowRadiusSquared)) {
						mgr.setBlockTypeId(centerX + x, centerY + y, centerZ + z, to.typeId);
						mgr.setBlockData(centerX + x, centerY + y, centerZ + z, to.damage);
						++replacedCount;
					}
				}
			}
		}
		return replacedCount;