package com.bioxx.tfc2.handlers; import java.util.Random; import java.util.Vector; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import com.bioxx.jmapgen.IslandMap; import com.bioxx.jmapgen.graph.Center; import com.bioxx.jmapgen.graph.Center.Marker; import com.bioxx.tfc2.world.WorldGen; public class CreateSpawnHandler { @SubscribeEvent public void onCreateSpawn(WorldEvent.CreateSpawnPosition event) { World world = event.getWorld(); world.findingSpawnPoint = true; Random random = new Random(world.getSeed()); BlockPos blockpos = findTerrainPositionForSpawn(random); int i = 0; int j = world.provider.getAverageGroundLevel(); int k = 0; if (blockpos != null) { i = blockpos.getX(); k = blockpos.getZ(); } int l = 0; while (!world.provider.canCoordinateBeSpawn(i, k)) { i += random.nextInt(64) - random.nextInt(64); k += random.nextInt(64) - random.nextInt(64); ++l; if (l == 1000) { break; } } world.getWorldInfo().setSpawn(new BlockPos(i, j, k)); world.findingSpawnPoint = false; event.setCanceled(true); } public BlockPos findTerrainPositionForSpawn(Random random) { BlockPos blockpos = new BlockPos(0,0,0); IslandMap map = WorldGen.getInstance().getIslandMap(0, -2); Vector<Center> land = map.getCentersBelow(0.1, false); Center c = land.get(random.nextInt(land.size())); for(int i = 0; i < 10000; i++) { if(c.hasMarker(Marker.Coast)) { blockpos = new BlockPos((int)c.point.x + map.getParams().getWorldX(), 0, (int)c.point.y + map.getParams().getWorldZ()); return blockpos; } else if(c.elevation > 0) { c = c.downslope; } else { c = c.neighbors.get(0); } } blockpos = new BlockPos((int)c.point.x + map.getParams().getWorldX(), 0, (int)c.point.y + map.getParams().getWorldZ()); return blockpos; } }