I have a problem with my structure; it doesn't spawn! I use the component way and I have the component files, structure files and the MapGen file. Is there anything else I need to do in order to make the structure spawn?
I tried with your code (and changed some stuff) but it didn't work (probably because I'm using ModLoader), so here's my original code (that has something to do with the structure):
ComponentPigmanVillage
package net.minecraft.src;
import java.util.List;
import java.util.Random;
abstract class ComponentPigmanVillage extends StructureComponent
{
private int villagersSpawned;
protected ComponentPigmanVillageStartPiece startPiece;
protected ComponentPigmanVillage(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2)
{
super(par2);
this.startPiece = par1ComponentVillageStartPiece;
}
protected StructureComponent getNextComponentNN(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, List par2List, Random par3Random, int par4, int par5)
{
switch (this.coordBaseMode)
{
case 0:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 1, this.getComponentType());
case 1:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.minZ - 1, 2, this.getComponentType());
case 2:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 1, this.getComponentType());
case 3:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.minZ - 1, 2, this.getComponentType());
default:
return null;
}
}
protected StructureComponent getNextComponentPP(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, List par2List, Random par3Random, int par4, int par5)
{
switch (this.coordBaseMode)
{
case 0:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 3, this.getComponentType());
case 1:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.maxZ + 1, 0, this.getComponentType());
case 2:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 3, this.getComponentType());
case 3:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.maxZ + 1, 0, this.getComponentType());
default:
return null;
}
}
protected int getAverageGroundLevel(World par1World, StructureBoundingBox par2StructureBoundingBox)
{
int var3 = 0;
int var4 = 0;
for (int var5 = this.boundingBox.minZ; var5 <= this.boundingBox.maxZ; ++var5)
{
for (int var6 = this.boundingBox.minX; var6 <= this.boundingBox.maxX; ++var6)
{
if (par2StructureBoundingBox.isVecInside(var6, 64, var5))
{
var3 += Math.max(par1World.getTopSolidOrLiquidBlock(var6, var5), par1World.provider.getAverageGroundLevel());
++var4;
}
}
}
if (var4 == 0)
{
return -1;
}
else
{
return var3 / var4;
}
}
protected static boolean canVillageGoDeeper(StructureBoundingBox par0StructureBoundingBox)
{
return par0StructureBoundingBox != null && par0StructureBoundingBox.minY > 10;
}
protected void spawnVillagers(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6)
{
if (this.villagersSpawned < par6)
{
for (int var7 = this.villagersSpawned; var7 < par6; ++var7)
{
int var8 = this.getXWithOffset(par3 + var7, par5);
int var9 = this.getYWithOffset(par4);
int var10 = this.getZWithOffset(par3 + var7, par5);
if (!par2StructureBoundingBox.isVecInside(var8, var9, var10))
{
break;
}
++this.villagersSpawned;
EntityPigman var11 = new EntityPigman(par1World);
var11.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var11);
EntityPigman var111 = new EntityPigman(par1World);
var111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var111);
EntityPigman var1111 = new EntityPigman(par1World);
var1111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var1111);
EntityPigman var11111 = new EntityPigman(par1World);
var11111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var11111);
EntityPigman var111111 = new EntityPigman(par1World);
var111111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var111111);
}
}
}
protected int getBiomeSpecificBlock(int par1, int par2)
{
if (this.startPiece.inDesert)
{
if (par1 == Block.wood.blockID)
{
return Block.blockNetherQuartz.blockID;
}
if (par1 == Block.cobblestone.blockID)
{
return Block.cobblestone.blockID;
}
if (par1 == Block.planks.blockID)
{
return Block.netherBrick.blockID;
}
if (par1 == Block.stairsWoodOak.blockID)
{
return Block.stairsNetherBrick.blockID;
}
if (par1 == Block.gravel.blockID)
{
return Block.cobblestone.blockID;
}
}
return par1;
}
protected int getBiomeSpecificBlockMetadata(int par1, int par2)
{
if (this.startPiece.inDesert)
{
if (par1 == Block.wood.blockID)
{
return 0;
}
if (par1 == Block.cobblestone.blockID)
{
return 0;
}
if (par1 == Block.planks.blockID)
{
return 2;
}
}
return par2;
}
protected void placeBlockAtCurrentPosition(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)
{
int var8 = this.getBiomeSpecificBlock(par2, par3);
int var9 = this.getBiomeSpecificBlockMetadata(par2, par3);
super.placeBlockAtCurrentPosition(par1World, var8, var9, par4, par5, par6, par7StructureBoundingBox);
}
protected void fillWithBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, int par9, int par10, boolean par11)
{
int var12 = this.getBiomeSpecificBlock(par9, 0);
int var13 = this.getBiomeSpecificBlockMetadata(par9, 0);
int var14 = this.getBiomeSpecificBlock(par10, 0);
int var15 = this.getBiomeSpecificBlockMetadata(par10, 0);
super.fillWithMetadataBlocks(par1World, par2StructureBoundingBox, par3, par4, par5, par6, par7, par8, var12, var13, var14, var15, par11);
}
protected void fillCurrentPositionBlocksDownwards(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)
{
int var8 = this.getBiomeSpecificBlock(par2, par3);
int var9 = this.getBiomeSpecificBlockMetadata(par2, par3);
super.fillCurrentPositionBlocksDownwards(par1World, var8, var9, par4, par5, par6, par7StructureBoundingBox);
}
}
package net.minecraft.src;
public abstract class ComponentPigmanVillageRoadPiece extends ComponentPigmanVillage
{
protected ComponentPigmanVillageRoadPiece(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2)
{
super(par1ComponentVillageStartPiece, par2);
}
}
ComponentPigmanVillagePathGen
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ComponentPigmanVillagePathGen extends ComponentPigmanVillageRoadPiece
{
private int averageGroundLevel;
public ComponentPigmanVillagePathGen(ComponentPigmanVillageStartPiece par1ComponentPigmanVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5)
{
super(par1ComponentPigmanVillageStartPiece, par2);
this.coordBaseMode = par5;
this.boundingBox = par4StructureBoundingBox;
this.averageGroundLevel = Math.max(par4StructureBoundingBox.getXSize(), par4StructureBoundingBox.getZSize());
}
public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random)
{
boolean var4 = false;
int var5;
StructureComponent var6;
for (var5 = par3Random.nextInt(5); var5 < this.averageGroundLevel - 8; var5 += 2 + par3Random.nextInt(5))
{
var6 = this.getNextComponentNN((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, var5);
if (var6 != null)
{
var5 += Math.max(var6.boundingBox.getXSize(), var6.boundingBox.getZSize());
var4 = true;
}
}
for (var5 = par3Random.nextInt(5); var5 < this.averageGroundLevel - 8; var5 += 2 + par3Random.nextInt(5))
{
var6 = this.getNextComponentPP((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, var5);
if (var6 != null)
{
var5 += Math.max(var6.boundingBox.getXSize(), var6.boundingBox.getZSize());
var4 = true;
}
}
if (var4 && par3Random.nextInt(3) > 0)
{
switch (this.coordBaseMode)
{
case 0:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 1, this.getComponentType());
break;
case 1:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType());
break;
case 2:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.minZ, 1, this.getComponentType());
break;
case 3:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType());
}
}
if (var4 && par3Random.nextInt(3) > 0)
{
switch (this.coordBaseMode)
{
case 0:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 3, this.getComponentType());
break;
case 1:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType());
break;
case 2:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.minZ, 3, this.getComponentType());
break;
case 3:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType());
}
}
}
public static StructureBoundingBox func_74933_a(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6)
{
for (int var7 = 7 * MathHelper.getRandomIntegerInRange(par2Random, 3, 5); var7 >= 7; var7 -= 7)
{
StructureBoundingBox var8 = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 3, 3, var7, par6);
if (StructureComponent.findIntersecting(par1List, var8) == null)
{
return var8;
}
}
return null;
}
public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
{
int var4 = this.getBiomeSpecificBlock(Block.gravel.blockID, 0);
for (int var5 = this.boundingBox.minX; var5 <= this.boundingBox.maxX; ++var5)
{
for (int var6 = this.boundingBox.minZ; var6 <= this.boundingBox.maxZ; ++var6)
{
if (par3StructureBoundingBox.isVecInside(var5, 64, var6))
{
int var7 = par1World.getTopSolidOrLiquidBlock(var5, var6) - 1;
par1World.setBlock(var5, var7, var6, var6, 0, 2);
}
}
}
return true;
}
}
ComponentPigmanVillageStartPiece
package net.minecraft.src;
import java.util.ArrayList;
import java.util.Random;
public class ComponentPigmanVillageStartPiece extends ComponentPigmanVillageFountain
{
public final WorldChunkManager worldChunkMngr;
public final boolean inDesert;
public final int terrainType;
public StructureVillagePieceWeight structVillagePieceWeight;
public ArrayList structureVillageWeightedPieceList;
public ArrayList field_74932_i = new ArrayList();
public ArrayList field_74930_j = new ArrayList();
public ComponentPigmanVillageStartPiece(WorldChunkManager par1WorldChunkManager, int par2, Random par3Random, int par4, int par5, ArrayList par6ArrayList, int par7)
{
super((ComponentPigmanVillageStartPiece)null, 0, par3Random, par4, par5);
this.worldChunkMngr = par1WorldChunkManager;
this.structureVillageWeightedPieceList = par6ArrayList;
this.terrainType = par7;
BiomeGenBase var8 = par1WorldChunkManager.getBiomeGenAt(par4, par5);
this.inDesert = var8 == BiomeGenBase.hell;
this.startPiece = this;
}
public WorldChunkManager getWorldChunkManager()
{
return this.worldChunkMngr;
}
}
StructurePigmanVillagePieces
package net.minecraft.src;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class StructurePigmanVillagePieces
{
public static ArrayList getStructurePigmanVillageWeightedPieceList(Random par0Random, int par1)
{
ArrayList var2 = new ArrayList();
var2.add(new StructurePigmanVillagePieceWeight(ComponentPigmanVillageHouse1.class, 4, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 3 + par1 * 2)));
Iterator var3 = var2.iterator();
while (var3.hasNext())
{
if (((StructurePigmanVillagePieceWeight)var3.next()).villagePiecesLimit == 0)
{
var3.remove();
}
}
return var2;
}
private static int func_75079_a(List par0List)
{
boolean var1 = false;
int var2 = 0;
StructurePigmanVillagePieceWeight var4;
for (Iterator var3 = par0List.iterator(); var3.hasNext(); var2 += var4.villagePieceWeight)
{
var4 = (StructurePigmanVillagePieceWeight)var3.next();
if (var4.villagePiecesLimit > 0 && var4.villagePiecesSpawned < var4.villagePiecesLimit)
{
var1 = true;
}
}
return var1 ? var2 : -1;
}
private static ComponentPigmanVillage func_75083_a(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, StructureVillagePieceWeight var12, List par2List, Random par3Random, int par4, int par5, int par6, int par7, int par8)
{
Class var9 = var12.villagePieceClass;
Object var10 = null;
if (var9 == ComponentPigmanVillageHouse1.class)
{
var10 = ComponentPigmanVillageHouse1.func_74898_a(par0ComponentPigmanVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
}
/* else if (var9 == ComponentVillageChurch.class)
{
var10 = ComponentVillageChurch.func_74919_a(par0ComponentPigmanVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
}
*/
return (ComponentPigmanVillage)var10;
}
private static ComponentPigmanVillage getNextVillageComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
int var8 = func_75079_a(par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList);
if (var8 <= 0)
{
return null;
}
else
{
int var9 = 0;
while (var9 < 5)
{
++var9;
int var10 = par2Random.nextInt(var8);
Iterator var11 = par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.iterator();
while (var11.hasNext())
{
StructureVillagePieceWeight var12 = (StructureVillagePieceWeight)var11.next();
var10 -= var12.villagePieceWeight;
if (var10 < 0)
{
if (!var12.canSpawnMoreVillagePiecesOfType(par7) || var12 == par0ComponentPigmanVillageStartPiece.structVillagePieceWeight && par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.size() > 1)
{
break;
}
ComponentPigmanVillage var13 = func_75083_a(par0ComponentPigmanVillageStartPiece, var12, par1List, par2Random, par3, par4, par5, par6, par7);
if (var13 != null)
{
++var12.villagePiecesSpawned;
par0ComponentPigmanVillageStartPiece.structVillagePieceWeight = var12;
if (!var12.canSpawnMoreVillagePieces())
{
par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.remove(var12);
}
return var13;
}
}
}
}
StructureBoundingBox var14 = ComponentPigmanVillageLamp.func_74904_a(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
if (var14 != null)
{
return new ComponentPigmanVillageLamp(par0ComponentPigmanVillageStartPiece, par7, par2Random, var14, par6);
}
else
{
return null;
}
}
}
private static StructureComponent getNextVillageStructureComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
if (par7 > 50)
{
return null;
}
else if (Math.abs(par3 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minZ) <= 112)
{
ComponentPigmanVillage var8 = getNextVillageComponent(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7 + 1);
if (var8 != null)
{
int var9 = (var8.boundingBox.minX + var8.boundingBox.maxX) / 2;
int var10 = (var8.boundingBox.minZ + var8.boundingBox.maxZ) / 2;
int var11 = var8.boundingBox.maxX - var8.boundingBox.minX;
int var12 = var8.boundingBox.maxZ - var8.boundingBox.minZ;
int var13 = var11 > var12 ? var11 : var12;
if (par0ComponentPigmanVillageStartPiece.getWorldChunkManager().areBiomesViable(var9, var10, var13 / 2 + 4, MapGenPigmanVillage.villageSpawnBiomes))
{
par1List.add(var8);
par0ComponentPigmanVillageStartPiece.field_74932_i.add(var8);
return var8;
}
}
return null;
}
else
{
return null;
}
}
private static StructureComponent getNextComponentPigmanVillagePath(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
if (par7 > 3 + par0ComponentPigmanVillageStartPiece.terrainType)
{
return null;
}
else if (Math.abs(par3 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minZ) <= 112)
{
StructureBoundingBox var8 = ComponentPigmanVillagePathGen.func_74933_a(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
if (var8 != null && var8.minY > 10)
{
ComponentPigmanVillagePathGen var9 = new ComponentPigmanVillagePathGen(par0ComponentPigmanVillageStartPiece, par7, par2Random, var8, par6);
int var10 = (var9.boundingBox.minX + var9.boundingBox.maxX) / 2;
int var11 = (var9.boundingBox.minZ + var9.boundingBox.maxZ) / 2;
int var12 = var9.boundingBox.maxX - var9.boundingBox.minX;
int var13 = var9.boundingBox.maxZ - var9.boundingBox.minZ;
int var14 = var12 > var13 ? var12 : var13;
if (par0ComponentPigmanVillageStartPiece.getWorldChunkManager().areBiomesViable(var10, var11, var14 / 2 + 4, MapGenPigmanVillage.villageSpawnBiomes))
{
par1List.add(var9);
par0ComponentPigmanVillageStartPiece.field_74930_j.add(var9);
return var9;
}
}
return null;
}
else
{
return null;
}
}
static StructureComponent getNextStructureComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
return getNextVillageStructureComponent(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
}
static StructureComponent getNextStructureComponentPigmanVillagePath(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
return getNextComponentPigmanVillagePath(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
}
}
package net.minecraft.src;
public class StructurePigmanVillagePieceWeight
{
public Class villagePieceClass;
public final int villagePieceWeight;
public int villagePiecesSpawned;
public int villagePiecesLimit;
public StructurePigmanVillagePieceWeight(Class par1Class, int par2, int par3)
{
this.villagePieceClass = par1Class;
this.villagePieceWeight = par2;
this.villagePiecesLimit = par3;
}
public boolean canSpawnMoreVillagePiecesOfType(int par1)
{
return this.villagePiecesLimit == 0 || this.villagePiecesSpawned < this.villagePiecesLimit;
}
public boolean canSpawnMoreVillagePieces()
{
return this.villagePiecesLimit == 0 || this.villagePiecesSpawned < this.villagePiecesLimit;
}
}
MapGenPigmanVillage
package net.minecraft.src;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
public class MapGenPigmanVillage extends MapGenStructure
{
public static final List villageSpawnBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.plains, BiomeGenBase.hell});
private int terrainType;
private int field_82665_g;
private int field_82666_h;
public MapGenPigmanVillage()
{
this.terrainType = 0;
this.field_82665_g = 32;
this.field_82666_h = 8;
}
public MapGenPigmanVillage(Map par1Map)
{
this();
Iterator var2 = par1Map.entrySet().iterator();
while (var2.hasNext())
{
Entry var3 = (Entry)var2.next();
if (((String)var3.getKey()).equals("size"))
{
this.terrainType = MathHelper.parseIntWithDefaultAndMax((String)var3.getValue(), this.terrainType, 0);
}
else if (((String)var3.getKey()).equals("distance"))
{
this.field_82665_g = MathHelper.parseIntWithDefaultAndMax((String)var3.getValue(), this.field_82665_g, this.field_82666_h + 1);
}
}
}
protected boolean canSpawnStructureAtCoords(int par1, int par2)
{
int var3 = par1;
int var4 = par2;
if (par1 < 0)
{
par1 -= this.field_82665_g - 1;
}
if (par2 < 0)
{
par2 -= this.field_82665_g - 1;
}
int var5 = par1 / this.field_82665_g;
int var6 = par2 / this.field_82665_g;
Random var7 = this.worldObj.setRandomSeed(var5, var6, 10387312);
var5 *= this.field_82665_g;
var6 *= this.field_82665_g;
var5 += var7.nextInt(this.field_82665_g - this.field_82666_h);
var6 += var7.nextInt(this.field_82665_g - this.field_82666_h);
if (var3 == var5 && var4 == var6)
{
boolean var8 = this.worldObj.getWorldChunkManager().areBiomesViable(var3 * 16 + 8, var4 * 16 + 8, 0, villageSpawnBiomes);
if (var8)
{
return true;
}
}
return false;
}
protected StructureStart getStructureStart(int par1, int par2)
{
return new StructurePigmanVillageStart(this.worldObj, this.rand, par1, par2, this.terrainType);
}
}
I tried with your code (and changed some stuff) but it didn't work (probably because I'm using ModLoader)
There is only one thing required forge in my sources - this is a registration of own "WorldGenerator" class. So all structures code must work independently of chosen "library". Also as talking about registration of custom world generator - in my thread on this site(second link) posted old code, wich used modloader.
Anyway i can't find it in your code. Show your "mod class" too please.
Also it will be great if you make your code more readable(add indents to it please)
There is only one thing required forge in my sources - this is a registration of own "WorldGenerator" class. So all structures code must work independently of chosen "library". Also as talking about registration of custom world generator - in my thread on this site(second link) posted old code, wich used modloader.
Anyway i can't find it in your code. Show your "mod class" too please.
Also it will be great if you make your code more readable(add indents to it please)
Oh, I forgot to look att your tutorial! Will check it and then if it doesn't work I will show you my code with indents.
There is only one thing required forge in my sources - this is a registration of own "WorldGenerator" class. So all structures code must work independently of chosen "library". Also as talking about registration of custom world generator - in my thread on this site(second link) posted old code, wich used modloader.
Anyway i can't find it in your code. Show your "mod class" too please.
Also it will be great if you make your code more readable(add indents to it please)
I didn't got it to work by using you tutorial, so here's my code with the indents:
mod_BetterVillages (only the part which spawns the structure)
public void generateSurface(IChunkProvider ichunkprovider, World world, Random rand, int x, int z) {
new MapGenPigmanVillage().generate(ichunkprovider, world, x, 0, null);
}
ComponentPigmanVillage
package net.minecraft.src;
import java.util.List;
import java.util.Random;
abstract class ComponentPigmanVillage extends StructureComponent
{
private int villagersSpawned;
protected ComponentPigmanVillageStartPiece startPiece;
protected ComponentPigmanVillage(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2, int direction)
{
super(par2);
this.startPiece = par1ComponentVillageStartPiece;
}
protected StructureComponent getNextComponentNN(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, List par2List, Random par3Random, int par4, int par5)
{
switch (this.coordBaseMode)
{
case 0:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 1, this.getComponentType());
case 1:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.minZ - 1, 2, this.getComponentType());
case 2:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 1, this.getComponentType());
case 3:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.minZ - 1, 2, this.getComponentType());
default:
return null;
}
}
protected StructureComponent getNextComponentPP(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, List par2List, Random par3Random, int par4, int par5)
{
switch (this.coordBaseMode)
{
case 0:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 3, this.getComponentType());
case 1:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.maxZ + 1, 0, this.getComponentType());
case 2:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY + par4, this.boundingBox.minZ + par5, 3, this.getComponentType());
case 3:
return StructurePigmanVillagePieces.getNextStructureComponent(par1ComponentVillageStartPiece, par2List, par3Random, this.boundingBox.minX + par5, this.boundingBox.minY + par4, this.boundingBox.maxZ + 1, 0, this.getComponentType());
default:
return null;
}
}
protected int getAverageGroundLevel(World par1World, StructureBoundingBox par2StructureBoundingBox)
{
int var3 = 0;
int var4 = 0;
for (int var5 = this.boundingBox.minZ; var5 <= this.boundingBox.maxZ; ++var5)
{
for (int var6 = this.boundingBox.minX; var6 <= this.boundingBox.maxX; ++var6)
{
if (par2StructureBoundingBox.isVecInside(var6, 64, var5))
{
var3 += Math.max(par1World.getTopSolidOrLiquidBlock(var6, var5), par1World.provider.getAverageGroundLevel());//Finds the highest block on the x, z coordinate that is solid and returns its y coord. Args x, z
++var4;
}
}
}
if (var4 == 0)
{
return -1;
}
else
{
return var3 / var4;
}
}
protected static boolean canVillageGoDeeper(StructureBoundingBox par0StructureBoundingBox)
{
return par0StructureBoundingBox != null && par0StructureBoundingBox.minY > 10;
}
protected void spawnVillagers(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6)
{
if (this.villagersSpawned < par6)
{
for (int var7 = this.villagersSpawned; var7 < par6; ++var7)
{
int var8 = this.getXWithOffset(par3 + var7, par5);
int var9 = this.getYWithOffset(par4);
int var10 = this.getZWithOffset(par3 + var7, par5);
if (!par2StructureBoundingBox.isVecInside(var8, var9, var10))
{
break;
}
++this.villagersSpawned;
EntityPigman var11 = new EntityPigman(par1World);
var11.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var11);
EntityPigman var111 = new EntityPigman(par1World);
var111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var111);
EntityPigman var1111 = new EntityPigman(par1World);
var1111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var1111);
EntityPigman var11111 = new EntityPigman(par1World);
var11111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var11111);
EntityPigman var111111 = new EntityPigman(par1World);
var111111.setLocationAndAngles((double)var8 + 0.5D, (double)var9, (double)var10 + 0.5D, 0.0F, 0.0F);
par1World.spawnEntityInWorld(var111111);
}
}
}
protected int getBiomeSpecificBlock(int par1, int par2)//Changes the blocks in another biome
{
if (this.startPiece.inDesert)
{
if (par1 == Block.wood.blockID)
{
return Block.blockNetherQuartz.blockID;
}
if (par1 == Block.cobblestone.blockID)
{
return Block.cobblestone.blockID;
}
if (par1 == Block.planks.blockID)
{
return Block.netherBrick.blockID;
}
if (par1 == Block.stairsWoodOak.blockID)
{
return Block.stairsNetherBrick.blockID;
}
if (par1 == Block.gravel.blockID)
{
return Block.cobblestone.blockID;
}
}
return par1;
}
protected int getBiomeSpecificBlockMetadata(int par1, int par2)
{
if (this.startPiece.inDesert)
{
if (par1 == Block.wood.blockID)
{
return 0;
}
if (par1 == Block.cobblestone.blockID)
{
return 0;
}
if (par1 == Block.planks.blockID)
{
return 2;
}
}
return par2;
}
protected void placeBlockAtCurrentPosition(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)//current Position depends on currently set Coordinates mode, is computed here
{
int var8 = this.getBiomeSpecificBlock(par2, par3);
int var9 = this.getBiomeSpecificBlockMetadata(par2, par3);
super.placeBlockAtCurrentPosition(par1World, var8, var9, par4, par5, par6, par7StructureBoundingBox);
}
protected void fillWithBlocks(World par1World, StructureBoundingBox par2StructureBoundingBox, int par3, int par4, int par5, int par6, int par7, int par8, int par9, int par10, boolean par11)
{
int var12 = this.getBiomeSpecificBlock(par9, 0);
int var13 = this.getBiomeSpecificBlockMetadata(par9, 0);
int var14 = this.getBiomeSpecificBlock(par10, 0);
int var15 = this.getBiomeSpecificBlockMetadata(par10, 0);
super.fillWithMetadataBlocks(par1World, par2StructureBoundingBox, par3, par4, par5, par6, par7, par8, var12, var13, var14, var15, par11);
}
protected void fillCurrentPositionBlocksDownwards(World par1World, int par2, int par3, int par4, int par5, int par6, StructureBoundingBox par7StructureBoundingBox)//Overwrites air and liquids from selected position downwards, stops at hitting anything else.
{
int var8 = this.getBiomeSpecificBlock(par2, par3);
int var9 = this.getBiomeSpecificBlockMetadata(par2, par3);
super.fillCurrentPositionBlocksDownwards(par1World, var8, var9, par4, par5, par6, par7StructureBoundingBox);
}
}
ComponentPigmanVillageFountain
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ComponentPigmanVillageFountain extends ComponentPigmanVillage
{
private final boolean field_74924_a = true;
private int averageGroundLevel = -1;
public ComponentPigmanVillageFountain(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2, Random par3Random, int par4, int par5)
{
super(par1ComponentVillageStartPiece, par2, par5);
this.coordBaseMode = par3Random.nextInt(4);
switch (this.coordBaseMode)
{
case 0:
case 2:
this.boundingBox = new StructureBoundingBox(par4, 64, par5, par4 + 6 - 1, 78, par5 + 6 - 1);
break;
default:
this.boundingBox = new StructureBoundingBox(par4, 64, par5, par4 + 6 - 1, 78, par5 + 6 - 1);
}
}
/**
* Initiates construction of the Structure Component picked, at the current Location of StructGen
*/
public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random)
{
StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.maxY - 4, this.boundingBox.minZ + 1, 1, this.getComponentType());
StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.maxY - 4, this.boundingBox.minZ + 1, 3, this.getComponentType());
StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX + 1, this.boundingBox.maxY - 4, this.boundingBox.minZ - 1, 2, this.getComponentType());
StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX + 1, this.boundingBox.maxY - 4, this.boundingBox.maxZ + 1, 0, this.getComponentType());
}
/**
* second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
* the end, it adds Fences...
*/
public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
{
if (this.averageGroundLevel < 0)
{
this.averageGroundLevel = this.getAverageGroundLevel(par1World, par3StructureBoundingBox);
if (this.averageGroundLevel < 0)
{
return true;
}
this.boundingBox.offset(0, this.averageGroundLevel - this.boundingBox.maxY + 3, 0);
}
this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, 0, 4, 0, 4, Block.stoneSingleSlab.blockID, Block.stoneSingleSlab.blockID, false);
this.placeBlockAtCurrentPosition(par1World, Block.waterMoving.blockID, 0, 2, 3, 2, par3StructureBoundingBox);
for (int var4 = 0; var4 <= 5; ++var4)
{
for (int var5 = 0; var5 <= 5; ++var5)
{
if (var5 == 0 || var5 == 5 || var4 == 0 || var4 == 5)
{
this.placeBlockAtCurrentPosition(par1World, Block.gravel.blockID, 0, var5, 11, var4, par3StructureBoundingBox);
}
}
}
return true;
}
}
ComponentPigmanVillageHouse1
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ComponentPigmanVillageHouse1 extends ComponentPigmanVillage
{
private int averageGroundLevel = -1;
public ComponentPigmanVillageHouse1(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5)
{
super(par1ComponentVillageStartPiece, par2, par5);
this.coordBaseMode = par5;
this.boundingBox = par4StructureBoundingBox;
}
public static ComponentPigmanVillageHouse1 func_74898_a(ComponentPigmanVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
StructureBoundingBox var8 = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 10, 10, 5, par6);
/*Discover if bounding box can fit within the current bounding box object.
*/ return canVillageGoDeeper(var8) && StructureComponent.findIntersecting(par1List, var8) == null ? new ComponentPigmanVillageHouse1(par0ComponentVillageStartPiece, par7, par2Random, var8, par6) : null;
}
/**
* second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
* the end, it adds Fences...
*/
public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
{
if (this.averageGroundLevel < 0)
{
this.averageGroundLevel = this.getAverageGroundLevel(par1World, par3StructureBoundingBox);
if (this.averageGroundLevel < 0)
{
return true;
}
this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 1, 0, 10, 4, 5, Block.planks.blockID, Block.planks.blockID, false);
this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, 0, 10, 0, 5, Block.cobblestone.blockID, Block.cobblestone.blockID, false);
this.placeBlockAtCurrentPosition(par1World, Block.stairsCobblestone.blockID, 0, 5, 0, -1, par3StructureBoundingBox);
this.fillWithAir(par1World, par3StructureBoundingBox, 1, 1, 1, 9, 3, 4);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 0, 2, 2, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 0, 2, 3, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 0, 3, 2, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 0, 3, 3, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 10, 2, 2, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 10, 2, 3, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 10, 3, 2, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.thinGlass.blockID, 0, 10, 3, 3, par3StructureBoundingBox);
this.placeDoorAtCurrentPosition(par1World, par3StructureBoundingBox, par2Random, 5, 1, 0, this.getMetadataWithOffset(Block.doorWood.blockID, 1));
this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 5, 0, 10, 5, 5, Block.fence.blockID, Block.fence.blockID, false);
this.fillWithAir(par1World, par3StructureBoundingBox, 1, 5, 1, 9, 5, 4);
this.placeBlockAtCurrentPosition(par1World, Block.workbench.blockID, 0, 2, 1, 2, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.stoneDoubleSlab.blockID, 0, 2, 1, 3, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.furnaceIdle.blockID, 0, 2, 1, 4, par3StructureBoundingBox);
this.fillWithBlocks(par1World, par3StructureBoundingBox, 7, 1, 1, 9, 3, 1, Block.bookShelf.blockID, Block.bookShelf.blockID, false);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 1, 2, 4, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 9, 2, 4, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 4, 2, -1, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 6, 2, -1, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 4, 2, 1, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 6, 2, 1, par3StructureBoundingBox);
this.boundingBox.offset(0, this.averageGroundLevel - this.boundingBox.maxY + 9 - 1, 0);
}
this.spawnVillagers(par1World, par3StructureBoundingBox, 2, 1, 2, 1);
return true;
}
/**
* Returns the villager type to spawn in this component, based on the number of villagers already spawned.
*/
protected Class<EntityPigmanA> getVillagerType(int par1)
{
return EntityPigmanA.class;
}
}
ComponentPigmanVillageLamp
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ComponentPigmanVillageLamp extends ComponentPigmanVillage
{
private int averageGroundLevel = -1;
public ComponentPigmanVillageLamp(ComponentPigmanVillageStartPiece par1ComponentPigmanVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5)
{
super(par1ComponentPigmanVillageStartPiece, par2, par5);
this.coordBaseMode = par5;
this.boundingBox = par4StructureBoundingBox;
}
public static StructureBoundingBox func_74904_a(ComponentPigmanVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6)
{
StructureBoundingBox var7 = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 3, 4, 2, par6);
return StructureComponent.findIntersecting(par1List, var7) != null ? null : var7;
}
/**
* second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
* the end, it adds Fences...
*/
public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
{
if (this.averageGroundLevel < 0)
{
this.averageGroundLevel = this.getAverageGroundLevel(par1World, par3StructureBoundingBox);
if (this.averageGroundLevel < 0)
{
return true;
}
this.boundingBox.offset(0, this.averageGroundLevel - this.boundingBox.maxY + 4 - 1, 0);
}
this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, 0, 2, 3, 1, 0, 0, false);
this.placeBlockAtCurrentPosition(par1World, Block.fence.blockID, 0, 1, 0, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.fence.blockID, 0, 1, 1, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.fence.blockID, 0, 1, 2, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.cloth.blockID, 15, 1, 3, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 0, 3, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 1, 3, 1, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 2, 3, 0, par3StructureBoundingBox);
this.placeBlockAtCurrentPosition(par1World, Block.torchWood.blockID, 0, 1, 3, -1, par3StructureBoundingBox);
return true;
}
}
ComponentPigmanVillageRoadPiece
package net.minecraft.src;
public abstract class ComponentPigmanVillageRoadPiece extends ComponentPigmanVillage
{
protected ComponentPigmanVillageRoadPiece(ComponentPigmanVillageStartPiece par1ComponentVillageStartPiece, int par2)
{
super(par1ComponentVillageStartPiece, par2, par2);
}
}
ComponentPigmanVillagePathGen
package net.minecraft.src;
import java.util.List;
import java.util.Random;
public class ComponentPigmanVillagePathGen extends ComponentPigmanVillageRoadPiece
{
private int averageGroundLevel;
public ComponentPigmanVillagePathGen(ComponentPigmanVillageStartPiece par1ComponentPigmanVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5)
{
super(par1ComponentPigmanVillageStartPiece, par2);
this.coordBaseMode = par5;
this.boundingBox = par4StructureBoundingBox;
this.averageGroundLevel = Math.max(par4StructureBoundingBox.getXSize(), par4StructureBoundingBox.getZSize());
}
/**
* Initiates construction of the Structure Component picked, at the current Location of StructGen
*/
public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random)
{
boolean var4 = false;
int var5;
StructureComponent var6;
for (var5 = par3Random.nextInt(5); var5 < this.averageGroundLevel - 8; var5 += 2 + par3Random.nextInt(5))
{
var6 = this.getNextComponentNN((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, var5);
if (var6 != null)
{
var5 += Math.max(var6.boundingBox.getXSize(), var6.boundingBox.getZSize());
var4 = true;
}
}
for (var5 = par3Random.nextInt(5); var5 < this.averageGroundLevel - 8; var5 += 2 + par3Random.nextInt(5))
{
var6 = this.getNextComponentPP((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, var5);
if (var6 != null)
{
var5 += Math.max(var6.boundingBox.getXSize(), var6.boundingBox.getZSize());
var4 = true;
}
}
if (var4 && par3Random.nextInt(3) > 0)
{
switch (this.coordBaseMode)
{
case 0:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 1, this.getComponentType());
break;
case 1:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType());
break;
case 2:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.minZ, 1, this.getComponentType());
break;
case 3:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType());
}
}
if (var4 && par3Random.nextInt(3) > 0)
{
switch (this.coordBaseMode)
{
case 0:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 3, this.getComponentType());
break;
case 1:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType());
break;
case 2:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.minZ, 3, this.getComponentType());
break;
case 3:
StructurePigmanVillagePieces.getNextStructureComponentPigmanVillagePath((ComponentPigmanVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType());
}
}
}
public static StructureBoundingBox func_74933_a(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6)
{
for (int var7 = 7 * MathHelper.getRandomIntegerInRange(par2Random, 3, 5); var7 >= 7; var7 -= 7)
{
StructureBoundingBox var8 = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 3, 3, var7, par6);
if (StructureComponent.findIntersecting(par1List, var8) == null)
{
return var8;
}
}
return null;
}
/**
* second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
* the end, it adds Fences...
*/
public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
{
for (int var5 = this.boundingBox.minX; var5 <= this.boundingBox.maxX; ++var5)
{
for (int var6 = this.boundingBox.minZ; var6 <= this.boundingBox.maxZ; ++var6)
{
if (par3StructureBoundingBox.isVecInside(var5, 64, var6))
{
int var7 = par1World.getTopSolidOrLiquidBlock(var5, var6) - 1;
par1World.setBlock(var5, var7, var6, var6, 0, 2);
}
}
}
return true;
}
}
ComponentPigmanVillageStartPiece
package net.minecraft.src;
import java.util.ArrayList;
import java.util.Random;
public class ComponentPigmanVillageStartPiece extends ComponentPigmanVillageFountain
{
public final WorldChunkManager worldChunkMngr;
/** Boolean that determines if the village is in a desert or not. */
public final boolean inDesert;
/** World terrain type, 0 for normal, 1 for flap map */
public final int terrainType;
public StructureVillagePieceWeight structVillagePieceWeight;
/**
* Contains List of all spawnable Structure Piece Weights. If no more Pieces of a type can be spawned, they are
* removed from this list
*/
public ArrayList structureVillageWeightedPieceList;
public ArrayList field_74932_i = new ArrayList();
public ArrayList field_74930_j = new ArrayList();
private ComponentPigmanVillageStartPiece startPiece;
public ComponentPigmanVillageStartPiece(WorldChunkManager par1WorldChunkManager, int par2, Random par3Random, int par4, int par5, ArrayList par6ArrayList, int par7)
{
super((ComponentPigmanVillageStartPiece)null, 0, par3Random, par4, par5);
this.worldChunkMngr = par1WorldChunkManager;
this.structureVillageWeightedPieceList = par6ArrayList;
this.terrainType = par7;
BiomeGenBase var8 = par1WorldChunkManager.getBiomeGenAt(par4, par5);
this.inDesert = var8 == BiomeGenBase.hell;
this.startPiece = this;
}
public WorldChunkManager getWorldChunkManager()
{
return this.worldChunkMngr;
}
}
StructurePigmanVillagePieces
package net.minecraft.src;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class StructurePigmanVillagePieces
{
public static ArrayList getStructurePigmanVillageWeightedPieceList(Random par0Random, int par1)
{
ArrayList var2 = new ArrayList();
var2.add(new StructurePigmanVillagePieceWeight(ComponentPigmanVillageHouse1.class, 4, MathHelper.getRandomIntegerInRange(par0Random, 2 + par1, 3 + par1 * 2)));
Iterator var3 = var2.iterator();
while (var3.hasNext())
{
if (((StructurePigmanVillagePieceWeight)var3.next()).villagePiecesLimit == 0)
{
var3.remove();
}
}
return var2;
}
private static int func_75079_a(List par0List)
{
boolean var1 = false;
int var2 = 0;
StructurePigmanVillagePieceWeight var4;
for (Iterator var3 = par0List.iterator(); var3.hasNext(); var2 += var4.villagePieceWeight)
{
var4 = (StructurePigmanVillagePieceWeight)var3.next();
if (var4.villagePiecesLimit > 0 && var4.villagePiecesSpawned < var4.villagePiecesLimit)
{
var1 = true;
}
}
return var1 ? var2 : -1;
}
private static ComponentPigmanVillage func_75083_a(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, StructureVillagePieceWeight var12, List par2List, Random par3Random, int par4, int par5, int par6, int par7, int par8)
{
Class var9 = var12.villagePieceClass;
Object var10 = null;
if (var9 == ComponentPigmanVillageHouse1.class)
{
var10 = ComponentPigmanVillageHouse1.func_74898_a(par0ComponentPigmanVillageStartPiece, par2List, par3Random, par4, par5, par6, par7, par8);
}
return (ComponentPigmanVillage)var10;
}
private static ComponentPigmanVillage getNextVillageComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
int var8 = func_75079_a(par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList);
if (var8 <= 0)
{
return null;
}
else
{
int var9 = 0;
while (var9 < 5)
{
++var9;
int var10 = par2Random.nextInt(var8);
Iterator var11 = par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.iterator();
while (var11.hasNext())
{
StructureVillagePieceWeight var12 = (StructureVillagePieceWeight)var11.next();
var10 -= var12.villagePieceWeight;
if (var10 < 0)
{
if (!var12.canSpawnMoreVillagePiecesOfType(par7) || var12 == par0ComponentPigmanVillageStartPiece.structVillagePieceWeight && par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.size() > 1)
{
break;
}
ComponentPigmanVillage var13 = func_75083_a(par0ComponentPigmanVillageStartPiece, var12, par1List, par2Random, par3, par4, par5, par6, par7);
if (var13 != null)
{
++var12.villagePiecesSpawned;
par0ComponentPigmanVillageStartPiece.structVillagePieceWeight = var12;
if (!var12.canSpawnMoreVillagePieces())
{
par0ComponentPigmanVillageStartPiece.structureVillageWeightedPieceList.remove(var12);
}
return var13;
}
}
}
}
StructureBoundingBox var14 = ComponentPigmanVillageLamp.func_74904_a(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
if (var14 != null)
{
return new ComponentPigmanVillageLamp(par0ComponentPigmanVillageStartPiece, par7, par2Random, var14, par6);
}
else
{
return null;
}
}
}
private static StructureComponent getNextVillageStructureComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
if (par7 > 50)
{
return null;
}
else if (Math.abs(par3 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minZ) <= 112)
{
ComponentPigmanVillage var8 = getNextVillageComponent(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7 + 1);
if (var8 != null)
{
int var9 = (var8.boundingBox.minX + var8.boundingBox.maxX) / 2;
int var10 = (var8.boundingBox.minZ + var8.boundingBox.maxZ) / 2;
int var11 = var8.boundingBox.maxX - var8.boundingBox.minX;
int var12 = var8.boundingBox.maxZ - var8.boundingBox.minZ;
int var13 = var11 > var12 ? var11 : var12;
if (par0ComponentPigmanVillageStartPiece.getWorldChunkManager().areBiomesViable/*checks given Chunk's Biomes against List of allowed ones*/(var9, var10, var13 / 2 + 4, MapGenPigmanVillage.villageSpawnBiomes))
{
par1List.add(var8);
par0ComponentPigmanVillageStartPiece.field_74932_i.add(var8);
return var8;
}
}
return null;
}
else
{
return null;
}
}
private static StructureComponent getNextComponentPigmanVillagePath(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
if (par7 > 3 + par0ComponentPigmanVillageStartPiece.terrainType)
{
return null;
}
else if (Math.abs(par3 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minX) <= 112 && Math.abs(par5 - par0ComponentPigmanVillageStartPiece.getBoundingBox().minZ) <= 112)
{
StructureBoundingBox var8 = ComponentPigmanVillagePathGen.func_74933_a(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6);
if (var8 != null && var8.minY > 10)
{
ComponentPigmanVillagePathGen var9 = new ComponentPigmanVillagePathGen(par0ComponentPigmanVillageStartPiece, par7, par2Random, var8, par6);
int var10 = (var9.boundingBox.minX + var9.boundingBox.maxX) / 2;
int var11 = (var9.boundingBox.minZ + var9.boundingBox.maxZ) / 2;
int var12 = var9.boundingBox.maxX - var9.boundingBox.minX;
int var13 = var9.boundingBox.maxZ - var9.boundingBox.minZ;
int var14 = var12 > var13 ? var12 : var13;
if (par0ComponentPigmanVillageStartPiece.getWorldChunkManager().areBiomesViable(var10, var11, var14 / 2 + 4, MapGenPigmanVillage.villageSpawnBiomes))
{
par1List.add(var9);
par0ComponentPigmanVillageStartPiece.field_74930_j.add(var9);
return var9;
}
}
return null;
}
else
{
return null;
}
}
static StructureComponent getNextStructureComponent(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
return getNextVillageStructureComponent(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
}
static StructureComponent getNextStructureComponentPigmanVillagePath(ComponentPigmanVillageStartPiece par0ComponentPigmanVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
{
return getNextComponentPigmanVillagePath(par0ComponentPigmanVillageStartPiece, par1List, par2Random, par3, par4, par5, par6, par7);
}
}
StructurePigmanVillageStart
package net.minecraft.src;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
class StructurePigmanVillageStart extends StructureStart
{
private boolean hasMoreThanTwoComponents = false;
public StructurePigmanVillageStart(World par1World, Random par2Random, int par3, int par4, int par5)
{
ArrayList var6 = StructurePigmanVillagePieces.getStructurePigmanVillageWeightedPieceList(par2Random, par5);
ComponentPigmanVillageStartPiece var7 = new ComponentPigmanVillageStartPiece(par1World.getWorldChunkManager(), 0, par2Random, (par3 << 4) + 2, (par4 << 4) + 2, var6, par5);
this.components.add(var7);//List of all StructureComponents that are part of this structure
var7.buildComponent(var7, this.components, par2Random);
ArrayList var8 = var7.field_74930_j;
ArrayList var9 = var7.field_74932_i;
int var10;
while (!var8.isEmpty() || !var9.isEmpty())
{
StructureComponent var11;
if (var8.isEmpty())
{
var10 = par2Random.nextInt(var9.size());
var11 = (StructureComponent)var9.remove(var10);
var11.buildComponent(var7, this.components, par2Random);//Initiates construction of the Structure Component picked, at the current Location of StructGen
}
else
{
var10 = par2Random.nextInt(var8.size());
var11 = (StructureComponent)var8.remove(var10);
var11.buildComponent(var7, this.components, par2Random);
}
}
/*Calculates total bounding box based on components' bounding boxes and saves it to boundingBox*/
this.updateBoundingBox();
var10 = 0;
Iterator var13 = this.components.iterator();
while (var13.hasNext())
{
StructureComponent var12 = (StructureComponent)var13.next();
if (!(var12 instanceof ComponentPigmanVillageRoadPiece))
{
++var10;
}
}
this.hasMoreThanTwoComponents = var10 > 2;
}
/*currently only defined for Villages, returns true if Village has more than 2 non-road components*/
public boolean isSizeableStructure()
{
return this.hasMoreThanTwoComponents;
}
}
StructurePigmanVillagePieceWeight
package net.minecraft.src;
public class StructurePigmanVillagePieceWeight
{
public Class villagePieceClass;
public final int villagePieceWeight;
public int villagePiecesSpawned;
public int villagePiecesLimit;
public StructurePigmanVillagePieceWeight(Class par1Class, int par2, int par3)
{
this.villagePieceClass = par1Class;
this.villagePieceWeight = par2;
this.villagePiecesLimit = par3;
}
public boolean canSpawnMoreVillagePiecesOfType(int par1)
{
return this.villagePiecesLimit == 0 || this.villagePiecesSpawned < this.villagePiecesLimit;
}
public boolean canSpawnMoreVillagePieces()
{
return this.villagePiecesLimit == 0 || this.villagePiecesSpawned < this.villagePiecesLimit;
}
}
MapGenPigmanVillage
package net.minecraft.src;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
public class MapGenPigmanVillage extends MapGenStructure
{
/** A list of all the biomes villages can spawn in. */
public static final List villageSpawnBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.plains, BiomeGenBase.hell});
/** World terrain type, 0 for normal, 1 for flat map */
private int terrainType;
/**How rare the structure is*/
private int field_82665_g;
private int field_82666_h;
public MapGenPigmanVillage()
{
this.terrainType = 0;
this.field_82665_g = 32;
this.field_82666_h = 8;
}
public MapGenPigmanVillage(Map par1Map)
{
this();
Iterator var2 = par1Map.entrySet().iterator();
while (var2.hasNext())
{
Entry var3 = (Entry)var2.next();
if (((String)var3.getKey()).equals("size"))
{
this.terrainType = MathHelper.parseIntWithDefaultAndMax((String)var3.getValue(), this.terrainType, 0);
}
else if (((String)var3.getKey()).equals("distance"))
{
this.field_82665_g = MathHelper.parseIntWithDefaultAndMax((String)var3.getValue(), this.field_82665_g, this.field_82666_h + 1);
}
}
}
protected boolean canSpawnStructureAtCoords(int par1, int par2)
{
int var3 = par1;
int var4 = par2;
if (par1 < 0)
{
par1 -= this.field_82665_g - 1;
}
if (par2 < 0)
{
par2 -= this.field_82665_g - 1;
}
int var5 = par1 / this.field_82665_g;
int var6 = par2 / this.field_82665_g;
Random var7 = this.worldObj.setRandomSeed(var5, var6, 10387312);
var5 *= this.field_82665_g;
var6 *= this.field_82665_g;
var5 += var7.nextInt(this.field_82665_g - this.field_82666_h);
var6 += var7.nextInt(this.field_82665_g - this.field_82666_h);
if (var3 == var5 && var4 == var6)
{
boolean var8 = this.worldObj.getWorldChunkManager().areBiomesViable(var3 * 16 + 8, var4 * 16 + 8, 0, villageSpawnBiomes);
if (var8)
{
return true;
}
}
return false;
}
protected StructureStart getStructureStart(int par1, int par2)
{
return new StructurePigmanVillageStart(this.worldObj, this.rand, par1, par2, this.terrainType);
}
}
There isn't "generate" method in "MapGenPigmanVillage" class.
And why are you pass "null" instead of "z coordinate" in "generateSurface" method of "mod_BetterVillages" class?
Okay I edited more, but it STILL doesn't work! My edited code:
mod_BetterVillages
public void generateSurface(World world, Random rand, int x, int z) {
new MapGenPigmanVillage().generate(world, rand, x, 0, z);
}
MapGenPigmanVillage
package net.minecraft.src;
import java.util.List;
import java.util.Arrays;
import java.util.Random;
public class MapGenPigmanVillage extends WorldGenerator {
// list of allowed bioms for structure generator
public static final List villageSpawnBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.plains, BiomeGenBase.hell});
// chance to generate a structure
private static final double spawnChance = 100D;
public boolean generate(World world, Random rand, int x, int y, int z) {
if (canSpawnStructureAtCoords(world, rand, x, z)) {
int direction = rand.nextInt(4);
// this class will create you structure
new StructurePigmanVillageStart(world, rand, direction, direction, direction);
}
return true;
}
protected boolean canSpawnStructureAtCoords(World world, Random rand, int x, int z) {
return rand.nextDouble() < this.spawnChance && villageSpawnBiomes.contains(world.getBiomeGenForCoords(x, z));
}
}
I have a problem with my structure; it doesn't spawn! I use the component way and I have the component files, structure files and the MapGen file. Is there anything else I need to do in order to make the structure spawn?
Would be thankful for help!
Or you can try to fix it by self. Here are my sources https://github.com/NightKosh/GraveStone-mod
And some description for it http://www.minecraftforum.net/topic/1762358-structure-generation-tutorialinformationhelp/
Thanks will try it by looking at your code. If it doesn't work, I will post my own codes.
I tried with your code (and changed some stuff) but it didn't work (probably because I'm using ModLoader), so here's my original code (that has something to do with the structure):
ComponentPigmanVillage
ComponentPigmanVillageFountain
ComponentPigmanVillageHouse1
ComponentPigmanVillageLamp
ComponentPigmanVillageRoadPiece
ComponentPigmanVillagePathGen
ComponentPigmanVillageStartPiece
There is only one thing required forge in my sources - this is a registration of own "WorldGenerator" class. So all structures code must work independently of chosen "library". Also as talking about registration of custom world generator - in my thread on this site(second link) posted old code, wich used modloader.
Anyway i can't find it in your code. Show your "mod class" too please.
Also it will be great if you make your code more readable(add indents to it please)
Oh, I forgot to look att your tutorial! Will check it and then if it doesn't work I will show you my code with indents.
I didn't got it to work by using you tutorial, so here's my code with the indents:
mod_BetterVillages (only the part which spawns the structure)
ComponentPigmanVillageFountain
ComponentPigmanVillageHouse1
ComponentPigmanVillageLamp
ComponentPigmanVillageRoadPiece
ComponentPigmanVillagePathGen
ComponentPigmanVillageStartPiece
StructurePigmanVillagePieces
StructurePigmanVillageStart
StructurePigmanVillagePieceWeight
MapGenPigmanVillage
And why are you pass "null" instead of "z coordinate" in "generateSurface" method of "mod_BetterVillages" class?
Okay I edited more, but it STILL doesn't work! My edited code:
mod_BetterVillages