Implement lost of functions to easily support new tree types

This commit is contained in:
Matthias Schiffer 2014-05-26 02:09:34 +02:00
parent bac5de2220
commit e32c4228aa
5 changed files with 319 additions and 27 deletions

View file

@ -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();
} }
} }

View file

@ -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");
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}
}

View file

@ -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