Compare commits

...

13 Commits

Author SHA1 Message Date
Adubbz 22d4dd29b3 Fixed a crash with BlockBOPGrass 2016-04-10 10:55:01 +10:00
Adubbz 2e3e12276b Backported mangrove, palm and big tree changes from 1.9 2016-04-07 17:31:06 +10:00
Adubbz 99cbcc9d94 Prevent saplings from dropping if their item is null. See #731 2016-04-04 09:50:01 +10:00
Adubbz 8c2169b8c4 Registered buckets as fluid containers. Closes #707 2016-03-19 12:54:22 +11:00
Forstride 9a01eaf180 Update README.md 2016-03-16 01:24:29 -04:00
Forstride 7a4ac7b188 Update README.md 2016-03-16 01:24:03 -04:00
Forstride 88a0a1f031 Update README.md 2016-03-16 01:18:24 -04:00
Forstride db63a91898 Update README.md 2016-03-15 14:11:31 -04:00
Adubbz 887d715c61 Fixed a dupe bug with TC and NeoTech. Closes #704, #698 2016-03-05 11:33:12 +11:00
Adubbz 21af6c9fad Merge pull request #703 from 7934345/BOP-1.8.9-3.0.x
Update zh_CN.lang
2016-03-03 20:39:42 +11:00
Jack Martin 73473315a3 Update zh_CN.lang
update some value with funny wolds.
2016-03-03 17:22:43 +08:00
Adubbz 243321ebea Merge pull request #702 from 7934345/BOP-1.8.9-3.0.x
Update zh_CN.lang
2016-03-03 20:01:43 +11:00
Jack Martin 6b5ff6d2ff Update zh_CN.lang
update Chinese translation to lasted 1.8.9 version
add new keys and remove useless keys
modify values that with wrong translation(not final version)

更新中文词条
添加了新词条/删除了废弃的词条
另外更新了部分翻译不妥的词条(依然有问题词条存在)
2016-03-03 16:56:14 +08:00
15 changed files with 936 additions and 218 deletions

View File

@ -17,3 +17,9 @@ Also, if you want to **disable or add certain world generation features** in cer
[<img src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png">](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US)
Biomes O' Plenty is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivs 4.0 Unported License](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US).
-----------------
We've partnered with **CreeperHost**, and will be launching an **official Glitchfiend server** soon, with all of our mods installed. It won't be happening until they're updated to 1.9, but feel free to use this **promo code** when ordering a server of your own!
<p align="center"><img src="http://i.imgur.com/rjmyjrV.png"></p>

View File

@ -1,4 +1,4 @@
minecraft_version=1.8.9
forge_version=11.15.1.1726
forge_version=11.15.1.1755
mod_version=3.0.0
mappings_version=snapshot_nodoc_20160104

View File

@ -89,6 +89,7 @@ public class BOPBiomes
public static Optional<BiomeGenBase> volcanic_island = Optional.absent();
public static Optional<BiomeGenBase> flower_island = Optional.absent();
public static Optional<BiomeGenBase> gravel_beach = Optional.absent();
public static Optional<BiomeGenBase> mangrove = Optional.absent();
//Biome extensions
public static IExtendedBiome end_extension;

View File

@ -0,0 +1,125 @@
/*******************************************************************************
* Copyright 2015-2016, 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.overworld;
import java.util.Random;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.chunk.ChunkPrimer;
import biomesoplenty.api.biome.BOPBiome;
import biomesoplenty.api.biome.generation.GeneratorStage;
import biomesoplenty.api.biome.generation.GeneratorWeighted;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.block.BlockBOPSand;
import biomesoplenty.common.enums.BOPGems;
import biomesoplenty.common.enums.BOPTrees;
import biomesoplenty.common.enums.BOPWoods;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import biomesoplenty.common.world.BOPWorldSettings;
import biomesoplenty.common.world.feature.GeneratorLakes;
import biomesoplenty.common.world.feature.GeneratorOreSingle;
import biomesoplenty.common.world.feature.tree.GeneratorMangroveTree;
public class BiomeGenMangrove extends BOPBiome
{
public IBlockState usualTopBlock;
public IBlockState alternateTopBlock;
public BiomeGenMangrove()
{
this.setColor(7251289);
this.setTemperatureRainfall(0.8F, 0.3F);
this.waterColorMultiplier = 0xCDFF51;
// terrain
this.terrainSettings.avgHeight(62).heightVariation(2, 4).octaves(0, 1, 2, 2, 1, 0);
this.seaFloorBlock = BOPBlocks.mud.getDefaultState();
this.topBlock = BOPBlocks.mud.getDefaultState();
this.fillerBlock = BOPBlocks.mud.getDefaultState();
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = Blocks.sand.getDefaultState();
this.canSpawnInBiome = false;
this.canGenerateVillages = false;
this.canGenerateRivers = false;
this.spawnableCreatureList.clear();
this.beachBiomeId = -1;
clearWeights();
// quicksand
this.addGenerator("quicksand", GeneratorStage.SAND, (new GeneratorLakes.Builder()).amountPerChunk(0.2F).waterLakeForBiome(this).liquid(BOPBlocks.sand.getDefaultState().withProperty(BlockBOPSand.VARIANT, BlockBOPSand.SandType.QUICKSAND)).frozenLiquid((IBlockState)null).create());
// trees & logs
IBlockPosQuery emptySandMud = BlockQuery.buildAnd().states(this.usualTopBlock).create();
GeneratorWeighted treeGenerator = new GeneratorWeighted(7);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("mangrove", 1, (new GeneratorMangroveTree.Builder()).placeOn(emptySandMud).log(BOPWoods.MANGROVE).leaves(BOPTrees.MANGROVE).create());
// gem
this.addGenerator("sapphire", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(BOPGems.SAPPHIRE).create());
}
@Override
public void configure(IConfigObj conf)
{
super.configure(conf);
this.usualTopBlock = this.topBlock;
this.alternateTopBlock = conf.getBlockState("alternateTopBlock", this.alternateTopBlock);
}
@Override
public void genTerrainBlocks(World world, Random rand, ChunkPrimer primer, int x, int z, double noise)
{
double d0 = GRASS_COLOR_NOISE.func_151601_a((double)x * 0.25D, (double)z * 0.25D);
if (d0 > 0.0D)
{
int i = x & 15;
int j = z & 15;
for (int k = 255; k >= 0; --k)
{
if (primer.getBlockState(j, k, i).getBlock().getMaterial() != Material.air)
{
if (k == 62 && primer.getBlockState(j, k, i).getBlock() != Blocks.water)
{
primer.setBlockState(j, k, i, Blocks.water.getDefaultState());
}
break;
}
}
}
this.topBlock = (noise + rand.nextDouble() * 1.0D > 1.8D) ? this.alternateTopBlock : this.usualTopBlock;
this.generateBiomeTerrain(world, rand, primer, x, z, noise);
}
@Override
public void applySettings(BOPWorldSettings settings)
{
if (!settings.generateBopGems) {this.removeGenerator("sapphire");}
if (!settings.generateBopFoliage) {this.removeGenerator("bushes"); this.removeGenerator("koru"); this.removeGenerator("shrubs"); this.removeGenerator("leaf_piles"); this.removeGenerator("dead_leaf_piles"); this.removeGenerator("clover_patches"); this.removeGenerator("sprouts");}
if (!settings.generateBopPlants) {this.removeGenerator("cattail"); this.removeGenerator("double_cattail"); this.removeGenerator("river_cane"); this.removeGenerator("tiny_cacti"); this.removeGenerator("roots"); this.removeGenerator("rafflesia"); this.removeGenerator("desert_sprouts");}
}
}

View File

@ -160,7 +160,7 @@ public class BlockBOPGrass extends BlockGrass implements IBOPBlock, ISustainsPla
@Override
public boolean canSustainPlant(IBlockAccess world, BlockPos pos, EnumFacing direction, net.minecraftforge.common.IPlantable plantable)
{
return this.canSustainPlantType(world, pos, plantable.getPlantType(world, pos.offset(direction)));
return this.canSustainPlantType(world, pos, plantable.getPlantType(world, pos));
}
@ -541,4 +541,4 @@ public class BlockBOPGrass extends BlockGrass implements IBOPBlock, ISustainsPla
}
}

View File

@ -11,6 +11,8 @@ package biomesoplenty.common.block;
import java.util.List;
import java.util.Random;
import com.google.common.collect.Lists;
import net.minecraft.block.BlockLeaves;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.properties.IProperty;
@ -237,6 +239,20 @@ public class BlockBOPLeaves extends BlockLeaves implements IBOPBlock
return treeType.hasSapling() ? BlockBOPSapling.paging.getVariantItem(treeType).getItemDamage() : 0;
}
@Override
public java.util.List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
{
BOPTrees treeType = ((BOPTrees) state.getValue(this.variantProperty));
if (treeType.hasSapling())
{
return super.getDrops(world, pos, state, fortune);
}
//Tree types without saplings shouldn't drop apples either
return Lists.newArrayList();
}
// TODO: different fruits for different trees?
@Override
protected void dropApple(World worldIn, BlockPos pos, IBlockState state, int chance)

View File

@ -22,6 +22,8 @@ import biomesoplenty.common.world.feature.tree.GeneratorBayouTree;
import biomesoplenty.common.world.feature.tree.GeneratorBigTree;
import biomesoplenty.common.world.feature.tree.GeneratorBulbTree;
import biomesoplenty.common.world.feature.tree.GeneratorMahoganyTree;
import biomesoplenty.common.world.feature.tree.GeneratorMangroveTree;
import biomesoplenty.common.world.feature.tree.GeneratorPalmTree;
import biomesoplenty.common.world.feature.tree.GeneratorPineTree;
import biomesoplenty.common.world.feature.tree.GeneratorRedwoodTree;
import biomesoplenty.common.world.feature.tree.GeneratorTaigaTree;
@ -192,10 +194,10 @@ public class BlockBOPSapling extends BlockBOPDecoration implements IGrowable {
return new GeneratorBasicTree.Builder().minHeight(4).maxHeight(7).log(BOPWoods.JACARANDA).leaves(BOPTrees.JACARANDA).create();
case SACRED_OAK:
return new GeneratorBigTree.Builder().log(BOPWoods.SACRED_OAK).leaves(BOPTrees.SACRED_OAK).minHeight(35).maxHeight(45).trunkWidth(2).foliageDensity(1.25D).create();
case MANGROVE: //Not implemented
return new WorldGenTrees(true);
case PALM: //Not implemented
return new WorldGenTrees(true);
case MANGROVE:
return new GeneratorMangroveTree.Builder().log(BOPWoods.MANGROVE).leaves(BOPTrees.MANGROVE).create();
case PALM:
return new GeneratorPalmTree.Builder().log(BOPWoods.PALM).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.PALM).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false))).create();
case REDWOOD:
return new GeneratorRedwoodTree.Builder().create();
case WILLOW:

View File

@ -179,13 +179,18 @@ public class AchievementEventHandler
{
Item item = stack.getItem();
Block block = Block.getBlockFromItem(item);
IBlockState state = block != null ? block.getStateFromMeta(stack.getItemDamage()) : null;
//Yggdrasil
if (state == BlockBOPSapling.paging.getVariantState(BOPTrees.SACRED_OAK))
try
{
event.player.triggerAchievement(BOPAchievements.grow_sacred_oak);
IBlockState state = block != null ? block.getStateFromMeta(item.getMetadata(stack.getItemDamage())) : null;
//Yggdrasil
if (state == BlockBOPSapling.paging.getVariantState(BOPTrees.SACRED_OAK))
{
event.player.triggerAchievement(BOPAchievements.grow_sacred_oak);
}
}
catch(Exception e) {} //Fail quietly if there's a problem matching metadata to a block state
}
}

View File

@ -54,6 +54,7 @@ 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;
@ -148,6 +149,7 @@ import biomesoplenty.common.biome.overworld.BiomeGenLandOfLakes;
import biomesoplenty.common.biome.overworld.BiomeGenLavenderFields;
import biomesoplenty.common.biome.overworld.BiomeGenLushDesert;
import biomesoplenty.common.biome.overworld.BiomeGenLushSwamp;
import biomesoplenty.common.biome.overworld.BiomeGenMangrove;
import biomesoplenty.common.biome.overworld.BiomeGenMapleWoods;
import biomesoplenty.common.biome.overworld.BiomeGenMarsh;
import biomesoplenty.common.biome.overworld.BiomeGenMeadow;
@ -430,6 +432,7 @@ public class ModBiomes implements BOPBiomes.IBiomeRegistry
// island biomes
mangrove = registerBOPBiome(new BiomeGenMangrove(), "Mangrove");
origin_island = registerBOPBiome(new BiomeGenOriginIsland(), "Origin Island");
tropical_island = registerBOPBiome(new BiomeGenTropicalIsland(), "Tropical Island");
volcanic_island = registerBOPBiome(new BiomeGenVolcanicIsland(), "Volcanic Island");
@ -439,6 +442,7 @@ public class ModBiomes implements BOPBiomes.IBiomeRegistry
addIslandBiome(tropical_island, 3);
addIslandBiome(volcanic_island, 5);
addIslandBiome(flower_island, 7);
addIslandBiome(mangrove, 10);
}
public static void initExtendedBiomes()

View File

@ -27,9 +27,11 @@ import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemBucket;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemSlab;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.EnumPlantType;
import net.minecraftforge.fluids.BlockFluidBase;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;
import biomesoplenty.api.block.IBOPBlock;
@ -266,6 +268,10 @@ public class ModBlocks
poison_bucket = ModItems.registerItem((new ItemBucket(poison)).setContainerItem(Items.bucket), "poison_bucket");
hot_spring_water_bucket = ModItems.registerItem((new ItemBucket(hot_spring_water)).setContainerItem(Items.bucket), "hot_spring_water_bucket");
FluidContainerRegistry.registerFluidContainer(honey_fluid, new ItemStack(honey_bucket));
FluidContainerRegistry.registerFluidContainer(blood_fluid, new ItemStack(blood_bucket));
FluidContainerRegistry.registerFluidContainer(poison_fluid, new ItemStack(poison_bucket));
FluidContainerRegistry.registerFluidContainer(hot_spring_water_fluid, new ItemStack(hot_spring_water_bucket));
}

View File

@ -28,6 +28,7 @@ public class ModGenerators
registerGenerator("bulb_tree", GeneratorBulbTree.class, new GeneratorBulbTree.Builder());
registerGenerator("mega_jungle_tree", GeneratorMegaJungleTree.class, new GeneratorMegaJungleTree.Builder());
registerGenerator("bayou_tree", GeneratorBayouTree.class, new GeneratorBayouTree.Builder());
registerGenerator("mangrove_tree", GeneratorMangroveTree.class, new GeneratorMangroveTree.Builder());
registerGenerator("taiga_tree", GeneratorTaigaTree.class, new GeneratorTaigaTree.Builder());
registerGenerator("profile_tree", GeneratorProfileTree.class, new GeneratorProfileTree.Builder());
registerGenerator("flora", GeneratorFlora.class, new GeneratorFlora.Builder());
@ -47,5 +48,6 @@ public class ModGenerators
registerGenerator("spike", GeneratorSpike.class, new GeneratorSpike.Builder());
registerGenerator("redwood_tree", GeneratorRedwoodTree.class, new GeneratorRedwoodTree.Builder());
registerGenerator("mahogany_tree", GeneratorMahoganyTree.class, new GeneratorMahoganyTree.Builder());
registerGenerator("palm_tree", GeneratorPalmTree.class, new GeneratorPalmTree.Builder());
}
}

View File

@ -13,6 +13,14 @@ import java.util.Random;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Lists;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryMaterial;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import net.minecraft.block.BlockLeaves;
import net.minecraft.block.BlockLog;
import net.minecraft.block.BlockSapling;
import net.minecraft.block.material.Material;
@ -22,13 +30,6 @@ import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryMaterial;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import com.google.common.collect.Lists;
/*This class is heavily based on https://gist.github.com/grum/62cfdec0537e8db24eb3#file-bigtreefeature-java
additional information has been added from http://pastebin.com/XBLdGqXQ. This class has been cross-checked
@ -246,18 +247,10 @@ public class GeneratorBigTree extends GeneratorTreeBase
//The following has been replaced as recommended by
//http://www.reddit.com/r/Minecraft/comments/1m97cw/while_you_are_all_crying_over_the_name_change_of/ccfgc3k
//The change should fix the decaying leaves
/*else if (y == 0 || y == foliageHeight - 1)
else if (y == 0 || y == foliageHeight - 1)
{
return 2f;
}*/
else if (y == 0 || y == foliageHeight - 2)
{
return 2f;
}
else if (y == foliageHeight - 1)
{
return 1.5f;
}
}
else
{
return 3f;
@ -286,11 +279,11 @@ public class GeneratorBigTree extends GeneratorTreeBase
clusterLeaves = this.leaves;
}
crossection(blockPos.up(y), foliageShape(y), clusterLeaves);
crossection(blockPos.up(y), foliageShape(y), clusterLeaves.withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)));
}
else
{
crossection(blockPos.up(y), foliageShape(y), this.leaves);
crossection(blockPos.up(y), foliageShape(y), this.leaves.withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)));
}
}
}
@ -588,4 +581,4 @@ public class GeneratorBigTree extends GeneratorTreeBase
this.leaves = conf.getBlockState("leavesState", this.leaves);
}
}
}

View File

@ -0,0 +1,294 @@
/*******************************************************************************
* Copyright 2015-2016, 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.feature.tree;
import java.util.Random;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryBlock;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryParseException;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryState;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
public class GeneratorMangroveTree extends GeneratorTreeBase
{
public static class Builder extends GeneratorTreeBase.InnerBuilder<Builder, GeneratorMangroveTree> implements IGeneratorBuilder<GeneratorMangroveTree>
{
protected int minLeavesRadius;
protected int leavesGradient;
protected int vineAttempts;
protected int maxVineLength;
protected IBlockPosQuery rootsReplace;
public Builder minLeavesRadius(int a) {this.minLeavesRadius = a; return this.self();}
public Builder leavesGradient(int a) {this.leavesGradient = a; return this.self();}
public Builder vineAttempts(int a) {this.vineAttempts = a; return this.self();}
public Builder maxVineLength(int a) {this.maxVineLength = a; return this.self();}
public Builder rootsReplace(IBlockPosQuery a) {this.replace = a; return this.self();}
public Builder rootsReplace(String a) throws BlockQueryParseException {this.replace = BlockQuery.parseQueryString(a); return this.self();}
public Builder rootsReplace(Block a) {this.replace = new BlockQueryBlock(a); return this.self();}
public Builder rootsReplace(IBlockState a) {this.replace = new BlockQueryState(a); return this.self();}
public Builder()
{
// defaults
this.amountPerChunk = 1.0F;
this.placeOn = BlockQueries.fertile;
this.replace = BlockQueries.airOrLeaves;
this.rootsReplace = BlockQueries.rootsCanDigThrough;
this.log = Blocks.log.getDefaultState();
this.leaves = Blocks.leaves.getDefaultState();
this.vine = null;
this.hanging = null;
this.altLeaves = null;
this.minHeight = 8;
this.maxHeight = 10;
this.minLeavesRadius = 1;
this.leavesGradient = 1;
this.vineAttempts = 20;
this.maxVineLength = 20;
}
@Override
public GeneratorMangroveTree create()
{
return new GeneratorMangroveTree(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.altLeaves, this.minHeight, this.maxHeight, this.minLeavesRadius, this.leavesGradient, this.vineAttempts, this.maxVineLength, this.rootsReplace);
}
}
private int minLeavesRadius;
private int leavesGradient;
private int vineAttempts;
private int maxVineLength;
private IBlockPosQuery rootsReplace;
public GeneratorMangroveTree(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState altLeaves, int minHeight, int maxHeight, int minLeavesRadius, int leavesGradient, int vineAttempts, int maxVineLength, IBlockPosQuery rootsReplace)
{
super(amountPerChunk, placeOn, replace, log, leaves, vine, hanging, altLeaves, minHeight, maxHeight);
this.minLeavesRadius = minLeavesRadius;
this.leavesGradient = leavesGradient;
this.vineAttempts = vineAttempts;
this.maxVineLength = maxVineLength;
this.rootsReplace = rootsReplace;
}
@Override
public BlockPos getScatterY(World world, Random random, int x, int z)
{
// always at ground (sometimes underwater)
return GeneratorUtils.ScatterYMethod.AT_GROUND.getBlockPos(world, random, x, z);
}
public boolean setRoot(World world, BlockPos pos)
{
if (this.rootsReplace.matches(world, pos))
{
world.setBlockState(pos, this.log, 2);
return true;
}
return false;
}
public boolean checkRootViable(World world, BlockPos pos, int rootHeight, EnumFacing direction)
{
// a viable root has an path which roots can dig through from trunk to some fertile ground
pos = pos.offset(direction).up(rootHeight - 1);
for (int i = 0; i < rootHeight; i++)
{
if (!this.rootsReplace.matches(world, pos)) {return false;}
pos = pos.down();
if (this.placeOn.matches(world, pos)) {return true;}
}
return false;
}
public boolean checkSpace(World world, BlockPos pos, int rootHeight, int middleHeight, int height)
{
// we want at least 2 of the roots to be viable
int rootsOk = 0;
for (EnumFacing direction : EnumFacing.Plane.HORIZONTAL)
{
if (this.checkRootViable(world, pos, rootHeight, direction)) {rootsOk++;}
}
if (rootsOk < 2) {return false;}
// check there's some space for the trunk and leaves too
for (int y = rootHeight; y <= height; y++)
{
// require 1x1 for the trunk, 3x3 for the leaves
int radius = (y <= (rootHeight + middleHeight) ? 0 : 1);
for (int x = -radius; x <= radius; x++)
{
for (int z = -radius; z <= radius; z++)
{
BlockPos pos1 = pos.add(x, y, z);
// note, there may be a sapling on the first layer - make sure this.replace matches it!
if (pos1.getY() >= 255 || !this.replace.matches(world, pos1))
{
return false;
}
}
}
}
return true;
}
public void generateTop(World world, Random random, BlockPos pos, int topHeight)
{
for (int y = 0; y < topHeight; y++)
{
int radius = Math.min(3, this.minLeavesRadius + (topHeight - y) / this.leavesGradient);
for (int x = -radius; x <= radius; ++x)
{
for (int z = -radius; z <= radius; ++z)
{
// too far away and the leaves will decay
int dist = Math.abs(x) + Math.abs(z);
if (dist < 4 || (dist == 4 && random.nextInt(2) == 0))
{
this.setLeaves(world, pos.add(x, y, z));
}
}
}
if (y < topHeight - 1)
{
// add the trunk in the middle
this.setLog(world, pos.add(0, y, 0));
} else {
// add leaves on top for certain
this.setLeaves(world, pos.add(0, y, 0));
}
}
}
public void generateRoots(World world, Random random, BlockPos pos, int rootHeight)
{
this.setRoot(world, pos.north().add(0, rootHeight, 0));
this.setRoot(world, pos.east().add(0, rootHeight, 0));
this.setRoot(world, pos.south().add(0, rootHeight, 0));
this.setRoot(world, pos.west().add(0, rootHeight, 0));
for (int i = 0; i < rootHeight; i++)
{
this.setRoot(world, pos.north().north());
this.setRoot(world, pos.east().east());
this.setRoot(world, pos.south().south());
this.setRoot(world, pos.west().west());
pos = pos.up();
}
//this.setRoot(world, pos.down());
}
@Override
public boolean generate(World world, Random random, BlockPos startPos)
{
if (!this.placeOn.matches(world, startPos.down()))
{
// Abandon if we can't place the tree on this block
return false;
}
// Choose heights
int height = GeneratorUtils.nextIntBetween(random, this.minHeight, this.maxHeight);
int topHeight = Math.min(6, GeneratorUtils.nextIntBetween(random, height / 5, height / 3));
int rootHeight = Math.min(5, GeneratorUtils.nextIntBetween(random, height / 4, height / 2));
int middleHeight = height - topHeight - rootHeight;
if (middleHeight < 1) {return false;}
// Start in the ground block
BlockPos pos = startPos.down();
if (!this.checkSpace(world, pos, rootHeight, middleHeight, height))
{
// Abandon if there isn't enough room
return false;
}
// Generate roots
this.generateRoots(world, random, pos, rootHeight);
pos = pos.up(rootHeight);
// Generate middle of tree (trunk only)
for(int i = 0; i < middleHeight; i++)
{
this.setLog(world, pos);
pos = pos.up();
}
// Generate the top of the tree
this.generateTop(world, random, pos, topHeight);
// Add vines
if (this.vine != null)
{
int maxLeavesRadius = this.minLeavesRadius + topHeight / this.leavesGradient;
this.addVines(world, random, startPos, height, maxLeavesRadius, this.vineAttempts);
}
return true;
}
protected void addVines(World world, Random rand, BlockPos startPos, int height, int leavesRadius, int generationAttempts)
{
for (int i = 0; i < generationAttempts; i++)
{
// choose a random direction
EnumFacing direction = EnumFacing.Plane.HORIZONTAL.random(rand);
EnumFacing back = direction.getOpposite();
EnumFacing sideways = direction.rotateY();
// choose a random starting point somewhere just outside the boundary of the tree
BlockPos pos = startPos.up(GeneratorUtils.nextIntBetween(rand, 2, height)).offset(direction, leavesRadius + 1).offset(sideways, GeneratorUtils.nextIntBetween(rand, -leavesRadius, leavesRadius));
// move back towards the center until we meet a leaf or log, then stick a vine on it
IBlockState state;
for (int l = 0; l < leavesRadius; l++)
{
state = world.getBlockState(pos.offset(back, 1 + l));
if (state == this.leaves || state == this.log) {
this.setVine(world, rand, pos.offset(back, l), back, this.maxVineLength);
break;
}
}
}
}
@Override
public void configure(IConfigObj conf)
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
this.minHeight = conf.getInt("minHeight", this.minHeight);
this.minLeavesRadius = conf.getInt("minLeavesRadius", this.minLeavesRadius);
this.leavesGradient = conf.getInt("leavesGradient", this.leavesGradient);
this.vineAttempts = conf.getInt("vineAttempts", this.vineAttempts);
this.maxVineLength = conf.getInt("maxVineLength", this.maxVineLength);
this.placeOn = conf.getBlockPosQuery("placeOn", this.placeOn);
this.replace = conf.getBlockPosQuery("replace", this.replace);
this.rootsReplace = conf.getBlockPosQuery("rootsReplace", this.rootsReplace);
this.log = conf.getBlockState("logState", this.log);
this.leaves = conf.getBlockState("leavesState", this.leaves);
this.vine = conf.getBlockState("vinesState", this.vine);
}
}

View File

@ -0,0 +1,180 @@
/*******************************************************************************
* Copyright 2015-2016, 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.feature.tree;
import java.util.Random;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.block.BlockQuery.IBlockPosQuery;
import biomesoplenty.common.util.config.BOPConfig.IConfigObj;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
public class GeneratorPalmTree extends GeneratorTreeBase
{
public static class Builder extends GeneratorTreeBase.InnerBuilder<Builder, GeneratorPalmTree> implements IGeneratorBuilder<GeneratorPalmTree>
{
public Builder()
{
this.amountPerChunk = 1.0F;
this.minHeight = 10;
this.maxHeight = 14;
this.placeOn = BlockQueries.fertile;
this.replace = BlockQueries.replaceable;
this.log = Blocks.log.getDefaultState();
this.leaves = Blocks.leaves.getDefaultState();
this.vine = null;
this.hanging = null;
this.altLeaves = null;
}
@Override
public GeneratorPalmTree create() {
return new GeneratorPalmTree(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.altLeaves, this.minHeight, this.maxHeight);
}
}
public GeneratorPalmTree(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState altLeaves, int minHeight, int maxHeight)
{
super(amountPerChunk, placeOn, replace, log, leaves, vine, hanging, altLeaves, minHeight, maxHeight);
}
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
// Move down until we reach the ground
while (pos.getY() > 1 && world.isAirBlock(pos) || world.getBlockState(pos).getBlock().isLeaves(world, pos)) {pos = pos.down();}
if (!this.placeOn.matches(world, pos))
{
// Abandon if we can't place the tree on this block
return false;
}
// Generation settings
int height = GeneratorUtils.nextIntBetween(random, this.minHeight, this.maxHeight);
int leavesRadius = 2;
int heightMinusTop = height - leavesRadius;
boolean slant = true;
EnumFacing direction = EnumFacing.random(random); //The direction the palm tree curves towards
if (direction == EnumFacing.DOWN || direction == EnumFacing.UP)
{
slant = false;
}
double baseSlant = random.nextInt(35) / 100D;
double slantMultiplier = 1.3D;
if (height < 8) {return false;} //Prevent trees from being too small
// Move up to space above ground
pos = pos.up();
if (!this.checkSpace(world, pos, height, 1))
{
// Abandon if there isn't enough room
return false;
}
double slantOffset = baseSlant;
// Generate trunk of tree (trunk only)
for(int step = 0; step <= heightMinusTop; step++)
{
BlockPos offsetPos = pos.up(step);
if (slant == true)
{
offsetPos = pos.up(step).offset(direction, (int)Math.floor(slantOffset));
}
if (step == heightMinusTop)
{
// Generate top of tree
generateLeavesTop(world, offsetPos, leavesRadius);
break;
}
this.setLog(world, offsetPos);
//As the height increases, slant more drastically
slantOffset *= slantMultiplier;
}
return true;
}
public boolean checkSpace(World world, BlockPos pos, int height, int radius)
{
for (int y = 0; y <= height; y++)
{
for (int x = -radius; x <= radius; x++)
{
for (int z = -radius; z <= radius; z++)
{
BlockPos pos1 = pos.add(x, y, z);
// note, there may be a sapling on the first layer - make sure this.replace matches it!
if (pos1.getY() >= 255 || !this.replace.matches(world, pos1))
{
return false;
}
}
}
}
return true;
}
// generate the top of the tree (3 blocks)
public void generateLeavesTop(World world, BlockPos pos, int maxRadius)
{
setLeaves(world, pos.add(2, -1, 0));
setLeaves(world, pos.add(-2, -1, 0));
setLeaves(world, pos.add(0, -1, 2));
setLeaves(world, pos.add(0, -1, -2));
setLeaves(world, pos.add(1, 0, 0));
setLeaves(world, pos.add(-1, 0, 0));
setLeaves(world, pos.add(0, 0, 1));
setLeaves(world, pos.add(0, 0, -1));
setLeaves(world, pos.add(2, 0, 2));
setLeaves(world, pos.add(-2, 0, -2));
setLeaves(world, pos.add(2, 0, -2));
setLeaves(world, pos.add(-2, 0, 2));
setLeaves(world, pos.add(1, 1, -1));
setLeaves(world, pos.add(-1, 1, 1));
setLeaves(world, pos.add(1, 1, 1));
setLeaves(world, pos.add(-1, 1, -1));
setLeaves(world, pos.add(0, 1, 0));
setLeaves(world, pos.add(2, 2, 0));
setLeaves(world, pos.add(-2, 2, 0));
setLeaves(world, pos.add(0, 2, 2));
setLeaves(world, pos.add(0, 2, -2));
}
@Override
public void configure(IConfigObj conf)
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
this.minHeight = conf.getInt("minHeight", this.minHeight);
this.maxHeight = conf.getInt("minHeight", this.maxHeight);
this.placeOn = conf.getBlockPosQuery("placeOn", this.placeOn);
this.replace = conf.getBlockPosQuery("replace", this.replace);
this.log = conf.getBlockState("logState", this.log);
this.leaves = conf.getBlockState("leavesState", this.leaves);
}
}

View File

@ -1,24 +1,81 @@
#Traslated by xuyu_staryG(gxy17886) From InfinityStudio
biome_finder.searching=寻找 %s
achievement.craft_ambrosia.desc=糖, 水, 蜂蜜, 浆果, 根茎, 海带, 脓水, 精灵之尘, 还有仙域水晶!
achievement.craft_ambrosia=琼浆玉液
achievement.craft_amethyst_sword.desc=获得第一把紫晶剑
achievement.craft_amethyst_sword=剑士
achievement.craft_dart_blower.desc=用竹竿制作吹箭筒
achievement.craft_dart_blower=镖与武器
achievement.craft_flax_string.desc=将亚麻制作成亚麻绳
achievement.craft_flax_string=亚麻的乐趣
achievement.craft_muddy_pickaxe.desc=what 你用泥巴捏了个镐???
achievement.craft_muddy_pickaxe=你好Low
achievement.craft_poison_jar.desc=从毒藤中萃取毒素
achievement.craft_poison_jar=制毒
achievement.craft_terrestrial_artifact.desc=将八种生物群所特有的宝石融合
achievement.craft_terrestrial_artifact=强力融合
achievement.eat_shroom_powder.desc=品尝了一些致幻的蘑菇粉
achievement.eat_shroom_powder=梦幻之镜
achievement.explore_all_biomes.desc=发现了所有生物群
achievement.explore_all_biomes=游侠
achievement.grow_sacred_oak.desc=种植了一颗神圣橡树树苗
achievement.grow_sacred_oak=世界之树
achievement.obtain_berry.desc=从浆果丛中获取到了浆果
achievement.obtain_berry=初识浆果
achievement.obtain_celestial_crystal.desc=在末地挖到了仙域水晶
achievement.obtain_celestial_crystal=极端还是前卫...
achievement.obtain_coral.desc=深水寻珊瑚
achievement.obtain_coral=只为珊瑚!
achievement.obtain_deathbloom.desc=获取彼岸花
achievement.obtain_deathbloom=不死之身
achievement.obtain_flowers.desc=发现了花朵!
achievement.obtain_flowers=那些花儿
achievement.obtain_honeycomb.desc=从马蜂窝中偷取蜂窝
achievement.obtain_honeycomb=蜂窝大亨
achievement.obtain_miners_delight.desc=在洞穴深处发现了乐矿花
achievement.obtain_miners_delight=生命的出路
achievement.obtain_pixie_dust.desc=杀死一只小精灵并获取其精灵之尘
achievement.obtain_pixie_dust=闭气
achievement.obtain_soul.desc=找回失落的灵魂
achievement.obtain_soul=灵魂猎人
achievement.obtain_thorn.desc=收集到带刺的荆棘!
achievement.obtain_thorn=相当棘手
achievement.obtain_turnip.desc=收获芜菁
achievement.obtain_turnip=芜菁之路
achievement.obtain_wilted_lily.desc=拯救了一只枯萎的百合
achievement.obtain_wilted_lily=天神下凡
achievement.use_biome_finder.desc=使用生物群雷达定位一块生物群
achievement.use_biome_finder=搜索小队
achievement.use_enderporter.desc=到家了,你还追呀~
achievement.use_enderporter=原点
biome_finder.found=找到 %s!
biome_finder.not_found=无法找到, 也许 %s 是距离太遥远
biome_finder.not_found=无法找到%s ,可能距离太远了。
biome_finder.searching=寻找 %s
commands.biomesoplenty.usage=/biomesoplenty <tpbiome|biomename> [args]
commands.biomesoplenty.biomename.success=生物群系【%s】已绑定为【%s】
commands.biomesoplenty.biomename.usage=/biomesoplenty biomename [biomeId]
commands.biomesoplenty.biomename.success=生物群系ID%s已绑定为: %s
commands.biomesoplenty.tpbiome.usage=/biomesoplenty tpbiome [biomeId]
commands.biomesoplenty.tpbiome.success=玩家%s传送到生物群系: %s,坐标(%s, %s, %s)
commands.biomesoplenty.tpbiome.error=未找到生物群系: %s!
commands.biomesoplenty.stats.blocks=方块: %s
commands.biomesoplenty.stats.items=物品: %s
commands.biomesoplenty.stats.entities=实体: %s
commands.biomesoplenty.stats.biomes=生物群落: %s
commands.biomesoplenty.stats.biomes=生物群落:%s
commands.biomesoplenty.stats.blocks=方块:%s
commands.biomesoplenty.stats.entities=实体:%s
commands.biomesoplenty.stats.items=物品:%s
commands.biomesoplenty.stripchunk.usage=/biomesoplenty stripchunk [radius] <include|exclude> [block] [metadata]
commands.biomesoplenty.tpbiome.error=未找到生物群系:%s!
commands.biomesoplenty.tpbiome.success=玩家%s传送到生物群系%s坐标%s %s %s
commands.biomesoplenty.tpbiome.usage=/biomesoplenty tpbiome [biomeId]
commands.biomesoplenty.usage=/biomesoplenty <tpbiome|biomename> [args]
config.category.convenienceSettings.title=便捷设定
config.category.convenienceSettings.tooltip=需要使用剪刀来收集花瓣(物品)
config.category.guiSettings.title=界面设定
config.category.guiSettings.tooltip=设定“超多生物群系”为世界默认生物群。
config.category.textureSettings.title=贴图设定
config.category.textureSettings.tooltip=覆盖Foger自带的 bucket 贴图(我们的贴图更加好看!)
config.category.trailSettings.title=足迹设定
config.category.trailSettings.tooltip=修改足迹可见性
container.flower_basket=花篮
generator.BIOMESOP.info=注意1.8版本的超多生物群系仍在开发阶段。
generator.BIOMESOP=超多生物群系
generator.BIOMESOP.info=注意: 1.8版本的超多生物群系仍在开发阶段.
itemGroup.tabBiomesOPlenty=超多生物群系
item.ambrosia.name=仙馔密酒
item.amethyst_axe.name=紫晶斧
@ -34,25 +91,28 @@ item.amethyst_sword.name=紫晶剑
item.ash.name=灰烬堆
item.berries.name=浆果
item.biome_essence.name=生物群落精华
item.biome_finder.name=生物雷达
item.biome_finder.name=生物雷达
item.black_dye.name=黑色染料
item.blood_bucket.name=血桶
item.blue_dye.name=蓝色染料
item.brown_dye.name=棕色染料
item.cherry_door.name=樱花树门
item.crystal_shard.name=仙域水晶碎片
item.dark_door.name=黑暗树门
item.dart.name=飞镖
item.dart_blower.name=鼓风机
item.dart.name=镖
item.dart_blower.name=吹箭筒
item.diamond_scythe.name=钻石镰刀
item.dull_flower_band.name=沉闷花带
item.ebony_door.name=乌木门
item.enderporter.name=末地传送
item.ethereal_door.name=天域树门
item.eucalyptus_door.name=桉树门
item.exotic_flower_band.name=异国花带
item.filled_honeycomb.name=充满的蜂窝
item.fir_door.name=杉树门
item.flax_string.name=亚麻绳
item.fleshchunk.name=肉块
item.flippers.name=脚蹼
item.flower_basket.name=花篮
item.gem_amber.name=琥珀
item.gem_amethyst.name=末影紫晶
item.gem_malachite.name=孔雀石
@ -61,12 +121,12 @@ item.gem_ruby.name=红宝石
item.gem_sapphire.name=蓝宝石
item.gem_tanzanite.name=坦桑石
item.gem_topaz.name=黄玉
item.ghastly_soul.name=可怕的灵魂
item.green_dye.name=绿色染料
item.gold_scythe.name=金镰刀
item.green_dye.name=绿色染料
item.hellbark_door.name=地狱皮树门
item.honey_bucket.name=蜜桶
item.honeycomb.name=空蜂窝
item.hot_spring_water_bucket.name=温泉水桶
item.ichor.name=脓水
item.iron_scythe.name=铁镰刀
item.jacaranda_door.name=蓝花楹门
@ -78,7 +138,6 @@ item.lush_flower_band.name=繁茂的花带
item.magic_door.name=魔法树门
item.mahogany_door.name=桃花心木门
item.mangrove_door.name=红树门
item.mudball.name=泥巴球
item.mud_axe.name=泥巴斧
item.mud_boots.name=泥巴靴子
item.mud_brick.name=泥砖
@ -90,316 +149,341 @@ item.mud_pickaxe.name=泥巴镐
item.mud_scythe.name=泥巴镰刀
item.mud_shovel.name=泥巴铲
item.mud_sword.name=泥巴剑
item.mudball.name=泥巴球
item.palm_door.name=棕榈树门
item.persimmon.name=柿子
item.peach.name=桃子
item.pear.name=梨
item.pinecone.name=松果
item.persimmon.name=柿子
item.pine_door.name=松木门
item.pinecone.name=松果
item.pixie_dust.name=精灵之尘
item.plain_flower_band.name=平原花带
item.poison_bucket.name=毒桶
item.poisondart.name=毒镖
item.record_corruption.name=音乐唱片
item.record.corruption.desc=???
item.record_wanderer.name=音乐唱片
item.record.corruption.desc=
item.record.wanderer.desc=Tim Rurkowski - Wanderer
item.record_corruption.name=音乐唱片
item.record_wanderer.name=音乐唱片
item.redwood_door.name=红木门
item.ricebowl.name=一碗饭
item.sacred_oak_door.name=神圣橡木门
item.saladfruit.name=水果沙拉
item.saladshroom.name=蘑菇沙拉
item.saladveggie.name=素食沙拉
item.shroompowder.name=蘑菇粉
item.soul.name=灵魂
item.spawn_egg_butterfly.name=生成 蝴蝶
item.spawn_egg_pixie.name=生成 小精灵
item.spawn_egg_snail.name=生成 蜗牛
item.spawn_egg_wasp.name=生成 黄蜂
item.stone_scythe.name=石质镰刀
item.terrestrial_artifact.name=矿质精华
item.turnip.name=芜菁
item.turnip_seeds.name=芜菁种子
item.wading_boots.name=涉水靴子
item.umbran_door.name=暗影木门
item.wading_boots.name=浅靴
item.white_dye.name=白色染料
item.wildcarrots.name=野胡萝卜
item.willow_door.name=杨柳木门
item.wood_scythe.name=木质镰刀
itemGroup.tabBiomesOPlenty=超多生物群系
tile.ash_block.name=灰烬块
tile.bamboo.name=竹子
tile.bamboo_thatching.name=竹板
tile.biome_block.name=生物精华矿石
tile.bone_segment.small_bone_segment.name=小块骨头
tile.bone_segment.medium_bone_segment.name=中块骨头
tile.bone_segment.large_bone_segment.name=大块骨头
tile.bone_segment.medium_bone_segment.name=中块骨头
tile.bone_segment.small_bone_segment.name=小块骨头
tile.cherry_fence.name=樱花树栅栏
tile.cherry_fence_gate.name=樱花树栅栏门
tile.cherry_wood_slab.name=樱花树原木台阶
tile.cherry_stairs.name=樱花树原木楼梯
tile.coral.pink_coral.name=粉珊瑚
tile.coral.orange_coral.name=橙珊瑚
tile.coral.blue_coral.name=蓝珊瑚
tile.coral.glowing_coral.name=夜光珊瑚
tile.cherry_wood_slab.name=樱花树原木台阶
tile.coral.algae.name=海藻
tile.coral.blue_coral.name=蓝珊瑚
tile.coral.glowing_coral.name=萤珊瑚
tile.coral.orange_coral.name=橙珊瑚
tile.coral.pink_coral.name=粉珊瑚
tile.crag_rock_slab.name=峭壁岩石台阶
tile.dark_fence.name=黑暗树栅栏
tile.dark_fence_gate.name=黑暗树栅栏门
tile.dark_wood_slab.name=黑暗树原木台阶
tile.dark_stairs.name=黑暗树原木楼梯
tile.dirt.loamy_dirt.name=肥沃泥土
tile.dirt.sandy_dirt.name=沙质泥土
tile.dirt.silty_dirt.name=淤泥
tile.crystal.name=仙域水晶
tile.dirt.coarse_loamy_dirt.name=粗糙肥沃泥土
tile.dirt.coarse_sandy_dirt.name=粗糙沙质泥土
tile.dirt.coarse_silty_dirt.name=粗糙淤泥
tile.dirt.loamy_dirt.name=肥沃泥土
tile.dirt.sandy_dirt.name=沙质泥土
tile.dirt.silty_dirt.name=淤泥
tile.double_plant.eyebulb.name=球茎
tile.double_plant.flax.name=亚麻
tile.double_plant.tall_cattail.name=香蒲
tile.double_plant.eyebulb.name=球茎
tile.dried_sand.name=干沙
tile.ebony_fence.name=乌木栅栏
tile.ebony_fence_gate.name=乌木栅栏门
tile.ebony_stairs.name=乌木楼梯
tile.ebony_wood_slab.name=乌木台阶
tile.ethereal_fence.name=天域树栅栏
tile.ethereal_fence_gate.name=天域树栅栏门
tile.ethereal_wood_slab.name=天域树台阶
tile.ethereal_stairs.name=天域树楼梯
tile.ethereal_wood_slab.name=天域树台阶
tile.eucalyptus_fence.name=桉树栅栏
tile.eucalyptus_fence_gate.name=桉树栅栏门
tile.eucalyptus_stairs.name=桉树楼梯
tile.eucalyptus_wood_slab.name=桉树台阶
tile.farmland_0.loamy_farmland.name=肥沃农田
tile.farmland_0.sandy_farmland.name=沙质农田
tile.farmland_1.silty_farmland.name=泥泞农田
tile.fir_fence.name=杉树栅栏
tile.fir_fence_gate.name=杉树栅栏门
tile.fir_wood_slab.name=杉树台阶
tile.fir_stairs.name=杉树楼梯
tile.fir_wood_slab.name=杉树台阶
tile.flesh.name=肉
tile.flower_0.clover.name=苜蓿
tile.flower_0.swampflower.name=沼泽花
tile.flower_0.deathbloom.name=死亡花
tile.flower_0.glowflower.name=闪光花
tile.flower_0.blue_hydrangea.name=蓝绣球花
tile.flower_0.orange_cosmos.name=黄波斯菊
tile.flower_0.pink_daffodil.name=粉水仙
tile.flower_0.wildflower.name=野花
tile.flower_0.bromeliad.name=凤梨
tile.flower_0.burning_blossom.name=火焰花
tile.flower_0.clover.name=三叶草
tile.flower_0.deathbloom.name=彼岸花
tile.flower_0.enderlotus.name=末影莲花
tile.flower_0.glowflower.name=萤花
tile.flower_0.lily_of_the_valley.name=铃兰
tile.flower_0.orange_cosmos.name=橙色波斯菊
tile.flower_0.pink_daffodil.name=粉色水仙
tile.flower_0.pink_hibiscus.name=粉色芙蓉
tile.flower_0.swampflower.name=沼泽花
tile.flower_0.violet.name=紫罗兰
tile.flower_0.white_anemone.name=银莲花
tile.flower_0.enderlotus.name=末影莲花
tile.flower_0.bromeliad.name=凤梨
tile.flower_0.dandelion.name=蒲公英
tile.flower_0.pink_hibiscus.name=粉木槿
tile.flower_0.lily_of_the_valley.name=谷百合
tile.flower_0.burning_blossom.name=火焰花
tile.flower_1.lavender.name=熏衣草
tile.flower_1.goldenrod.name=秋麒麟草
tile.flower_0.wildflower.name=野花
tile.flower_0.wilted_lily.name=枯萎的百合
tile.flower_1.bluebells.name=蓝铃花
tile.flower_1.miners_delight.name=乐矿花
tile.flower_1.goldenrod.name=秋麒麟草
tile.flower_1.icy_iris.name=冰虹膜花
tile.flower_1.lavender.name=熏衣草
tile.flower_1.miners_delight.name=乐矿花
tile.flower_1.rose.name=玫瑰
tile.flower_vine.name=开花的葡萄藤
tile.fruit_block.apple_block.name=苹果方块
tile.fruit_block.persimmon_block.name=柿子方块
tile.fruit_block.peach_block.name=桃子方块
tile.fruit_block.pear_block.name=梨方块
tile.fruit_block.pinecone_block.name=松果
tile.gem_block.amethyst_block.name=紫晶块
tile.gem_block.ruby_block.name=红宝石块
tile.gem_block.peridot_block.name=橄榄石块
tile.gem_block.topaz_block.name=黄玉块
tile.gem_block.tanzanite_block.name=坦桑石块
tile.gem_block.malachite_block.name=磷灰石块
tile.gem_block.sapphire_block.name=蓝宝石块
tile.flower_vine.name=藤花
tile.gem_block.amber_block.name=琥珀块
tile.gem_ore.amethyst_ore.name=末影紫晶矿石
tile.gem_ore.ruby_ore.name=红宝石矿石
tile.gem_ore.peridot_ore.name=橄榄石矿石
tile.gem_ore.topaz_ore.name=黄玉矿石
tile.gem_ore.tanzanite_ore.name=坦桑矿石
tile.gem_ore.malachite_ore.name=磷灰石矿石
tile.gem_ore.sapphire_ore.name=蓝宝石矿石
tile.gem_block.amethyst_block.name=紫晶块
tile.gem_block.malachite_block.name=磷灰石块
tile.gem_block.peridot_block.name=橄榄石块
tile.gem_block.ruby_block.name=红宝石块
tile.gem_block.sapphire_block.name=蓝宝石块
tile.gem_block.tanzanite_block.name=坦桑石块
tile.gem_block.topaz_block.name=黄玉块
tile.gem_ore.amber_ore.name=琥珀矿石
tile.gem_ore.amethyst_ore.name=末影紫晶矿石
tile.gem_ore.malachite_ore.name=磷灰石矿石
tile.gem_ore.peridot_ore.name=橄榄石矿石
tile.gem_ore.ruby_ore.name=红宝石矿石
tile.gem_ore.sapphire_ore.name=蓝宝石矿石
tile.gem_ore.tanzanite_ore.name=坦桑矿石
tile.gem_ore.topaz_ore.name=黄玉矿石
tile.grass.daisy_grass_block.name=长草
tile.grass.spectral_moss.name=末地苔藓方块
tile.grass.smoldering_grass_block.name=阴燃草方块
tile.grass.loamy_grass_block.name=肥沃草方块
tile.grass.origin_grass_block.name=远古草方块
tile.grass.overgrown_netherrack.name=杂草丛生的地狱岩
tile.grass.sandy_grass_block.name=沙质草方块
tile.grass.silty_grass_block.name=淤泥草方块
tile.grass.origin_grass_block.name=原始草方块
tile.grass.overgrown_netherrack.name=杂草丛生的地狱岩
tile.grass.smoldering_grass_block.name=阴燃草方块
tile.grass.spectral_moss.name=幽灵苔
tile.hard_ice.name=硬质冰块
tile.hellbark_fence.name=地狱皮树栅栏
tile.hellbark_fence_gate.name=地狱皮树栅栏门
tile.hellbark_wood_slab.name=地狱皮树台阶
tile.hellbark_stairs.name=地狱皮树楼梯
tile.hive.hive_block.name=蜂房方块
tile.hive.honeycomb_block.name=蜂房方块
tile.hive.empty_honeycomb_block.name=空的蜂房方块
tile.hive.filled_honeycomb_block.name=满的蜂房方块
tile.hellbark_wood_slab.name=地狱皮树台阶
tile.hive.empty_honeycomb_block.name=空的蜂巢方块
tile.hive.filled_honeycomb_block.name=满的蜂巢方块
tile.hive.hive_block.name=蜂巢方块
tile.hive.honeycomb_block.name=蜂窝方块
tile.honey_block.name=蜂蜜方块
tile.ivy.name=常春藤
tile.jacaranda_fence.name=蓝花楹树栅栏
tile.jacaranda_fence_gate.name=蓝花楹树栅栏门
tile.jacaranda_wood_slab.name=蓝花楹树原木台阶
tile.jacaranda_stairs.name=蓝花楹树原木楼梯
tile.leaves_0.yellow_autumn_leaves.name=黄色秋天树叶
tile.leaves_0.orange_autumn_leaves.name=橙色秋天树叶
tile.jacaranda_wood_slab.name=蓝花楹树原木台阶
tile.leaves_0.bamboo_leaves.name=竹叶
tile.leaves_0.magic_leaves.name=魔法树树叶
tile.leaves_1.dark_leaves.name=黑暗树树叶
tile.leaves_1.dead_leaves.name=垂死树树叶
tile.leaves_1.fir_leaves.name=杉树树叶
tile.leaves_0.orange_autumn_leaves.name=橙秋树叶
tile.leaves_0.yellow_autumn_leaves.name=黄秋树叶
tile.leaves_1.dead_leaves.name=亡树树叶
tile.leaves_1.ethereal_leaves.name=天域树树叶
tile.leaves_2.origin_leaves.name=Origin 树叶
tile.leaves_1.fir_leaves.name=杉树树叶
tile.leaves_1.umbran_leaves.name=暗影树树叶
tile.leaves_2.maple_leaves.name=枫树树叶
tile.leaves_2.origin_leaves.name=远古树叶
tile.leaves_2.pink_cherry_leaves.name=粉色樱花树树叶
tile.leaves_2.white_cherry_leaves.name=白色樱花树树叶
tile.leaves_2.maple_leaves.name=枫树树叶
tile.leaves_3.flowering_leaves.name=开花橡树树叶
tile.leaves_3.hellbark_leaves.name=地狱皮树树叶
tile.leaves_3.flowering_leaves.name=Flowering 树叶
tile.leaves_3.jacaranda_leaves.name=蓝花楹树树叶
tile.leaves_3.sacred_oak_leaves.name=神圣橡树树叶
tile.leaves_4.mangrove_leaves.name=红树树叶
tile.leaves_4.palm_leaves.name=棕榈树树叶
tile.leaves_4.redwood_leaves.name=红木树叶
tile.leaves_4.willow_leaves.name=柳树树叶
tile.leaves_5.pine_leaves.name=松树树叶
tile.leaves_5.ebony_leaves.name=乌木树叶
tile.leaves_5.eucalyptus_leaves.name=桉树树叶
tile.leaves_5.mahogany_leaves.name=桃花心树树叶
tile.leaves_5.red_big_flower_petal.name=巨型红色花瓣
tile.leaves_5.yellow_big_flower_petal.name=巨型黄色花瓣
tile.limestone_slab.name=石灰岩台阶
tile.log_0.sacred_oak_log.name=神圣橡树原木
tile.leaves_5.pine_leaves.name=松树树叶
tile.leaves_6.red_big_flower_petal.name=巨型红色花瓣
tile.leaves_6.yellow_big_flower_petal.name=巨型黄色花瓣
tile.log_0.cherry_log.name=樱花树原木
tile.log_0.dark_log.name=黑暗树原木
tile.log_0.fir_log.name=杉树原木
tile.log_0.sacred_oak_log.name=神圣橡树原木
tile.log_0.umbran_log.name=暗影树原木
tile.log_1.ethereal_log.name=天域树原木
tile.log_1.magic_log.name=魔法树原木
tile.log_1.mangrove_log.name=红树原木
tile.log_1.palm_log.name=棕榈树原木
tile.log_2.hellbark_log.name=地狱皮树原木
tile.log_2.pine_log.name=松树原木
tile.log_2.redwood_log.name=红木原木
tile.log_2.willow_log.name=柳树原木
tile.log_2.pine_log.name=松树原木
tile.log_2.hellbark_log.name=地狱皮树原木
tile.log_3.ebony_log.name=乌木原木
tile.log_3.eucalyptus_log.name=桉树原木
tile.log_3.jacaranda_log.name=蓝花楹树原木
tile.log_3.mahogany_log.name=桃花心树原木
tile.log_3.giant_flower_stem.name=巨大花茎
tile.log_3.dead_log.name=垂死树原木
tile.log_4.dead_log.name=亡树原木
tile.log_4.giant_flower_stem.name=巨大花茎
tile.magic_fence.name=魔法树栅栏
tile.magic_fence_gate.name=魔法树栅栏门
tile.magic_wood_slab.name=魔法树台阶
tile.magic_stairs.name=魔法树楼梯
tile.magic_wood_slab.name=魔法树台阶
tile.mahogany_fence.name=桃花心树栅栏
tile.mahogany_fence_gate.name=桃花心树栅栏门
tile.mahogany_wood_slab.name=桃花心树台阶
tile.mahogany_stairs.name=桃花心树楼梯
tile.mahogany_wood_slab.name=桃花心树台阶
tile.mangrove_fence.name=红树栅栏
tile.mangrove_fence_gate.name=红树栅栏门
tile.mangrove_wood_slab.name=红树台阶
tile.mangrove_stairs.name=红树楼梯
tile.moss.name=苔藓
tile.mangrove_wood_slab.name=红树台阶
tile.mud.mud.name=泥巴
tile.mud_brick.name=泥巴砖块
tile.mud_brick_block.name=泥巴砖
tile.mud_brick_slab.name=泥巴砖台阶
tile.mud_brick_stairs.name=泥巴砖楼梯
tile.sand.quicksand.name=流沙
tile.mushroom.toadstool.name=毒菌
tile.mushroom.portobello.name=双孢蘑菇
tile.mushroom.blue_milk_cap.name=蓝牛奶伞菌
tile.mushroom.glowshroom.name=夜光菇
tile.mushroom.flat_mushroom.name=平菇
tile.mushroom.glowshroom.name=萤菇
tile.mushroom.portobello.name=双孢蘑菇
tile.mushroom.shadow_shroom.name=影菇
tile.mushroom.toadstool.name=毒菌
tile.palm_fence.name=棕榈树栅栏
tile.palm_fence_gate.name=棕榈树栅栏门
tile.palm_wood_slab.name=棕榈树台阶
tile.palm_stairs.name=棕榈树楼梯
tile.palm_wood_slab.name=棕榈树台阶
tile.pine_fence.name=松树栅栏
tile.pine_fence_gate.name=松树栅栏门
tile.pine_wood_slab.name=松树台阶
tile.pine_stairs.name=松树楼梯
tile.planks_0.sacred_oak_planks.name=神圣橡树木板
tile.planks_0.cherry_planks.name=樱花树木板
tile.planks_0.dark_planks.name=黑暗树木板
tile.planks_0.fir_planks.name=杉树木板
tile.planks_0.ethereal_planks.name=天域树木板
tile.planks_0.magic_planks.name=魔法树木板
tile.planks_0.mangrove_planks.name=红树木板
tile.planks_0.palm_planks.name=棕榈树木板
tile.planks_0.redwood_planks.name=红木木板
tile.planks_0.willow_planks.name=柳树木板
tile.pine_wood_slab.name=松树台阶
tile.planks_0.bamboo_thatching.name=竹板
tile.planks_0.pine_planks.name=松树木板
tile.planks_0.cherry_planks.name=樱花树木板
tile.planks_0.ebony_planks.name=乌木木板
tile.planks_0.ethereal_planks.name=天域树木板
tile.planks_0.eucalyptus_planks.name=桉树木板
tile.planks_0.fir_planks.name=杉树木板
tile.planks_0.hellbark_planks.name=地狱皮树木板
tile.planks_0.jacaranda_planks.name=蓝花楹树木板
tile.planks_0.magic_planks.name=魔法树木板
tile.planks_0.mahogany_planks.name=桃花心树木板
tile.plant_0.shortgrass.name=短草
tile.plant_0.mediumgrass.name=中草
tile.plant_0.bush.name=灌木
tile.plant_0.sprout.name=萌芽
tile.plant_0.poisonivy.name=毒常春藤
tile.planks_0.mangrove_planks.name=红树木板
tile.planks_0.palm_planks.name=棕榈树木板
tile.planks_0.pine_planks.name=松树木板
tile.planks_0.redwood_planks.name=红木木板
tile.planks_0.sacred_oak_planks.name=神圣橡树木板
tile.planks_0.umbran_planks.name=暗影木板
tile.planks_0.willow_planks.name=柳树木板
tile.plant_0.berrybush.name=浆果灌木
tile.plant_0.shrub.name=灌木
tile.plant_0.wheatgrass.name=小麦草
tile.plant_0.dampgrass.name=潮湿的草
tile.plant_0.koru.name=Koru
tile.plant_0.bush.name=灌木
tile.plant_0.cloverpatch.name=三叶草
tile.plant_0.leafpile.name=落叶堆
tile.plant_0.deadleafpile.name=死落叶堆
tile.plant_0.deadgrass.name=死草
tile.plant_0.dampgrass.name=潮湿的草
tile.plant_0.deadgrass.name=枯草
tile.plant_0.deadleafpile.name=枯叶堆
tile.plant_0.desertgrass.name=沙漠草
tile.plant_0.desertsprouts.name=沙漠萌芽
tile.plant_1.dunegrass.name=沙丘草
tile.plant_1.spectralfern.name=光谱蕨
tile.plant_1.thorn.name=荆棘
tile.plant_1.wildrice.name=野生稻
tile.plant_0.koru.name=银蕨
tile.plant_0.leafpile.name=落叶堆
tile.plant_0.mediumgrass.name=中草
tile.plant_0.poisonivy.name=毒常春藤
tile.plant_0.shortgrass.name=短草
tile.plant_0.shrub.name=灌木
tile.plant_0.sprout.name=萌芽
tile.plant_0.wheatgrass.name=小麦草
tile.plant_1.cattail.name=香蒲
tile.plant_1.rivercane.name=河藤
tile.plant_1.wildcarrot_block.name=野生胡萝卜
tile.plant_1.tinycactus.name=仙人掌
tile.plant_1.witherwart.name=枯萎地狱疣
tile.plant_1.dunegrass.name=沙丘草
tile.plant_1.rafflesia.name=大花草
tile.plant_1.reed.name=芦苇
tile.plant_1.rivercane.name=河藤
tile.plant_1.root.name=根
tile.polished_limestone_slab.name=光滑石灰岩台阶
tile.polished_siltstone_slab.name=光滑粉砂台阶
tile.polished_shale_slab.name=光滑页岩台阶
tile.plant_1.spectralfern.name=幽灵蕨
tile.plant_1.thorn.name=荆棘
tile.plant_1.tinycactus.name=仙人掌
tile.plant_1.wildrice.name=野生稻
tile.plant_1.witherwart.name=枯萎地狱疣
tile.redwood_fence.name=红木栅栏
tile.redwood_fence_gate.name=红木栅栏门
tile.redwood_wood_slab.name=红木台阶
tile.redwood_stairs.name=红木楼梯
tile.redwood_wood_slab.name=红木台阶
tile.sacred_oak_fence.name=神圣橡树栅栏
tile.sacred_oak_fence_gate.name=神圣橡树栅栏门
tile.sacred_oak_wood_slab.name=神圣橡树台阶
tile.sacred_oak_stairs=神圣橡树楼梯
tile.sapling_0.yellow_autumn_sapling.name=黄色秋天树苗
tile.sapling_0.orange_autumn_sapling.name=橙色秋天树苗
tile.sacred_oak_wood_slab.name=神圣橡树台阶
tile.sand.quicksand.name=流沙
tile.sapling_0.bamboo_sapling.name=竹子树苗
tile.sapling_0.magic_sapling.name=魔法树树苗
tile.sapling_0.dark_sapling.name=黑暗树树苗
tile.sapling_0.dead_sapling.name=垂死树树苗
tile.sapling_0.fir_sapling.name=杉树树苗
tile.sapling_0.dead_sapling.name=亡树树苗
tile.sapling_0.ethereal_sapling.name=天域树树苗
tile.sapling_1.origin_sapling.name=Origin 树苗
tile.sapling_1.pink_cherry_sapling.name=粉色樱花树树苗
tile.sapling_1.white_cherry_sapling.name=白色樱花树树苗
tile.sapling_1.maple_sapling.name=枫树树苗
tile.sapling_0.fir_sapling.name=杉树树苗
tile.sapling_0.magic_sapling.name=魔法树树苗
tile.sapling_0.orange_autumn_sapling.name=橙秋树苗
tile.sapling_0.umbran_sapling.name=暗影树树苗
tile.sapling_0.yellow_autumn_sapling.name=黄秋树苗
tile.sapling_1.flowering_sapling.name=开花橡树树苗
tile.sapling_1.hellbark_sapling.name=地狱皮树树苗
tile.sapling_1.flowering_sapling.name=Flowering Oak 树苗
tile.sapling_1.jacaranda_sapling.name=蓝花楹树树苗
tile.sapling_1.maple_sapling.name=枫树树苗
tile.sapling_1.origin_sapling.name=远古树苗
tile.sapling_1.pink_cherry_sapling.name=粉色樱花树树苗
tile.sapling_1.sacred_oak_sapling.name=神圣橡树树苗
tile.sapling_1.white_cherry_sapling.name=白色樱花树树苗
tile.sapling_2.ebony_sapling.name=乌木树苗
tile.sapling_2.eucalyptus_sapling.name=桉树树苗
tile.sapling_2.mahogany_sapling.name=桃花心树树苗
tile.sapling_2.mangrove_sapling.name=红树树苗
tile.sapling_2.palm_sapling.name=棕榈树树苗
tile.sapling_2.pine_sapling.name=松树树苗
tile.sapling_2.redwood_sapling.name=红木树苗
tile.sapling_2.willow_sapling.name=柳树树苗
tile.sapling_2.pine_sapling.name=松树树苗
tile.sapling_2.mahogany_sapling.name=桃花心树树苗
tile.seaweed.kelp.name=海带
tile.shale_slab.name=页岩台阶
tile.siltstone_slab.name=粉砂台阶
tile.stone.limestone.name=石灰岩
tile.stone.polished_limestone.name=光滑石灰岩
tile.stone.siltstone.name=粉砂
tile.stone.polished_shale.name=光滑页
tile.stone.polished_siltstone.name=光滑粉砂岩
tile.stone.shale.name=页岩
tile.stone.polished_shale.name=光滑页岩
tile.stone_formations.stalagmite.name=石笋
tile.stone_formations.stalactite.name=钟乳石
tile.tree_moss.name=树苔藓
tile.stone.siltstone.name=粉砂岩
tile.terrarium.terrarium_bamboo.name=竹子盆景
tile.terrarium.terrarium_cactus.name=仙人掌盆景
tile.terrarium.terrarium_dead.name=亡树盆景
tile.terrarium.terrarium_ender.name=末地盆景
tile.terrarium.terrarium_fern.name=蕨盆景
tile.terrarium.terrarium_flax.name=亚麻植物盆景
tile.terrarium.terrarium_flower.name=鲜花盆景
tile.terrarium.terrarium_glowshroom.name=萤菇盆景
tile.terrarium.terrarium_koru.name=银蕨盆景
tile.terrarium.terrarium_mushroom.name=菌类盆景
tile.terrarium.terrarium_mystic.name=神秘盆景
tile.terrarium.terrarium_nether.name=地獄盆景
tile.terrarium.terrarium_ominous.name=不详的盆景
tile.terrarium.terrarium_origin.name=远古盆景
tile.terrarium.terrarium_sapling.name=树苗盆景
tile.terrarium.terrarium_wasteland.name=荒地盆景
tile.tree_moss.name=树青苔
tile.turnip_block.name=芜青
tile.umbran_fence.name=暗影树栅栏
tile.umbran_fence_gate.name=暗影树栅栏门
tile.umbran_stairs.name=暗影树楼梯
tile.umbran_wood_slab.name=暗影树台阶
tile.waterlily.duckweed.name=浮萍
tile.waterlily.lily_medium.name=中型睡莲
tile.waterlily.lily_small.name=小型睡莲
tile.waterlily.lily_tiny.name=小浮萍
tile.willow_fence.name=柳树栅栏
tile.willow_fence_gate.name=柳树栅栏门
tile.willow_wood_slab.name=柳树台阶
tile.willow_stairs.name=柳树楼梯
tile.wisteria.name=紫藤
tile.ash_stone.name=火山灰岩
tile.hard_sand.name=硬化沙子
tile.hard_dirt.name=硬化泥土
tile.hard_ice.name=硬化冰块
tile.dried_dirt.name=干燥泥土
tile.crag_rock.name=崖壁岩石
tile.mud_brick.name=泥巴砖块
tile.crystal.name=仙域水晶
tile.willow_wood_slab.name=柳树台阶