001package net.minecraft.world.gen.structure; 002 003import java.util.List; 004import java.util.Random; 005import net.minecraft.block.Block; 006import net.minecraft.util.MathHelper; 007import net.minecraft.world.World; 008 009public class ComponentVillagePathGen extends ComponentVillageRoadPiece 010{ 011 private int averageGroundLevel; 012 013 public ComponentVillagePathGen(ComponentVillageStartPiece par1ComponentVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5) 014 { 015 super(par1ComponentVillageStartPiece, par2); 016 this.coordBaseMode = par5; 017 this.boundingBox = par4StructureBoundingBox; 018 this.averageGroundLevel = Math.max(par4StructureBoundingBox.getXSize(), par4StructureBoundingBox.getZSize()); 019 } 020 021 /** 022 * Initiates construction of the Structure Component picked, at the current Location of StructGen 023 */ 024 public void buildComponent(StructureComponent par1StructureComponent, List par2List, Random par3Random) 025 { 026 boolean flag = false; 027 int i; 028 StructureComponent structurecomponent1; 029 030 for (i = par3Random.nextInt(5); i < this.averageGroundLevel - 8; i += 2 + par3Random.nextInt(5)) 031 { 032 structurecomponent1 = this.getNextComponentNN((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, i); 033 034 if (structurecomponent1 != null) 035 { 036 i += Math.max(structurecomponent1.boundingBox.getXSize(), structurecomponent1.boundingBox.getZSize()); 037 flag = true; 038 } 039 } 040 041 for (i = par3Random.nextInt(5); i < this.averageGroundLevel - 8; i += 2 + par3Random.nextInt(5)) 042 { 043 structurecomponent1 = this.getNextComponentPP((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, 0, i); 044 045 if (structurecomponent1 != null) 046 { 047 i += Math.max(structurecomponent1.boundingBox.getXSize(), structurecomponent1.boundingBox.getZSize()); 048 flag = true; 049 } 050 } 051 052 if (flag && par3Random.nextInt(3) > 0) 053 { 054 switch (this.coordBaseMode) 055 { 056 case 0: 057 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 1, this.getComponentType()); 058 break; 059 case 1: 060 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType()); 061 break; 062 case 2: 063 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX - 1, this.boundingBox.minY, this.boundingBox.minZ, 1, this.getComponentType()); 064 break; 065 case 3: 066 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.minZ - 1, 2, this.getComponentType()); 067 } 068 } 069 070 if (flag && par3Random.nextInt(3) > 0) 071 { 072 switch (this.coordBaseMode) 073 { 074 case 0: 075 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.maxZ - 2, 3, this.getComponentType()); 076 break; 077 case 1: 078 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.minX, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType()); 079 break; 080 case 2: 081 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX + 1, this.boundingBox.minY, this.boundingBox.minZ, 3, this.getComponentType()); 082 break; 083 case 3: 084 StructureVillagePieces.getNextStructureComponentVillagePath((ComponentVillageStartPiece)par1StructureComponent, par2List, par3Random, this.boundingBox.maxX - 2, this.boundingBox.minY, this.boundingBox.maxZ + 1, 0, this.getComponentType()); 085 } 086 } 087 } 088 089 public static StructureBoundingBox func_74933_a(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6) 090 { 091 for (int i1 = 7 * MathHelper.getRandomIntegerInRange(par2Random, 3, 5); i1 >= 7; i1 -= 7) 092 { 093 StructureBoundingBox structureboundingbox = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 3, 3, i1, par6); 094 095 if (StructureComponent.findIntersecting(par1List, structureboundingbox) == null) 096 { 097 return structureboundingbox; 098 } 099 } 100 101 return null; 102 } 103 104 /** 105 * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at 106 * the end, it adds Fences... 107 */ 108 public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox) 109 { 110 int i = this.getBiomeSpecificBlock(Block.gravel.blockID, 0); 111 112 for (int j = this.boundingBox.minX; j <= this.boundingBox.maxX; ++j) 113 { 114 for (int k = this.boundingBox.minZ; k <= this.boundingBox.maxZ; ++k) 115 { 116 if (par3StructureBoundingBox.isVecInside(j, 64, k)) 117 { 118 int l = par1World.getTopSolidOrLiquidBlock(j, k) - 1; 119 par1World.setBlockAndMetadataWithNotify(j, l, k, i, 0, 2); 120 } 121 } 122 } 123 124 return true; 125 } 126}