Skip to content

Commit

Permalink
🔧 Redesign of overworld ore generation.
Browse files Browse the repository at this point in the history
Copper and Zinc now generate only once per every 16 or so chunks. Copper and Zinc cannot generate in the same chunk. Instead of generating standard ore veins, they generate ore deposit generators, which are renewable sources of copper/zinc. Though, without the debug mode, they appear exactly the same as their ore variants. 30% of ore deposits are worked out, providing a small room, and a possibility of a chest with custom loot, a workbench, and a furnace. Worked out ore veins have much less ore to start with. Ore deposits regenerate a single ore block each MC day. The Soil Sampling Kit will show the exclamation point particles when it finds an ore deposit generator block.
  • Loading branch information
elifoster committed Aug 30, 2016
1 parent 6b01f07 commit f798f60
Show file tree
Hide file tree
Showing 16 changed files with 512 additions and 41 deletions.
12 changes: 6 additions & 6 deletions src/main/java/eiteam/esteemedinnovation/EsteemedInnovation.java
Expand Up @@ -17,9 +17,9 @@
import eiteam.esteemedinnovation.entity.item.EntityMortarItem;
import eiteam.esteemedinnovation.entity.projectile.EntityRocket;
import eiteam.esteemedinnovation.gui.GuiHandler;
import eiteam.esteemedinnovation.handler.GenericEventHandler;
import eiteam.esteemedinnovation.handler.GenericTickHandler;
import eiteam.esteemedinnovation.handler.PhobicCoatingHandler;
import eiteam.esteemedinnovation.handler.GenericEventHandler;
import eiteam.esteemedinnovation.init.blocks.BlockCategories;
import eiteam.esteemedinnovation.init.blocks.SteamNetworkBlocks;
import eiteam.esteemedinnovation.init.items.ItemCategories;
Expand All @@ -32,9 +32,9 @@
import eiteam.esteemedinnovation.network.*;
import eiteam.esteemedinnovation.tile.*;
import eiteam.esteemedinnovation.world.ComponentSteamWorkshop;
import eiteam.esteemedinnovation.world.ExtraDimensionalOreGenerator;
import eiteam.esteemedinnovation.world.SteamWorkshopCreationHandler;
import eiteam.esteemedinnovation.world.OreGenerator;

import eiteam.esteemedinnovation.world.SurfaceOreGenerator;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
Expand Down Expand Up @@ -66,9 +66,8 @@
import net.minecraftforge.oredict.OreDictionary;
import net.minecraftforge.oredict.RecipeSorter;

import java.util.List;

import javax.swing.*;
import java.util.List;

@Mod(modid = EsteemedInnovation.MOD_ID, name = "Esteemed Innovation", version = Config.VERSION)
public class EsteemedInnovation {
Expand Down Expand Up @@ -142,7 +141,8 @@ public void preInit(FMLPreInitializationEvent event) {

upgrade = EnumHelper.addRarity("UPGRADE", TextFormatting.RED, "Upgrade");

GameRegistry.registerWorldGenerator(new OreGenerator(), 1);
GameRegistry.registerWorldGenerator(new ExtraDimensionalOreGenerator(), 1);
GameRegistry.registerWorldGenerator(new SurfaceOreGenerator(), 1);

channel = NetworkRegistry.INSTANCE.newSimpleChannel(MOD_ID + "Channel");
channel.registerMessage(CamoPacketHandler.class, CamoPacket.class, 0, Side.SERVER);
Expand Down
Expand Up @@ -18,6 +18,7 @@ public class BlockEngineeringTable extends BlockContainer {
public BlockEngineeringTable() {
super(Material.ROCK);
setHardness(3.5F);
setCreativeTab(EsteemedInnovation.tab);
}

@Override
Expand Down
@@ -1,5 +1,6 @@
package eiteam.esteemedinnovation.block;

import eiteam.esteemedinnovation.EsteemedInnovation;
import eiteam.esteemedinnovation.tile.TileEntityFunnel;

import net.minecraft.block.Block;
Expand All @@ -17,6 +18,7 @@ public class BlockFunnel extends Block {

public BlockFunnel() {
super(Material.ANVIL);
setCreativeTab(EsteemedInnovation.tab);
}

@Override
Expand Down
@@ -0,0 +1,144 @@
package eiteam.esteemedinnovation.block;

import eiteam.esteemedinnovation.init.blocks.OreBlocks;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.state.pattern.BlockMatcher;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

import java.util.Random;

import static eiteam.esteemedinnovation.block.BlockGenericOre.OreBlockTypes.OVERWORLD_COPPER;
import static eiteam.esteemedinnovation.block.BlockGenericOre.OreBlockTypes.OVERWORLD_ZINC;

public class BlockOreDepositGenerator extends Block {
public static final PropertyEnum<Types> VARIANT = PropertyEnum.create("variant", Types.class);
public static final PropertyBool WORKED_OUT = PropertyBool.create("worked_out");

public BlockOreDepositGenerator() {
super(Material.ROCK);
// Same values as BlockGenericOre.
setResistance(5F);
setHardness(3F);
setSoundType(SoundType.STONE);
setHarvestLevel("pickaxe", 1);
}

@Override
public BlockStateContainer createBlockState() {
return new BlockStateContainer(this, VARIANT, WORKED_OUT);
}

@Override
public int getMetaFromState(IBlockState state) {
// The variant occupies the first bit, the worked out value occupies the second bit.
int variant = state.getValue(VARIANT).ordinal();
int workedOut = (state.getValue(WORKED_OUT) ? 1 : 0) << 1;
return variant + workedOut;
}

@Override
public IBlockState getStateFromMeta(int meta) {
Types variant = Types.LOOKUP[meta & 1];
boolean workedOut = ((meta >> 1) & 1) == 1;
return getDefaultState().withProperty(VARIANT, variant).withProperty(WORKED_OUT, workedOut);
}

@Override
public int damageDropped(IBlockState state) {
return state.getValue(VARIANT).ordinal();
}

@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
return Item.getItemFromBlock(OreBlocks.Blocks.ORE_BLOCK);
}

@Override
public int tickRate(World world) {
// 20 minutes, the time in a single MC day.
return 24_000;
}

@Override
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
world.scheduleBlockUpdate(pos, this, tickRate(world), 0);
generateAdjacentOres(world, pos, false);
}

@Override
public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
world.scheduleBlockUpdate(pos, this, tickRate(world), 0);
generateAdjacentOres(world, pos, true);
}

/**
* Generates ores adjacent in all directions to this deposit generator.
* @param world The world
* @param center The center (deposit generator) position
* @param firstRun Whether this is the first time this is being generated. If this is not the first run, it will only
* generate if the adjacent block is air, and will return as soon as it generates a single ore.
* If it <b>is</b> the first run, then it will replace adjacent blocks if possible, and fill in all
* spaces adjacent to it.
*/
private void generateAdjacentOres(World world, BlockPos center, boolean firstRun) {
IBlockState oreState = getOreState(world, center);
boolean workedOut = world.getBlockState(center).getValue(WORKED_OUT);
for (EnumFacing dir : EnumFacing.VALUES) {
if (firstRun && workedOut && world.rand.nextBoolean()) {
continue;
}
BlockPos adjacent = center.offset(dir);
boolean place = firstRun ? canReplace(adjacent, world) : world.isAirBlock(adjacent);
if (place) {
world.setBlockState(adjacent, oreState);
if (!firstRun) {
return;
}
}
}
}

public static boolean canReplace(BlockPos replacePos, World world) {
IBlockState replaceState = world.getBlockState(replacePos);
return replaceState.getBlock().isReplaceableOreGen(replaceState, world, replacePos, BlockMatcher.forBlock(Blocks.STONE)) ||
world.isAirBlock(replacePos);
}

private IBlockState getOreState(World world, BlockPos center) {
return getOreState(world.getBlockState(center));
}

private IBlockState getOreState(IBlockState depositState) {
return OreBlocks.Blocks.ORE_BLOCK.getDefaultState().withProperty(BlockGenericOre.VARIANT,
depositState.getValue(VARIANT) == Types.COPPER ? OVERWORLD_COPPER : OVERWORLD_ZINC);
}

public enum Types implements IStringSerializable {
COPPER,
ZINC;

public static Types[] LOOKUP = new Types[values().length];

static {
for (Types type : values()) {
LOOKUP[type.ordinal()] = type;
}
}

@Override
public String getName() {
return toString().toLowerCase();
}
}
}
Expand Up @@ -182,6 +182,12 @@ public void registerModels() {
registerModel(MiscellaneousBlocks.Blocks.ENGINEERING_TABLE.getBlock());
registerModel(MiscellaneousBlocks.Blocks.FUNNEL.getBlock());

for (int i = 0; i < 4; i++) {
String variant = "variant=" + (i % 2 == 0 ? "copper" : "zinc");
variant += ",worked_out=" + (i > 1 ? "true" : "false");
registerModel(MiscellaneousBlocks.Blocks.ORE_DEPOSIT_BLOCK.getBlock(), i, variant);
}

registerModel(CastingBlocks.Blocks.CRUCIBLE.getBlock());
registerModel(CastingBlocks.Blocks.NETHER_CRUCIBLE.getBlock());
registerModel(CastingBlocks.Blocks.CARVING_TABLE.getBlock());
Expand Down
Expand Up @@ -5,9 +5,10 @@
import eiteam.esteemedinnovation.api.book.BookRecipeRegistry;
import eiteam.esteemedinnovation.block.BlockEngineeringTable;
import eiteam.esteemedinnovation.block.BlockFunnel;
import eiteam.esteemedinnovation.block.BlockOreDepositGenerator;
import eiteam.esteemedinnovation.init.IInitCategory;
import eiteam.esteemedinnovation.init.misc.OreDictEntries;

import eiteam.esteemedinnovation.item.BlockManyMetadataItem;
import net.minecraft.block.Block;
import net.minecraft.init.Items;
import net.minecraft.item.ItemBlock;
Expand All @@ -17,7 +18,8 @@
public class MiscellaneousBlocks implements IInitCategory {
public enum Blocks {
ENGINEERING_TABLE(new BlockEngineeringTable(), "engineering"),
FUNNEL(new BlockFunnel(), "funnel");
FUNNEL(new BlockFunnel(), "funnel"),
ORE_DEPOSIT_BLOCK(new BlockOreDepositGenerator(), true, "ore_deposit_generator");

public static Blocks[] LOOKUP = new Blocks[values().length];

Expand All @@ -31,12 +33,20 @@ public enum Blocks {

private Block block;

Blocks(Block block, boolean meta, String name) {
this(block, new BlockManyMetadataItem(block), name);
}

Blocks(Block block, String name) {
block.setCreativeTab(EsteemedInnovation.tab);
this(block, new ItemBlock(block), name);
}

// You probably won't actually be able to use this one since ItemBlock constructors take the Block.
Blocks(Block block, ItemBlock itemBlock, String name) {
block.setUnlocalizedName(EsteemedInnovation.MOD_ID + ":" + name);
block.setRegistryName(EsteemedInnovation.MOD_ID, name);
GameRegistry.register(block);
GameRegistry.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
GameRegistry.register(itemBlock.setRegistryName(block.getRegistryName()));
this.block = block;
}

Expand All @@ -48,6 +58,9 @@ public boolean isEnabled() {
case FUNNEL: {
return Config.enableFunnel;
}
case ORE_DEPOSIT_BLOCK: {
return true;
}
}
return false;
}
Expand Down Expand Up @@ -86,6 +99,9 @@ public void recipes() {
));
break;
}
case ORE_DEPOSIT_BLOCK: {
break;
}
}
}
}
Expand Down
@@ -0,0 +1,29 @@
package eiteam.esteemedinnovation.init.misc;

import eiteam.esteemedinnovation.EsteemedInnovation;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;

public class LootTablesCategory extends MiscellaneousCategory {
public enum LootTables {
WORKED_OUT_ORE_DEPOSIT_TABLE("worked_out_ore_deposit");

private ResourceLocation loc;

LootTables(String name) {
loc = new ResourceLocation(EsteemedInnovation.MOD_ID, name);
}

public ResourceLocation getResource() {
return loc;
}
}

@Override
public void init(FMLInitializationEvent event) {
for (LootTables table : LootTables.values()) {
LootTableList.register(table.getResource());
}
}
}
Expand Up @@ -6,6 +6,7 @@

public enum MiscellaneousCategories {
DEFAULT_CRUCIBLE_LIQUIDS(new DefaultCrucibleLiquids()),
LOOT_TABLES(new LootTablesCategory()),
TINKERS_INTEGRATION(new TinkersIntegration()),
CRAFTTWEAKER_INTEGRATION(new CraftTweakerIntegration());

Expand All @@ -24,6 +25,9 @@ public boolean isEnabled() {
case DEFAULT_CRUCIBLE_LIQUIDS: {
return true;
}
case LOOT_TABLES: {
return true;
}
case TINKERS_INTEGRATION: {
return CrossMod.CRAFTTWEAKER;
}
Expand Down

0 comments on commit f798f60

Please sign in to comment.