Merge pull request #1369 from Vaern/master

Revamped Silo Structure
This commit is contained in:
HbmMods 2024-03-04 21:09:55 +01:00 committed by GitHub
commit 79b08d8cdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 1415 additions and 8 deletions

View File

@ -4,7 +4,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.hbm.main.MainRegistry;
import com.hbm.world.gen.component.Component;
import com.hbm.world.gen.component.SiloComponent;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import net.minecraft.block.Block;
@ -17,6 +20,7 @@ import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraft.world.gen.structure.StructureBoundingBox;
public class TestEventTester extends Block {
@ -35,6 +39,9 @@ public class TestEventTester extends Block {
this.worldObj = p_149695_1_;
if (p_149695_1_.isBlockIndirectlyGettingPowered(x1, y1, z1))
{
/*Component comp = new SiloComponent(this.worldObj.rand, x1, y1, z1);
comp.addComponentParts(p_149695_1_, this.worldObj.rand, comp.getBoundingBox());*/
//The laser thread is too dangerous to use right now
//ThreadLaser laser = new ThreadLaser(p_149695_1_, x, y, z, "north");
//laser.start();

View File

@ -46,7 +46,9 @@ public class ItemStructurePattern extends ItemStructureTool {
for(int iy = minY; iy <= maxY; iy++) {
for(int iz = minZ; iz <= maxZ; iz++) {
Block b = world.getBlock(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ());
Block b = world.getBlock(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ());
if(b.isAir(world, ix + pos.getX(), iy + pos.getY(), iz + pos.getZ())) continue;
int meta = world.getBlockMetadata(ix + pos.getX(), iy + pos.getY(), iz + pos.getZ());
message += "placeBlockAtCurrentPosition(world, " + b.getUnlocalizedName() + ", " + meta + ", " + ix + ", " + iy + ", " + iz + ", box);\n";

View File

@ -390,8 +390,6 @@ public class HbmChestContents {
public static WeightedRandomChestContent[] lockersVault = new WeightedRandomChestContent[] {
new WeightedRandomChestContent(ModItems.robes_helmet, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.robes_plate, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.ammo_45, 0, 48, 64, 2),
new WeightedRandomChestContent(ModItems.gun_uac_pistol, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.robes_legs, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.robes_boots, 0, 1, 1, 1),
new WeightedRandomChestContent(ModItems.jackt, 0, 1, 1, 1),

View File

@ -7,6 +7,7 @@ import com.hbm.world.gen.component.BunkerComponents.BunkerStart;
import com.hbm.world.gen.component.CivilianFeatures;
import com.hbm.world.gen.component.OfficeFeatures;
import com.hbm.world.gen.component.RuinFeatures;
import com.hbm.world.gen.component.SiloComponent;
import cpw.mods.fml.common.IWorldGenerator;
import cpw.mods.fml.common.registry.GameRegistry;
@ -47,5 +48,6 @@ public class HbmWorld {
OfficeFeatures.registerComponents();
RuinFeatures.registerComponents();
BunkerComponents.registerComponents();
MapGenStructureIO.func_143031_a(SiloComponent.class, "NTMSiloComponent");
}
}

View File

@ -20,6 +20,7 @@ import com.hbm.world.gen.component.RuinFeatures.NTMRuin1;
import com.hbm.world.gen.component.RuinFeatures.NTMRuin2;
import com.hbm.world.gen.component.RuinFeatures.NTMRuin3;
import com.hbm.world.gen.component.RuinFeatures.NTMRuin4;
import com.hbm.world.gen.component.SiloComponent;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
@ -143,6 +144,9 @@ public class MapGenNTMFeatures extends MapGenStructure {
this.components.add(ruin4);
}
} else if(biome.heightVariation <= 0.25F && rand.nextInt(15) == 0) { //for now our only restriction is kinda-flat biomes. that and chance might change idk
SiloComponent silo = new SiloComponent(rand, i, j);
this.components.add(silo);
} else if(biome.temperature >= 1.0 && biome.rainfall == 0 && !(biome instanceof BiomeGenMesa)) { //Desert & Savannah
if(rand.nextBoolean()) {
NTMHouse1 house1 = new NTMHouse1(rand, i, j);

View File

@ -132,7 +132,7 @@ abstract public class Component extends StructureComponent {
/**
* 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?
* should work for hoppers, just flip dir for N/S and W/E
* @param metadata (2 for facing South, 3 for facing North, 4 for facing East, 5 for facing West
*/
protected int getDecoMeta(int metadata) {
@ -199,6 +199,11 @@ abstract public class Component extends StructureComponent {
return metadata << 2; //To accommodate for BlockDecoModel's shift in the rotation bits; otherwise, simply bit-shift right and or any non-rotation meta after
}
//works for crts, toasters, and anything that follows mc's cardinal dirs. S: 0, W: 1, N: 2, E: 3
protected int getCRTMeta(int meta) {
return (meta + this.coordBaseMode) % 4;
}
/**
* Gets orientation-adjusted meta for stairs.
* 0 = West, 1 = East, 2 = North, 3 = South
@ -547,7 +552,7 @@ abstract public class Component extends StructureComponent {
if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY)
return;
for(int x = minX; x <= maxX; x++) {
for(int x = minX; x <= maxX; x++) { //TODO these could technically be optimized a bit more. probably won't do anything but worth
for(int z = minZ; z <= maxZ; z++) {
int posX = getXWithOffset(x, z);
@ -788,6 +793,29 @@ abstract public class Component extends StructureComponent {
}
}
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, int meta) {
if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY)
return;
for(int x = minX; x <= maxX; x++) {
for(int z = minZ; z <= maxZ; z++) {
int posX = getXWithOffset(x, z);
int posZ = getZWithOffset(x, z);
if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) {
for(int y = minY; y <= maxY; y++) {
int posY = getYWithOffset(y);
if(rand.nextFloat() <= randLimit)
world.setBlock(posX, posY, posZ, block, meta, 2);
}
}
}
}
}
protected ForgeDirection getDirection(ForgeDirection dir) {
switch(coordBaseMode) {
default: //South
@ -801,17 +829,35 @@ abstract public class Component extends StructureComponent {
}
}
/** Sets the core block for a BlockDummyable multiblock. WARNING: Does not take {@link com.hbm.blocks.BlockDummyable#getDirModified(ForgeDirection)} or {@link com.hbm.blocks.BlockDummyable#getMetaForCore(World, int, int, int, EntityPlayer, int)}
* into account yet! This will be changed as it comes up!<br>
* For BlockDummyables, 'dir' <b>always</b> faces the player, being the opposite of the player's direction. This is already taken into account. */
protected void placeCore(World world, StructureBoundingBox box, Block block, ForgeDirection dir, int x, int y, int z) {
int posX = getXWithOffset(x, z);
int posZ = getZWithOffset(x, z);
int posY = getYWithOffset(y);
if(!box.isVecInside(posX, posY, posZ)) return;
if(dir == null)
dir = ForgeDirection.NORTH;
dir = getDirection(dir.getOpposite());
world.setBlock(posX, posY, posZ, block, dir.ordinal() + BlockDummyable.offset, 2);
}
//always set the core block first
/** StructureComponent-friendly method for {@link com.hbm.handler.MultiblockHandlerXR#fillSpace(World, int, int, int, int[], Block, ForgeDirection)}. Prevents runoff outside of the provided bounding box. */
/** StructureComponent-friendly method for {@link com.hbm.handler.MultiblockHandlerXR#fillSpace(World, int, int, int, int[], Block, ForgeDirection)}. Prevents runoff outside of the provided bounding box.<br>
* For BlockDummyables, 'dir' <b>always</b> faces the player, being the opposite of the player's direction. This is already taken into account. */
protected void fillSpace(World world, StructureBoundingBox box, int x, int y, int z, int[] dim, Block block, ForgeDirection dir) {
if(getYWithOffset(y - dim[1]) < box.minY || getYWithOffset(y + dim[0]) > box.maxY) //the BlockDummyable will be fucked regardless if it goes beyond either limit
return;
if(dir == null)
dir = ForgeDirection.SOUTH;
dir = ForgeDirection.NORTH;
dir = getDirection(dir);
dir = getDirection(dir.getOpposite());
int count = 0;

File diff suppressed because it is too large Load Diff