function MCWorld(%name, %seed) {
	if (isObject(MCWorld)) {
		return -1;
	}

	if (%seed $= "") {
		%seed = getRandom();
	}

	%obj = new ScriptGroup(MCWorld) {
		name = %name;
		seed = %seed;
	};

	if (isObject(MissionCleanup)) {
		MissionCleanup.add(%obj);
	}

	return %obj;
}

function MCWorld::getTerrainHeight(%this, %x, %y) {
	if (%this.height[%x, %y] !$= "") {
		return %this.height[%x, %y];
	}

	if(!isObject($perlin))
		$perlin = new ScriptObject() {
			class = Perlin;
		};

	%min = 63;
	%max = 119;

	//%quality = 256 + %this.seed;
	//%quality = 200 + %this.seed;
	%quality = 350 + %this.seed;

	%height = $perlin.noise((%x / %this.seed) / %quality, (%y / %this.seed) / %quality, %this.seed);
	%height = (%height * (%max - %min)) + %min;

	if (%height < 0) {
		%height = 0;
	}

	%height += 1;

	if (%height > 119) {
		%height = 119;
	}

	%this.height[%x, %y] = %height;
	return %height;
}

function MCWorld::createSpawnRegion(%this, %dim) {
	ChunkSO($MC::CenterChunkX, $MC::CenterChunkY, %dim);

	for (%x = $MC::CenterChunkX - 2; %x <= $MC::CenterChunkX + 2; %x++) {
		for (%y = $MC::CenterChunkY - 2; %y <= $MC::CenterChunkY + 2; %y++) {
			if (vectorDist(%x SPC %y SPC 0, $MC::CenterChunkX SPC $MC::CenterChunkY SPC 0) > 2) {
				continue;
			}

			if (%x == 0 && %y == 0) {
				continue;
			}

			ChunkSO(%x, %y, %dim);
		}
	}
}

function MCWorld::setBlock(%this, %x, %y, %z, %dataBlock, %dim)
{
	if (%dim $= "") {
		%dim = 0;
	}

	%x = mFloor(%x);
	%y = mFloor(%y);
	%z = mFloor(%z);

	%round = roundToChunkIndex(%x SPC %y SPC %z);

	%cx = getWord(%round, 0);
	%cy = getWord(%round, 1);

	%chunk = ChunkSO(%cx, %cy, %dim);

	if (!isObject(%chunk)) {
		return;
	}

	%pos = vectorSub(%x SPC %y SPC %z, %chn.getPosition());

	%px = getWord(%pos, 0);
	%py = getWord(%pos, 1);
	%pz = getWord(%pos, 2);

	%chn.setBlock(%px, %py, %pz, %dataBlock);
}

function MCWorld::getBlock(%this, %x, %y, %z, %dim)
{
	if (%dim $= "") {
		%dim = 0;
	}

	%x = mFloor(%x);
	%y = mFloor(%y);
	%z = mFloor(%z);

	%round = roundToChunkIndex(%x SPC %y SPC %z);

	%cx = getWord(%round, 0);
	%cy = getWord(%round, 1);

	%chunk = ChunkSO(%cx, %cy, %dim);

	if (!isObject(%chunk)) {
		return;
	}

	%pos = vectorSub(%x SPC %y SPC %z, %chunk.getPosition());

	%px = getWord(%pos, 0);
	%py = getWord(%pos, 1);
	%pz = getWord(%pos, 2);

	return %chunk.getBlock(%px, %py, %pz);
}

function MCWorld::getTemperature(%this, %x, %y, %dim)
{
	if (%dim $= "") {
		%dim = 0;
	}

	%x = mFloor(%x);
	%y = mFloor(%y);
	%z = mFloor(%z);

	%round = roundToChunkIndex(%x SPC %y SPC %z);

	%cx = getWord(%round, 0);
	%cy = getWord(%round, 1);

	%chunk = ChunkSO(%cx, %cy, %dim);

	if (!isObject(%chunk)) {
		return;
	}

	%pos = vectorSub(%x SPC %y SPC %z, %chunk.getPosition());

	%px = getWord(%pos, 0);
	%py = getWord(%pos, 1);

	return %chunk.getTemperature(%px, %py);
}

function MCWorld::getHumidity(%this, %x, %y, %dim)
{
	if (%dim $= "") {
		%dim = 0;
	}

	%x = mFloor(%x);
	%y = mFloor(%y);
	%z = mFloor(%z);

	%round = roundToChunkIndex(%x SPC %y SPC %z);

	%cx = getWord(%round, 0);
	%cy = getWord(%round, 1);

	%chunk = ChunkSO(%cx, %cy, %dim);

	if (!isObject(%chunk)) {
		return;
	}

	%pos = vectorSub(%x SPC %y SPC %z, %chunk.getPosition());

	%px = getWord(%pos, 0);
	%py = getWord(%pos, 1);

	return %chunk.getHumidity(%px, %py);
}
