Merge pull request #745 from Vaern/master

BlockDecoModel, Structure stuff
This commit is contained in:
HbmMods 2022-09-12 08:14:41 +02:00 committed by GitHub
commit 9f30c1c021
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 3304 additions and 1340 deletions

View File

@ -387,6 +387,8 @@ public class ModBlocks {
public static Block brick_dungeon_circle;
public static Block brick_forgotten;
public static Block deco_computer;
public static Block tape_recorder;
public static Block steel_poles;
@ -1640,7 +1642,9 @@ public class ModBlocks {
brick_dungeon_circle = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_circle");
brick_forgotten = new BlockGeneric(Material.rock).setBlockName("brick_forgotten").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1000000).setBlockTextureName(RefStrings.MODID + ":brick_forgotten");
deco_computer = new BlockDecoModel(Material.iron, 1).setBlockName("deco_computer").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":deco_computer");
tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder");
steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam");
pole_top = new DecoPoleTop(Material.iron).setBlockName("pole_top").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_pole_top");
@ -2741,6 +2745,7 @@ public class ModBlocks {
GameRegistry.registerBlock(brick_dungeon_tile, brick_dungeon_tile.getUnlocalizedName());
GameRegistry.registerBlock(brick_dungeon_circle, brick_dungeon_circle.getUnlocalizedName());
GameRegistry.registerBlock(brick_forgotten, brick_forgotten.getUnlocalizedName());
GameRegistry.registerBlock(deco_computer, ItemBlockMeta.class, deco_computer.getUnlocalizedName());
GameRegistry.registerBlock(tape_recorder, tape_recorder.getUnlocalizedName());
GameRegistry.registerBlock(steel_poles, steel_poles.getUnlocalizedName());
GameRegistry.registerBlock(pole_top, pole_top.getUnlocalizedName());

View File

@ -0,0 +1,102 @@
package com.hbm.blocks.generic;
import java.util.List;
import com.hbm.lib.RefStrings;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class BlockDecoModel extends Block {
//Allows between 1-4 differently colored/textured sub-blocks altogether.
int subTypes;
public BlockDecoModel(Material mat, int types) {
super(mat);
subTypes = types;
}
@SideOnly(Side.CLIENT)
protected IIcon[] icons;
@Override
public int damageDropped(int meta) {
return meta & 12;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tabs, List list) {
for(byte i = 0; i < subTypes; i++) {
list.add(new ItemStack(item, 1, i));
}
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
super.registerBlockIcons(iconRegister);
icons = new IIcon[subTypes];
for(byte i = 0; i < subTypes; i++)
icons[i] = iconRegister.registerIcon(this.textureName + "_" + i);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
return this.icons[(meta >> 2) % this.icons.length];
}
public static int renderID = RenderingRegistry.getNextAvailableRenderId();
@Override
public int getRenderType() {
return renderID;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
//Did somebody say - pain?
//Alright fuckers, looks like 2/b010 = North, 3/b011 = South, 4/b100 = West, 5/b101 = East for sides.
//I'll just opt for something similar (0/b00 North, 1/b01 South, 2/b10 West, 3/b11 East)
//Assumes meta is using the third and fourth bits.
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3;
int meta;
if((i & 1) != 1)
meta = i >> 1; //For North(b00>b00) and South(b10>b01), shift bits right by one
else {
if(i == 3)
meta = 2; //For West(b11>b10), just set to 2
else
meta = 3; //For East(b01>b11), just set to 3
}
world.setBlockMetadataWithNotify(x, y, z, meta, 2);
}
}

View File

@ -21,6 +21,7 @@ public class CommonConfig {
public static final String CATEGORY_MOBS = "12_mobs";
public static final String CATEGORY_RADIATION = "13_radiation";
public static final String CATEGORY_HAZARD = "14_hazard";
public static final String CATEGORY_STRUCTURES = "15_structures";
public static final String CATEGORY_528 = "528";
public static final String CATEGORY_LBSM = "LESS BULLSHIT MODE";

View File

@ -0,0 +1,37 @@
package com.hbm.config;
import com.hbm.main.MainRegistry;
import net.minecraftforge.common.config.Configuration;
public class StructureConfig {
public static boolean enableStructures = true;
public static int structureMinChunks = 8;
public static int structureMaxChunks = 24;
public static double lootAmountFactor = 1D;
public static void loadFromConfig(Configuration config) {
final String CATEGORY_STRUCTURES = CommonConfig.CATEGORY_STRUCTURES;
enableStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Switch for whether structures using the MapGenStructure system spawn.", true);
structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8);
structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24);
lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D);
structureMinChunks = CommonConfig.setDef(structureMinChunks, 8);
structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24);
if(structureMinChunks > structureMaxChunks) {
MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!");
MainRegistry.logger.error(String.format("Errored values will default back to %1$d and %2$d respectively, PLEASE REVIEW CONFIGURATION DESCRIPTION BEFORE MEDDLING WITH VALUES!", 8, 24));
structureMinChunks = 8;
structureMaxChunks = 24;
}
}
}

View File

@ -493,6 +493,18 @@ public class AnvilRecipes {
new AnvilOutput(new ItemStack(ModItems.ingot_tcalloy, 1), 0.25F)
}
).setTier(3));
constructionRecipes.add(new AnvilConstructionRecipe(
new ComparableStack(ModBlocks.deco_computer),
new AnvilOutput[] {
new AnvilOutput(new ItemStack(ModItems.crt_display, 1)),
new AnvilOutput(new ItemStack(ModItems.scrap, 3)),
new AnvilOutput(new ItemStack(ModItems.wire_copper, 4)),
new AnvilOutput(new ItemStack(ModItems.circuit_red_copper, 1), 0.25F),
new AnvilOutput(new ItemStack(ModItems.circuit_copper, 2))
}
).setTier(2));
constructionRecipes.add(new AnvilConstructionRecipe(
new ComparableStack(ModItems.circuit_raw),

View File

@ -6,10 +6,16 @@ import com.hbm.blocks.ModBlocks;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.items.ModItems;
import com.hbm.items.machine.ItemBreedingRod.*;
import com.hbm.util.I18nUtil;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.WeightedRandomChestContent;
import net.minecraft.world.World;
public class HbmChestContents {
@ -335,4 +341,46 @@ public class HbmChestContents {
new WeightedRandomChestContent(ModItems.warhead_mirv, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.battery_schrabidium_cell, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.powder_nitan_mix, 0, 16, 32, 1) };
public static WeightedRandomChestContent[] officeTrash = new WeightedRandomChestContent[] {
//Meta, Min amount, Max amount, Weight
new WeightedRandomChestContent(Items.paper, 0, 1, 12, 10),
new WeightedRandomChestContent(Items.book, 0, 1, 3, 4),
new WeightedRandomChestContent(ModItems.twinkie, 0, 1, 2, 6),
new WeightedRandomChestContent(ModItems.coffee, 0, 1, 1, 4),
new WeightedRandomChestContent(ModItems.flame_politics, 0, 1, 1, 2),
new WeightedRandomChestContent(ModItems.ring_pull, 0, 1, 1, 4),
new WeightedRandomChestContent(ModItems.can_empty, 0, 1, 1, 2),
new WeightedRandomChestContent(ModItems.can_creature, 0, 1, 2, 2),
new WeightedRandomChestContent(ModItems.can_smart, 0, 1, 3, 2),
new WeightedRandomChestContent(ModItems.can_mrsugar, 0, 1, 2, 2),
new WeightedRandomChestContent(ModItems.book_guide, 3, 1, 1, 1),
new WeightedRandomChestContent(Item.getItemFromBlock(ModBlocks.deco_computer), 0, 1, 1, 1)};
/** Nowhere else to put this and this seems like the most fitting place **/
public static ItemStack genetateBook(String key) {
String author = I18nUtil.resolveKey("book.lore." + key + ".author");
String title = I18nUtil.resolveKey("book.lore." + key + ".title");
ItemStack book = new ItemStack(Items.written_book);
book.stackTagCompound = new NBTTagCompound();
book.stackTagCompound.setString("author", author);
book.stackTagCompound.setString("title", title);
NBTTagList nbt = new NBTTagList();
for(byte i = 1; i <= 50; i++) {
String unloc = "book.lore." + key + ".page" + i;
String page = I18nUtil.resolveKey(unloc);
if(page.equals(unloc))
break;
else
nbt.appendTag(new NBTTagString(page));
}
book.stackTagCompound.setTag("pages", nbt);
return book;
}
}

View File

@ -1,8 +1,11 @@
package com.hbm.lib;
import com.hbm.world.worldgen.ComponentNTMFeatures;
import com.hbm.world.worldgen.MapGenNTMFeatures;
import com.hbm.world.worldgen.NTMWorldGenerator;
import com.hbm.world.worldgen.components.CivilianFeatures.*;
import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*;
import com.hbm.world.worldgen.components.OfficeFeatures.*;
import com.hbm.world.worldgen.components.RuinFeatures.*;
import cpw.mods.fml.common.IWorldGenerator;
import cpw.mods.fml.common.registry.GameRegistry;
@ -19,7 +22,7 @@ public class HbmWorld {
//MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE");
//MapGenStructureIO.func_143031_a(StructureComponentTest.class, "HFR_COMPONENT");
MapGenStructureIO.registerStructure(MapGenNTMFeatures.Start.class, "NTMFeatures");
ComponentNTMFeatures.registerNTMFeatures();
registerNTMFeatures();
registerWorldGen(new HbmWorldGen(), 1);
registerWorldGen(new NTMWorldGenerator(), 1); //Ideally, move everything over from HbmWorldGen to NTMWorldGenerator
@ -29,4 +32,21 @@ public class HbmWorld {
public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) {
GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability);
}
/** Register structures in MapGenStructureIO */
public static void registerNTMFeatures() {
MapGenStructureIO.func_143031_a(NTMHouse1.class, "NTMHouse1");
MapGenStructureIO.func_143031_a(NTMHouse2.class, "NTMHouse2");
MapGenStructureIO.func_143031_a(NTMLab1.class, "NTMLab1");
MapGenStructureIO.func_143031_a(NTMLab2.class, "NTMLab2");
MapGenStructureIO.func_143031_a(NTMWorkshop1.class, "NTMWorkshop1");
MapGenStructureIO.func_143031_a(NTMRuin1.class, "NTMRuin1");
MapGenStructureIO.func_143031_a(NTMRuin2.class, "NTMRuin2");
MapGenStructureIO.func_143031_a(NTMRuin3.class, "NTMRuin3");
MapGenStructureIO.func_143031_a(NTMRuin4.class, "NTMRuin4");
//aggggggggggg
MapGenStructureIO.func_143031_a(BasicHelipad.class, "NTMBasicHelipad");
MapGenStructureIO.func_143031_a(RadioShack.class, "NTMRadioShack");
MapGenStructureIO.func_143031_a(LargeOffice.class, "NTMLargeOffice");
}
}

View File

@ -739,7 +739,8 @@ public class ClientProxy extends ServerProxy {
RenderingRegistry.registerBlockHandler(new RenderBlockSideRotation());
RenderingRegistry.registerBlockHandler(new RenderDiode());
RenderingRegistry.registerBlockHandler(new RenderBoxDuct());
RenderingRegistry.registerBlockHandler(new RenderBlockDecoModel(ModBlocks.deco_computer.getRenderType(), ResourceManager.deco_computer));
RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_dynamite.getRenderType(), ResourceManager.charge_dynamite));
RenderingRegistry.registerBlockHandler(new RenderBlockRotated(ModBlocks.charge_c4.getRenderType(), ResourceManager.charge_c4));

View File

@ -863,6 +863,7 @@ public class MainRegistry {
ToolConfig.loadFromConfig(config);
WeaponConfig.loadFromConfig(config);
MobConfig.loadFromConfig(config);
StructureConfig.loadFromConfig(config);
try {
if(GeneralConfig.enableThermosPreventer && Class.forName("thermos.Thermos") != null) {

View File

@ -1249,6 +1249,8 @@ public class ResourceManager {
public static final IModelCustom pipe_quad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_quad.obj"));
public static final IModelCustom pipe_frame = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/pipe_frame.obj"));
public static final IModelCustom deco_computer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/blocks/puter.obj"));
public static final IModelCustom rbmk_element = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_element.obj"));
public static final IModelCustom rbmk_reflector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_reflector.obj"));
public static final IModelCustom rbmk_rods = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/rbmk/rbmk_rods.obj"));

View File

@ -0,0 +1,92 @@
package com.hbm.render.block;
import org.lwjgl.opengl.GL11;
import com.hbm.render.util.ObjUtil;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.client.model.IModelCustom;
import net.minecraftforge.client.model.obj.WavefrontObject;
public class RenderBlockDecoModel implements ISimpleBlockRenderingHandler {
private int renderID;
private IModelCustom model;
public RenderBlockDecoModel(int renderType, IModelCustom IModelCustom) {
renderID = renderType;
model = IModelCustom;
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
IIcon iicon = block.getIcon(0, metadata);
tessellator.setColorOpaque_F(1, 1, 1);
if(renderer.hasOverrideBlockTexture()) {
iicon = renderer.overrideBlockTexture;
}
GL11.glRotated(-15, 0, 1, 0);
tessellator.startDrawingQuads();
ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, modelId, false);
tessellator.draw();
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
Tessellator tessellator = Tessellator.instance;
int meta = world.getBlockMetadata(x, y, z);
IIcon iicon = block.getIcon(0, meta & 12);
tessellator.setColorOpaque_F(1, 1, 1);
if(renderer.hasOverrideBlockTexture()) {
iicon = renderer.overrideBlockTexture;
}
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
float rotation = 0;
switch(meta & 3) {
default: //North
rotation = (float) Math.PI; break;
case 1: //South
break;
case 2: //West
rotation = 1.5F * (float) Math.PI;break;
case 3: //East
rotation = 0.5F * (float) Math.PI; break;
}
tessellator.addTranslation(x + 0.5F, y + 0.5F, z + 0.5F);
ObjUtil.renderWithIcon((WavefrontObject) model, iicon, tessellator, rotation, true);
tessellator.addTranslation(-x - 0.5F, -y - 0.5F, -z - 0.5F);
return false;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return this.renderID;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -2,19 +2,30 @@ package com.hbm.world.worldgen;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import com.hbm.config.GeneralConfig;
import com.hbm.config.StructureConfig;
import com.hbm.world.worldgen.components.CivilianFeatures.*;
import com.hbm.world.worldgen.components.MilitaryBaseFeatures;
import com.hbm.world.worldgen.components.MilitaryBaseFeatures.*;
import com.hbm.world.worldgen.components.OfficeFeatures.*;
import com.hbm.world.worldgen.components.RuinFeatures.*;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.BiomeGenBeach;
import net.minecraft.world.biome.BiomeGenMesa;
import net.minecraft.world.gen.structure.MapGenStructure;
import net.minecraft.world.gen.structure.MapGenStructureIO;
import net.minecraft.world.gen.structure.StructureComponent;
import net.minecraft.world.gen.structure.StructureStart;
public class MapGenNTMFeatures extends MapGenStructure {
//BiomeDictionary could be /very/ useful, since it automatically sorts *all* biomes into predefined categories
private static List biomelist = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean});
/** Maximum distance between structures */
private int maxDistanceBetweenScatteredFeatures;
@ -22,8 +33,8 @@ public class MapGenNTMFeatures extends MapGenStructure {
private int minDistanceBetweenScatteredFeatures;
public MapGenNTMFeatures() {
this.maxDistanceBetweenScatteredFeatures = 24;
this.minDistanceBetweenScatteredFeatures = 8;
this.maxDistanceBetweenScatteredFeatures = StructureConfig.structureMaxChunks;
this.minDistanceBetweenScatteredFeatures = StructureConfig.structureMinChunks;
}
/** String ID for this MapGen */
@ -97,51 +108,64 @@ public class MapGenNTMFeatures extends MapGenStructure {
* chance/location fails for all other structures. Might not even be necessary, but whatever.
* Rainfall & Temperature Check
*/
//TODO: Do something about this so it's nice-looking and easily readable. Plus, test compatibility against mods like BoP
if(rand.nextBoolean()) { //Empty Ruin Structures
switch(rand.nextInt(4)) {
case 0:
ComponentNTMFeatures.NTMRuin1 ruin1 = new ComponentNTMFeatures.NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMRuin1 ruin1 = new NTMRuin1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(ruin1);
break;
case 1:
ComponentNTMFeatures.NTMRuin2 ruin2 = new ComponentNTMFeatures.NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMRuin2 ruin2 = new NTMRuin2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(ruin2);
break;
case 2:
ComponentNTMFeatures.NTMRuin3 ruin3 = new ComponentNTMFeatures.NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMRuin3 ruin3 = new NTMRuin3(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(ruin3);
break;
case 3:
ComponentNTMFeatures.NTMRuin4 ruin4 = new ComponentNTMFeatures.NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMRuin4 ruin4 = new NTMRuin4(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(ruin4);
}
} else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah
if(rand.nextBoolean()) {
ComponentNTMFeatures.NTMHouse1 house1 = new ComponentNTMFeatures.NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMHouse1 house1 = new NTMHouse1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(house1);
} else {
ComponentNTMFeatures.NTMHouse2 house2 = new ComponentNTMFeatures.NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
NTMHouse2 house2 = new NTMHouse2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(house2);
}
} else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9) { //Taiga & Mega Taiga
if(rand.nextBoolean()) {
ComponentNTMFeatures.NTMWorkshop1 workshop1 = new ComponentNTMFeatures.NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
} else if(biome.temperature >= 0.25 && biome.temperature <= 0.3 && biome.rainfall >= 0.6 && biome.rainfall <= 0.9 && rand.nextBoolean()) { //Taiga & Mega Taiga
NTMWorkshop1 workshop1 = new NTMWorkshop1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(workshop1);
}
} else if(biome.heightVariation <= 0.2 && biome.rainfall <= 0.5 && !(biome instanceof BiomeGenBeach) && rand.nextInt(3) == 0) { //Everything except jungles, extra-hilly areas, and beaches
MilitaryBaseFeatures.smallHelipad(components, chunkX, posY, chunkZ, rand); //agggggggg
} else { //Everything else
if(rand.nextBoolean()) {
ComponentNTMFeatures.NTMLab2 lab2 = new ComponentNTMFeatures.NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(lab2);
} else {
ComponentNTMFeatures.NTMLab1 lab1 = new ComponentNTMFeatures.NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(lab1);
switch(rand.nextInt(3)) {
case 0:
NTMLab2 lab2 = new NTMLab2(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(lab2); break;
case 1:
NTMLab1 lab1 = new NTMLab1(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(lab1); break;
case 2:
LargeOffice office = new LargeOffice(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
this.components.add(office); break;
}
}
if(GeneralConfig.enableDebugMode)
System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n");
if(GeneralConfig.enableDebugMode) {
System.out.print("[Debug] StructureStart at " + (chunkX * 16 + 8) + ", " + posY + ", " + (chunkZ * 16 + 8) + "\n[Debug] Components: ");
this.components.forEach((component) -> {
System.out.print(MapGenStructureIO.func_143036_a((StructureComponent) component) + " ");
});
System.out.print("\n");
}
this.updateBoundingBox();
}

View File

@ -2,7 +2,7 @@ package com.hbm.world.worldgen;
import java.util.Random;
import com.hbm.config.GeneralConfig;
import com.hbm.config.StructureConfig;
import cpw.mods.fml.common.IWorldGenerator;
import net.minecraft.block.Block;
@ -39,12 +39,12 @@ public class NTMWorldGenerator implements IWorldGenerator {
//WorldConfig.enableStructures
/** Spawns structure starts. Utilizes canSpawnStructureAtCoords() + if else checks in Start constructor */
if(GeneralConfig.enableDungeons) {
if(StructureConfig.enableStructures) {
this.NTMFeatureGenerator.func_151539_a(chunkGenerator, world, chunkX, chunkZ, ablock);
}
/** Actually generates structures in a given chunk. */
if(GeneralConfig.enableDungeons) {
if(StructureConfig.enableStructures) {
this.NTMFeatureGenerator.generateStructuresInChunk(world, rand, chunkX, chunkZ);
}
}

View File

@ -0,0 +1,760 @@
package com.hbm.world.worldgen.components;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockBobble.BobbleType;
import com.hbm.blocks.generic.BlockBobble.TileEntityBobble;
import com.hbm.lib.HbmChestContents;
import com.hbm.util.LootGenerator;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemDoor;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.WeightedRandomChestContent;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
/* Described as "Civilian", as that's the overarching connection between all of these structures. Unlike the ruins, there's not enough to
* compartmentalize even further. Just in general many of the structures I consider lower-quality (except for the sandstone houses; those are actually pretty nice).
*/
public class CivilianFeatures {
/** Sandstone Ruin 1 */
public static class NTMHouse1 extends Feature {
private boolean hasPlacedChest;
private static Sandstone RandomSandstone = new Sandstone();
public NTMHouse1() {
super();
}
/** Constructor for this feature; takes coordinates for bounding box */
public NTMHouse1(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 9, 4, 6);
this.hasPlacedChest = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasChest", this.hasPlacedChest);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedChest = nbt.getBoolean("hasChest");
}
/**
* Generates structures.
*/
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
/*
* Places block at current position. Dependent on coordinate mode, i.e. will allow for random rotation, so use this instead of setBlock!
* this.placeBlockAtCurrentPosition(world, block, minX, metadata, x, y, z, box);
* Fills an area with air, self-explanatory. Use to clear interiors of unwanted blocks.
* this.fillWithAir(world, box, minX, minY, minZ, maxX, maxY, maxZ);
* Fills an area with blocks, self-explanatory.
* this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace);
* Fills an area with metadata blocks, self-explanatory.
* this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockPlaceMeta, blockToReplace, replaceBlockMeta, alwaysReplace);
* Fills an area with randomized blocks, self-explanatory.
* this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, alwaysReplace, rand, StructureComponent.blockSelector);
* (BlockSelector is basically a list of blocks that can be randomly picked, except that it can actually be weighted)
* Replaces any air or water blocks with this block down. Useful for foundations
* this.func_151554_b(world, block, metadata, x, startAtY, z, box
* Fills an area with blocks randomly - look into randLimit?
* this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, blockToPlace, blockToReplace, alwaysReplace);
*/
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < this.sizeX + 1; i++) {
for(byte j = 0; j < this.sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box);
}
}
//Walls
this.fillWithRandomizedBlocks(world, box, 0, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall
this.fillWithRandomizedBlocks(world, box, 0, 1, 0, 1, 1, 0, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 1, 0, box);
this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 5, 1, 0, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 6, 1, 0, box);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 7, 1, 0, box);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX, 1, 0, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 0, 2, 0, sizeX - 2, 2, 0, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 0, 1, sizeZ, false, rand, RandomSandstone); //Left Wall
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 0, 2, 1, box);
this.fillWithMetadataBlocks(world, box, 0, 2, 3, 0, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 1, sizeZ, false, rand, RandomSandstone); //Front Wall
this.fillWithRandomizedBlocks(world, box, 3, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 3, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithMetadataBlocks(world, box, 4, 2, sizeZ, 5, 2, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 2, 2, sizeZ, box);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 0, sizeX, 0, sizeZ, false, rand, RandomSandstone); //Right Wall
this.randomlyFillWithBlocks(world, box, rand, 0.65F, sizeX, 1, 1, sizeX, 1, sizeZ - 1, Blocks.sand, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 4, 0, 1, 4, 1, 3, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, ModBlocks.reinforced_sand, 0, 4, 0, 4, box);
//Loot/Sand
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 1, 0, 1, box);
if(!this.hasPlacedChest)
this.hasPlacedChest = this.generateStructureChestContents(world, box, rand, 3, 0, 1, HbmChestContents.modGeneric, rand.nextInt(2) + 8);
this.fillWithBlocks(world, box, 5, 0, 1, 6, 0, 1, ModBlocks.crate, Blocks.air, false);
this.placeBlockAtCurrentPosition(world, Blocks.sand, 0, 7, 0, 1, box);
if(rand.nextFloat() <= 0.25)
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_metal, 0, sizeX - 1, 0, 1, box);
this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 2, 3, 0, sizeZ - 1, Blocks.sand, Blocks.air, false);
this.randomlyFillWithBlocks(world, box, rand, 0.25F, 5, 0, 2, sizeX - 1, 0, sizeZ - 1, Blocks.sand, Blocks.air, false);
return true;
}
}
public static class NTMHouse2 extends Feature {
private static Sandstone RandomSandstone = new Sandstone();
private boolean[] hasPlacedLoot = new boolean[2];
public NTMHouse2() {
super();
}
public NTMHouse2(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 15, 5, 9);
this.hasPlacedLoot[0] = false;
this.hasPlacedLoot[1] = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]);
nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1");
this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2");
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.print(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < 7; i++) {
for(byte j = 0; j < this.sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box);
}
}
for(byte i = 9; i < this.sizeX + 1; i++) {
for(byte j = 0; j < this.sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.sandstone, 0, i, -1, j, box);
}
}
this.fillWithAir(world, box, 1, 0, 1, 5, sizeY, sizeZ - 1);
//House 1
this.fillWithRandomizedBlocks(world, box, 0, 0, 0, 6, 1, 0, false, rand, RandomSandstone); //Back Wall
this.fillWithRandomizedBlocks(world, box, 0, 2, 0, 1, 2, 0, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 2, 2, 0, box);
this.fillWithRandomizedBlocks(world, box, 3, 2, 0, 3, 2, 0, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, 4, 2, 0, box);
this.fillWithRandomizedBlocks(world, box, 5, 2, 0, 6, 2, 0, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 0, 3, 0, 6, 3, 0, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 3, sizeZ, false, rand, RandomSandstone); //Left Wall
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 6, 1, sizeZ, false, rand, RandomSandstone); //Front Wall
this.fillWithRandomizedBlocks(world, box, 1, 2, sizeZ, 1, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithBlocks(world, box, 2, 2, sizeZ, 4, 2, sizeZ, Blocks.fence, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 5, 2, sizeZ, 6, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 1, 3, sizeZ, 6, 3, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 1, 6, 3, sizeZ - 1, false, rand, RandomSandstone); //Right Wall
this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ - 2, 6, 0, sizeZ - 2, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 6, 3, sizeZ - 2, 6, 3, sizeZ - 2, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, 6, 0, 1, 6, 3, sizeZ - 3, false, rand, RandomSandstone);
this.fillWithBlocks(world, box, 1, 0, 1, 5, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor
//this.fillWithRandomizedBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, false, rand, RandomSandstone); //Ceiling
this.fillWithBlocks(world, box, 1, sizeY - 1, 0, 5, sizeY - 1, sizeZ, Blocks.sandstone, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 0, sizeY - 1, 0, 0, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false); //Roof
this.fillWithMetadataBlocks(world, box, 6, sizeY - 1, 0, 6, sizeY - 1, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 2, sizeY, 0, 4, sizeY, 0, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 3, sizeY, 1, 3, sizeY, 2, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 3, sizeY, 4, 3, sizeY, 6, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, 3, sizeY, sizeZ - 1, box);
this.fillWithMetadataBlocks(world, box, 2, sizeY, sizeZ, 4, sizeY, sizeZ, Blocks.stone_slab, 1, Blocks.air, 0, false);
//House 2
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 0, sizeX, 0, 0, false, rand, RandomSandstone); //Back Wall
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 1, 0, sizeX - 2, 1, 0, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 0, sizeX - 6, 2, 0, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, 2, 0, box);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 3, 2, 0, box);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 1, sizeX - 6, 3, 1, false, rand, RandomSandstone); //Left Wall
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 3, 2, sizeX - 6, 3, sizeZ - 1, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX - 6, sizeY - 1, 2, box);
this.fillWithMetadataBlocks(world, box, sizeX - 6, sizeY - 1, 4, sizeX - 6, sizeY - 1, sizeZ - 2, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 3, sizeX - 6, 1, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 0, 2, sizeX - 6, 0, 2, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 3, sizeX - 6, 2, 3, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.fence, 0, sizeX - 6, 2, 4, box);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, 5, sizeX - 6, 2, 5, false, rand, RandomSandstone);
this.fillWithBlocks(world, box, sizeX - 6, 2, sizeZ - 3, sizeX - 6, 2, sizeZ - 2, Blocks.fence, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX - 6, 2, sizeZ - 1, sizeX - 6, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 5, 0, sizeZ, sizeX, 1, sizeZ, false, rand, RandomSandstone); //Front Wall
this.fillWithRandomizedBlocks(world, box, sizeX - 5, 2, sizeZ, sizeX - 5, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX, 2, sizeZ, false, rand, RandomSandstone);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, false, rand, RandomSandstone); //Right Wall
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 1, 3, false, rand, RandomSandstone);
this.fillWithMetadataBlocks(world, box, sizeX, 1, 4, sizeX, 1, 5, Blocks.stone_slab, 1, Blocks.air, 0, false);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 1, sizeZ - 3, false, rand, RandomSandstone);
this.placeBlockAtCurrentPosition(world, Blocks.stone_slab, 1, sizeX, 1, sizeZ - 1, box);
this.fillWithBlocks(world, box, sizeX - 5, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.sandstone, Blocks.air, false); //Floor
//Loot & Decorations
//House 1
int eastMeta = this.getDecoMeta(4);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_boiler_off, 4, 1, 1, 1, box);
this.fillWithBlocks(world, box, 1, 2, 1, 1, 3, 1, ModBlocks.deco_pipe_quad_rusted, Blocks.air, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.deco_pipe_rim_rusted, 0, 1, sizeY, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 2, 1, 3, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, 1, 1, sizeZ - 4, box);
if(!hasPlacedLoot[0]) {
this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), 1, 1, sizeZ - 2, box);
WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.machineParts, (TileEntityChest)world.getTileEntity(this.getXWithOffset(1, sizeZ - 2),
this.getYWithOffset(1), this.getZWithOffset(1, sizeZ - 2)), 10);
this.hasPlacedLoot[0] = true;
}
this.fillWithBlocks(world, box, 4, 1, sizeZ - 1, 5, 1, sizeZ - 1, ModBlocks.crate, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 5, 1, 4, 5, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 5, 1, 6, 5, 3, 6, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.steel_grate, 7, 5, 1, 5, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_weapon, 0, 5, 2, 5, box);
//House 2
if(!hasPlacedLoot[1]) {
this.placeBlockAtCurrentPosition(world, Blocks.chest, this.getMetadataWithOffset(Blocks.chest, 3), sizeX - 5, 1, 1, box);
WeightedRandomChestContent.generateChestContents(rand, HbmChestContents.antenna, (TileEntityChest)world.getTileEntity(this.getXWithOffset(sizeX - 5, 1),
this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 1)), 10);
this.hasPlacedLoot[1] = true;
}
this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 5, 1, 4, box);
TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 5, 4), this.getYWithOffset(1), this.getZWithOffset(sizeX - 5, 4));
if(bobble != null) {
bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1];
bobble.markDirty();
}
this.randomlyFillWithBlocks(world, box, rand, 0.25F, sizeX - 4, 1, 1, sizeX - 1, 1, sizeZ - 1, Blocks.sand, Blocks.air, false);
return true;
}
}
public static class NTMLab1 extends Feature {
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
private static LabTiles RandomLabTiles = new LabTiles();
private boolean[] hasPlacedLoot = new boolean[2];
public NTMLab1() {
super();
}
/** Constructor for this feature; takes coordinates for bounding box */
public NTMLab1(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 9, 4, 7);
this.hasPlacedLoot[0] = false;
this.hasPlacedLoot[1] = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]);
nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1");
this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2");
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < this.sizeX + 1; i++) {
for(byte j = 0; j < this.sizeZ - 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
for(byte i = 3; i < this.sizeX + 1; i++) {
for(byte j = 6; j < this.sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
if(this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box).getMaterial().isReplaceable()
|| this.getBlockAtCurrentPosition(world, 2, 0, sizeZ - 1, box) == Blocks.air) {
this.func_151554_b(world, Blocks.stonebrick, 0, 2, -1, sizeZ - 1, box);
this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, getStairMeta(0), 2, 0, sizeZ - 1, box);
}
this.fillWithAir(world, box, 1, 0, 1, sizeX - 1, sizeY, 4);
this.fillWithAir(world, box, 4, 0, 4, sizeX - 1, sizeY, sizeZ - 1);
this.fillWithAir(world, box, 3, 1, sizeZ - 1, 3, 2, sizeZ - 1);
int pillarMeta = this.getPillarMeta(8);
//Pillars
this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, 4, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 0, sizeZ - 1, ModBlocks.concrete_pillar, pillarMeta, Blocks.air, 0, false);
this.fillWithBlocks(world, box, 0, 0, sizeZ - 2, 0, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithBlocks(world, box, 3, 0, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
//Walls
this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, sizeY - 1, 0, false, rand, RandomConcreteBricks); //Back Wall
this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, sizeX, sizeY, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, sizeY - 1, 4, false, rand, RandomConcreteBricks); //Left Wall
this.fillWithRandomizedBlocks(world, box, 0, sizeY, 0, 0, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 2, sizeY, sizeZ - 2, false, rand, RandomConcreteBricks); //Front Wall Pt. 1
this.placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete_broken, 0, 3, sizeY, sizeZ - 2, box);
this.fillWithRandomizedBlocks(world, box, 3, sizeY - 1, sizeZ - 1, 3, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ, sizeX - 1, 1, sizeZ, false, rand, RandomConcreteBricks); //Front Wall Pt. 2
this.fillWithRandomizedBlocks(world, box, 4, 2, sizeZ, 4, 3, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 3, sizeZ, false, rand, RandomConcreteBricks);
this.randomlyFillWithBlocks(world, box, rand, 0.75F, 5, 2, sizeZ, sizeX - 2, 3, sizeZ, Blocks.glass_pane, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 3, sizeY, sizeZ, sizeX, sizeY, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, sizeY, sizeZ - 1, false, rand, RandomConcreteBricks); //Right Wall
//Floor & Ceiling
this.fillWithRandomizedBlocks(world, box, 1, 0, 1, sizeX - 1, 0, 4, false, rand, RandomLabTiles); //Floor
this.fillWithRandomizedBlocks(world, box, 4, 0, sizeZ - 2, sizeX - 1, 0, sizeZ - 1, false, rand, RandomLabTiles);
this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 3, 0, sizeZ - 1, box);
this.fillWithBlocks(world, box, 1, sizeY - 1, 1, 1, sizeY, 4, ModBlocks.reinforced_glass, Blocks.air, false); //Ceiling
this.fillWithBlocks(world, box, 2, sizeY, 1, sizeX - 1, sizeY, 4, ModBlocks.brick_light, Blocks.air, false);
this.fillWithBlocks(world, box, 4, sizeY, sizeZ - 2, sizeX - 1, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false);
//Decorations & Loot
this.fillWithMetadataBlocks(world, box, 1, 1, 1, 1, 1, 4, Blocks.dirt, 2, Blocks.air, 0, false);
int westDecoMeta = this.getDecoMeta(5);
this.fillWithMetadataBlocks(world, box, 2, 1, 1, 2, 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 2, sizeY - 1, 1, 2, sizeY - 1, 4, ModBlocks.steel_wall, westDecoMeta, Blocks.air, 0, false);
for(byte i = 0; i < 4; i++) {
this.placeBlockAtCurrentPosition(world, ModBlocks.plant_flower, i, 1, 2, 1 + i, box);
}
int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 2);
this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, 3, 1, sizeZ - 1, box);
ItemDoor.placeDoorBlock(world, this.getXWithOffset(3, sizeZ - 1), this.getYWithOffset(1), this.getZWithOffset(3, sizeZ - 1), doorMeta, ModBlocks.door_office);
int northDecoMeta = this.getDecoMeta(3);
this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_scaffold, westDecoMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 5, sizeY - 1, 2, sizeX - 1, sizeY - 1, 2, ModBlocks.steel_wall, northDecoMeta, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_electric_furnace_off, northDecoMeta, 5, 1, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_microwave, northDecoMeta, 5, 2, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, 6, 1, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_shredder, 0, sizeX - 2, 1, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.deco_titanium, 0, sizeX - 1, 1, 1, box);
this.fillWithBlocks(world, box, 5, 1, 3, sizeX - 1, 1, 3, ModBlocks.deco_titanium, Blocks.air, false);
if(!hasPlacedLoot[0]) {
this.placeBlockAtCurrentPosition(world, ModBlocks.deco_loot, 0, 6, 2, 3, box);
LootGenerator.lootMedicine(world, this.getXWithOffset(6, 3), this.getYWithOffset(2), this.getZWithOffset(6, 3));
this.hasPlacedLoot[0] = true;
}
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_can, 0, sizeX - 1, 1, sizeZ - 2, box);
if(!hasPlacedLoot[1]) {
this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 1, 1, sizeZ - 1, HbmChestContents.modGeneric, 8);
}
return true;
}
}
public static class NTMLab2 extends Feature {
private static SuperConcrete RandomSuperConcrete = new SuperConcrete();
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
private static LabTiles RandomLabTiles = new LabTiles();
private boolean[] hasPlacedLoot = new boolean[2];
public NTMLab2() {
super();
}
public NTMLab2(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 12, 11, 8);
this.hasPlacedLoot[0] = false;
this.hasPlacedLoot[1] = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]);
nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1");
this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2");
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
this.boundingBox.offset(0, -7, 0);
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < sizeX + 1; i++) {
for(byte j = 0; j < sizeZ - 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box);
}
}
for(byte i = 0; i < 7; i++) {
for(byte j = 7; j < sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, 6, j, box);
}
}
if(this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box).getMaterial().isReplaceable()
|| this.getBlockAtCurrentPosition(world, sizeX - 3, sizeY - 4, 7, box) == Blocks.air) {
int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 2);
this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 3, sizeY - 4, 7, box);
this.func_151554_b(world, Blocks.stonebrick, 0, sizeX - 2, sizeY - 4, 7, box);
this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 4, 7, sizeX - 2, sizeY - 4, 7, Blocks.stone_brick_stairs, stairMeta, Blocks.air, 0, false);
}
this.fillWithAir(world, box, 1, sizeY - 4, 1, sizeX - 1, sizeY, sizeZ - 3);
this.fillWithAir(world, box, 1, sizeY - 4, sizeZ - 2, 5, sizeY, sizeZ - 1);
this.fillWithAir(world, box, sizeX - 3, sizeY - 3, sizeZ - 2, sizeX - 2, sizeY - 2, sizeZ - 2);
this.fillWithAir(world, box, 5, 5, 1, 6, 6, 2);
this.fillWithAir(world, box, 2, 0, 2, sizeX - 2, 3, sizeZ - 2);
//Walls
this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, sizeX, sizeY, 0, false, rand, RandomSuperConcrete); //Back Wall
this.fillWithRandomizedBlocks(world, box, 0, sizeY - 4, 0, 0, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Left Wall
this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, sizeZ, 5, sizeY - 4, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 1
this.fillWithBlocks(world, box, 1, sizeY - 3, sizeZ, 1, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 2, sizeY - 4, sizeZ, 2, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 3, sizeY - 3, sizeZ, 3, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ, 4, sizeY - 1, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 5, sizeY - 3, sizeZ, 5, sizeY - 1, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, sizeY, sizeZ, 5, sizeY, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 1, 6, sizeY, sizeZ, false, rand, RandomSuperConcrete); //Front Wall pt. 2
this.fillWithRandomizedBlocks(world, box, 6, sizeY - 4, sizeZ - 2, 7, sizeY - 2, sizeZ - 2, false, rand, RandomSuperConcrete); //Front Wall pt. 3
this.fillWithBlocks(world, box, 6, sizeY - 1, sizeZ - 2, 7, sizeY - 1, sizeZ - 2, ModBlocks.concrete_super_broken, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, sizeZ - 2, sizeX, sizeY - 4, sizeZ - 2, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 3, sizeZ - 2, sizeX - 4, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 1, sizeZ - 2, sizeX - 2, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY - 4, sizeZ - 2, sizeX, sizeY, sizeZ - 2, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 4, 1, sizeX, sizeY - 4, sizeZ - 3, false, rand, RandomSuperConcrete); //Right Wall
this.fillWithBlocks(world, box, sizeX, sizeY - 3, sizeZ - 3, sizeX, sizeY - 1, sizeZ - 3, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 4, sizeX, sizeY - 1, 4, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, sizeX, sizeY - 3, 3, sizeX, sizeY - 1, 3, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX, sizeY - 3, 2, sizeX, sizeY - 1, 2, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, sizeX, sizeY - 3, 1, sizeX, sizeY - 1, 1, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX, sizeY, 1, sizeX, sizeY, sizeZ - 3, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 1, 0, 1, sizeX - 1, 3, 1, ModBlocks.reinforced_stone, Blocks.air, false); //Back Wall
this.fillWithBlocks(world, box, 1, 0, 2, 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Left Wall
this.fillWithBlocks(world, box, 1, 0, sizeZ - 1, sizeX - 1, 3, sizeZ - 1, ModBlocks.reinforced_stone, Blocks.air, false); //Front Wall
this.fillWithBlocks(world, box, sizeX - 1, 0, 2, sizeX - 1, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); // Right Wall
this.fillWithBlocks(world, box, 6, 0, 3, 6, 3, sizeZ - 2, ModBlocks.reinforced_stone, Blocks.air, false); //Internal Wall
//Floors & Ceiling
this.fillWithRandomizedBlocks(world, box, 1, sizeY - 4, 1, 3, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles); //Left Floor
this.fillWithRandomizedBlocks(world, box, 4, sizeY - 4, sizeZ - 2, 5, sizeY - 4, sizeZ - 1, false, rand, RandomLabTiles);
this.fillWithRandomizedBlocks(world, box, sizeX - 4, sizeY - 4, 1, sizeX - 1, sizeY - 4, sizeZ - 3, false, rand, RandomLabTiles); //Right Floor
this.fillWithRandomizedBlocks(world, box, sizeX - 3, sizeY - 4, sizeZ - 2, sizeX - 2, sizeY - 4, sizeZ - 2, false, rand, RandomLabTiles);
this.fillWithBlocks(world, box, 4, sizeY - 4, 1, 7, sizeY - 4, 1, ModBlocks.tile_lab_broken, Blocks.air, false); //Center Floor (Pain)
this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 4, sizeY - 4, 2, box);
this.fillWithBlocks(world, box, 4, sizeY - 4, 3, 4, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 5, sizeY - 4, 3, box);
this.fillWithBlocks(world, box, 5, sizeY - 4, 4, 5, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_broken, 0, 6, sizeY - 4, 4, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.tile_lab_cracked, 0, 6, sizeY - 4, 5, box);
this.fillWithBlocks(world, box, 7, sizeY - 4, 2, 7, sizeY - 4, 3, ModBlocks.tile_lab_broken, Blocks.air, false);
this.fillWithBlocks(world, box, 7, sizeY - 4, 4, 7, sizeY - 4, 5, ModBlocks.tile_lab_cracked, Blocks.air, false);
this.fillWithBlocks(world, box, 1, sizeY, 1, 2, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Left Ceiling
this.fillWithBlocks(world, box, 3, sizeY, sizeZ - 2, 4, sizeY, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false);
this.fillWithBlocks(world, box, sizeX - 3, sizeY, 1, sizeX - 1, sizeY, sizeZ - 3, ModBlocks.brick_light, Blocks.air, false); //Right Ceiling
this.fillWithBlocks(world, box, 3, sizeY, 1, 8, sizeY, 1, ModBlocks.waste_planks, Blocks.air, false); //Center Ceiling (Pain)
this.fillWithBlocks(world, box, 3, sizeY, 2, 4, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithBlocks(world, box, 7, sizeY, 2, 8, sizeY, 2, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithBlocks(world, box, 3, sizeY, 3, 3, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithBlocks(world, box, 4, sizeY, 4, 4, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithBlocks(world, box, 5, sizeY, 6, 5, sizeY, sizeZ - 1, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithBlocks(world, box, 8, sizeY, 3, 8, sizeY, 5, ModBlocks.waste_planks, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 2, 0, 2, 5, 0, sizeZ - 2, false, rand, RandomLabTiles); //Floor
this.fillWithRandomizedBlocks(world, box, 6, 0, 2, 6, 0, 3, false, rand, RandomLabTiles);
this.fillWithRandomizedBlocks(world, box, 7, 0, 2, sizeX - 2, 0, sizeZ - 2, false, rand, RandomLabTiles);
this.fillWithRandomizedBlocks(world, box, 1, 4, 1, sizeX - 1, 4, sizeZ - 1, false, rand, RandomConcreteBricks); //Ceiling
//Decorations & Loot
int eastMeta = this.getDecoMeta(4);
int westMeta = this.getDecoMeta(5);
int northMeta = this.getDecoMeta(3);
int southMeta = this.getDecoMeta(2);
this.placeBlockAtCurrentPosition(world, ModBlocks.crashed_balefire, southMeta, 6, sizeY - 2, 3, box);
int doorMeta = this.getMetadataWithOffset(Blocks.wooden_door, 1);
this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 3, sizeY - 3, sizeZ - 2, box);
ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 3, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 3, sizeZ - 2),
doorMeta, ModBlocks.door_office);
this.placeBlockAtCurrentPosition(world, ModBlocks.door_office, doorMeta, sizeX - 2, sizeY - 3, sizeZ - 2, box);
ItemDoor.placeDoorBlock(world, this.getXWithOffset(sizeX - 2, sizeZ - 2), this.getYWithOffset(sizeY - 3), this.getZWithOffset(sizeX - 2, sizeZ - 2),
doorMeta, ModBlocks.door_office);
this.fillWithBlocks(world, box, 1, sizeY - 3, 1, 1, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 1, sizeY - 3, 2, 1, sizeY - 2, 3, ModBlocks.steel_grate, 7, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, westMeta, 1, sizeY - 1, 2, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, 1, sizeY - 1, 3, box);
this.fillWithBlocks(world, box, 1, sizeY - 3, 6, 1, sizeY - 1, 6, ModBlocks.deco_pipe_framed_rusted, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, sizeX - 4, sizeY - 3, 1, sizeX - 4, sizeY - 1, 1, ModBlocks.steel_wall, eastMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 1, 1, sizeX - 2, sizeY - 1, 1, ModBlocks.steel_grate, 0, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX - 3, sizeY - 2, 1, sizeX - 2, sizeY - 2, 1, ModBlocks.tape_recorder, northMeta, Blocks.air, 0, false);
this.fillWithBlocks(world, box, sizeX - 3, sizeY - 3, 1, sizeX - 2, sizeY - 3, 1, ModBlocks.deco_steel, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, sizeX - 1, sizeY - 3, 1, sizeX - 1, sizeY - 1, 1, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 2, 1, 2, 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.vitrified_barrel, 0, 2, 2, 2, box);
this.fillWithMetadataBlocks(world, box, 3, 1, 2, 3, 3, 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 3, 1, 4, 3, 3, 4, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 3, 1, sizeZ - 2, 3, 3, sizeZ - 2, ModBlocks.steel_wall, westMeta, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.crate, 0, 4, 1, sizeZ - 2, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.crate_lead, 0, 4, 2, sizeZ - 2, box);
if(!hasPlacedLoot[0]) {
this.hasPlacedLoot[0] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 5, 1, sizeZ - 2, HbmChestContents.nuclearFuel, 10);
}
this.fillWithBlocks(world, box, 4, 1, sizeZ - 3, 5, 1, sizeZ - 3, ModBlocks.crate_lead, Blocks.air, false);
this.fillWithBlocks(world, box, sizeX - 5, 1, sizeZ - 2, sizeX - 5, 3, sizeZ - 2, ModBlocks.deco_steel, Blocks.air, false);;
this.fillWithMetadataBlocks(world, box, sizeX - 4, 1, sizeZ - 2, sizeX - 2, 1, sizeZ - 2, ModBlocks.steel_grate, 7, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX - 4, 2, sizeZ - 2, sizeX - 3, 2, sizeZ - 2, ModBlocks.tape_recorder, southMeta, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.steel_beam, 0, sizeX - 2, 2, sizeZ - 2, box);
this.fillWithBlocks(world, box, sizeX - 4, 3, sizeZ - 2, sizeX - 2, 3, sizeZ - 2, ModBlocks.steel_roof, Blocks.air, false);
if(!hasPlacedLoot[1]) {
this.hasPlacedLoot[1] = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, sizeX - 2, 1, 3, HbmChestContents.nukeTrash, 9);
}
return true;
}
}
public static class NTMWorkshop1 extends Feature {
private static SuperConcrete RandomSuperConcrete = new SuperConcrete();
private boolean hasPlacedLoot;
public NTMWorkshop1() {
super();
}
public NTMWorkshop1(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 10, 6, 8);
this.hasPlacedLoot = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasLoot", this.hasPlacedLoot);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedLoot = nbt.getBoolean("hasLoot");
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
////System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 1; i < sizeX - 2; i++) {
for(byte j = 0; j < sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
for(byte i = 8; i < sizeX + 1; i++) {
for(byte j = 1; j < 7; j++) {
this.func_151554_b(world, Blocks.dirt, 0, i, -1, j, box);
}
}
this.fillWithAir(world, box, 1, 0, 0, sizeX - 3, sizeY - 2, sizeZ);
this.fillWithAir(world, box, sizeX - 2, 0, 2, sizeX - 1, 2, 5);
if(this.getBlockAtCurrentPosition(world, 0, 0, 5, box).getMaterial().isReplaceable()
|| this.getBlockAtCurrentPosition(world, 0, 0, 5, box) == Blocks.air) {
int stairMeta = this.getMetadataWithOffset(Blocks.stone_brick_stairs, 1);
this.placeBlockAtCurrentPosition(world, Blocks.stone_brick_stairs, stairMeta, 0, 0, 5, box);
for(byte i = 1; 1 < sizeZ; i++) {
this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box);
}
this.fillWithMetadataBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, Blocks.stone_slab, 5, Blocks.air, 0, false);
}
//Walls
int pillarMetaWE = this.getPillarMeta(4);
int pillarMetaNS = this.getPillarMeta(8);
this.fillWithBlocks(world, box, 1, 0, 0, 1, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall
this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, 0, box);
this.fillWithMetadataBlocks(world, box, 2, 4, 0, sizeX - 4, 4, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, 0, box);
this.fillWithBlocks(world, box, sizeX - 3, 0, 0, sizeX - 3, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 2, 0, 0, sizeX - 4, 1, 0, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 2, 2, 0, 2, 2, 0, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 3, 2, 0, 5, 2, 0, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, 0, sizeX - 4, 2, 0, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 2, 3, 0, sizeX - 4, 3, 0, false, rand, RandomSuperConcrete);
this.fillWithMetadataBlocks(world, box, 1, 4, 1, 1, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall
this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, 1, 4, sizeZ, box);
this.fillWithBlocks(world, box, 1, 0, sizeZ, 1, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, 1, 1, 1, 4, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 1, 2, 1, 1, 2, 1, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 1, 2, 2, 1, 2, 3, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 2, 4, 1, 2, 4, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 1, 3, 1, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ - 2, 1, 3, sizeZ - 1, false, rand, RandomSuperConcrete);
this.fillWithMetadataBlocks(world, box, 2, 4, sizeZ, sizeX - 4, 4, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall
this.placeBlockAtCurrentPosition(world, ModBlocks.concrete, 0, sizeX - 3, 4, sizeZ, box);
this.fillWithBlocks(world, box, sizeX - 3, 0, sizeZ, sizeX - 3, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 2, 0, sizeZ, sizeX - 4, 1, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 2, 2, sizeZ, 2, 2, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, 3, 2, sizeZ, 5, 2, sizeZ, ModBlocks.reinforced_glass, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX - 4, 2, sizeZ, sizeX - 4, 2, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 2, 3, sizeZ, sizeX - 4, 3, sizeZ, false, rand, RandomSuperConcrete);
this.fillWithMetadataBlocks(world, box, sizeX - 3, 4, 1, sizeX - 3, 4, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall
this.fillWithRandomizedBlocks(world, box, sizeX - 3, 0, 1, sizeX - 3, 3, sizeZ - 1, false, rand, RandomSuperConcrete);
pillarMetaWE = this.getPillarMeta(5);
pillarMetaNS = this.getPillarMeta(9);
this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 1, sizeX - 1, 2, 1, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Back Wall
this.fillWithMetadataBlocks(world, box, sizeX, 0, 1, sizeX, 2, 1, Blocks.log, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 1, sizeX - 1, 1, 1, Blocks.planks, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX, 2, 2, sizeX, 2, 5, Blocks.log, pillarMetaNS, Blocks.air, 0, false); //Right Wall
this.fillWithMetadataBlocks(world, box, sizeX, 0, 6, sizeX, 2, 6, Blocks.log, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX, 0, 3, sizeX, 1, 5, Blocks.planks, 1, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, sizeX - 2, 2, 6, sizeX - 1, 2, 6, Blocks.log, pillarMetaWE, Blocks.air, 0, false); //Front Wall
this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 6, sizeX - 1, 1, 6, Blocks.planks, 1, Blocks.air, 0, false);
//Floor & Ceiling
this.fillWithBlocks(world, box, 2, 0, 1, 6, 0, sizeZ - 1, ModBlocks.brick_light, Blocks.air, false); //Floor
this.placeBlockAtCurrentPosition(world, ModBlocks.brick_light, 0, 1, 0, 5, box);
this.fillWithRandomizedBlocks(world, box, 2, 4, 1, 6, 4, 3, false, rand, RandomSuperConcrete); //Ceiling
this.fillWithRandomizedBlocks(world, box, 2, 4, 4, 2, 4, 4, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 5, 4, 4, 6, 4, 4, false, rand, RandomSuperConcrete);
this.fillWithRandomizedBlocks(world, box, 2, 4, sizeZ - 3, 6, 4, sizeZ - 1, false, rand, RandomSuperConcrete);
this.fillWithBlocks(world, box, sizeX - 2, 2, 2, sizeX - 1, 2, 5, ModBlocks.deco_steel, Blocks.air, false);
//Loot & Decorations
int southMeta = this.getDecoMeta(2);
int eastMeta = this.getDecoMeta(5);
this.placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 2, sizeY - 1, 1, box);
this.fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.deco_steel, Blocks.air, false);
this.fillWithBlocks(world, box, 2, sizeY - 1, 2, 4, sizeY - 1, 2, ModBlocks.deco_steel, Blocks.air, false);
this.fillWithBlocks(world, box, 2, sizeY, 1, 4, sizeY, 2, ModBlocks.steel_roof, Blocks.air, false);
this.fillWithBlocks(world, box, 2, 1, 1, 2, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false);
this.fillWithBlocks(world, box, 3, 1, 1, 3, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_generator, 0, 4, 1, 1, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.machine_detector, 0, 4, 1, 2, box);
this.fillWithBlocks(world, box, 5, 1, 1, 5, 1, 2, ModBlocks.deco_beryllium, Blocks.air, false);
this.fillWithBlocks(world, box, 6, 1, 1, 6, 3, 1, ModBlocks.deco_red_copper, Blocks.air, false);
this.fillWithBlocks(world, box, 3, 1, 4, 4, 1, 4, ModBlocks.concrete_super_broken, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 6, 1, 4, 6, 3, 4, ModBlocks.steel_scaffold, eastMeta, Blocks.air, 0, false);
this.fillWithMetadataBlocks(world, box, 6, 1, 5, 6, 1, 7, ModBlocks.steel_grate, 7, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.radiorec, eastMeta, 6, 2, sizeZ - 1, box);
this.fillWithMetadataBlocks(world, box, 2, 1, sizeZ - 1, 3, 1, sizeZ - 1, ModBlocks.machine_electric_furnace_off, southMeta, Blocks.air, 0, false);
if(!hasPlacedLoot) {
this.hasPlacedLoot = this.generateInvContents(world, box, rand, ModBlocks.crate_iron, 4, 1, sizeZ - 1, HbmChestContents.machineParts, 11);
}
this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 5, 3, 1, box);
this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 2, 1, 2, box);
this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 1, 2, box);
this.placeBlockAtCurrentPosition(world, Blocks.web, 0, 6, 2, 5, box);
this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 5, sizeX - 1, 0, 5, ModBlocks.steel_grate, 7, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, ModBlocks.tape_recorder, southMeta, sizeX - 2, 1, 5, box);
this.placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), sizeX - 1, 1, 5, box);
TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(this.getXWithOffset(sizeX - 1, 5), this.getYWithOffset(1), this.getZWithOffset(sizeX - 1, 5));
if(bobble != null) {
bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1];
bobble.markDirty();
}
this.fillWithMetadataBlocks(world, box, sizeX - 2, 0, 2, sizeX - 2, 0, 3, Blocks.log, pillarMetaWE, Blocks.air, 0, false);
this.placeBlockAtCurrentPosition(world, Blocks.log, pillarMetaWE, sizeX - 2, 1, 2, box);
this.placeBlockAtCurrentPosition(world, Blocks.web, 0, sizeX - 2, 1, 3, box);
return true;
}
}
}

View File

@ -0,0 +1,507 @@
package com.hbm.world.worldgen.components;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockBobble.BobbleType;
import com.hbm.blocks.generic.BlockBobble.TileEntityBobble;
import com.hbm.config.StructureConfig;
import com.hbm.lib.HbmChestContents;
import com.hbm.tileentity.machine.TileEntityLockableBase;
import com.hbm.tileentity.machine.storage.TileEntityCrateIron;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.WeightedRandomChestContent;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
import net.minecraft.world.gen.structure.StructureComponent;
abstract public class Feature extends StructureComponent {
/** The size of the bounding box for this feature in the X axis */
protected int sizeX;
/** The size of the bounding box for this feature in the Y axis */
protected int sizeY;
/** The size of the bounding box for this feature in the Z axis */
protected int sizeZ;
/** Average height (Presumably stands for height position) */
protected int hpos = -1;
protected Feature() {
super(0);
}
protected Feature(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) {
super(0);
this.sizeX = maxX;
this.sizeY = maxY;
this.sizeZ = maxZ;
this.coordBaseMode = rand.nextInt(4);
switch(this.coordBaseMode) {
case 0:
this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ);
break;
case 1:
this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX);
break;
case 2:
this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ);
break;
case 3:
this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxZ, minY + maxY, minZ + maxX);
break;
default:
this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ);
}
}
/** Set to NBT */
protected void func_143012_a(NBTTagCompound nbt) {
nbt.setInteger("Width", this.sizeX);
nbt.setInteger("Height", this.sizeY);
nbt.setInteger("Depth", this.sizeZ);
nbt.setInteger("HPos", this.hpos);
}
/** Get from NBT */
protected void func_143011_b(NBTTagCompound nbt) {
this.sizeX = nbt.getInteger("Width");
this.sizeY = nbt.getInteger("Height");
this.sizeZ = nbt.getInteger("Depth");
this.hpos = nbt.getInteger("HPos");
}
protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) {
int total = 0;
int iterations = 0;
for(int z = this.boundingBox.minZ; z <= this.boundingBox.maxZ; z++) {
for(int x = this.boundingBox.minX; x <= this.boundingBox.maxX; x++) {
if(box.isVecInside(x, y, z)) {
total += Math.max(world.getTopSolidOrLiquidBlock(x, z), world.provider.getAverageGroundLevel());
iterations++;
}
}
}
if(iterations == 0)
return false;
this.hpos = total / iterations; //finds mean of every block in bounding box
this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0);
return true;
}
/** Metadata for Decoration Methods **/
/**
* Gets metadata for rotatable pillars.
* @param metadata (First two digits are equal to block metadata, other two are equal to orientation
* @return metadata adjusted for random orientation
*/
protected int getPillarMeta(int metadata) {
if(this.coordBaseMode % 2 != 0 && this.coordBaseMode != -1)
metadata = metadata ^ 12;
return metadata;
}
/**
* Gets metadata for rotatable DecoBlock
* honestly i don't remember how i did this and i'm scared to optimize it because i fail to see any reasonable patterns like the pillar
* seriously, 3 fucking bits for 4 orientations when you can do it easily with 2?
* @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West
*/
protected int getDecoMeta(int metadata) {
switch(this.coordBaseMode) {
case 0: //South
switch(metadata) {
case 2: return 2;
case 3: return 3;
case 4: return 4;
case 5: return 5;
}
case 1: //West
switch(metadata) {
case 2: return 5;
case 3: return 4;
case 4: return 2;
case 5: return 3;
}
case 2: //North
switch(metadata) {
case 2: return 3;
case 3: return 2;
case 4: return 5;
case 5: return 4;
}
case 3: //East
switch(metadata) {
case 2: return 4;
case 3: return 5;
case 4: return 3;
case 5: return 2;
}
}
return 0;
}
/**
* Get orientation-offset metadata for BlockDecoModel
* @param metadata (0 for facing North, 1 for facing South, 2 for facing West, 3 for facing East)
*/
protected int getDecoModelMeta(int metadata) {
//N: 0b00, S: 0b01, W: 0b10, E: 0b11
switch(this.coordBaseMode) {
default: //South
break;
case 1: //West
if((metadata & 3) < 2) //N & S can just have bits toggled
metadata = metadata ^ 3;
else //W & E can just have first bit set to 0
metadata = metadata ^ 2;
break;
case 2: //North
metadata = metadata ^ 1; //N, W, E & S can just have first bit toggled
break;
case 3: //East
if((metadata & 3) < 2)//N & S can just have second bit set to 1
metadata = metadata ^ 2;
else //W & E can just have bits toggled
metadata = metadata ^ 3;
break;
}
return metadata;
}
/**
* Gets orientation-adjusted meta for stairs.
* 0 = West, 1 = East, 2 = North, 3 = South
*/
protected int getStairMeta(int metadata) {
switch(this.coordBaseMode) {
default: //South
break;
case 1: //West
if((metadata & 3) < 2) //Flip second bit for E/W
metadata = metadata ^ 2;
else
metadata = metadata ^ 3; //Flip both bits for N/S
break;
case 2: //North
metadata = metadata ^ 1; //Flip first bit
break;
case 3: //East
if((metadata & 3) < 2) //Flip both bits for E/W
metadata = metadata ^ 3;
else //Flip second bit for N/S
metadata = metadata ^ 2;
break;
}
return metadata;
}
/* For Later:
* 0/S: S->S; W->W; N->N; E->E
* 1/W: S->W; W->N; N->E; E->S
* 2/N: S->N; W->E; N->S; E->W
* 3/E: S->E; W->S; N->W; E->N
* 0/b00/W, 1/b01/N, 2/b10/E, 3/b11/S
*/
/**
* Places door at specified location with orientation-adjusted meta
* 0 = West, 1 = North, 2 = East, 3 = South
*/
protected void placeDoor(World world, StructureBoundingBox box, Block door, int meta, int featureX, int featureY, int featureZ) {
switch(this.coordBaseMode) {
default:
break;
case 1:
meta = (meta + 1) % 4; break;
case 2:
meta = meta ^ 2; break; //Flip second bit
case 3:
meta = (meta - 1) % 4; break;
}
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
this.placeBlockAtCurrentPosition(world, door, meta, featureX, featureY, featureZ, box);
ItemDoor.placeDoorBlock(world, posX, posY, posZ, meta, door);
}
/** Loot Methods **/
/**
* it feels disgusting to make a method with this many parameters but fuck it, it's easier
* @return TE implementing IInventory with randomized contents
*/
protected boolean generateInvContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) {
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box);
IInventory inventory = (IInventory)world.getTileEntity(posX, posY, posZ);
if(inventory != null) {
amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor);
WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount);
return true;
}
return false;
}
/**
* Block TE MUST extend TileEntityLockableBase, otherwise this will not work and crash!
* @return TE implementing IInventory and extending TileEntityLockableBase with randomized contents + lock
*/
protected boolean generateLockableContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ,
WeightedRandomChestContent[] content, int amount, double mod) {
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
this.placeBlockAtCurrentPosition(world, block, 0, featureX, featureY, featureZ, box);
TileEntity tile = world.getTileEntity(posX, posY, posZ);
TileEntityLockableBase lock = (TileEntityLockableBase) tile;
IInventory inventory = (IInventory) tile;
if(inventory != null && lock != null) {
lock.setPins(rand.nextInt(999) + 1);
lock.setMod(mod);
lock.lock();
amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor);
WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount);
return true;
}
return false;
}
protected void generateLoreBook(World world, StructureBoundingBox box, int featureX, int featureY, int featureZ, int slot, String key) {
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
IInventory inventory = (IInventory) world.getTileEntity(posX, posY, posZ);
if(inventory != null) {
ItemStack book = HbmChestContents.genetateBook(key);
inventory.setInventorySlotContents(slot, book);
}
}
/**
* Places random bobblehead with a randomized orientation at specified location
*/
protected void placeRandomBobble(World world, StructureBoundingBox box, Random rand, int featureX, int featureY, int featureZ) {
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box);
TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ);
if(bobble != null) {
bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1];
bobble.markDirty();
}
}
/** Block Placement Utility Methods **/
/**
* Places blocks underneath location until reaching a solid block; good for foundations
*/
protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int minX, int minZ, int maxX, int maxZ, int featureY, StructureBoundingBox box) {
for(int featureX = minX; featureX <= maxX; featureX++) {
for(int featureZ = minZ; featureZ <= maxZ; featureZ++) {
int posX = this.getXWithOffset(featureX, featureZ);
int posY = this.getYWithOffset(featureY);
int posZ = this.getZWithOffset(featureX, featureZ);
if(box.isVecInside(posX, posY, posZ)) {
Block block = world.getBlock(posX, posY, posZ);
while ((world.isAirBlock(posX, posY, posZ) || !block.getMaterial().isSolid() || (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1) {
world.setBlock(posX, posY, posZ, placeBlock, meta, 2);
block = world.getBlock(posX, --posY, posZ);
}
}
}
}
}
/**
* Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids.
* Useful for stuff like fences and walls most likely.
*/
protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) {
for(int x = minX; x <= maxX; x++) {
for(int z = minZ; z <= maxZ; z++) {
int posX = this.getXWithOffset(x, z);
int posZ = this.getZWithOffset(x, z);
int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ);
if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) {
for(int i = 0; i < height; i++) {
int posY = topHeight + i;
world.setBlock(posX, posY, posZ, block, 0, 2);
}
}
}
}
}
/** getXWithOffset & getZWithOffset Methods that are actually fixed **/
//Turns out, this entire time every single minecraft structure is mirrored instead of rotated when facing East and North
//Also turns out, it's a scarily easy fix that they somehow didn't see *entirely*
@Override
protected int getXWithOffset(int x, int z) {
switch(this.coordBaseMode) {
case 0:
return this.boundingBox.minX + x;
case 1:
return this.boundingBox.maxX - z;
case 2:
return this.boundingBox.maxX - x;
case 3:
return this.boundingBox.minX + z;
default:
return x;
}
}
@Override
protected int getZWithOffset(int x, int z) {
switch(this.coordBaseMode) {
case 0:
return this.boundingBox.minZ + z;
case 1:
return this.boundingBox.minZ + x;
case 2:
return this.boundingBox.maxZ - z;
case 3:
return this.boundingBox.maxZ - x;
default:
return x;
}
}
/** Methods that remove the replaceBlock and alwaysReplace, and other parameters: as they are useless and only serve as a time sink normally. */
protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) {
this.fillWithBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, block, false);
}
protected void fillWithMetadataBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta) {
this.fillWithMetadataBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, block, meta, block, meta, false);
}
protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) {
this.randomlyFillWithBlocks(world, box, rand, randLimit, minX, minY, minZ, maxX, maxY, maxZ, block, block, false);
}
protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector) {
this.fillWithRandomizedBlocks(world, box, minX, minY, minZ, maxX, maxY, maxZ, false, rand, selector);
}
/** Block Selectors **/
static class Sandstone extends StructureComponent.BlockSelector {
Sandstone() { }
/** Selects blocks */
@Override
public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) {
float chance = rand.nextFloat();
if(chance > 0.6F) {
this.field_151562_a = Blocks.sandstone;
} else if (chance < 0.5F ) {
this.field_151562_a = ModBlocks.reinforced_sand;
} else {
this.field_151562_a = Blocks.sand;
}
}
}
static class ConcreteBricks extends StructureComponent.BlockSelector {
ConcreteBricks() { }
/** Selects blocks */
@Override
public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) {
float chance = rand.nextFloat();
if(chance < 0.2F) {
this.field_151562_a = ModBlocks.brick_concrete;
} else if (chance < 0.55F) {
this.field_151562_a = ModBlocks.brick_concrete_mossy;
} else if (chance < 0.75F) {
this.field_151562_a = ModBlocks.brick_concrete_cracked;
} else {
this.field_151562_a = ModBlocks.brick_concrete_broken;
}
}
}
//ag
static class LabTiles extends StructureComponent.BlockSelector {
LabTiles() { }
/** Selects blocks */
@Override
public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) {
float chance = rand.nextFloat();
if(chance < 0.5F) {
this.field_151562_a = ModBlocks.tile_lab;
} else if (chance < 0.9F) {
this.field_151562_a = ModBlocks.tile_lab_cracked;
} else {
this.field_151562_a = ModBlocks.tile_lab_broken;
}
}
}
static class SuperConcrete extends StructureComponent.BlockSelector {
SuperConcrete() {
this.field_151562_a = ModBlocks.concrete_super;
}
/** Selects blocks */
@Override
public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean p_75062_5_) {
this.selectedBlockMetaData = rand.nextInt(6) + 10;
}
}
}

View File

@ -0,0 +1,187 @@
package com.hbm.world.worldgen.components;
import java.util.LinkedList;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
//These structures are... kind of? low quality, but they test out new methods so whatev.
public class MilitaryBaseFeatures {
//stop-gap methods until this entire mess can be organized into proper classes/structure groups
public static void smallHelipad(LinkedList components, int chunkX, int posY, int chunkZ, Random rand) {
BasicHelipad helipad = new BasicHelipad(rand, chunkX * 16 + 8, posY, chunkZ * 16 + 8);
int[] chunkPos = getAdjacentChunk(chunkX, chunkZ, rand);
RadioShack radio = new RadioShack(rand, chunkPos[0] * 16 + 8, posY, chunkPos[1] * 16 + 8);
components.add(helipad);
components.add(radio);
}
//ugh
public static int[] getAdjacentChunk(int chunkX, int chunkZ, Random rand) {
int[] chunkPos = new int[2];
switch(rand.nextInt(4)) {
case 0:
chunkPos[0] = chunkX;
chunkPos[1] = chunkZ + 1;
break;
case 1:
chunkPos[0] = chunkX - 1;
chunkPos[1] = chunkZ;
break;
case 2:
chunkPos[0] = chunkX;
chunkPos[1] = chunkZ - 1;
break;
case 3:
chunkPos[0] = chunkX + 1;
chunkPos[1] = chunkZ;
break;
}
return chunkPos;
}
public static class BasicHelipad extends Feature {
public BasicHelipad() { super(); }
protected BasicHelipad(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 12, 0, 12);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return true;
}
this.boundingBox.offset(0, -1, 0);
for(int i = 1; i < sizeX; i++) {
for(int j = 1; j < sizeZ; j++) {
func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
clearCurrentPositionBlocksUpwards(world, i, 1, j, box);
}
}
for(int i = 0; i <= sizeX; i++) {
for(int j = 0; j <= sizeZ; j++) {
if(i == 0 || i == sizeX || j == 0 || j == sizeX)
func_151554_b(world, Blocks.stonebrick, 0, i, 0, j, box);
}
}
//Helipad
fillWithBlocks(world, box, 1, 0, 1, 11, 0, 1, ModBlocks.concrete, Blocks.air, false); //this entire time, the second block was actually for anything not at min/max x's, y's, and z's. useful!
fillWithBlocks(world, box, 11, 0, 2, 11, 0, 11, ModBlocks.concrete, Blocks.air, false);
fillWithBlocks(world, box, 1, 0, 11, 10, 0, 11, ModBlocks.concrete, Blocks.air, false);
fillWithBlocks(world, box, 1, 0, 2, 1, 0, 10, ModBlocks.concrete, Blocks.air, false);
fillWithBlocks(world, box, 2, 0, 2, 10, 0, 10, ModBlocks.concrete_smooth, Blocks.air, false); //i'm not carefully carving out the white H lmao fuck that
fillWithBlocks(world, box, 4, 0, 4, 4, 0, 8, ModBlocks.concrete_colored, Blocks.air, false); //white is 0
fillWithBlocks(world, box, 8, 0, 4, 8, 0, 8, ModBlocks.concrete_colored, Blocks.air, false);
fillWithBlocks(world, box, 5, 0, 6, 7, 0, 6, ModBlocks.concrete_colored, Blocks.air, false);
//Surrounding Fences
placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 0, sizeX, 0, 1);
placeBlocksOnTop(world, box, ModBlocks.fence_metal, sizeX, 1, sizeX, sizeZ, 1);
placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, sizeZ, sizeX - 1, sizeZ, 1);
placeBlocksOnTop(world, box, ModBlocks.fence_metal, 0, 1, 0, sizeZ - 1, 1);
return false;
}
}
public static class RadioShack extends Feature {
private static LabTiles RandomLabTiles = new LabTiles();
private static ConcreteBricks ConcreteBricks = new ConcreteBricks();
public RadioShack() { super(); }
protected RadioShack(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 6, 4, 5);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return true;
}
this.boundingBox.offset(0, -1, 0);
for(int i = 1; i <= sizeX; i++) {
for(int j = 1; j <= sizeZ; j++) {
func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
func_151554_b(world, Blocks.stonebrick, 0, 0, 0, 2, box);
//Floor & Foundation
fillWithRandomizedBlocks(world, box, 2, 0, 1, 5, 0, 4, false, rand, RandomLabTiles);
placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, 1, box);
placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, 1, box);
placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 1, 0, sizeZ, box);
placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, sizeX, 0, sizeZ, box);
fillWithBlocks(world, box, 2, 0, 1, sizeX - 1, 0, 1, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithBlocks(world, box, 2, 0, 0, sizeX - 1, 0, 0, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithBlocks(world, box, sizeX, 0, 2, sizeX, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithBlocks(world, box, 2, 0, sizeZ, sizeX - 1, 0, sizeZ, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithBlocks(world, box, 1, 0, 2, 1, 0, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false);
//Back Wall
fillWithRandomizedBlocks(world, box, 1, 1, 1, 2, sizeY - 1, 1, false, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 2, 1, 0, 5, sizeY - 1, 0, false, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 5, 1, 1, sizeX, sizeY - 1, 1, false, rand, ConcreteBricks);
//Front Wall
fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 2, sizeY - 1, sizeZ, false, rand, ConcreteBricks);
placeBlockAtCurrentPosition(world, ModBlocks.brick_concrete, 0, 3, sizeY - 1, sizeZ, box);
fillWithRandomizedBlocks(world, box, 4, 1, sizeZ, sizeX, sizeY - 1, sizeZ, false, rand, ConcreteBricks);
placeDoor(world, box, ModBlocks.door_metal, 3, 3, 1, sizeZ);
//Left & Right Wall
fillWithRandomizedBlocks(world, box, 1, 1, 2, 1, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX, 1, 2, sizeX, sizeY - 1, sizeZ - 1, false, rand, ConcreteBricks);
placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, 1, 2, 3, box);
placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 2, box);
placeBlockAtCurrentPosition(world, ModBlocks.reinforced_glass, 0, sizeX, 2, 4, box);
//Ceiling
fillWithBlocks(world, box, 3, sizeY - 1, 1, 4, sizeY - 1, 1, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithBlocks(world, box, 2, sizeY - 1, 2, sizeX - 1, sizeY - 1, sizeZ - 1, ModBlocks.concrete_smooth, Blocks.air, false);
fillWithAir(world, box, 2, 1, 2, sizeX - 1, 2, sizeZ - 1);
//Decoration
int southMeta = getDecoMeta(2);
int northMeta = getDecoMeta(3); //all of these deco blocks are so inconsistent about what their directions actually are
int eastMeta = getDecoMeta(4);
fillWithMetadataBlocks(world, box, 2, 1, 2, 5, 1, 2, ModBlocks.steel_grate, 7, null, 0, false); //null should be okay here
fillWithBlocks(world, box, 3, 1, 1, 4, 1, 1, ModBlocks.deco_tungsten, null, false);
fillWithMetadataBlocks(world, box, 3, 2, 1, 4, 2, 1, ModBlocks.tape_recorder, northMeta, null, 0, false);
placeBlockAtCurrentPosition(world, ModBlocks.radiorec, southMeta, 2, 2, 2, box);
placeRandomBobble(world, box, rand, sizeX - 1, 2, 2);
fillWithMetadataBlocks(world, box, sizeX - 1, 1, 3, sizeX - 1, 2, 3, ModBlocks.tape_recorder, eastMeta, null, 0, false);
//OutsideDeco
fillWithMetadataBlocks(world, box, 0, 1, 2, 0, 2, 2, ModBlocks.steel_poles, eastMeta, null, 0, false);
placeBlockAtCurrentPosition(world, ModBlocks.pole_satellite_receiver, eastMeta, 0, sizeY - 1, 2, box);
fillWithBlocks(world, box, 0, sizeY, 2, sizeX - 1, sizeY, 2, ModBlocks.steel_roof, null, false);
placeBlockAtCurrentPosition(world, ModBlocks.steel_roof, 0, sizeX - 1, sizeY, 3, box);
return false;
}
}
}

View File

@ -0,0 +1,220 @@
package com.hbm.world.worldgen.components;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import com.hbm.lib.HbmChestContents;
import com.hbm.world.worldgen.components.Feature.ConcreteBricks;
import net.minecraft.init.Blocks;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
//Oh my fucking god TM
public class OfficeFeatures {
public static class LargeOffice extends Feature {
private static ConcreteBricks ConcreteBricks = new ConcreteBricks();
private boolean[] hasPlacedLoot = new boolean[2];
public LargeOffice() {
super();
}
public LargeOffice(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 14, 5, 12);
this.hasPlacedLoot[0] = false;
this.hasPlacedLoot[1] = false;
}
@Override
protected void func_143012_a(NBTTagCompound nbt) {
super.func_143012_a(nbt);
nbt.setBoolean("hasLoot1", this.hasPlacedLoot[0]);
nbt.setBoolean("hasLoot2", this.hasPlacedLoot[1]);
}
@Override
protected void func_143011_b(NBTTagCompound nbt) {
super.func_143011_b(nbt);
this.hasPlacedLoot[0] = nbt.getBoolean("hasLoot1");
this.hasPlacedLoot[1] = nbt.getBoolean("hasLoot2");
}
//Holy shit I despise this method so goddamn much
//TODO BOB: please i beg you make some sort of utility tool to simplify this
//ideally we'd invent something like the structure blocks or even a more advanced
//schematic to java tool
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return true;
}
this.boundingBox.offset(0, -1, 0);
placeFoundationUnderneath(world, Blocks.stonebrick, 0, 5, 0, sizeX, 1, -1, box);
placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 2, sizeX, 7, -1, box);
placeFoundationUnderneath(world, Blocks.stonebrick, 0, 0, 8, 8, sizeZ, 0, box);
placeFoundationUnderneath(world, Blocks.stonebrick, 0, 9, 8, sizeX, sizeZ, -1, box);
fillWithAir(world, box, 1, 1, 3, 4, 3, 6);
fillWithAir(world, box, 6, 1, 1, sizeX - 1, 3, 6);
fillWithAir(world, box, 10, 1, 7, sizeX - 1, 3, sizeZ - 1);
//Pillars
//Back
fillWithBlocks(world, box, 0, 0, 2, 0, 4, 2, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 5, 0, 0, 5, 4, 0, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 4, 0, ModBlocks.concrete_pillar);
//Front
fillWithBlocks(world, box, 0, 0, 7, 0, 3, 7, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 0, 0, sizeZ, 0, 3, sizeZ, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 3, 0, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 6, 0, sizeZ, 6, 3, sizeZ, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 9, 0, sizeZ, 9, 3, sizeZ, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, 9, 0, 7, 9, 3, 7, ModBlocks.concrete_pillar);
fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 4, sizeZ, ModBlocks.concrete_pillar);
//Walls
//Back
fillWithRandomizedBlocks(world, box, 1, 0, 2, 5, 4, 2, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 4, 1, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 6, 0, 0, sizeX - 1, 1, 0, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 6, 2, 0, 6, 2, 0, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 9, 2, 0, 10, 2, 0, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX - 1, 2, 0, sizeX - 1, 2, 0, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 6, 3, 0, sizeX - 1, 4, 0, rand, ConcreteBricks);
//Right
fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, sizeZ - 1, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX, 2, 1, sizeX, 2, 2, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX, 2, 5, sizeX, 2, 7, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 2, sizeX, 2, sizeZ - 1, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX, 3, 1, sizeX, 4, sizeZ - 1, rand, ConcreteBricks);
//Front
fillWithRandomizedBlocks(world, box, 0, 4, sizeZ, sizeX - 1, 4, sizeZ, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 10, 0, sizeZ, sizeX - 1, 1, sizeZ, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 10, 2, sizeZ, 10, 2, sizeZ, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, sizeX - 1, 2, sizeZ, sizeX - 1, 2, sizeZ, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 10, 3, sizeZ, sizeX - 1, 3, sizeZ, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 9, 0, 8, 9, 3, sizeZ - 1, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 1, 0, 7, 8, 0, 7, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 1, 1, 7, 1, 2, 7, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 4, 1, 7, 8, 3, 7, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 1, 3, 7, 3, 3, 7, rand, ConcreteBricks);
//Left
fillWithRandomizedBlocks(world, box, 0, 4, 3, 0, 4, sizeZ - 1, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 0, 0, 3, 0, 1, 6, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 0, 2, 3, 0, 3, 3, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 0, 2, 6, 0, 3, 6, rand, ConcreteBricks);
//Interior
fillWithRandomizedBlocks(world, box, 5, 1, 3, 5, 3, 5, rand, ConcreteBricks);
fillWithRandomizedBlocks(world, box, 5, 3, 6, 5, 3, 6, rand, ConcreteBricks);
//Trim
randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 2, 5, sizeY, 2, Blocks.stone_slab);
randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 1, 5, sizeY, 1, Blocks.stone_slab);
randomlyFillWithBlocks(world, box, rand, 0.85F, 5, sizeY, 0, sizeX, sizeY, 0, Blocks.stone_slab);
randomlyFillWithBlocks(world, box, rand, 0.85F, sizeX, sizeY, 1, sizeX, sizeY, sizeZ, Blocks.stone_slab);
randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, sizeZ, sizeX - 1, sizeY, sizeZ, Blocks.stone_slab);
randomlyFillWithBlocks(world, box, rand, 0.85F, 0, sizeY, 3, 0, sizeY, sizeZ - 1, Blocks.stone_slab);
//Floor
fillWithMetadataBlocks(world, box, 1, 0, 3, 4, 0, 6, Blocks.wool, 13); //Green Wool
fillWithBlocks(world, box, 5, 0, 3, 5, 0, 6, ModBlocks.brick_light);
fillWithBlocks(world, box, 6, 0, 1, sizeX - 1, 0, 6, ModBlocks.brick_light);
fillWithBlocks(world, box, 10, 0, 7, sizeX - 1, 0, sizeZ - 1, ModBlocks.brick_light);
//Ceiling
fillWithBlocks(world, box, 6, 4, 1, sizeX - 1, 4, 2, ModBlocks.brick_light);
fillWithBlocks(world, box, 1, 4, 3, sizeX - 1, 4, sizeZ - 1, ModBlocks.brick_light);
//Decorations
//Carpet
fillWithMetadataBlocks(world, box, 9, 1, 3, 11, 1, 6, Blocks.carpet, 8); //Light gray
//Windows
randomlyFillWithBlocks(world, box, rand, 0.75F, 0, 2, 4, 0, 3, 5, Blocks.glass_pane);
randomlyFillWithBlocks(world, box, rand, 0.75F, 7, 2, 0, 8, 2, 0, Blocks.glass_pane);
randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, 0, sizeX - 2, 2, 0, Blocks.glass_pane);
randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 3, sizeX, 2, 4, Blocks.glass_pane);
randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX, 2, 8, sizeX, 2, 9, Blocks.glass_pane);
randomlyFillWithBlocks(world, box, rand, 0.75F, sizeX - 3, 2, sizeZ, sizeX - 2, 2, sizeZ, Blocks.glass_pane);
//Fuwnituwe >w<
int stairMetaE = getStairMeta(1); //East
int stairMetaN = getStairMeta(2); //*SHOULD* be north
int stairMetaS = getStairMeta(3); //South :3
int stairMetaWU = getStairMeta(0) | 4; //West, Upside-down
int stairMetaEU = stairMetaE | 4; //East, Upside-down
int stairMetaNU = stairMetaN | 4; //North, Upside-down uwu
int stairMetaSU = stairMetaS | 4; //South, Upside-down
//Desk 1 :3
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 1, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, 2, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 3, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 2, 1, 3, box); //Chaiw :3
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 1, 2, 4, box); //Nowth-facing Computer :33
//Desk 2 :3
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaS, 7, 1, 3, box); //Chaiw :3
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 6, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 7, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.planks, 1, 8, 1, 4, box); //Spwuce Pwanks :3
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(0), 7, 2, 4, box); //Nowth-facing Computer X3
placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, 8, 2, 4, box);
//Desk 3 :3
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 1, box);
fillWithMetadataBlocks(world, box, 11, 1, 1, sizeX - 1, 1, 1, Blocks.spruce_stairs, stairMetaSU);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 2, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, 3, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, 4, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, 5, box);
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 11, 1, 2, box); //Chaiw ;3
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 2, 1, 4, box); //Chaiw :333
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), sizeX - 3, 2, 1, box); //South-facing Computer :3
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, 5, box); //West-facing Computer ^w^
placeBlockAtCurrentPosition(world, Blocks.flower_pot, 0, sizeX - 1, 2, 3, box);
placeBlockAtCurrentPosition(world, ModBlocks.radiorec, getDecoMeta(5), sizeX - 1, 2, 2, box); //Wadio
//Desk 4 DX
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaEU, 10, 1, 8, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, 11, 1, 8, box);
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaN, 10, 1, 9, box); //Chaiw ;3
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(1), 10, 2, 8, box); //South-facing Computer :33
//Desk 5 :333
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaSU, sizeX - 1, 1, sizeZ - 3, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaWU, sizeX - 1, 1, sizeZ - 2, box);
placeBlockAtCurrentPosition(world, Blocks.spruce_stairs, stairMetaNU, sizeX - 1, 1, sizeZ - 1, box);
placeBlockAtCurrentPosition(world, Blocks.oak_stairs, stairMetaE, sizeX - 3, 1, sizeZ - 1, box); //UwU... Chaiw!!!! :333 I wove chaiws XD :333 OwO what's this?? chaiw???? :333333333333333333
placeBlockAtCurrentPosition(world, ModBlocks.deco_computer, getDecoModelMeta(2), sizeX - 1, 2, sizeZ - 1, box); //West-facing Computer >w<
//Cobwebs pwobabwy
//Maybe make a method for this eventually?
//Something where the tops of ceilings + empty corners along walls get most cobwebs,
//with no cobwebs hanging midair + it not being performance intensive
randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 3, 3, 4, 3, 6, Blocks.web);
randomlyFillWithBlocks(world, box, rand, 0.25F, 6, 3, 1, sizeX - 1, 3, 6, Blocks.web);
randomlyFillWithBlocks(world, box, rand, 0.25F, 10, 3, 7, sizeX - 1, 3, sizeZ - 1, Blocks.web);
//Doors
placeDoor(world, box, ModBlocks.door_office, 3, 2, 1, 7);
placeDoor(world, box, ModBlocks.door_office, 3, 3, 1, 7);
placeDoor(world, box, ModBlocks.door_office, 0, 5, 1, 6);
//Woot
if(!this.hasPlacedLoot[0])
this.hasPlacedLoot[0] = generateInvContents(world, box, rand, Blocks.chest, sizeX - 4, 1, sizeZ - 1, HbmChestContents.officeTrash, 10);
if(!this.hasPlacedLoot[1]) {
this.hasPlacedLoot[1] = generateLockableContents(world, box, rand, ModBlocks.safe, 6, 1, 1, HbmChestContents.machineParts, 10, 0.5D);
generateLoreBook(world, box, 6, 1, 1, 7, "office" + rand.nextInt(1));
}
//TODO: add book with funny lore to safe, add cobwebs too
//0b00/0 West, 0b01/1 East, 0b10/2 North, 0b11/3 South, 0b100/4 West UD, 0b101 East UD, 0b110 North UD, 0b111 South UD
return false;
}
}
}

View File

@ -0,0 +1,279 @@
package com.hbm.world.worldgen.components;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
public class RuinFeatures {
public static class NTMRuin1 extends Feature {
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
public NTMRuin1() {
super();
}
public NTMRuin1(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 8, 6, 10);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < sizeX + 1; i++) {
for(byte j = 0; j < sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
int pillarMetaWE = this.getPillarMeta(4);
int pillarMetaNS = this.getPillarMeta(8);
this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall
this.fillWithMetadataBlocks(world, box, 1, 3, 0, 3, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false);
this.fillWithBlocks(world, box, 4, 0, 0, 4, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 5, 3, 0, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false);
this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY - 1, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 3, 0, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 3, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 1, 0, 5, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 4, 0, 3, 4, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall
this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, sizeY - 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 2, 2, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 2, 6, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 2, 0, 2, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 4, 1, 0, 4, 5, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 5, 1, 0, 5, 2, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 4, sizeZ - 2, 0, 4, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, 1, 3, sizeZ, 3, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall
this.fillWithBlocks(world, box, 4, 0, sizeZ, 4, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, 5, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false);
this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, sizeY - 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 3, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 3, 1, sizeZ, 3, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 1, sizeZ, 5, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 2, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall
this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 1, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 2, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, 6, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 2, sizeX, 1, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 2, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks);
this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false);
return true;
}
}
public static class NTMRuin2 extends Feature {
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
public NTMRuin2() {
super();
}
public NTMRuin2(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 7, 5, 10);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < sizeX + 1; i++) {
for(byte j = 0; j < sizeZ + 1; j++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, j, box);
}
}
int pillarMetaWE = this.getPillarMeta(4);
int pillarMetaNS = this.getPillarMeta(8);
this.fillWithBlocks(world, box, 0, 0, 0, 0, 3, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall
this.fillWithMetadataBlocks(world, box, 1, 3, 0, sizeX - 1, 3, 0, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false);
this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 3, 1, 0, 4, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 3, 4, 0, sizeX - 1, 4, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, sizeY, 0, sizeX - 1, sizeY, 0, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, 0, 3, 1, 0, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Left Wall
this.fillWithBlocks(world, box, 0, 0, 5, 0, 0, 5, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 2, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 2, 3, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 0, sizeZ - 3, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, sizeZ - 1, 0, 1, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, sizeX - 1, 3, sizeZ, sizeX - 1, 3, sizeZ, ModBlocks.concrete_pillar, pillarMetaWE, Blocks.air, 0, false); //Front Wall
this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 3, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 1, sizeZ, 1, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, sizeZ, sizeX - 1, 2, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithMetadataBlocks(world, box, sizeX, 3, 1, sizeX, 3, 4, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false); //Right Wall
this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 4, 5, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithMetadataBlocks(world, box, sizeX, 3, sizeZ - 2, sizeX, 3, sizeZ - 1, ModBlocks.concrete_pillar, pillarMetaNS, Blocks.air, 0, false);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 0, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 1, sizeX, 2, 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 3, sizeX, 2, 3, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 4, sizeX, 1, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, 7, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, sizeZ - 1, sizeX, 2, sizeZ - 1, false, rand, RandomConcreteBricks);
this.randomlyFillWithBlocks(world, box, rand, 0.25F, 1, 0, 1, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false);
return true;
}
}
public static class NTMRuin3 extends Feature {
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
public NTMRuin3() {
super();
}
public NTMRuin3(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 8, 3, 10);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < sizeZ + 1; i++) {
this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box);
this.func_151554_b(world, Blocks.stonebrick, 0, sizeX, -1, i, box);
}
for(byte i = 1; i < sizeX; i++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 0, box);
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, 4, box);
}
this.fillWithBlocks(world, box, 0, 0, 0, 0, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall
this.fillWithBlocks(world, box, sizeX, 0, 0, sizeX, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, 0, sizeX - 1, 0, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 1, 0, 1, 1, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 0, sizeX - 1, 1, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 1, 2, 0, sizeX - 2, 2, 0, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, 0, 0, 4, 0, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Left Wall
this.placeBlockAtCurrentPosition(world, ModBlocks.concrete_pillar, 0, 0, 0, sizeZ, box);
this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, 3, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 0, 5, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 5, 0, 1, 5, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 7, 0, 1, 7, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, sizeX, 0, 4, sizeX, 1, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall
this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 1, sizeX, 1, 3, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 5, sizeX, 0, 6, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 0, sizeZ - 1, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, 4, 0, 4, 4, 2, 4, ModBlocks.concrete_pillar, Blocks.air, false); //Center Wall
this.fillWithRandomizedBlocks(world, box, 3, 0, 4, 3, 1, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 0, 4, sizeX - 1, 1, 4, false, rand, RandomConcreteBricks);
this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, sizeX - 1, 0, 3, Blocks.gravel, Blocks.air, false);
this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 5, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false);
return true;
}
}
public static class NTMRuin4 extends Feature {
private static ConcreteBricks RandomConcreteBricks = new ConcreteBricks();
public NTMRuin4() {
super();
}
public NTMRuin4(Random rand, int minX, int minY, int minZ) {
super(rand, minX, minY, minZ, 10, 2, 11);
}
@Override
public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) {
//System.out.println(this.coordBaseMode);
if(!this.setAverageHeight(world, box, this.boundingBox.minY)) {
return false;
}
//System.out.println("" + this.boundingBox.minX + ", " + this.boundingBox.minY + ", " + this.boundingBox.minZ);
for(byte i = 0; i < sizeZ + 1; i++) {
this.func_151554_b(world, Blocks.stonebrick, 0, 0, -1, i, box);
this.func_151554_b(world, Blocks.stonebrick, 0, i >= 5 ? sizeX : 5, -1, i, box); //elegant solution
}
for(byte i = 1; i < sizeX; i++) {
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, sizeZ, box);
this.func_151554_b(world, Blocks.stonebrick, 0, i, -1, i > 4 ? 5 : 0, box); //ternary operators my beloved
}
this.fillWithBlocks(world, box, 0, 0, 0, 0, 1, 0, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 1
this.fillWithBlocks(world, box, 5, 0, 0, 5, sizeY, 0, ModBlocks.concrete_pillar, Blocks.air, false);
this.fillWithRandomizedBlocks(world, box, 1, 0, 0, 4, 0, 0, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 4, 1, 0, 4, 1, 0, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, 5, 0, 5, 5, sizeY, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 1
this.fillWithRandomizedBlocks(world, box, 5, 0, 1, 5, 0, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 1, 1, 5, 1, 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 1, 4, 5, 1, 4, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 5, 2, 1, 5, 2, 4, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, sizeX, 0, 5, sizeX, 1, 5, ModBlocks.concrete_pillar, Blocks.air, false); //Back Wall Pt. 2
this.fillWithRandomizedBlocks(world, box, 6, 0, 5, sizeX - 1, 0, 5, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 6, 1, 5, 6, 1, 5, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 1, 5, sizeX - 1, 1, 5, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, sizeX, 0, sizeZ, sizeX, 1, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Right Wall Pt. 2
this.fillWithRandomizedBlocks(world, box, sizeX, 0, 6, sizeX, 0, sizeZ - 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX, 1, 6, sizeX, 1, sizeZ - 3, false, rand, RandomConcreteBricks);
this.fillWithBlocks(world, box, 0, 0, sizeZ, 0, 0, sizeZ, ModBlocks.concrete_pillar, Blocks.air, false); //Front Wall
this.fillWithRandomizedBlocks(world, box, 1, 0, sizeZ, 1, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 6, 0, sizeZ, 7, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, sizeX - 1, 0, sizeZ, sizeX - 1, 0, sizeZ, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 0, 1, 0, 0, sizeZ - 1, false, rand, RandomConcreteBricks); //Left Wall
this.fillWithRandomizedBlocks(world, box, 0, 1, 1, 0, 1, 1, false, rand, RandomConcreteBricks);
this.fillWithRandomizedBlocks(world, box, 0, 1, 4, 0, 1, 7, false, rand, RandomConcreteBricks);
this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 1, 4, 0, 5, Blocks.gravel, Blocks.air, false);
this.randomlyFillWithBlocks(world, box, rand, 0.05F, 1, 0, 6, sizeX - 1, 0, sizeZ - 1, Blocks.gravel, Blocks.air, false);
return true;
}
}
}

View File

@ -314,6 +314,17 @@ book.starter.page18=vær is just a guy who has been trapped in the grey void fea
#book.rbmk.title16=Meltdown
#book.rbmk.page16=§4§lAvoid.
book.lore.office0.title=Letter of Resignation
book.lore.office0.author=Kosma
book.lore.office0.page1=Management downsized our department again yesterday. Those idiots only have themselves to blame, I don't know what they were expecting after the Panay fiasco. Who the hell leaks that sort of information? We're losing millions and
book.lore.office0.page2=it's ME who's the one out of a job now. I'M the one being asked to resign. I hope you asshats finally learn from your overabundance of mistakes and take that stick out of your ass.
book.lore.office0.page3=I'm not coming back on Friday. Just send the paycheck.
book.lore.office1.title=Note
book.lore.office1.author=Jonas
book.lore.office1.page1=
book.lore.office2.page2=
cannery.f1=[ Press F1 for help ]
cannery.centrifuge=Gas Centrifuge
@ -3681,6 +3692,7 @@ tile.crystal_virus.name=Dark Crystal
tile.deco_aluminium.name=Aluminium Deco Block
tile.deco_asbestos.name=Asbestos Roof
tile.deco_beryllium.name=Beryllium Deco Block
tile.deco_computer.name=IBM Personal Computer 300PL
tile.deco_emitter.name=Deco Light Emitter
tile.deco_lead.name=Lead Deco Block
tile.deco_rbmk.name=RBMK Deco Block

View File

@ -0,0 +1,966 @@
# Blender v3.2.0 OBJ File: 'puter.blend'
# www.blender.org
o Cube.001_Cube.005
v -0.369039 -0.501855 0.479973
v -0.369039 -0.459563 0.479973
v -0.369039 -0.501855 0.209191
v -0.369039 -0.433180 0.209191
v 0.369039 -0.501855 0.479973
v 0.369039 -0.459563 0.479973
v 0.369039 -0.501855 0.209191
v 0.369039 -0.433180 0.209191
vt 0.175000 0.175000
vt -0.000000 0.150000
vt 0.175000 0.150000
vt 0.350000 0.225000
vt 0.175000 0.200000
vt 0.350000 0.200000
vt 0.175000 0.225000
vt -0.000000 0.200000
vt -0.000000 0.225000
vt 0.175000 0.225000
vt 0.350000 0.250000
vt 0.175000 0.250000
vt 0.350000 0.150000
vt 0.175000 0.200000
vt 0.175000 0.150000
vt -0.000000 0.150000
vt 0.350000 0.000000
vt 0.350000 0.150000
vt -0.000000 0.200000
vt 0.175000 0.225000
vt 0.175000 0.175000
vt 0.350000 0.225000
vt 0.350000 0.200000
vt -0.000000 0.000000
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 0.0000
vn 0.0000 0.9953 0.0970
s off
f 2/1/1 3/2/1 1/3/1
f 4/4/2 7/5/2 3/6/2
f 7/7/3 6/8/3 5/9/3
f 6/10/4 1/11/4 5/12/4
f 7/13/5 1/14/5 3/15/5
f 4/16/6 6/17/6 8/18/6
f 2/1/1 4/19/1 3/2/1
f 4/4/2 8/20/2 7/5/2
f 7/7/3 8/21/3 6/8/3
f 6/10/4 2/22/4 1/11/4
f 7/13/5 5/23/5 1/14/5
f 4/16/6 2/24/6 6/17/6
o Cube
v 0.262500 0.290571 0.025979
v -0.061658 -0.358688 -0.212822
v -0.077958 -0.358688 -0.229123
v 0.262500 -0.234429 0.025979
v -0.262500 0.290571 0.025979
v -0.262500 -0.234429 0.025979
v -0.077958 -0.358688 -0.352438
v 0.131250 0.290571 0.034371
v 0.000000 0.290571 0.035881
v -0.061658 -0.358688 -0.368738
v -0.131250 0.290571 0.034371
v -0.131250 -0.234429 0.034371
v 0.077958 -0.358688 -0.229123
v 0.000000 -0.234429 0.035881
v 0.061658 -0.358688 -0.212822
v 0.131250 -0.234429 0.034371
v -0.262500 -0.103179 0.034371
v -0.262500 0.028071 0.035881
v -0.262500 0.159321 0.034371
v 0.061658 -0.358688 -0.368738
v 0.262500 0.159321 0.034371
v 0.077958 -0.358688 -0.352438
v 0.262500 0.028071 0.035881
v 0.262500 -0.103179 0.034371
v 0.131250 0.159321 0.040787
v -0.065019 -0.247914 -0.242045
v -0.048736 -0.247914 -0.225761
v 0.131250 0.028071 0.044501
v 0.131250 -0.103179 0.040787
v -0.048736 -0.247914 -0.355799
v -0.065019 -0.247914 -0.339516
v 0.000000 0.159321 0.044501
v 0.000000 0.028071 0.049025
v 0.065019 -0.247914 -0.339516
v 0.000000 -0.103179 0.044501
v 0.048736 -0.247914 -0.355799
v -0.131250 0.159321 0.040787
v 0.048736 -0.247914 -0.225761
v -0.131250 0.028071 0.044501
v 0.065019 -0.247914 -0.242045
v -0.131250 -0.103179 0.040787
v -0.065019 -0.337090 -0.339524
v -0.048744 -0.337090 -0.355799
v 0.262500 0.290571 0.092896
v 0.048744 -0.337090 -0.355799
v -0.262500 0.290571 0.092896
v 0.262500 -0.234429 0.092896
v 0.065019 -0.337090 -0.339524
v 0.065019 -0.337090 -0.242037
v -0.262500 -0.234429 0.092896
v -0.262500 0.256505 -0.133796
v 0.048744 -0.337090 -0.225761
v -0.228434 0.290571 -0.133796
v -0.065019 -0.337090 -0.242037
v 0.228434 0.290571 -0.133796
v -0.048744 -0.337090 -0.225761
v 0.262500 0.256505 -0.133796
v 0.262500 -0.200363 -0.133796
v 0.228434 -0.234429 -0.133796
v -0.228434 -0.234429 -0.133796
v -0.262500 -0.200363 -0.133796
v -0.305185 -0.311180 -0.084290
v -0.339251 -0.277114 -0.084290
v 0.339251 0.333256 -0.084290
v 0.305185 0.367322 -0.084290
v -0.305185 0.367322 -0.084290
v -0.339251 0.333256 -0.084290
v 0.339251 -0.277114 -0.084290
v 0.305185 -0.311180 -0.084290
v 0.339251 0.333342 0.092896
v 0.305271 0.367322 0.092896
v 0.316748 0.344819 0.092896
v -0.305271 0.367322 0.092896
v -0.339251 0.333342 0.092896
v -0.316748 0.344819 0.092896
v 0.305271 -0.311180 0.092896
v 0.339251 -0.277200 0.092896
v 0.316748 -0.288677 0.092896
v -0.339251 -0.277200 0.092896
v -0.305271 -0.311180 0.092896
v -0.316748 -0.288677 0.092896
v 0.219945 0.269868 -0.499021
v 0.228515 0.290571 -0.478319
v 0.241798 0.248016 -0.499021
v 0.262500 0.256586 -0.478319
v 0.241798 -0.150854 -0.499021
v 0.262500 -0.159424 -0.478319
v 0.219945 -0.172706 -0.499021
v 0.228515 -0.193409 -0.478319
v -0.241798 0.248016 -0.499021
v -0.262500 0.256586 -0.478319
v -0.219945 0.269868 -0.499021
v -0.228515 0.290571 -0.478319
v -0.219945 -0.172706 -0.499021
v -0.228515 -0.193409 -0.478319
v -0.241798 -0.150854 -0.499021
v -0.262500 -0.159424 -0.478319
v -0.131250 -0.234429 0.101749
v 0.000000 -0.233661 0.104777
v 0.131250 -0.234429 0.101749
v 0.131250 0.290571 0.101749
v 0.000000 0.291339 0.105210
v -0.131250 0.290571 0.101749
v -0.057767 -0.234429 -0.364857
v 0.074076 -0.234429 -0.348548
v 0.057767 -0.234429 -0.364857
v -0.074076 -0.234429 -0.348548
v -0.074076 -0.234429 -0.233013
v 0.074076 -0.234429 -0.233013
v 0.057767 -0.234429 -0.216704
v -0.057767 -0.234429 -0.216704
vt 0.325000 0.725000
vt 0.375000 0.737500
vt 0.325000 0.737500
vt 0.450000 0.675000
vt 0.500000 0.725000
vt 0.450000 0.725000
vt 0.500000 0.675000
vt 0.450000 0.662500
vt 0.500000 0.662500
vt 0.387500 0.725000
vt 0.437500 0.737500
vt 0.387500 0.737500
vt 0.512500 0.725000
vt 0.562500 0.737500
vt 0.512500 0.737500
vt 0.512500 0.675000
vt 0.562500 0.725000
vt 0.325000 0.675000
vt 0.375000 0.725000
vt 0.387500 0.675000
vt 0.437500 0.725000
vt 0.325000 0.787500
vt 0.375000 0.800000
vt 0.387500 0.750000
vt 0.562500 0.662500
vt 0.562500 0.675000
vt 0.375000 0.675000
vt 0.325000 0.662500
vt 0.375000 0.662500
vt 0.437500 0.662500
vt 0.437500 0.675000
vt 0.512500 0.737500
vt 0.575000 0.737500
vt 0.575000 0.725000
vt 0.512500 0.662500
vt 0.575000 0.675000
vt 0.575000 0.662500
vt 0.387500 0.662500
vt 0.450000 0.737500
vt 0.375000 0.737500
vt 0.337500 0.737500
vt 0.325000 0.750000
vt 0.337500 0.800000
vt 0.387500 0.787500
vt 0.112500 0.737500
vt 0.062500 0.687500
vt 0.112500 0.687500
vt 0.387500 0.262500
vt 0.375000 0.375000
vt 0.375000 0.262500
vt 0.262500 0.687500
vt 0.212500 0.737500
vt 0.212500 0.687500
vt 0.162500 0.737500
vt 0.162500 0.687500
vt 0.187500 0.262500
vt 0.200000 0.375000
vt 0.187500 0.375000
vt 0.162500 0.537500
vt 0.112500 0.587500
vt 0.112500 0.537500
vt 0.162500 0.587500
vt 0.112500 0.637500
vt 0.162500 0.637500
vt 0.212500 0.587500
vt 0.212500 0.537500
vt 0.212500 0.637500
vt 0.262500 0.587500
vt 0.262500 0.537500
vt 0.262500 0.637500
vt 0.562500 0.262500
vt 0.575000 0.375000
vt 0.562500 0.375000
vt 0.600000 0.262500
vt 0.750000 0.375000
vt 0.062500 0.587500
vt 0.062500 0.537500
vt 0.062500 0.637500
vt 0.387500 0.412500
vt 0.387500 0.375000
vt 0.012500 0.412500
vt 0.012500 0.375000
vt -0.000000 0.787500
vt 0.037500 0.762500
vt 0.012500 0.787500
vt 0.562500 0.475000
vt 0.562500 0.412500
vt 0.575000 0.412500
vt 0.187500 0.475000
vt 0.187500 0.412500
vt 0.200000 0.412500
vt 0.212500 0.512500
vt 0.262500 0.512500
vt 0.287500 0.737500
vt 0.012500 0.475000
vt 0.312500 0.475000
vt 0.287500 0.512500
vt 0.325000 0.787500
vt 0.287500 0.762500
vt 0.287500 0.687500
vt 0.312500 0.800000
vt 0.012500 0.800000
vt 0.037500 0.537500
vt 0.750000 0.475000
vt 0.575000 0.475000
vt 0.112500 0.762500
vt 0.200000 0.475000
vt 0.375000 0.412500
vt 0.375000 0.475000
vt -0.000000 0.487500
vt 0.012500 0.487500
vt 0.312500 0.787500
vt 0.325000 0.487500
vt 0.312500 0.487500
vt 0.012500 0.475000
vt -0.000000 0.412500
vt 0.350000 0.262500
vt 0.450000 0.312500
vt 0.450000 0.337500
vt 0.500000 0.337500
vt 0.487500 0.350000
vt 0.012500 0.262500
vt -0.000000 0.375000
vt 0.387500 0.475000
vt -0.000000 0.262500
vt 0.200000 0.250000
vt 0.187500 0.250000
vt 0.575000 0.250000
vt 0.562500 0.250000
vt -0.000000 0.250000
vt 0.375000 0.250000
vt 0.200000 0.262500
vt 0.350000 0.250000
vt 0.750000 0.250000
vt 0.750000 0.262500
vt 0.337500 0.475000
vt 0.325000 0.487500
vt 0.325000 0.650000
vt 0.112500 0.512500
vt 0.062500 0.512500
vt 0.162500 0.512500
vt 0.062500 0.737500
vt 0.062500 0.762500
vt 0.212500 0.762500
vt 0.262500 0.737500
vt 0.262500 0.762500
vt 0.162500 0.762500
vt 0.500000 0.312500
vt 0.487500 0.300000
vt 0.462500 0.300000
vt 0.462500 0.350000
vt 0.575000 0.262500
vt 0.037500 0.637500
vt 0.037500 0.512500
vt 0.037500 0.575000
vt 0.037500 0.687500
vt 0.750000 0.412500
vt 0.287500 0.537500
vt 0.287500 0.575000
vt 0.287500 0.637500
vt 0.037500 0.737500
vt -0.000000 0.475000
vt 0.012500 0.250000
vt 0.387500 0.250000
vt 0.600000 0.250000
vt 0.337500 0.662500
vt 0.525000 0.662500
vt 0.537500 0.650000
vt 0.537500 0.487500
vt 0.525000 0.475000
vn 0.8578 0.5139 0.0000
vn -1.0000 0.0000 0.0000
vn -0.8301 -0.5576 0.0000
vn 0.0000 0.5139 0.8578
vn 0.0000 0.5139 -0.8578
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 -0.0000
vn 0.0000 -0.5576 -0.8301
vn 0.8301 -0.5576 0.0000
vn 0.0000 -0.5576 0.8301
vn -0.5130 -0.6882 0.5130
vn -0.5397 0.6460 -0.5397
vn 0.5397 0.6460 -0.5397
vn 0.5397 0.6460 0.5397
vn -0.7071 0.0001 0.7071
vn -0.5130 -0.6882 -0.5130
vn 0.5130 -0.6882 -0.5130
vn 0.5130 -0.6882 0.5130
vn -0.7071 0.0001 -0.7071
vn 0.7071 0.0001 -0.7071
vn 0.7071 0.0001 0.7071
vn -0.5397 0.6460 0.5397
vn -0.8578 0.5139 0.0000
vn -0.0339 0.0525 0.9980
vn -0.0525 0.0339 0.9980
vn -0.0385 0.0385 0.9985
vn -0.7046 -0.7046 -0.0837
vn 0.0525 0.0339 0.9980
vn 0.0339 0.0525 0.9980
vn 0.0385 0.0385 0.9985
vn 0.0000 0.0572 0.9984
vn 0.0000 0.0484 0.9988
vn -0.7071 0.7071 0.0002
vn -0.0000 -0.0572 0.9984
vn -0.0385 -0.0385 0.9985
vn -0.0339 -0.0525 0.9980
vn -0.0000 -0.0484 0.9988
vn -0.0484 0.0000 0.9988
vn 0.0385 -0.0385 0.9985
vn 0.0339 -0.0525 0.9980
vn 0.0484 -0.0000 0.9988
vn 0.0525 -0.0339 0.9980
vn 0.0637 -0.0637 0.9959
vn 0.0572 -0.0000 0.9984
vn 0.7046 -0.7046 -0.0837
vn -0.0525 -0.0339 0.9980
vn -0.0637 -0.0637 0.9959
vn -0.0572 0.0000 0.9984
vn -0.0000 -0.5420 -0.8403
vn 0.0000 0.5420 -0.8403
vn 0.0204 0.0104 0.9997
vn 0.0297 -0.0165 0.9994
vn 0.5420 0.0000 -0.8403
vn 0.0000 1.0000 0.0000
vn -0.5420 0.0000 -0.8403
vn 0.0008 1.0000 -0.0002
vn 0.0052 0.9999 0.0090
vn -0.0297 0.0165 0.9994
vn 0.0201 -0.0104 0.9997
vn 0.0297 0.0165 0.9994
vn 0.0286 -0.0504 0.9983
vn 0.0009 -1.0000 0.0018
vn 0.0020 -1.0000 0.0094
vn -0.0204 0.0104 0.9997
vn -0.0201 -0.0104 0.9997
vn 0.7071 0.7071 -0.0003
vn -0.7071 0.7071 -0.0003
vn -0.0653 -0.9968 -0.0469
vn -0.1280 -0.9858 -0.1089
vn 0.0653 -0.9968 -0.0469
vn 0.2934 -0.2934 -0.9098
vn 0.2934 0.2934 -0.9098
vn -0.2934 -0.2934 -0.9098
vn -0.2934 0.2934 -0.9098
vn -0.7071 -0.7071 -0.0003
vn 0.7071 -0.7071 -0.0003
vn 0.7071 0.7071 0.0002
vn -0.5000 0.5000 -0.7070
vn 0.5000 -0.5000 -0.7070
vn 0.5000 0.5000 -0.7070
vn -0.5000 -0.5000 -0.7070
vn 0.0000 -0.7071 -0.7071
vn -0.7071 0.0000 -0.7071
vn 0.0000 0.7071 -0.7071
vn 0.7071 0.0000 -0.7071
vn -0.0009 1.0000 -0.0018
vn -0.0024 1.0000 -0.0093
vn -0.0007 0.9999 -0.0122
vn -0.0020 1.0000 -0.0095
vn -0.0052 -0.9999 -0.0091
vn -0.0008 -1.0000 0.0002
vn 0.0023 -1.0000 0.0093
vn 0.1280 -0.9858 -0.1089
vn 0.0502 -0.9610 -0.2719
vn 0.0989 -0.9734 -0.2067
vn -0.0989 -0.9734 -0.2067
vn -0.0502 -0.9610 -0.2719
vn -0.0637 0.0637 0.9959
vn 0.0637 0.0637 0.9959
vn 0.0000 0.1434 0.9897
vn -0.0297 -0.0165 0.9994
vn -0.0320 0.0425 0.9986
vn 0.0320 0.0425 0.9986
vn -0.0286 -0.0504 0.9983
vn 0.0000 -0.1379 0.9904
vn 0.0007 -0.9999 0.0121
usemtl Material
s off
f 56/25/7 21/26/7 30/27/7
f 34/28/8 50/29/8 62/30/8
f 39/31/9 116/32/9 115/33/9
f 60/34/10 10/35/10 23/36/10
f 51/37/11 28/38/11 18/39/11
f 38/40/12 53/41/12 51/37/12
f 42/42/13 57/43/13 56/25/13
f 46/44/14 64/45/14 60/34/14
f 15/46/15 28/47/15 21/48/15
f 38/40/16 114/49/16 44/50/16
f 48/51/17 113/52/17 117/53/17
f 46/44/18 119/54/18 35/55/18
f 116/32/19 35/55/19 119/54/19
f 51/37/20 15/56/20 50/29/20
f 30/57/21 53/41/21 56/58/21
f 23/36/22 57/43/22 60/34/22
f 35/55/23 62/30/23 64/45/23
f 39/31/24 112/59/24 38/40/24
f 42/60/25 114/49/25 113/61/25
f 48/51/26 118/62/26 46/44/26
f 51/37/27 39/31/27 38/40/27
f 56/58/28 44/50/28 42/60/28
f 60/34/29 48/51/29 46/44/29
f 10/35/30 62/30/30 11/63/30
f 62/30/31 15/56/31 11/63/31
f 56/25/7 57/43/7 21/26/7
f 34/28/8 39/31/8 50/29/8
f 39/31/9 34/28/9 116/32/9
f 60/34/10 64/45/10 10/35/10
f 51/37/11 53/41/11 28/38/11
f 38/40/12 44/50/12 53/41/12
f 42/42/13 48/51/13 57/43/13
f 46/44/14 35/55/14 64/45/14
f 21/48/15 23/64/15 10/65/15
f 10/65/15 11/66/15 15/46/15
f 15/46/15 18/67/15 28/47/15
f 28/47/15 30/68/15 21/48/15
f 21/48/15 10/65/15 15/46/15
f 38/40/16 112/59/16 114/49/16
f 48/51/17 42/42/17 113/52/17
f 46/44/18 118/62/18 119/54/18
f 116/32/19 34/28/19 35/55/19
f 51/37/20 18/39/20 15/56/20
f 30/57/21 28/38/21 53/41/21
f 23/36/22 21/26/22 57/43/22
f 35/55/23 34/28/23 62/30/23
f 39/31/24 115/33/24 112/59/24
f 42/60/25 44/50/25 114/49/25
f 48/51/26 117/53/26 118/62/26
f 51/37/27 50/29/27 39/31/27
f 56/58/28 53/41/28 44/50/28
f 60/34/29 57/43/29 48/51/29
f 10/35/30 64/45/30 62/30/30
f 62/30/31 50/29/31 15/56/31
s 1
f 19/69/32 27/70/33 45/71/34
f 103/72/35 69/73/35 105/74/35
f 29/75/36 16/76/37 33/77/38
f 33/77/38 17/78/39 40/79/40
f 17/78/39 45/71/34 40/79/40
f 101/80/41 59/81/41 61/82/41
f 22/83/42 49/84/43 20/85/44
f 43/86/45 47/87/46 49/84/43
f 40/79/40 47/87/46 41/88/14
f 37/89/47 22/83/42 24/90/48
f 36/91/49 43/86/45 37/89/47
f 36/91/49 40/79/40 41/88/14
f 32/92/50 24/90/48 12/93/51
f 31/94/52 37/89/47 32/92/50
f 31/94/52 33/77/38 36/91/49
f 97/95/53 66/96/53 67/97/53
f 95/98/13 65/99/13 66/96/13
f 20/85/44 25/100/54 14/101/55
f 49/84/43 26/102/56 25/100/54
f 45/71/34 26/102/56 47/87/46
f 67/97/57 70/103/57 68/104/57
f 61/82/58 73/105/58 63/106/58
f 79/107/59 52/108/60 80/109/14
f 84/110/15 70/103/15 77/111/15
f 65/99/61 76/112/61 66/96/61
f 81/113/62 73/105/62 74/114/62
f 69/73/63 75/115/63 59/81/63
f 12/93/64 108/116/65 55/117/62
f 52/118/8 29/75/8 31/94/8
f 82/119/14 87/120/14 58/121/66
f 84/122/67 55/123/68 108/124/69
f 85/125/14 78/126/14 52/108/60
f 58/127/13 25/100/13 26/102/13
f 76/112/13 78/128/13 85/129/13
f 111/130/70 19/69/15 17/78/71
f 82/131/8 71/132/8 87/133/8
f 78/126/14 79/107/59 80/109/14
f 81/134/72 82/119/14 83/135/14
f 84/122/67 85/125/14 86/136/14
f 87/120/14 88/137/73 89/138/14
f 79/139/74 72/140/74 73/105/74
f 74/114/75 82/131/75 81/113/75
f 59/81/8 105/141/8 69/73/8
f 68/104/76 115/142/77 116/143/15
f 117/144/15 67/97/78 118/145/15
f 77/111/79 66/96/79 76/112/79
f 101/80/62 63/106/62 91/146/62
f 63/106/80 72/140/80 65/147/80
f 71/132/81 68/104/81 70/103/81
f 61/82/82 75/115/82 74/114/82
f 88/148/83 71/132/83 70/103/83
f 77/111/84 85/129/84 84/110/84
f 63/106/85 93/149/85 91/146/85
f 98/150/86 101/80/86 100/151/86
f 94/152/87 97/95/87 96/153/87
f 92/154/88 91/146/88 93/149/88
f 104/155/89 103/72/89 105/74/89
f 103/72/90 96/153/90 97/95/90
f 99/156/91 104/157/91 105/141/91
f 91/146/92 100/151/92 101/80/92
f 95/98/93 92/158/93 93/159/93
f 102/160/12 104/161/12 98/162/12
f 106/163/94 14/101/62 58/164/62
f 108/116/65 12/93/64 107/165/95
f 107/165/95 24/90/96 22/83/97
f 13/166/15 111/130/70 54/167/15
f 109/168/98 9/169/99 52/170/15
f 110/171/100 9/169/99 109/168/98
f 113/172/101 67/97/78 117/144/15
f 114/173/102 97/95/103 113/172/101
f 103/72/104 114/173/102 112/174/105
f 115/142/77 103/72/104 112/174/105
f 119/175/15 68/104/76 116/143/15
f 118/145/15 68/104/76 119/175/15
f 19/69/32 13/166/106 27/70/33
f 103/72/35 68/104/35 69/73/35
f 29/75/36 9/169/107 16/76/37
f 33/77/38 16/76/37 17/78/39
f 17/78/39 19/69/32 45/71/34
f 101/80/41 99/156/41 59/81/41
f 22/83/42 43/86/45 49/84/43
f 43/86/45 41/88/14 47/87/46
f 40/79/40 45/71/34 47/87/46
f 37/89/47 43/86/45 22/83/42
f 36/91/49 41/88/14 43/86/45
f 36/91/49 33/77/38 40/79/40
f 32/92/50 37/89/47 24/90/48
f 31/94/52 36/91/49 37/89/47
f 31/94/52 29/75/36 33/77/38
f 97/95/53 95/176/53 66/96/53
f 95/98/13 93/159/13 65/99/13
f 20/85/44 49/84/43 25/100/54
f 49/84/43 47/87/46 26/102/56
f 45/71/34 27/70/33 26/102/56
f 67/97/57 77/111/57 70/103/57
f 61/82/58 74/114/58 73/105/58
f 79/107/59 81/134/72 110/177/108
f 81/134/72 83/135/14 54/178/109
f 110/177/108 81/134/72 111/179/110
f 54/178/109 111/179/110 81/134/72
f 110/177/108 109/180/111 79/107/59
f 109/180/111 52/108/60 79/107/59
f 84/110/15 88/148/15 70/103/15
f 65/99/61 72/181/61 76/112/61
f 81/113/62 79/139/62 73/105/62
f 69/73/63 71/132/63 75/115/63
f 12/93/8 55/182/8 32/92/8
f 55/182/8 52/118/8 31/94/8
f 32/92/8 55/182/8 31/94/8
f 52/118/8 9/169/8 29/75/8
f 87/120/14 89/138/14 58/121/66
f 58/121/66 54/178/109 82/119/14
f 54/178/109 83/135/14 82/119/14
f 106/183/112 58/121/66 88/137/73
f 58/121/66 89/138/14 88/137/73
f 88/137/73 84/122/67 107/184/113
f 106/183/112 88/137/73 107/184/113
f 84/122/67 86/136/14 55/123/68
f 108/124/69 107/184/113 84/122/67
f 78/126/14 80/109/14 52/108/60
f 52/108/60 55/123/68 85/125/14
f 55/123/68 86/136/14 85/125/14
f 13/166/13 54/185/13 27/70/13
f 54/185/13 58/127/13 26/102/13
f 27/70/13 54/185/13 26/102/13
f 58/127/13 14/101/13 25/100/13
f 76/112/13 72/181/13 78/128/13
f 9/169/99 110/171/100 16/76/114
f 110/171/100 111/130/70 17/78/71
f 16/76/114 110/171/100 17/78/71
f 111/130/70 13/166/15 19/69/15
f 82/131/8 75/115/8 71/132/8
f 79/139/74 78/186/74 72/140/74
f 74/114/75 75/115/75 82/131/75
f 59/81/8 99/156/8 105/141/8
f 68/104/76 103/72/104 115/142/77
f 77/111/79 67/97/79 66/96/79
f 101/80/62 61/82/62 63/106/62
f 63/106/80 73/105/80 72/140/80
f 71/132/81 69/73/81 68/104/81
f 61/82/82 59/81/82 75/115/82
f 88/148/83 87/133/83 71/132/83
f 77/111/84 76/112/84 85/129/84
f 63/106/85 65/147/85 93/149/85
f 98/150/86 99/156/86 101/80/86
f 94/152/87 95/176/87 97/95/87
f 92/154/88 90/187/88 91/146/88
f 104/155/89 102/188/89 103/72/89
f 103/72/90 102/188/90 96/153/90
f 99/156/91 98/150/91 104/157/91
f 91/146/92 90/187/92 100/151/92
f 95/98/93 94/189/93 92/158/93
f 98/162/12 100/190/12 102/160/12
f 100/190/12 90/191/12 102/160/12
f 90/191/12 92/192/12 94/193/12
f 94/193/12 96/194/12 90/191/12
f 96/194/12 102/160/12 90/191/12
f 14/101/62 106/163/94 20/85/62
f 106/163/94 107/165/95 22/83/97
f 20/85/62 106/163/94 22/83/97
f 107/165/95 12/93/64 24/90/96
f 113/172/101 97/95/103 67/97/78
f 103/72/104 97/95/103 114/173/102
f 118/145/15 67/97/78 68/104/76
o Cube.002
v -0.182506 -0.376577 0.025979
v -0.202175 -0.376577 0.006310
v -0.202175 -0.376577 -0.479353
v -0.182475 -0.376637 -0.499021
v 0.202175 -0.376577 0.006310
v -0.236819 -0.500000 0.112318
v 0.182506 -0.376577 0.025979
v -0.262500 -0.500000 0.000000
v 0.182509 -0.376637 -0.499021
v -0.262500 -0.376637 0.000000
v -0.236819 -0.376637 0.112318
v 0.202175 -0.376577 -0.479353
v 0.262500 -0.500000 0.000000
v -0.168634 -0.353125 -0.007583
v -0.202175 -0.356313 0.006310
v 0.236819 -0.500000 0.112318
v 0.236819 -0.376637 0.112318
v -0.182506 -0.356313 0.025979
v 0.262500 -0.376637 0.000000
v -0.168634 -0.353125 -0.465459
v -0.262500 -0.500000 -0.434422
v -0.182506 -0.356313 -0.499021
v -0.242168 -0.500000 -0.499021
v -0.242168 -0.376637 -0.499021
v -0.202175 -0.356313 -0.479353
v -0.262500 -0.376637 -0.434422
v 0.168634 -0.353125 -0.007583
v 0.242168 -0.500000 -0.499021
v 0.262500 -0.500000 -0.434422
v 0.182506 -0.356313 0.025979
v 0.262500 -0.376637 -0.434422
v 0.202175 -0.356313 0.006310
v 0.242168 -0.376637 -0.499021
v -0.236819 -0.391892 0.112318
v 0.168634 -0.353125 -0.465459
v 0.202175 -0.356313 -0.479353
v -0.262500 -0.391892 0.000000
v 0.236819 -0.391892 0.112318
v 0.182506 -0.356313 -0.499021
v 0.262500 -0.391892 0.000000
v 0.243379 -0.391892 0.123162
v -0.269772 -0.391892 0.010843
v -0.243379 -0.500000 0.123162
v -0.269772 -0.500000 0.010843
v 0.243379 -0.500000 0.123162
v 0.269772 -0.500000 0.010843
v -0.243379 -0.391892 0.123162
v 0.269772 -0.391892 0.010843
vt 0.737500 0.775000
vt 0.750000 0.787500
vt 0.737500 0.787500
vt 0.975000 0.787500
vt 0.962500 0.775000
vt 0.975000 0.775000
vt 0.962500 0.725000
vt 0.750000 0.712500
vt 0.962500 0.712500
vt 0.962500 0.062500
vt 0.962500 0.350000
vt 0.750000 0.062500
vt 0.975000 0.725000
vt 0.937500 0.400000
vt 0.925000 0.712500
vt 0.925000 0.400000
vt 0.737500 0.787500
vt 0.962500 0.787500
vt 0.962500 0.712500
vt 0.975000 0.400000
vt 0.975000 0.712500
vt 0.950000 0.700000
vt 0.950000 0.412500
vt 0.750000 0.750000
vt 0.962500 0.750000
vt 0.950000 0.412500
vt 0.962500 0.400000
vt 0.750000 0.775000
vt 0.962500 0.750000
vt 0.750000 0.725000
vt 0.737500 0.712500
vt 0.650000 0.075000
vt 0.362500 0.062500
vt 0.650000 0.062500
vt 0.575000 0.475000
vt 0.700000 0.475000
vt 0.575000 0.662500
vt 0.350000 0.162500
vt 0.412500 0.225000
vt 0.350000 0.225000
vt 0.425000 0.225000
vt 0.425000 0.162500
vt 0.687500 0.162500
vt 0.350000 0.150000
vt 0.425000 0.137500
vt 0.350000 0.137500
vt 0.425000 0.075000
vt 0.412500 0.137500
vt 0.725000 0.000000
vt 0.937500 0.000000
vt 0.975000 0.062500
vt 0.725000 0.075000
vt 0.687500 0.150000
vt 0.725000 0.150000
vt 0.725000 0.237500
vt 0.687500 0.237500
vt 0.750000 0.487500
vt 0.712500 0.475000
vt 0.762500 0.487500
vt 0.537500 0.150000
vt 0.350000 0.162500
vt 0.350000 0.150000
vt 0.762500 0.650000
vt 0.750000 0.650000
vt 0.350000 0.225000
vt 0.425000 0.237500
vt 0.350000 0.237500
vt 0.587500 0.162500
vt 0.537500 0.162500
vt 0.350000 0.137500
vt 0.412500 0.075000
vt 0.350000 0.075000
vt 0.412500 0.162500
vt 0.687500 0.075000
vt 0.587500 0.162500
vt 0.637500 0.150000
vt 0.637500 0.162500
vt 0.712500 0.662500
vt 0.700000 0.662500
vt 0.350000 0.062500
vt 0.662500 0.000000
vt 0.662500 0.062500
vt 0.912500 0.412500
vt 0.862500 0.687500
vt 0.862500 0.375000
vt 0.750000 0.775000
vt 0.750000 0.350000
vt 0.975000 0.712500
vt 0.937500 0.712500
vt 0.737500 0.725000
vt 0.750000 0.750000
vt 0.737500 0.775000
vt 0.950000 0.700000
vt 0.362500 0.075000
vt 0.537500 0.650000
vt 0.537500 0.487500
vt 0.425000 0.150000
vt 0.975000 0.000000
vt 0.662500 0.062500
vt 0.662500 0.000000
vt 0.725000 0.162500
vt 0.587500 0.150000
vt 0.587500 0.150000
vt 0.350000 0.000000
vt 0.862500 0.687500
vt 0.875000 0.700000
vt 0.825000 0.700000
vt 0.812500 0.650000
vt 0.812500 0.350000
vt 0.862500 0.375000
vt 0.925000 0.350000
vt 0.925000 0.400000
vt 0.812500 0.350000
vt 0.812500 0.650000
vt 0.762500 0.375000
vt 0.800000 0.700000
vt 0.762500 0.687500
vt 0.750000 0.700000
vt 0.925000 0.712500
vt 0.925000 0.662500
vt 0.912500 0.650000
vn -0.7071 0.0000 -0.7071
vn 0.7071 0.0000 -0.7071
vn 0.0000 0.0000 1.0000
vn 0.0000 1.0000 0.0000
vn 0.7071 0.0000 0.7071
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
vn 1.0000 0.0000 0.0000
vn -0.0946 0.9955 0.0000
vn 0.0000 0.9955 0.0946
vn 0.0946 0.9955 0.0000
vn 0.0000 0.9955 -0.0946
vn -0.7071 0.0000 0.7071
vn 0.0000 -1.0000 0.0000
vn 0.9735 0.0000 0.2288
vn -0.9748 0.0000 0.2229
vn -0.8305 0.0000 -0.5570
vn -0.9539 0.0000 -0.3002
vn 0.9539 0.0000 -0.3002
vn 0.9748 0.0000 0.2229
vn -0.9735 0.0000 0.2288
vn 0.8305 0.0000 -0.5570
vn 0.0000 1.0000 0.0007
vn -0.7066 -0.0011 -0.7077
vn 0.7072 0.0001 -0.7071
vn -0.0669 0.9955 0.0669
vn -0.0669 0.9955 -0.0669
vn 0.0669 0.9955 -0.0669
vn 0.0669 0.9955 0.0669
vn 0.0000 1.0000 -0.0031
vn -0.0013 1.0000 -0.0004
vn -0.0010 1.0000 0.0000
vn 0.0010 1.0000 0.0002
vn 0.0010 1.0000 0.0000
vn 0.0013 1.0000 -0.0004
vn -0.0010 1.0000 0.0002
vn -0.0004 1.0000 0.0004
vn 0.0004 1.0000 0.0004
s off
f 141/195/115 122/196/115 144/197/115
f 131/198/116 158/199/116 155/200/116
f 149/201/117 120/202/117 126/203/117
f 146/204/118 154/205/118 133/206/118
f 126/203/119 151/207/119 149/201/119
f 134/208/120 122/209/120 121/210/120
f 123/211/121 158/199/121 128/212/121
f 155/213/122 124/214/122 131/215/122
f 139/216/123 134/208/123 133/217/123
f 133/218/124 149/201/124 146/219/124
f 155/213/125 146/220/125 151/221/125
f 141/222/126 154/223/126 158/199/126
f 137/224/127 121/225/127 120/202/127
f 136/226/117 153/227/117 157/228/117
f 148/229/128 132/230/128 140/231/128
f 164/232/129 167/233/129 160/234/129
f 159/235/122 132/236/122 148/237/122
f 130/238/130 156/239/130 153/240/130
f 127/241/131 161/242/131 156/239/131
f 123/243/121 128/244/121 147/245/121
f 142/246/132 145/247/132 143/248/132
f 148/237/133 152/249/133 150/250/133
f 135/251/128 165/252/128 164/253/128
f 153/254/118 160/255/118 157/256/118
f 135/251/128 162/257/128 125/258/128
f 157/259/134 138/260/134 136/261/134
f 153/254/118 161/262/118 166/263/118
f 166/264/135 163/265/135 162/266/135
f 159/235/136 165/267/136 132/236/136
f 140/268/120 156/239/120 145/247/120
f 157/269/118 167/270/118 159/271/118
f 125/258/128 163/272/128 127/273/128
f 166/274/117 164/275/117 160/276/117
f 126/277/137 130/278/137 136/279/137
f 141/195/138 123/280/138 122/196/138
f 131/198/139 128/212/139 158/199/139
f 149/201/117 137/224/117 120/202/117
f 139/281/118 133/206/118 154/205/118
f 126/203/119 124/282/119 151/207/119
f 134/208/120 144/283/120 122/209/120
f 123/211/121 141/195/121 158/199/121
f 155/213/122 151/221/122 124/214/122
f 133/218/140 134/284/140 137/224/140
f 139/285/141 141/222/141 144/286/141
f 154/223/142 155/200/142 158/199/142
f 146/219/143 149/201/143 151/207/143
f 139/216/123 144/283/123 134/208/123
f 133/218/124 137/224/124 149/201/124
f 155/213/125 154/287/125 146/220/125
f 141/222/126 139/285/126 154/223/126
f 137/224/127 134/284/127 121/225/127
f 136/226/117 130/288/117 153/227/117
f 132/230/128 135/251/128 125/258/128
f 125/258/128 127/273/128 132/230/128
f 127/273/128 140/231/128 132/230/128
f 140/231/128 142/289/128 147/290/128
f 147/290/128 148/229/128 140/231/128
f 164/232/129 165/267/129 167/233/129
f 148/237/122 150/250/122 159/235/122
f 150/250/122 138/260/122 159/235/122
f 130/238/130 129/291/130 156/239/130
f 127/241/131 163/265/131 161/242/131
f 128/244/121 152/292/121 147/245/121
f 147/245/121 142/293/121 123/243/121
f 142/293/121 143/294/121 123/243/121
f 142/246/132 140/268/132 145/247/132
f 148/237/133 147/295/133 152/249/133
f 135/251/128 132/230/128 165/252/128
f 153/254/118 166/263/118 160/255/118
f 135/251/128 164/253/128 162/257/128
f 157/259/134 159/235/134 138/260/134
f 153/254/118 156/296/118 161/262/118
f 166/264/135 161/242/135 163/265/135
f 159/235/136 167/233/136 165/267/136
f 127/241/120 156/239/120 140/268/120
f 156/239/120 129/291/120 145/247/120
f 157/269/118 160/297/118 167/270/118
f 125/258/128 162/257/128 163/272/128
f 166/274/117 162/298/117 164/275/117
f 122/299/144 123/300/144 143/301/144
f 143/301/145 145/302/145 122/299/145
f 145/302/146 129/303/146 121/304/146
f 136/279/147 138/305/147 124/306/147
f 138/307/148 150/308/148 124/309/148
f 150/308/149 152/310/149 131/311/149
f 152/310/144 128/312/144 131/311/144
f 145/302/146 121/304/146 122/299/146
f 129/313/150 130/278/150 121/314/150
f 150/308/148 131/311/148 124/309/148
f 120/315/151 121/314/151 130/278/151
f 136/279/152 124/306/152 126/277/152
f 126/277/137 120/315/137 130/278/137

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB