Implement lost of functions to easily support new tree types
This commit is contained in:
parent
bac5de2220
commit
e32c4228aa
5 changed files with 319 additions and 27 deletions
|
@ -10,7 +10,7 @@ import cpw.mods.fml.common.event.FMLInitializationEvent;
|
||||||
import cpw.mods.fml.common.registry.GameRegistry;
|
import cpw.mods.fml.common.registry.GameRegistry;
|
||||||
import cpw.mods.fml.common.registry.LanguageRegistry;
|
import cpw.mods.fml.common.registry.LanguageRegistry;
|
||||||
import net.universe_factory.minecraft.test.blocks.*;
|
import net.universe_factory.minecraft.test.blocks.*;
|
||||||
import net.universe_factory.minecraft.test.recipes.RecipesWoodTest;
|
import net.universe_factory.minecraft.test.generic.GenericWood;
|
||||||
|
|
||||||
|
|
||||||
@Mod(modid = Test.MODID, version = Test.VERSION)
|
@Mod(modid = Test.MODID, version = Test.VERSION)
|
||||||
|
@ -18,15 +18,22 @@ public class Test {
|
||||||
public static final String MODID = "neoraider_test";
|
public static final String MODID = "neoraider_test";
|
||||||
public static final String VERSION = "1";
|
public static final String VERSION = "1";
|
||||||
|
|
||||||
public static final Block blockWoodTest = new BlockWoodTest();
|
public static final GenericWood cherry = new GenericWood(new GenericWood.Info() {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Cherry";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMinTreeHeight() {
|
||||||
|
return 4;
|
||||||
|
}});
|
||||||
|
|
||||||
@Instance(value = MODID)
|
@Instance(value = MODID)
|
||||||
public static Test instance;
|
public static Test instance;
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void init(FMLInitializationEvent event) {
|
public void init(FMLInitializationEvent event) {
|
||||||
GameRegistry.registerBlock(blockWoodTest, "blockWoodTest");
|
cherry.register();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
package net.universe_factory.minecraft.test.blocks;
|
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
|
||||||
import net.minecraft.block.material.Material;
|
|
||||||
import net.minecraft.creativetab.CreativeTabs;
|
|
||||||
import net.universe_factory.minecraft.test.Test;
|
|
||||||
|
|
||||||
public class BlockWoodTest extends Block {
|
|
||||||
public BlockWoodTest() {
|
|
||||||
super(Material.wood);
|
|
||||||
|
|
||||||
setHardness(2.0f);
|
|
||||||
setResistance(5.0f);
|
|
||||||
setStepSound(Block.soundTypeWood);
|
|
||||||
setBlockName("woodTest");
|
|
||||||
setCreativeTab(CreativeTabs.tabBlock);
|
|
||||||
setHarvestLevel("axe", 0);
|
|
||||||
|
|
||||||
setBlockTextureName(Test.MODID + ":planks_test");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,188 @@
|
||||||
|
package net.universe_factory.minecraft.test.generic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import cpw.mods.fml.common.registry.GameRegistry;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockLeaves;
|
||||||
|
import net.minecraft.block.BlockLog;
|
||||||
|
import net.minecraft.block.BlockSapling;
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||||
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.IIcon;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenBigTree;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenTrees;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenerator;
|
||||||
|
import net.minecraftforge.event.terraingen.TerrainGen;
|
||||||
|
import net.universe_factory.minecraft.test.Test;
|
||||||
|
|
||||||
|
public class GenericWood {
|
||||||
|
public final Info info;
|
||||||
|
|
||||||
|
public final Block planks;
|
||||||
|
public final Block log;
|
||||||
|
public final BlockLeaves leaves;
|
||||||
|
public final BlockSapling sapling;
|
||||||
|
|
||||||
|
public GenericWood(Info info) {
|
||||||
|
this.info = info;
|
||||||
|
|
||||||
|
planks = new Planks();
|
||||||
|
log = new Log();
|
||||||
|
leaves = new Leaves();
|
||||||
|
sapling = new Sapling();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void register() {
|
||||||
|
GameRegistry.registerBlock(planks, "blockWood" + info.getName());
|
||||||
|
GameRegistry.registerBlock(log, "blockLog" + info.getName());
|
||||||
|
GameRegistry.registerBlock(leaves, "blockLeaves" + info.getName());
|
||||||
|
GameRegistry.registerBlock(sapling, "blockSapling" + info.getName());
|
||||||
|
|
||||||
|
GameRegistry.addRecipe(new ItemStack(planks, 4, 0), "#", '#', log);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Planks extends Block {
|
||||||
|
public Planks() {
|
||||||
|
super(Material.wood);
|
||||||
|
|
||||||
|
setHardness(2.0f);
|
||||||
|
setResistance(5.0f);
|
||||||
|
setStepSound(Block.soundTypeWood);
|
||||||
|
setBlockName("wood" + info.getName());
|
||||||
|
setCreativeTab(CreativeTabs.tabBlock);
|
||||||
|
setHarvestLevel("axe", 0);
|
||||||
|
|
||||||
|
setBlockTextureName(Test.MODID + ":planks_" + info.getName().toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Log extends BlockLog {
|
||||||
|
private IIcon sideIcon;
|
||||||
|
private IIcon topIcon;
|
||||||
|
|
||||||
|
public Log() {
|
||||||
|
setBlockName("log" + info.getName());
|
||||||
|
setHarvestLevel("axe", 0);
|
||||||
|
|
||||||
|
setBlockTextureName(Test.MODID + ":log");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public void registerBlockIcons(IIconRegister iconRegister) {
|
||||||
|
sideIcon = iconRegister.registerIcon(this.getTextureName() + "_" + info.getName().toLowerCase());
|
||||||
|
topIcon = iconRegister.registerIcon(this.getTextureName() + "_" + info.getName().toLowerCase() + "_top");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
protected IIcon getSideIcon(int meta) {
|
||||||
|
return sideIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
protected IIcon getTopIcon(int meta) {
|
||||||
|
return topIcon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Leaves extends BlockLeaves {
|
||||||
|
private String[] nameArray = new String[] { info.getName() };
|
||||||
|
private IIcon icon;
|
||||||
|
private IIcon iconOpaque;
|
||||||
|
|
||||||
|
public Leaves() {
|
||||||
|
setBlockName("leaves" + info.getName());
|
||||||
|
|
||||||
|
setBlockTextureName(Test.MODID + ":leaves");
|
||||||
|
|
||||||
|
setGraphicsLevel(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public void registerBlockIcons(IIconRegister iconRegister) {
|
||||||
|
icon = iconRegister.registerIcon(this.getTextureName() + "_" + info.getName().toLowerCase());
|
||||||
|
iconOpaque = iconRegister.registerIcon(this.getTextureName() + "_" + info.getName().toLowerCase() + "_opaque");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public IIcon getIcon(int side, int meta) {
|
||||||
|
return (field_150127_b == 0) ? icon : iconOpaque;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] func_150125_e() {
|
||||||
|
return nameArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int quantityDropped(Random random) {
|
||||||
|
return random.nextInt(20) == 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) {
|
||||||
|
return Item.getItemFromBlock(sapling);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Sapling extends BlockSapling {
|
||||||
|
public Sapling() {
|
||||||
|
setBlockName("sapling" + info.getName());
|
||||||
|
|
||||||
|
setHardness(0.0f);
|
||||||
|
setStepSound(soundTypeGrass);
|
||||||
|
|
||||||
|
setBlockTextureName(Test.MODID + ":sapling_" + info.getName().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public void registerBlockIcons(IIconRegister iconRegister) {
|
||||||
|
blockIcon = iconRegister.registerIcon(this.getTextureName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public IIcon getIcon(int side, int meta) {
|
||||||
|
return blockIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public void getSubBlocks(Item item, CreativeTabs tabs, List list) {
|
||||||
|
list.add(new ItemStack(item, 1, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Grows the tree */
|
||||||
|
@Override
|
||||||
|
public void func_149878_d(World world, int x, int y, int z, Random random) {
|
||||||
|
if (!TerrainGen.saplingGrowTree(world, random, x, y, z))
|
||||||
|
return;
|
||||||
|
|
||||||
|
WorldGenerator generator = new WorldGenGenericTrees(true, GenericWood.this);
|
||||||
|
|
||||||
|
world.setBlock(x, y, z, Blocks.air, 0, 4);
|
||||||
|
|
||||||
|
if (!generator.generate(world, random, x, y, z))
|
||||||
|
world.setBlock(x, y, z, this, 0, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static abstract class Info {
|
||||||
|
public abstract String getName();
|
||||||
|
public abstract int getMinTreeHeight();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
package net.universe_factory.minecraft.test.generic;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockSapling;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.util.Direction;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenerator;
|
||||||
|
import net.minecraftforge.common.IPlantable;
|
||||||
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
|
||||||
|
public class WorldGenGenericTrees extends WorldGenAbstractTree {
|
||||||
|
private final GenericWood genericWood;
|
||||||
|
|
||||||
|
public WorldGenGenericTrees(boolean b, GenericWood genericWood) {
|
||||||
|
super(b);
|
||||||
|
|
||||||
|
this.genericWood = genericWood;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean generate(World world, Random random, int x, int y, int z) {
|
||||||
|
int height = random.nextInt(3) + genericWood.info.getMinTreeHeight();
|
||||||
|
boolean flag = true;
|
||||||
|
|
||||||
|
if (y >= 1 && y + height + 1 <= 256) {
|
||||||
|
byte b0;
|
||||||
|
int k1;
|
||||||
|
Block block;
|
||||||
|
|
||||||
|
for (int i1 = y; i1 <= y + 1 + height; ++i1) {
|
||||||
|
b0 = 1;
|
||||||
|
|
||||||
|
if (i1 == y) {
|
||||||
|
b0 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i1 >= y + 1 + height - 2) {
|
||||||
|
b0 = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j1 = x - b0; j1 <= x + b0 && flag; ++j1) {
|
||||||
|
for (k1 = z - b0; k1 <= z + b0 && flag; ++k1) {
|
||||||
|
if (i1 >= 0 && i1 < 256) {
|
||||||
|
block = world.getBlock(j1, i1, k1);
|
||||||
|
|
||||||
|
if (!this.isReplaceable(world, j1, i1, k1)) {
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
flag = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!flag) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Block block2 = world.getBlock(x, y - 1, z);
|
||||||
|
|
||||||
|
boolean isSoil = block2.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, genericWood.sapling);
|
||||||
|
if (isSoil && y < 256 - height - 1) {
|
||||||
|
block2.onPlantGrow(world, x, y - 1, z, x, y, z);
|
||||||
|
b0 = 3;
|
||||||
|
byte b1 = 0;
|
||||||
|
int l1;
|
||||||
|
int i2;
|
||||||
|
int j2;
|
||||||
|
int i3;
|
||||||
|
|
||||||
|
for (k1 = y - b0 + height; k1 <= y + height; ++k1) {
|
||||||
|
i3 = k1 - (y + height);
|
||||||
|
l1 = b1 + 1 - i3 / 2;
|
||||||
|
|
||||||
|
for (i2 = x - l1; i2 <= x + l1; ++i2) {
|
||||||
|
j2 = i2 - x;
|
||||||
|
|
||||||
|
for (int k2 = z - l1; k2 <= z + l1; ++k2) {
|
||||||
|
int l2 = k2 - z;
|
||||||
|
|
||||||
|
if (Math.abs(j2) != l1 || Math.abs(l2) != l1 || random.nextInt(2) != 0 && i3 != 0) {
|
||||||
|
Block block1 = world.getBlock(i2, k1, k2);
|
||||||
|
|
||||||
|
if (block1.isAir(world, i2, k1, k2) || block1.isLeaves(world, i2, k1, k2)) {
|
||||||
|
this.setBlockAndNotifyAdequately(world, i2, k1, k2, genericWood.leaves, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (k1 = 0; k1 < height; ++k1) {
|
||||||
|
block = world.getBlock(x, y + k1, z);
|
||||||
|
|
||||||
|
if (block.isAir(world, x, y + k1, z) || block.isLeaves(world, x, y + k1, z)) {
|
||||||
|
this.setBlockAndNotifyAdequately(world, x, y + k1, z, genericWood.log, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1 +1,4 @@
|
||||||
tile.woodTest.name=Test Wood
|
tile.woodCherry.name=Cherry Tree Wood Planks
|
||||||
|
tile.logCherry.name=Cherry Tree Wood
|
||||||
|
tile.leavesCherry.name=Cherry Tree Leaves
|
||||||
|
tile.saplingCherry.name=Cherry Tree Sapling
|
Reference in a new issue