Added hive generation
This commit is contained in:
parent
c35964f8b4
commit
1fda3b3b2e
8 changed files with 295 additions and 263 deletions
|
@ -129,6 +129,7 @@ public class BOPBiomes
|
|||
public static IExtendedBiome cold_taiga_hills_extension;
|
||||
public static IExtendedBiome mega_taiga_extension;
|
||||
public static IExtendedBiome mega_taiga_hills_extension;
|
||||
public static IExtendedBiome hell_extension;
|
||||
|
||||
private static IBiomeRegistry createRegistry()
|
||||
{
|
||||
|
|
|
@ -17,6 +17,9 @@ import biomesoplenty.api.generation.GeneratorStage;
|
|||
import biomesoplenty.api.generation.IGenerationManager;
|
||||
import biomesoplenty.api.generation.IGenerator;
|
||||
import biomesoplenty.common.biome.BOPBiome;
|
||||
import biomesoplenty.common.util.biome.GeneratorUtils;
|
||||
import biomesoplenty.common.world.generator.GeneratorHive;
|
||||
import biomesoplenty.common.world.generator.GeneratorSplatter;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.monster.EntityEnderman;
|
||||
|
@ -54,6 +57,8 @@ public class BOPHellBiome extends BOPBiome
|
|||
this.spawnableMonsterList.add(new Biome.SpawnListEntry(EntityPigZombie.class, 100, 4, 4));
|
||||
this.spawnableMonsterList.add(new Biome.SpawnListEntry(EntityMagmaCube.class, 2, 4, 4));
|
||||
this.spawnableMonsterList.add(new Biome.SpawnListEntry(EntityEnderman.class, 1, 4, 4));
|
||||
|
||||
this.addGenerator("hive", GeneratorStage.PRE, (new GeneratorHive.Builder()).amountPerChunk(4.0F).create());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2014-2017, the Biomes O' Plenty Team
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
|
||||
******************************************************************************/
|
||||
package biomesoplenty.common.biome.vanilla;
|
||||
|
||||
import biomesoplenty.api.generation.GeneratorStage;
|
||||
import biomesoplenty.common.world.generator.GeneratorHive;
|
||||
import net.minecraft.init.Biomes;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.world.biome.BiomeDecorator;
|
||||
|
||||
public class BiomeExtHell extends ExtendedBiomeWrapper
|
||||
{
|
||||
public BiomeExtHell()
|
||||
{
|
||||
super(Biomes.HELL);
|
||||
|
||||
// setup hell as a properly decorated biome
|
||||
Biomes.HELL.topBlock = Blocks.NETHERRACK.getDefaultState();
|
||||
Biomes.HELL.fillerBlock = Blocks.NETHERRACK.getDefaultState();
|
||||
|
||||
Biomes.HELL.theBiomeDecorator = new BiomeDecorator();
|
||||
Biomes.HELL.theBiomeDecorator.treesPerChunk = -999;
|
||||
Biomes.HELL.theBiomeDecorator.flowersPerChunk = -999;
|
||||
Biomes.HELL.theBiomeDecorator.grassPerChunk = -999;
|
||||
Biomes.HELL.theBiomeDecorator.sandPerChunk = -999;
|
||||
Biomes.HELL.theBiomeDecorator.sandPerChunk2 = -999;
|
||||
//this.theBiomeDecorator.generateLakes = false;
|
||||
|
||||
this.addGenerator("hive", GeneratorStage.PRE, (new GeneratorHive.Builder()).amountPerChunk(4.0F).create());
|
||||
}
|
||||
}
|
||||
|
|
@ -8,105 +8,7 @@
|
|||
|
||||
package biomesoplenty.common.init;
|
||||
|
||||
import static biomesoplenty.api.biome.BOPBiomes.alps;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.bamboo_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.bayou;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.birch_forest_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.birch_forest_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.bog;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.boneyard;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.boreal_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.brushland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.chaparral;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.cherry_blossom_grove;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.cold_desert;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.cold_taiga_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.cold_taiga_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.coniferous_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.coral_reef;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.corrupted_sands;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.crag;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.dead_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.dead_swamp;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.desert_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.desert_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.end_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.eucalyptus_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.excludedDecoratedWorldTypes;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.extreme_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.extreme_hills_plus_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.fen;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.flower_field;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.flower_island;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.forest_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.forest_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.fungi_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.glacier;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.grassland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.gravel_beach;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.grove;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.heathland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.highland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.ice_mountains_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.ice_plains_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.jungle_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.jungle_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.kelp_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.land_of_lakes;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.lavender_fields;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.lush_desert;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.lush_swamp;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mangrove;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.maple_woods;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.marsh;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.meadow;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mega_taiga_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mega_taiga_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mesa_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mesa_plateau_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.moor;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mountain;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mountain_foothills;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mushroom_island_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.mystic_grove;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.oasis;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.ocean_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.ominous_woods;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.orchard;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.origin_island;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.outback;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.overgrown_cliffs;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.phantasmagoric_inferno;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.plains_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.polar_chasm;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.prairie;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.quagmire;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.rainforest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.redwood_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.roofed_forest_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.sacred_springs;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.savanna_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.savanna_plateau_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.seasonal_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.shield;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.shrubland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.snowy_coniferous_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.snowy_forest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.steppe;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.swampland_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.taiga_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.taiga_hills_extension;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.temperate_rainforest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.tropical_island;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.tropical_rainforest;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.tundra;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.undergarden;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.visceral_heap;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.volcanic_island;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.wasteland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.wetland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.woodland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.xeric_shrubland;
|
||||
import static biomesoplenty.api.biome.BOPBiomes.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
@ -118,6 +20,7 @@ import java.util.Map;
|
|||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import biomesoplenty.common.biome.vanilla.*;
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Sets;
|
||||
|
@ -197,34 +100,6 @@ import biomesoplenty.common.biome.overworld.BiomeGenWasteland;
|
|||
import biomesoplenty.common.biome.overworld.BiomeGenWetland;
|
||||
import biomesoplenty.common.biome.overworld.BiomeGenWoodland;
|
||||
import biomesoplenty.common.biome.overworld.BiomeGenXericShrubland;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtBirchForest;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtBirchForestHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtColdTaiga;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtColdTaigaHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtDesert;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtDesertHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtEnd;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtExtremeHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtExtremeHillsPlus;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtForest;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtForestHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtIceMountains;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtIcePlains;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtJungle;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtJungleHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtMegaTaiga;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtMegaTaigaHills;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtMesa;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtMesaPlateau;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtMushroomIsland;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtOcean;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtPlains;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtRoofedForest;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtSavanna;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtSavannaPlateau;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtSwampland;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtTaiga;
|
||||
import biomesoplenty.common.biome.vanilla.BiomeExtTaigaHills;
|
||||
import biomesoplenty.common.command.BOPCommand;
|
||||
import biomesoplenty.common.util.config.BOPConfig;
|
||||
import biomesoplenty.common.world.WorldProviderBOPHell;
|
||||
|
@ -468,7 +343,7 @@ public class ModBiomes implements BOPBiomes.IBiomeRegistry
|
|||
swampland_extension = registerWrappedBiome(new BiomeExtSwampland(), "swampland");
|
||||
taiga_extension = registerWrappedBiome(new BiomeExtTaiga(), "taiga");
|
||||
taiga_hills_extension = registerWrappedBiome(new BiomeExtTaigaHills(), "taiga_hills");
|
||||
|
||||
hell_extension = registerWrappedBiome(new BiomeExtHell(), "hell");
|
||||
}
|
||||
|
||||
private static void registerBiomeDictionaryTags()
|
||||
|
|
|
@ -10,25 +10,7 @@ package biomesoplenty.common.init;
|
|||
|
||||
import static biomesoplenty.common.world.GeneratorRegistry.registerGenerator;
|
||||
|
||||
import biomesoplenty.common.world.generator.GeneratorBigFlower;
|
||||
import biomesoplenty.common.world.generator.GeneratorBigMushroom;
|
||||
import biomesoplenty.common.world.generator.GeneratorBlobs;
|
||||
import biomesoplenty.common.world.generator.GeneratorColumns;
|
||||
import biomesoplenty.common.world.generator.GeneratorCrystals;
|
||||
import biomesoplenty.common.world.generator.GeneratorDoubleFlora;
|
||||
import biomesoplenty.common.world.generator.GeneratorFlora;
|
||||
import biomesoplenty.common.world.generator.GeneratorGrass;
|
||||
import biomesoplenty.common.world.generator.GeneratorLakes;
|
||||
import biomesoplenty.common.world.generator.GeneratorLogs;
|
||||
import biomesoplenty.common.world.generator.GeneratorMixedLily;
|
||||
import biomesoplenty.common.world.generator.GeneratorOreCluster;
|
||||
import biomesoplenty.common.world.generator.GeneratorOreSingle;
|
||||
import biomesoplenty.common.world.generator.GeneratorSpike;
|
||||
import biomesoplenty.common.world.generator.GeneratorSplatter;
|
||||
import biomesoplenty.common.world.generator.GeneratorSplotches;
|
||||
import biomesoplenty.common.world.generator.GeneratorVines;
|
||||
import biomesoplenty.common.world.generator.GeneratorWaterside;
|
||||
import biomesoplenty.common.world.generator.GeneratorWeighted;
|
||||
import biomesoplenty.common.world.generator.*;
|
||||
import biomesoplenty.common.world.generator.tree.GeneratorBasicTree;
|
||||
import biomesoplenty.common.world.generator.tree.GeneratorBayouTree;
|
||||
import biomesoplenty.common.world.generator.tree.GeneratorBigTree;
|
||||
|
@ -79,6 +61,7 @@ public class ModGenerators
|
|||
registerGenerator("mixed_lily", GeneratorMixedLily.class, new GeneratorMixedLily.Builder());
|
||||
registerGenerator("crystals", GeneratorCrystals.class, new GeneratorCrystals.Builder());
|
||||
registerGenerator("spike", GeneratorSpike.class, new GeneratorSpike.Builder());
|
||||
registerGenerator("hive", GeneratorHive.class, new GeneratorHive.Builder());
|
||||
registerGenerator("redwood_tree", GeneratorRedwoodTree.class, new GeneratorRedwoodTree.Builder());
|
||||
registerGenerator("redwood_tree_thin", GeneratorRedwoodTreeThin.class, new GeneratorRedwoodTreeThin.Builder());
|
||||
registerGenerator("mahogany_tree", GeneratorMahoganyTree.class, new GeneratorMahoganyTree.Builder());
|
||||
|
|
|
@ -30,120 +30,5 @@ public class ItemFlippers extends ItemArmor
|
|||
// flippers are always on your feet - armorType = 3
|
||||
super(material, renderIndex, EntityEquipmentSlot.FEET);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand)
|
||||
{
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
RayTraceResult rayTrace = this.rayTrace(world, player, false);
|
||||
|
||||
/* if (rayTrace != null && rayTrace.typeOfHit == RayTraceResult.Type.BLOCK)
|
||||
{
|
||||
int halfHeight = 7;
|
||||
int maxRadius = 9;
|
||||
int layerSize = 3;
|
||||
int bottomExtra = 4;
|
||||
boolean empty = true;
|
||||
BlockPos hitPos = rayTrace.getBlockPos();
|
||||
|
||||
// create the top and bottom halves of the hive, and a little bit extra on the bottom for the sake of looking
|
||||
// slightly more like a hive
|
||||
for (int yOffset = halfHeight; yOffset >= -halfHeight - bottomExtra; yOffset--)
|
||||
{
|
||||
// y is already negative, so add it rather than subtract
|
||||
int radius = maxRadius + (yOffset / layerSize) * (yOffset >= 0 ? -1 : 1);
|
||||
|
||||
for (int xOffset = -radius; xOffset <= radius; xOffset++)
|
||||
{
|
||||
for (int zOffset = -radius; zOffset <= radius; zOffset++)
|
||||
{
|
||||
int x2_z2 = xOffset * xOffset + zOffset * zOffset;
|
||||
|
||||
// used to determine where to fill with honey
|
||||
boolean bottomHalf = yOffset <= 0;
|
||||
|
||||
// check to fill the top and bottom of the two layers
|
||||
boolean outerCap = yOffset == -halfHeight - bottomExtra || yOffset == halfHeight;
|
||||
boolean innerCap = yOffset == -halfHeight - bottomExtra + 1 || yOffset == halfHeight - 1;
|
||||
|
||||
// create a circular outline for the hive. the bottom and top layers should be filled.
|
||||
// add a bit extra (1) to make the circles nicer too
|
||||
|
||||
// inner layer. inset by one block
|
||||
if (x2_z2 <= (radius - 1) * (radius - 1) + 1 && (x2_z2 >= (radius - 2) * (radius - 2) || innerCap))
|
||||
{
|
||||
IBlockState honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.EMPTY_HONEYCOMB);
|
||||
float f = world.rand.nextFloat();
|
||||
|
||||
if (!empty && f <= 0.95)
|
||||
{
|
||||
honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.HONEYCOMB);
|
||||
|
||||
// if on the bottom half of the hive bias more towards filled honeycomb.
|
||||
// the rest of the hive can still have filled blocks though
|
||||
if (f <= 0.2 || (f <= 0.65 && bottomHalf))
|
||||
{
|
||||
honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.FILLED_HONEYCOMB);
|
||||
}
|
||||
}
|
||||
else if (empty && f <= 0.2)
|
||||
{
|
||||
honeyComb = Blocks.AIR.getDefaultState();
|
||||
}
|
||||
|
||||
// offset so we're placing the hive underneath the initial y coordinate
|
||||
world.setBlockState(hitPos.add(xOffset, yOffset - halfHeight, zOffset), honeyComb);
|
||||
}
|
||||
|
||||
// inner fill
|
||||
if (!empty && bottomHalf && x2_z2 <= (radius - 2) * (radius - 2) + 1)
|
||||
{
|
||||
// fill the centre of the hive with honey blocks honey
|
||||
IBlockState fillBlock = yOffset == 0 ? BOPBlocks.honey_block.getDefaultState() : BOPBlocks.honey.getDefaultState();
|
||||
world.setBlockState(hitPos.add(xOffset, yOffset - halfHeight, zOffset), fillBlock);
|
||||
}
|
||||
|
||||
// place a wasp spawner in the middle of the hive
|
||||
if (!empty && yOffset == 0 && xOffset == 0 && zOffset == 0)
|
||||
{
|
||||
BlockPos spawnerPos = hitPos.add(xOffset, yOffset - halfHeight, zOffset);
|
||||
|
||||
world.setBlockState(spawnerPos, Blocks.MOB_SPAWNER.getDefaultState(), 2);
|
||||
TileEntity tileentity = world.getTileEntity(spawnerPos);
|
||||
|
||||
if (tileentity instanceof TileEntityMobSpawner)
|
||||
{
|
||||
MobSpawnerBaseLogic spawnerLogic = ((TileEntityMobSpawner)tileentity).getSpawnerBaseLogic();
|
||||
|
||||
NBTTagCompound spawnerConfig = new NBTTagCompound();
|
||||
spawnerConfig.setShort("MinSpawnDelay", (short)100);
|
||||
spawnerConfig.setShort("MaxSpawnDelay", (short)400);
|
||||
spawnerConfig.setShort("SpawnCount", (short)6);
|
||||
spawnerConfig.setShort("MaxNearbyEntities", (short)16);
|
||||
spawnerConfig.setShort("RequiredPlayerRange", (short)24);
|
||||
|
||||
spawnerLogic.readFromNBT(spawnerConfig);
|
||||
spawnerLogic.setEntityId(new ResourceLocation(BiomesOPlenty.MOD_ID, "wasp"));
|
||||
}
|
||||
else
|
||||
{
|
||||
BiomesOPlenty.logger.error("Failed to fetch mob spawner entity at ({}, {}, {})", new Object[] {Integer.valueOf(spawnerPos.getX()), Integer.valueOf(spawnerPos.getY()), Integer.valueOf(spawnerPos.getZ())});
|
||||
}
|
||||
}
|
||||
|
||||
// outer layer
|
||||
if (x2_z2 <= radius * radius + 1 && (x2_z2 >= (radius - 1) * (radius - 1) || outerCap))
|
||||
{
|
||||
// offset so we're placing the hive underneath the initial y coordinate
|
||||
world.setBlockState(hitPos.add(xOffset, yOffset - halfHeight, zOffset), BOPBlocks.hive.getDefaultState());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ public class GeneratorUtils
|
|||
|
||||
public static enum ScatterYMethod
|
||||
{
|
||||
ANYWHERE, NETHER_SURFACE, AT_SURFACE, AT_GROUND, BELOW_SURFACE, BELOW_GROUND, ABOVE_SURFACE, ABOVE_GROUND;
|
||||
ANYWHERE, NETHER_SURFACE, NETHER_ROOF, AT_SURFACE, AT_GROUND, BELOW_SURFACE, BELOW_GROUND, ABOVE_SURFACE, ABOVE_GROUND;
|
||||
public BlockPos getBlockPos(World world, Random random, int x, int z)
|
||||
{
|
||||
int tempY;
|
||||
|
@ -119,6 +119,11 @@ public class GeneratorUtils
|
|||
tempY = world.getHeight(new BlockPos(x, 0, z)).getY();
|
||||
pos = getFirstBlockMatching(world, new BlockPos(x, nextIntBetween(random, 1, 127), z), BlockQuery.buildAnd().add(BlockQueries.solid).withAirAbove().create());
|
||||
return (pos == null ? new BlockPos(x, 1, z) : pos.up());
|
||||
case NETHER_ROOF:
|
||||
// random point above the nether surface
|
||||
tempY = world.getHeight(new BlockPos(x, 0, z)).getY();
|
||||
pos = getFirstBlockMatching(world, new BlockPos(x, nextIntBetween(random, 1, 127), z), BlockQuery.buildAnd().add(BlockQueries.solid).withAirBelow().create());
|
||||
return (pos == null ? new BlockPos(x, 1, z) : pos.down());
|
||||
case ANYWHERE: default:
|
||||
// random y coord
|
||||
return new BlockPos(x, nextIntBetween(random, 1, 255), z);
|
||||
|
|
|
@ -0,0 +1,241 @@
|
|||
/*******************************************************************************
|
||||
* Copyright 2014-2017, the Biomes O' Plenty Team
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
|
||||
******************************************************************************/
|
||||
package biomesoplenty.common.world.generator;
|
||||
|
||||
import biomesoplenty.api.block.BOPBlocks;
|
||||
import biomesoplenty.api.block.BlockQueries;
|
||||
import biomesoplenty.api.block.IBlockPosQuery;
|
||||
import biomesoplenty.api.config.IConfigObj;
|
||||
import biomesoplenty.common.block.BlockBOPHive;
|
||||
import biomesoplenty.common.util.biome.GeneratorUtils;
|
||||
import biomesoplenty.common.util.block.BlockQuery;
|
||||
import biomesoplenty.core.BiomesOPlenty;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Biomes;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.MobSpawnerBaseLogic;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityMobSpawner;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class GeneratorHive extends GeneratorReplacing
|
||||
{
|
||||
public static class Builder extends GeneratorReplacing.InnerBuilder<GeneratorHive.Builder, GeneratorHive> implements IGeneratorBuilder<GeneratorHive>
|
||||
{
|
||||
protected int halfHeight;
|
||||
protected int maxRadius;
|
||||
protected int layerSize;
|
||||
protected int bottomExtra;
|
||||
protected float emptyChance;
|
||||
|
||||
public GeneratorHive.Builder halfHeight(int a) {this.halfHeight = a; return this.self();}
|
||||
public GeneratorHive.Builder maxRadius(int a) {this.maxRadius = a; return this.self();}
|
||||
public GeneratorHive.Builder layerSize(int a) {this.layerSize = a; return this.self();}
|
||||
public GeneratorHive.Builder bottomExtra(int a) {this.bottomExtra = a; return this.self();}
|
||||
public GeneratorHive.Builder emptyChance(float a) {this.emptyChance = a; return this.self();}
|
||||
|
||||
public Builder()
|
||||
{
|
||||
// defaults
|
||||
this.amountPerChunk = 1.0F;
|
||||
this.placeOn = BlockQuery.buildAnd().states(Blocks.NETHERRACK.getDefaultState()).withAirBelow().create();;
|
||||
this.replace = new BlockQuery.BlockQueryMaterial(Material.AIR);
|
||||
this.with = null;
|
||||
this.scatterYMethod = GeneratorUtils.ScatterYMethod.NETHER_ROOF;
|
||||
this.halfHeight = 7;
|
||||
this.maxRadius = 9;
|
||||
this.layerSize = 3;
|
||||
this.bottomExtra = 4;
|
||||
this.emptyChance = 0.25F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GeneratorHive create()
|
||||
{
|
||||
return new GeneratorHive(this.amountPerChunk, this.placeOn, this.replace, this.with, this.scatterYMethod, this.halfHeight, this.maxRadius, this.layerSize, this.bottomExtra, this.emptyChance);
|
||||
}
|
||||
}
|
||||
|
||||
protected int halfHeight;
|
||||
protected int maxRadius;
|
||||
protected int layerSize;
|
||||
protected int bottomExtra;
|
||||
protected float emptyChance;
|
||||
|
||||
public GeneratorHive(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState with, GeneratorUtils.ScatterYMethod scatterYMethod, int halfHeight, int maxRadius, int layerSize, int bottomExtra, float emptyChance)
|
||||
{
|
||||
super(amountPerChunk, placeOn, replace, with, scatterYMethod);
|
||||
this.halfHeight = halfHeight;
|
||||
this.maxRadius = maxRadius;
|
||||
this.layerSize = layerSize;
|
||||
this.bottomExtra = bottomExtra;
|
||||
this.emptyChance = emptyChance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean generate(World world, Random rand, BlockPos position)
|
||||
{
|
||||
// check that there's room and if the blocks below are suitable
|
||||
if (!this.canPlaceHere(world, position, this.halfHeight * 2 + this.bottomExtra, this.maxRadius)) {return false;}
|
||||
|
||||
boolean empty = rand.nextFloat() <= this.emptyChance;
|
||||
|
||||
// create the top and bottom halves of the hive, and a little bit extra on the bottom for the sake of looking
|
||||
// slightly more like a hive
|
||||
for (int yOffset = this.halfHeight; yOffset >= -this.halfHeight - this.bottomExtra; yOffset--)
|
||||
{
|
||||
// y is already negative, so add it rather than subtract
|
||||
int radius = this.maxRadius + (yOffset / this.layerSize) * (yOffset >= 0 ? -1 : 1);
|
||||
|
||||
for (int xOffset = -radius; xOffset <= radius; xOffset++)
|
||||
{
|
||||
for (int zOffset = -radius; zOffset <= radius; zOffset++)
|
||||
{
|
||||
int x2_z2 = xOffset * xOffset + zOffset * zOffset;
|
||||
|
||||
// used to determine where to fill with honey
|
||||
boolean bottomHalf = yOffset <= 0;
|
||||
|
||||
// check to fill the top and bottom of the two layers
|
||||
boolean outerCap = yOffset == -this.halfHeight - this.bottomExtra || yOffset == this.halfHeight;
|
||||
boolean innerCap = yOffset == -this.halfHeight - this.bottomExtra + 1 || yOffset == this.halfHeight - 1;
|
||||
|
||||
// create a circular outline for the hive. the bottom and top layers should be filled.
|
||||
// add a bit extra (1) to make the circles nicer too
|
||||
|
||||
// inner layer. inset by one block
|
||||
if (x2_z2 <= (radius - 1) * (radius - 1) + 1 && (x2_z2 >= (radius - 2) * (radius - 2) || innerCap))
|
||||
{
|
||||
IBlockState honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.EMPTY_HONEYCOMB);
|
||||
float f = rand.nextFloat();
|
||||
|
||||
if (!empty && f <= 0.95)
|
||||
{
|
||||
honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.HONEYCOMB);
|
||||
|
||||
// if on the bottom half of the hive bias more towards filled honeycomb.
|
||||
// the rest of the hive can still have filled blocks though
|
||||
if (f <= 0.2 || (f <= 0.65 && bottomHalf))
|
||||
{
|
||||
honeyComb = BOPBlocks.hive.getDefaultState().withProperty(BlockBOPHive.VARIANT, BlockBOPHive.HiveType.FILLED_HONEYCOMB);
|
||||
}
|
||||
}
|
||||
else if (empty && f <= 0.2)
|
||||
{
|
||||
honeyComb = Blocks.AIR.getDefaultState();
|
||||
}
|
||||
|
||||
// offset so we're placing the hive underneath the initial y coordinate
|
||||
world.setBlockState(position.add(xOffset, yOffset - this.halfHeight, zOffset), honeyComb);
|
||||
}
|
||||
|
||||
// inner fill
|
||||
if (!empty && bottomHalf && x2_z2 <= (radius - 2) * (radius - 2) + 1)
|
||||
{
|
||||
// fill the centre of the hive with honey blocks honey
|
||||
IBlockState fillBlock = yOffset == 0 ? BOPBlocks.honey_block.getDefaultState() : BOPBlocks.honey.getDefaultState();
|
||||
world.setBlockState(position.add(xOffset, yOffset - this.halfHeight, zOffset), fillBlock);
|
||||
}
|
||||
|
||||
// place a wasp spawner in the middle of the hive
|
||||
if (!empty && yOffset == 0 && xOffset == 0 && zOffset == 0)
|
||||
{
|
||||
BlockPos spawnerPos = position.add(xOffset, yOffset - this.halfHeight, zOffset);
|
||||
|
||||
world.setBlockState(spawnerPos, Blocks.MOB_SPAWNER.getDefaultState(), 2);
|
||||
TileEntity tileentity = world.getTileEntity(spawnerPos);
|
||||
|
||||
if (tileentity instanceof TileEntityMobSpawner)
|
||||
{
|
||||
MobSpawnerBaseLogic spawnerLogic = ((TileEntityMobSpawner)tileentity).getSpawnerBaseLogic();
|
||||
|
||||
NBTTagCompound spawnerConfig = new NBTTagCompound();
|
||||
spawnerConfig.setShort("MinSpawnDelay", (short)100);
|
||||
spawnerConfig.setShort("MaxSpawnDelay", (short)400);
|
||||
spawnerConfig.setShort("SpawnCount", (short)6);
|
||||
spawnerConfig.setShort("MaxNearbyEntities", (short)16);
|
||||
spawnerConfig.setShort("RequiredPlayerRange", (short)24);
|
||||
|
||||
spawnerLogic.readFromNBT(spawnerConfig);
|
||||
spawnerLogic.setEntityId(new ResourceLocation(BiomesOPlenty.MOD_ID, "wasp"));
|
||||
}
|
||||
else
|
||||
{
|
||||
BiomesOPlenty.logger.error("Failed to fetch mob spawner entity at ({}, {}, {})", new Object[] {Integer.valueOf(spawnerPos.getX()), Integer.valueOf(spawnerPos.getY()), Integer.valueOf(spawnerPos.getZ())});
|
||||
}
|
||||
}
|
||||
|
||||
// outer layer
|
||||
if (x2_z2 <= radius * radius + 1 && (x2_z2 >= (radius - 1) * (radius - 1) || outerCap))
|
||||
{
|
||||
// offset so we're placing the hive underneath the initial y coordinate
|
||||
world.setBlockState(position.add(xOffset, yOffset - halfHeight, zOffset), BOPBlocks.hive.getDefaultState());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean canPlaceHere(World world, BlockPos pos, int height, int radius)
|
||||
{
|
||||
|
||||
|
||||
if (world.getBiome(pos) == Biomes.HELL)
|
||||
{
|
||||
System.out.println(world.getBlockState(pos).getBlock() == Blocks.NETHERRACK);
|
||||
}
|
||||
|
||||
if (pos.getY() <= 1 || pos.getY() > 255)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (int y = pos.getY(); y >= pos.getY() - height; --y)
|
||||
{
|
||||
for (int x = pos.getX() - radius; x <= pos.getX() + radius; ++x)
|
||||
{
|
||||
for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; ++z)
|
||||
{
|
||||
if (y == pos.getY() && !this.placeOn.matches(world, new BlockPos(x, y + 1, z)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.replace.matches(world, new BlockPos(x, y, z)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configure(IConfigObj conf)
|
||||
{
|
||||
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
|
||||
this.placeOn = conf.getBlockPosQuery("placeUnder", this.placeOn);
|
||||
this.replace = conf.getBlockPosQuery("replace", this.replace);
|
||||
this.scatterYMethod = conf.getEnum("scatterYMethod", this.scatterYMethod, GeneratorUtils.ScatterYMethod.class);
|
||||
|
||||
this.halfHeight = conf.getInt("halfHeight", this.halfHeight);
|
||||
this.maxRadius = conf.getInt("maxRadius", this.maxRadius);
|
||||
this.layerSize = conf.getInt("layerSize", this.layerSize);
|
||||
this.bottomExtra = conf.getInt("bottomExtra", this.bottomExtra);
|
||||
this.emptyChance = conf.getFloat("emptyChance", this.emptyChance);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue