From 890f009c4906a37262d18fd3d210eaa1941e9d34 Mon Sep 17 00:00:00 2001 From: Cheeserolls Date: Sat, 11 Apr 2015 21:43:31 +0100 Subject: [PATCH] Add BOP Plants (merged with foliage) deadgrass, desertgrass, desertsprouts, dunegrass, spectralfern, thorn, wildrice, cattail, rivercane, wildcarrot, tinycactus, witherwart, reed and root --- .../biomesoplenty/api/block/BOPBlocks.java | 3 +- .../api/block/BOPPlantEnums.java | 80 +++ .../java/biomesoplenty/api/item/BOPItems.java | 1 + .../biome/overworld/BiomeGenSteppe.java | 6 +- .../biome/overworld/BiomeGenThicket.java | 8 +- .../common/block/BlockBOPPlant.java | 582 ++++++++++++++++++ .../common/block/BlockBOPPlant0.java | 25 + .../common/block/BlockBOPPlant1.java | 25 + .../common/block/BlockFoliage.java | 360 ----------- .../biomesoplenty/common/init/ModBlocks.java | 6 +- .../biomesoplenty/common/init/ModItems.java | 16 +- .../biomesoplenty/blockstates/cheese0.json | 5 - .../biomesoplenty/blockstates/cheese1.json | 5 - .../{foliage.json => plant_0.json} | 5 +- .../biomesoplenty/blockstates/plant_1.json | 15 + .../biomesoplenty/models/block/cattail.json | 6 + .../models/block/cloverpatch.json | 2 +- .../biomesoplenty/models/block/deadgrass.json | 6 + .../models/block/deadleafpile.json | 2 +- .../models/block/desertgrass.json | 6 + .../models/block/desertsprouts.json | 6 + .../biomesoplenty/models/block/dunegrass.json | 6 + .../biomesoplenty/models/block/leafpile.json | 2 +- .../biomesoplenty/models/block/reed.json | 6 + .../biomesoplenty/models/block/rivercane.json | 6 + .../biomesoplenty/models/block/root.json | 6 + .../biomesoplenty/models/block/shrub.json | 2 +- .../models/block/spectralfern.json | 6 + .../biomesoplenty/models/block/thorn.json | 6 + .../models/block/tinycactus.json | 6 + .../models/block/wildcarrot_block.json | 6 + .../biomesoplenty/models/block/wildrice.json | 6 + .../models/block/witherwart.json | 6 + .../biomesoplenty/models/item/berrybush.json | 1 + .../biomesoplenty/models/item/bush.json | 1 + .../biomesoplenty/models/item/cattail.json | 19 + .../models/item/cloverpatch.json | 3 +- .../biomesoplenty/models/item/dampgrass.json | 1 + .../biomesoplenty/models/item/deadgrass.json | 19 + .../models/item/deadleafpile.json | 1 + .../models/item/desertgrass.json | 19 + .../models/item/desertsprouts.json | 19 + .../biomesoplenty/models/item/dunegrass.json | 19 + .../biomesoplenty/models/item/koru.json | 1 + .../biomesoplenty/models/item/leafpile.json | 1 + .../models/item/mediumgrass.json | 1 + .../biomesoplenty/models/item/poisonivy.json | 1 + .../biomesoplenty/models/item/reed.json | 19 + .../biomesoplenty/models/item/rivercane.json | 19 + .../biomesoplenty/models/item/root.json | 19 + .../biomesoplenty/models/item/shortgrass.json | 1 + .../biomesoplenty/models/item/shrub.json | 1 + .../models/item/spectralfern.json | 19 + .../biomesoplenty/models/item/sprout.json | 1 + .../biomesoplenty/models/item/thorn.json | 19 + .../biomesoplenty/models/item/tinycactus.json | 19 + .../biomesoplenty/models/item/wheatgrass.json | 1 + .../models/item/wildcarrot_block.json | 19 + .../models/item/wildcarrots.json | 18 + .../biomesoplenty/models/item/wildrice.json | 19 + .../biomesoplenty/models/item/witherwart.json | 19 + .../biomesoplenty/textures/blocks/cattail.png | Bin 0 -> 593 bytes .../textures/blocks/deadgrass.png | Bin 0 -> 338 bytes .../textures/blocks/desertgrass.png | Bin 0 -> 395 bytes .../textures/blocks/desertsprouts.png | Bin 0 -> 340 bytes .../textures/blocks/dunegrass.png | Bin 0 -> 616 bytes .../biomesoplenty/textures/blocks/reed.png | Bin 0 -> 592 bytes .../textures/blocks/rivercane.png | Bin 0 -> 518 bytes .../biomesoplenty/textures/blocks/root.png | Bin 0 -> 501 bytes .../textures/blocks/spectralfern.png | Bin 0 -> 282 bytes .../biomesoplenty/textures/blocks/thorn.png | Bin 0 -> 345 bytes .../textures/blocks/tinycactus.png | Bin 0 -> 590 bytes .../textures/blocks/wildcarrot.png | Bin 0 -> 519 bytes .../textures/blocks/wildrice.png | Bin 0 -> 699 bytes .../textures/blocks/witherwart.png | Bin 0 -> 392 bytes .../textures/items/wildcarrots.png | Bin 0 -> 470 bytes 76 files changed, 1133 insertions(+), 400 deletions(-) create mode 100644 src/main/java/biomesoplenty/api/block/BOPPlantEnums.java create mode 100644 src/main/java/biomesoplenty/common/block/BlockBOPPlant.java create mode 100644 src/main/java/biomesoplenty/common/block/BlockBOPPlant0.java create mode 100644 src/main/java/biomesoplenty/common/block/BlockBOPPlant1.java delete mode 100644 src/main/java/biomesoplenty/common/block/BlockFoliage.java delete mode 100644 src/main/resources/assets/biomesoplenty/blockstates/cheese0.json delete mode 100644 src/main/resources/assets/biomesoplenty/blockstates/cheese1.json rename src/main/resources/assets/biomesoplenty/blockstates/{foliage.json => plant_0.json} (79%) create mode 100644 src/main/resources/assets/biomesoplenty/blockstates/plant_1.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/cattail.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/deadgrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/desertgrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/desertsprouts.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/dunegrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/reed.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/rivercane.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/root.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/spectralfern.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/thorn.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/tinycactus.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/wildcarrot_block.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/wildrice.json create mode 100644 src/main/resources/assets/biomesoplenty/models/block/witherwart.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/cattail.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/deadgrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/desertgrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/desertsprouts.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/dunegrass.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/reed.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/rivercane.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/root.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/spectralfern.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/thorn.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/tinycactus.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/wildcarrot_block.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/wildcarrots.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/wildrice.json create mode 100644 src/main/resources/assets/biomesoplenty/models/item/witherwart.json create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/cattail.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/deadgrass.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/desertgrass.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/desertsprouts.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/dunegrass.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/reed.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/rivercane.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/root.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/spectralfern.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/thorn.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/tinycactus.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/wildcarrot.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/wildrice.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/witherwart.png create mode 100644 src/main/resources/assets/biomesoplenty/textures/items/wildcarrots.png diff --git a/src/main/java/biomesoplenty/api/block/BOPBlocks.java b/src/main/java/biomesoplenty/api/block/BOPBlocks.java index 1f7010966..9dbbcacd3 100644 --- a/src/main/java/biomesoplenty/api/block/BOPBlocks.java +++ b/src/main/java/biomesoplenty/api/block/BOPBlocks.java @@ -124,7 +124,8 @@ public class BOPBlocks public static Block tree_moss; public static Block wisteria; - public static Block foliage; + public static Block plant_0; + public static Block plant_1; public static Block double_foliage; public static Block honey_block; diff --git a/src/main/java/biomesoplenty/api/block/BOPPlantEnums.java b/src/main/java/biomesoplenty/api/block/BOPPlantEnums.java new file mode 100644 index 000000000..9f3ed3c29 --- /dev/null +++ b/src/main/java/biomesoplenty/api/block/BOPPlantEnums.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright 2014, 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.api.block; + +import java.util.HashMap; +import java.util.Map; + +import com.google.common.base.Predicate; + +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.util.IStringSerializable; + +public class BOPPlantEnums +{ + + public static enum AllPlants implements IStringSerializable { + + SHORTGRASS, MEDIUMGRASS, BUSH, SPROUT, POISONIVY, BERRYBUSH, SHRUB, WHEATGRASS, DAMPGRASS, KORU, CLOVERPATCH, LEAFPILE, DEADLEAFPILE, DEADGRASS, DESERTGRASS, DESERTSPROUTS, DUNEGRASS, SPECTRALFERN, THORN, WILDRICE, CATTAIL, RIVERCANE, WILDCARROT, TINYCACTUS, WITHERWART, REED, ROOT; + + @Override + public String getName() { + return this.name().toLowerCase(); + } + @Override + public String toString() + { + return this.getName(); + } + } + + public static enum PlantsFilterType { + ALL; + public Predicate getPredicate(final int pageNum, final int numPerPage) + { + // final PlantsFilterType filterType = this; + return new Predicate() + { + @Override + public boolean apply(AllPlants plant) + { + return (plant.ordinal() >= (numPerPage * pageNum)) && (plant.ordinal() < (numPerPage * (pageNum+1))); + } + }; + } + } + + private static Map propCache = new HashMap(); + + public static PropertyEnum getVariantProperty(int pageNum, int numPerPage) + { + return getVariantProperty(pageNum, numPerPage, PlantsFilterType.ALL); + } + + public static PropertyEnum getVariantProperty(int pageNum, int numPerPage, PlantsFilterType filterType) + { + // check length and make sure things are in bounds + int len = AllPlants.values().length; + int numPages = (int) Math.ceil( (double)len / numPerPage); + pageNum = Math.max(0, Math.min(pageNum, numPages - 1)); + + // look up the array of properties for pages of size numPerPage and the given filter - if it doesn't exist yet, create it + Integer index = new Integer(numPerPage * PlantsFilterType.values().length + filterType.ordinal() ); + if (!propCache.containsKey(index)) {propCache.put(index, new PropertyEnum[numPages]);} + + // look up the property for page pageNum - if it doesn't exist yet, create it + PropertyEnum[] propArr = propCache.get(index); + if (propArr[pageNum] == null) + { + propArr[pageNum] = PropertyEnum.create("variant", AllPlants.class, filterType.getPredicate(pageNum, numPerPage)); + } + return propArr[pageNum]; + } + +} \ No newline at end of file diff --git a/src/main/java/biomesoplenty/api/item/BOPItems.java b/src/main/java/biomesoplenty/api/item/BOPItems.java index b8f3a6e2b..ead683508 100644 --- a/src/main/java/biomesoplenty/api/item/BOPItems.java +++ b/src/main/java/biomesoplenty/api/item/BOPItems.java @@ -25,6 +25,7 @@ public class BOPItems public static Item gem; public static Item ash; public static Item berries; + public static Item wildcarrots; public static Item sacred_oak_door; public static Item cherry_door; diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenSteppe.java b/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenSteppe.java index 583682b3d..0f462c5de 100644 --- a/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenSteppe.java +++ b/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenSteppe.java @@ -15,8 +15,8 @@ import net.minecraftforge.common.BiomeManager.BiomeType; import biomesoplenty.api.biome.BOPBiome; import biomesoplenty.api.biome.generation.GeneratorStage; import biomesoplenty.api.block.BOPBlocks; -import biomesoplenty.common.block.BlockFoliage; -import biomesoplenty.common.block.BlockFoliage.FoliageType; +import biomesoplenty.api.block.BOPPlantEnums.AllPlants; +import biomesoplenty.common.block.BlockBOPPlant; import biomesoplenty.common.block.BlockGem; import biomesoplenty.common.block.BlockGem.GemType; import biomesoplenty.common.world.feature.GeneratorGrass; @@ -37,7 +37,7 @@ public class BiomeGenSteppe extends BOPBiome this.spawnableCreatureList.add(new SpawnListEntry(EntityHorse.class, 5, 2, 6)); this.addGenerator("dead_bushes", GeneratorStage.DEAD_BUSH, new GeneratorGrass(3, Blocks.deadbush.getDefaultState(), 4)); - this.addGenerator("grass", GeneratorStage.GRASS, new GeneratorGrass(15, BOPBlocks.foliage.getDefaultState().withProperty(BlockFoliage.VARIANT, FoliageType.SHORTGRASS))); + this.addGenerator("grass", GeneratorStage.GRASS, new GeneratorGrass(15, BlockBOPPlant.getVariantState(AllPlants.SHORTGRASS))); this.addGenerator("ruby", GeneratorStage.SAND, new GeneratorOreSingle(BOPBlocks.gem_ore.getDefaultState().withProperty(BlockGem.VARIANT, GemType.RUBY), 12, 4, 32)); } diff --git a/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenThicket.java b/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenThicket.java index f3f95f885..2d1f04e59 100644 --- a/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenThicket.java +++ b/src/main/java/biomesoplenty/common/biome/overworld/BiomeGenThicket.java @@ -15,9 +15,9 @@ 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.BlockFoliage; +import biomesoplenty.api.block.BOPPlantEnums.AllPlants; +import biomesoplenty.common.block.BlockBOPPlant; import biomesoplenty.common.block.BlockGem; -import biomesoplenty.common.block.BlockFoliage.FoliageType; import biomesoplenty.common.block.BlockGem.GemType; import biomesoplenty.common.world.feature.GeneratorFlora; import biomesoplenty.common.world.feature.GeneratorOreSingle; @@ -44,8 +44,8 @@ public class BiomeGenThicket extends BOPBiome //TODO: Add the rest of the generators, requires plant blocks this.addGenerator("flowers", GeneratorStage.FLOWERS, new GeneratorFlora(5, Blocks.red_flower.getDefaultState())); //this.addGenerator("thorns", GeneratorStage.FLOWERS, new GeneratorFlora(55, BOPBlocks.foliage.getDefaultState().withProperty(BlockBOPPlant., FoliageType.LEAFPILE)); - this.addGenerator("leaf_piles", GeneratorStage.FLOWERS, new GeneratorFlora(5, BOPBlocks.foliage.getDefaultState().withProperty(BlockFoliage.VARIANT, FoliageType.LEAFPILE))); - this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS, new GeneratorFlora(10, BOPBlocks.foliage.getDefaultState().withProperty(BlockFoliage.VARIANT, FoliageType.DEADLEAFPILE))); + this.addGenerator("leaf_piles", GeneratorStage.FLOWERS, new GeneratorFlora(5, BlockBOPPlant.getVariantState(AllPlants.LEAFPILE))); + this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS, new GeneratorFlora(10, BlockBOPPlant.getVariantState(AllPlants.DEADLEAFPILE))); this.addGenerator("amber", GeneratorStage.SAND, new GeneratorOreSingle(BOPBlocks.gem_ore.getDefaultState().withProperty(BlockGem.VARIANT, GemType.AMBER), 12, 4, 32)); } diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java b/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java new file mode 100644 index 000000000..8b69148c2 --- /dev/null +++ b/src/main/java/biomesoplenty/common/block/BlockBOPPlant.java @@ -0,0 +1,582 @@ +/******************************************************************************* + * Copyright 2014, 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.block; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import biomesoplenty.api.block.BOPBlocks; +import biomesoplenty.api.block.BOPPlantEnums; +import biomesoplenty.api.block.BOPPlantEnums.AllPlants; +import biomesoplenty.api.item.BOPItems; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyEnum; +import net.minecraft.block.state.BlockState; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemShears; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.world.ColorizerGrass; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeColorHelper; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.IShearable; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +// TODO: shrub needs custom item texture +// TODO: double cattail +// TODO: placing reeds +// TODO: pick block? + +public abstract class BlockBOPPlant extends BlockDecoration implements IShearable +{ + + + // setup paged variant property + + // All 4 meta bits available for VARIANT which means we can have sixteen per instance + public static final int VARIANTS_PER_PAGE = 16; + // child classes must implement to define their page number + abstract public int getPageNum(); + // fetch the variant property for a given page + public static PropertyEnum getVariantProperty(int pageNum) + { + return BOPPlantEnums.getVariantProperty(pageNum, VARIANTS_PER_PAGE); + } + // fetch the current instance's variant property + public PropertyEnum getMyVariantProperty() + { + return getVariantProperty(getPageNum()); + } + // get the meta bits from the variant + public int metaFromVariant(AllPlants plant) + { + return plant.ordinal() % VARIANTS_PER_PAGE; + } + // get the variant from meta bits (safely) + public AllPlants variantFromMeta(int meta) + { + int i = Math.max(0, Math.min(meta + (this.getPageNum() * VARIANTS_PER_PAGE), AllPlants.values().length)); + return AllPlants.values()[i]; + } + // store reference to each created instance, indexed by page num, so that later we can look up the right BlockFoliage instance for a particular variant + private static Map instances = new HashMap(); + + // get the BlockFoliage instance for the given variant + public static BlockBOPPlant getVariantBlock(AllPlants plant) + { + int pageNum = plant.ordinal() / VARIANTS_PER_PAGE; + BlockBOPPlant block = instances.get(pageNum); + if (block == null) {throw new IllegalArgumentException("No BlockFoliage instance created yet for page "+pageNum);} + return block; + } + // get the default block state for the given variant + public static IBlockState getVariantState(AllPlants plant) + { + BlockBOPPlant block = getVariantBlock(plant); + return block.getDefaultState().withProperty(block.getMyVariantProperty() , plant); + } + // get the item representation of the given variant + public static ItemStack getVariantItem(AllPlants plant, int howMany) + { + return new ItemStack(getVariantBlock(plant), howMany, getVariantBlock(plant).getMetaFromState(getVariantState(plant))); + } + public static ItemStack getVariantItem(AllPlants plant) + { + return getVariantItem(plant, 1); + } + + + + @Override + protected BlockState createBlockState() {return new BlockState(this, new IProperty[] { getMyVariantProperty() });} + + + // implement IBOPBlock + @Override + public IProperty[] getPresetProperties() { return new IProperty[] { getMyVariantProperty() }; } + @Override + public IProperty[] getNonRenderingProperties() { return null; } + @Override + public String getStateName(IBlockState state) + { + AllPlants plant = (AllPlants) state.getValue(getMyVariantProperty()); + switch (plant) + { + case WILDCARROT: + return plant.getName() + "_block"; + default: + return plant.getName(); + } + } + + public BlockBOPPlant() + { + super(); + // save a reference to this instance so that later we can look up the right BlockFoliage instance for a particular variant + instances.put(this.getPageNum(), this); + this.setDefaultState( this.blockState.getBaseState() ); + } + + // map from state to meta and vice verca + @Override + public IBlockState getStateFromMeta(int meta) + { + return this.getDefaultState().withProperty(getMyVariantProperty(), variantFromMeta(meta)); + } + @Override + public int getMetaFromState(IBlockState state) + { + return metaFromVariant((AllPlants) state.getValue(getMyVariantProperty())); + } + + + // get the items dropped when you bash the bush + @Override + public List getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) + { + Random rand = world instanceof World ? ((World)world).rand : RANDOM; + + // start with an empty stack + List ret = new java.util.ArrayList(); + + // add items based on the VARIANT + AllPlants plant = (AllPlants) state.getValue(getMyVariantProperty()); + switch (plant) + { + case SHORTGRASS: case MEDIUMGRASS: case WHEATGRASS: case DAMPGRASS: + if (rand.nextInt(8) == 0) + { + // 1 in 8 chance of getting a seed from this grass + ret.add(ForgeHooks.getGrassSeed(rand)); + } + break; + + case SPROUT: + if (rand.nextInt(50) == 0) + { + // in in 50 chance of getting a carrot or potato from SPROUT + ret.add(new ItemStack(rand.nextInt(2) == 0 ? Items.carrot : Items.potato)); + } + break; + + case KORU: + if (rand.nextInt(64) == 0) + { + // 1 in 64 change of getting a turnip seed from KORU + ret.add(new ItemStack(BOPItems.turnip_seeds)); + } + break; + + case BERRYBUSH: + // BERRYBUSH always drops berries + ret.add(new ItemStack(BOPItems.berries)); + break; + + case WILDRICE: + // wildrice drops itself only 1 in 5 times + if (rand.nextInt(5) == 0) + { + ret.add(getVariantItem(plant)); + } + break; + + case WILDCARROT: + ret.add(new ItemStack(BOPItems.wildcarrots)); + break; + + case CATTAIL: case RIVERCANE: case TINYCACTUS: case WITHERWART: case REED: case ROOT: + // these variants drop themselves as items + ret.add(getVariantItem(plant)); + break; + + default: + // the rest drop nothing + break; + } + return ret; + + } + + @Override + public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, TileEntity tileentity) + { + super.harvestBlock(world, player, pos, state, tileentity); + boolean usingShears = (player.getCurrentEquippedItem() == null || !(player.getCurrentEquippedItem().getItem() instanceof ItemShears)); + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + // suffer cactus damage if you harvest thorn without shears + case THORN: + if (!usingShears) + { + player.attackEntityFrom(DamageSource.cactus, 2); + } + break; + + default: + break; + } + } + + @Override + @SideOnly(Side.CLIENT) + public boolean addDestroyEffects(World world, BlockPos pos, net.minecraft.client.particle.EffectRenderer effectRenderer) + { + IBlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + // make sure the block at pos is actually this block (according to the comments in Block.addDestroyEffects, it might not be...) + if (block != this) {return false;} + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case WITHERWART: + byte n = 3; + for (byte i = 0; i < n; i++) + { + for (byte j = 0; j < n; j++) + { + for (byte k = 0; k < n; k++) + { + double x = pos.getX() + (i + 0.5D) / n; + double y = pos.getY() + (j + 0.5D) / n; + double z = pos.getZ() + (k + 0.5D) / n; + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x, y, z, 0.0D, 0.0D, 0.0D); + } + } + } + break; + + default: + break; + + + } + return false; + } + + + + + // TODO: comment these + @Override + @SideOnly(Side.CLIENT) + public int getBlockColor() + { + return ColorizerGrass.getGrassColor(0.5D, 1.0D); + } + + @Override + @SideOnly(Side.CLIENT) + public int getRenderColor(IBlockState state) + { + return this.getBlockColor(); + } + + @Override + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass) + { + IBlockState state = worldIn.getBlockState(pos); + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case SHRUB: case LEAFPILE: + return BiomeColorHelper.getFoliageColorAtPos(worldIn, pos); + case DEADLEAFPILE: + return 0xFFFFFF; + default: + return BiomeColorHelper.getGrassColorAtPos(worldIn, pos); + } + } + + // berrybush item should not be tinted, even though the model is + @Override + public int getItemRenderColor(IBlockState state, int tintIndex) + { + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case BERRYBUSH: + return 0xFFFFFF; + default: + return this.getRenderColor(state); + } + } + + // different variants have different sizes + @Override + public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) + { + IBlockState state = worldIn.getBlockState(pos); + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case CLOVERPATCH: case LEAFPILE: case DEADLEAFPILE: + this.setBlockBoundsByRadiusAndHeight(0.5F, 0.015625F); + break; + case SHORTGRASS: + this.setBlockBounds(0.1F, 0F, 0.1F, 0.9F, 0.25F, 0.9F); + break; + case MEDIUMGRASS: + this.setBlockBounds(0.1F, 0F, 0.1F, 0.9F, 0.6F, 0.9F); + break; + case CATTAIL: + this.setBlockBoundsByRadiusAndHeight(0.375F, 1.0F); + break; + case TINYCACTUS: + // TODO: what on earth is this madness? Does it just cause some random scattering? + long i1 = pos.getX() * 3129871 ^ pos.getZ() * 116129781L ^ pos.getY(); + i1 = i1 * i1 * 42317861L + i1 * 11L; + float d0 = (float)(((i1 >> 16 & 15L) / 15.0F - 0.5D) * 0.5D); + float d2 = (float)(((i1 >> 24 & 15L) / 15.0F - 0.5D) * 0.5D); + this.setBlockBounds(0.3F + d0, 0.0F, 0.3F + d2, 0.7F + d0, 0.4F, 0.7F + d2); + break; + case ROOT: + // roots hang from ceiling + this.setBlockBoundsByRadiusAndHeight(0.4F, 0.8F, true); + break; + default: + this.setBlockBoundsByRadiusAndHeight(0.4F, 0.8F); + break; + } + } + + + + + @Override + public boolean canBlockStay(World world, BlockPos pos, IBlockState state) + { + AllPlants plant = ((AllPlants) state.getValue(getMyVariantProperty())); + // roots hang down from above, all the others grow up from below + IBlockState adjacentBlockState = world.getBlockState(plant == AllPlants.ROOT ? pos.up() : pos.down()); + Block adjacentBlock = adjacentBlockState.getBlock(); + + // TODO: the 1.7 code contained this line: + // if (block == Blocks.air && world.provider.dimensionId != -1 ? (world.getFullBlockLightValue(x, y, z) >= 8 || world.canBlockSeeTheSky(x, y, z)) : false) return false; + // which can be expressed a bit more clearly as this: + // + // boolean notInNether = !(world.provider instanceof net.minecraft.world.WorldProviderHell); + // boolean inAir = (groundBlock == Blocks.air); + // boolean wellLit = (world.getLight(pos) >= 8 || world.canSeeSky(pos)); + // if (inAir && notInNether && wellLit) {return false;} + // + // That looks bonkers to me, so I'm ignoring it for now - need to ask the others + + boolean onFertile = (adjacentBlock == Blocks.dirt || adjacentBlock == BOPBlocks.dirt || adjacentBlock == Blocks.mycelium || adjacentBlock == Blocks.grass); + boolean onDry = (adjacentBlock == BOPBlocks.hard_dirt || adjacentBlock == Blocks.hardened_clay || adjacentBlock == Blocks.sand || adjacentBlock == BOPBlocks.hard_sand || adjacentBlock == Blocks.soul_sand); + boolean onSand = (adjacentBlock == Blocks.sand || adjacentBlock == Blocks.soul_sand); + boolean onGrass = (adjacentBlock == Blocks.grass); + boolean onSpectralMoss = false; + + if (adjacentBlock instanceof BlockBOPGrass) + { + switch ((BlockBOPGrass.BOPGrassType) adjacentBlockState.getValue(BlockBOPGrass.VARIANT)) + { + case SPECTRAL_MOSS: + onSpectralMoss = true; + break; + case SMOLDERING: + break; + case OVERGROWN_NETHERRACK: + onFertile = true; + break; + case LOAMY: case SANDY: case SILTY: case ORIGIN: default: + onFertile = true; + onGrass = true; + break; + } + } + switch (plant) + { + case DEADGRASS: case DESERTGRASS: case TINYCACTUS: + return onDry; + case DESERTSPROUTS: case DUNEGRASS: + return onSand; + case SPECTRALFERN: + return onSpectralMoss; + case THORN: + return onFertile || onSand; + case CATTAIL: + boolean hasWater = (world.getBlockState(pos.add(-1, -1, 0)).getBlock().getMaterial() == Material.water || world.getBlockState(pos.add(1,-1,0)).getBlock().getMaterial() == Material.water || world.getBlockState(pos.add(0,-1,-1)).getBlock().getMaterial() == Material.water || world.getBlockState(pos.add(0,-1,1)).getBlock().getMaterial() == Material.water); + return onGrass && hasWater; + case RIVERCANE: + boolean onSelf = ( (adjacentBlock instanceof BlockBOPPlant) && ((AllPlants) adjacentBlockState.getValue(((BlockBOPPlant)adjacentBlock).getMyVariantProperty()) == AllPlants.RIVERCANE) ); + return onSelf || onFertile; + case WITHERWART: + return (adjacentBlock == Blocks.soul_sand); + case REED: + // reed needs the ground block to be water, but the block below that to NOT be water + // TODO: reed is gonna have some trickiness with placing, implement as lily variation instead? + return (adjacentBlock == Blocks.water && world.getBlockState(pos.down().down()).getBlock() != Blocks.water); + default: + return onFertile; + } + + } + + + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + // poison ivy throws up occasional spell particles + case POISONIVY: + if (rand.nextInt(32)==0) + { + worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, (double)((float)pos.getX() + rand.nextFloat()), (double)((float)pos.getY() + 1.1F), (double)((float)pos.getZ() + rand.nextFloat()), 0.0D, 0.0D, 0.0D); + } + break; + + default: + break; + } + super.randomDisplayTick(worldIn, pos, state, rand); + } + + + @Override + public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) + { + super.updateTick(worldIn, pos, state, rand); + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case BUSH: + // every now and then berries grow on a bush + if (rand.nextInt(80) > 0 && worldIn.getLightFromNeighbors(pos.up()) >= 9) + { + worldIn.setBlockState(pos, getVariantState(AllPlants.BERRYBUSH)); + } + break; + + default: + break; + } + } + + + @Override + public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) + { + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case POISONIVY: + // poison ivy poisons players who walk into it + if (entity instanceof EntityPlayer) { + ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.poison.id, 100)); + } + break; + case THORN: case TINYCACTUS: + // thorns and tiny cacti harm players like a vanilla cactus unless the player is wearing leather boots and leather leggings + // TODO: should other types of armor protect from thorns? + if (entity instanceof EntityPlayer) { + InventoryPlayer inventory = ((EntityPlayer)entity).inventory; + boolean wearingLeatherBoots = (inventory.armorInventory[0] != null && inventory.armorInventory[0].getItem() == Items.leather_boots); + boolean wearingLeatherLeggings = (inventory.armorInventory[1] != null && inventory.armorInventory[1].getItem() == Items.leather_leggings); + if (!wearingLeatherBoots && !wearingLeatherLeggings) + { + entity.attackEntityFrom(DamageSource.cactus, 1); + } + } + break; + default: + break; + } + } + + @Override + public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) + { + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case BERRYBUSH: + // an activated berry bush turns into a regular bush and drops a berry + worldIn.setBlockState(pos, getVariantState(AllPlants.BUSH)); + EntityItem berries = new EntityItem(worldIn, (double)pos.getX(), (double)pos.getY(), (double)pos.getZ(), new ItemStack(BOPItems.berries)); + if (!worldIn.isRemote) + { + worldIn.spawnEntityInWorld(berries); + if (!(playerIn instanceof FakePlayer)) + { + berries.onCollideWithPlayer(playerIn); + } + return true; + } + break; + + default: + break; + } + return super.onBlockActivated(worldIn, pos, state, playerIn, side, hitX, hitY, hitZ); + } + + + @Override + public boolean isShearable(ItemStack item, IBlockAccess world, BlockPos pos) { + IBlockState state = world.getBlockState(pos); + switch ((AllPlants) state.getValue(getMyVariantProperty())) + { + case CATTAIL: case RIVERCANE: case WILDCARROT: + return false; + default: + return true; + } + } + + @Override + public List onSheared(ItemStack item, IBlockAccess world, BlockPos pos, int fortune) { + + // start with an empty stack + List ret = new java.util.ArrayList(); + + // add items based on the VARIANT + AllPlants plant = ((AllPlants) world.getBlockState(pos).getValue(getMyVariantProperty())); + switch (plant) + { + case CATTAIL: case RIVERCANE: case TINYCACTUS: case WITHERWART: case REED: case ROOT: + // these items drop themselves as items when the block is broken (from getDrops), so we don't want to add anything else for using shears + break; + + case BERRYBUSH: + // BERRYBUSH gives a regular bush when sheared (note this is in addition to the berry from getDrops) + IBlockState bush = getVariantState(AllPlants.BUSH); + ret.add(new ItemStack(bush.getBlock(), 1, this.getMetaFromState(bush))); + // ret.add(new ItemStack(BOPItems.berries, 1)); + break; + + default: + // for everything else, get the block as an item + ret.add(getVariantItem(plant)); + break; + } + return ret; + } + + + // TODO: pickblock on carrot? + +} diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPPlant0.java b/src/main/java/biomesoplenty/common/block/BlockBOPPlant0.java new file mode 100644 index 000000000..7500b2e0a --- /dev/null +++ b/src/main/java/biomesoplenty/common/block/BlockBOPPlant0.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright 2014, 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.block; + +import net.minecraft.block.properties.PropertyEnum; + +public class BlockBOPPlant0 extends BlockBOPPlant { + + public static final int PAGENUM = 0; + + // create a static reference to this block's variant property + // this is for convenience, and for consistency with other Block classes + public static final PropertyEnum VARIANT = BlockBOPPlant.getVariantProperty(PAGENUM); + + @Override + public int getPageNum() {return PAGENUM;} + +} diff --git a/src/main/java/biomesoplenty/common/block/BlockBOPPlant1.java b/src/main/java/biomesoplenty/common/block/BlockBOPPlant1.java new file mode 100644 index 000000000..31b65028b --- /dev/null +++ b/src/main/java/biomesoplenty/common/block/BlockBOPPlant1.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright 2014, 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.block; + +import net.minecraft.block.properties.PropertyEnum; + +public class BlockBOPPlant1 extends BlockBOPPlant { + + public static final int PAGENUM = 1; + + // create a static reference to this block's variant property + // this is for convenience, and for consistency with other Block classes + public static final PropertyEnum VARIANT = BlockBOPPlant.getVariantProperty(PAGENUM); + + @Override + public int getPageNum() {return PAGENUM;} + +} diff --git a/src/main/java/biomesoplenty/common/block/BlockFoliage.java b/src/main/java/biomesoplenty/common/block/BlockFoliage.java deleted file mode 100644 index 8d6456507..000000000 --- a/src/main/java/biomesoplenty/common/block/BlockFoliage.java +++ /dev/null @@ -1,360 +0,0 @@ -/******************************************************************************* - * Copyright 2014, 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.block; - -import java.util.List; -import java.util.Random; - -import biomesoplenty.api.block.BOPBlocks; -import biomesoplenty.api.item.BOPItems; -import net.minecraft.block.Block; -import net.minecraft.block.properties.IProperty; -import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.state.BlockState; -import net.minecraft.block.state.IBlockState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.util.BlockPos; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.IStringSerializable; -import net.minecraft.world.ColorizerGrass; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraft.world.biome.BiomeColorHelper; -import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.IShearable; -import net.minecraftforge.common.util.FakePlayer; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -public class BlockFoliage extends BlockDecoration implements IShearable -{ - - // add properties - public static enum FoliageType implements IStringSerializable - { - SHORTGRASS, MEDIUMGRASS, BUSH, SPROUT, POISONIVY, BERRYBUSH, SHRUB, WHEATGRASS, DAMPGRASS, KORU, CLOVERPATCH, LEAFPILE, DEADLEAFPILE; - @Override - public String getName() - { - return this.name().toLowerCase(); - } - @Override - public String toString() - { - return this.getName(); - } - }; - public static final PropertyEnum VARIANT = PropertyEnum.create("variant", FoliageType.class); - @Override - protected BlockState createBlockState() {return new BlockState(this, new IProperty[] { VARIANT });} - - - // implement IBOPBlock - @Override - public IProperty[] getPresetProperties() { return new IProperty[] {VARIANT}; } - @Override - public IProperty[] getNonRenderingProperties() { return null; } - @Override - public String getStateName(IBlockState state) - { - return ((FoliageType) state.getValue(VARIANT)).getName(); - } - - - public BlockFoliage() - { - super(); - this.setDefaultState( this.blockState.getBaseState().withProperty(VARIANT, FoliageType.SHORTGRASS) ); - } - - // map from state to meta and vice verca - @Override - public IBlockState getStateFromMeta(int meta) - { - return this.getDefaultState().withProperty(VARIANT, FoliageType.values()[meta < FoliageType.values().length ? meta : 0]); - } - @Override - public int getMetaFromState(IBlockState state) - { - return ((FoliageType) state.getValue(VARIANT)).ordinal(); - } - - - // get the items dropped when you bash the bush - @Override - public List getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) - { - Random rand = world instanceof World ? ((World)world).rand : RANDOM; - - // start with an empty stack - List ret = new java.util.ArrayList(); - - // add items based on the VARIANT - switch ((FoliageType) state.getValue(VARIANT)) - { - case SHORTGRASS: case MEDIUMGRASS: case WHEATGRASS: case DAMPGRASS: - if (rand.nextInt(8) == 0) - { - // 1 in 8 chance of getting a seed from this grass - ret.add(ForgeHooks.getGrassSeed(rand)); - } - break; - - case SPROUT: - if (rand.nextInt(50) == 0) - { - // in in 50 chance of getting a carrot or potato from SPROUT - ret.add(new ItemStack(rand.nextInt(2) == 0 ? Items.carrot : Items.potato)); - } - break; - - case KORU: - if (rand.nextInt(64) == 0) - { - // 1 in 64 change of getting a turnip seed from KORU - ret.add(new ItemStack(BOPItems.turnip_seeds)); - } - - case BERRYBUSH: - // BERRYBUSH always drops berries - ret.add(new ItemStack(BOPItems.berries)); - - default: - break; - } - return ret; - - } - - - - // TODO: comment these - @Override - @SideOnly(Side.CLIENT) - public int getBlockColor() - { - return ColorizerGrass.getGrassColor(0.5D, 1.0D); - } - - @Override - @SideOnly(Side.CLIENT) - public int getRenderColor(IBlockState state) - { - return this.getBlockColor(); - } - - @Override - @SideOnly(Side.CLIENT) - public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass) - { - switch ((FoliageType) worldIn.getBlockState(pos).getValue(VARIANT)) - { - case SHRUB: case LEAFPILE: - return BiomeColorHelper.getFoliageColorAtPos(worldIn, pos); - case DEADLEAFPILE: - return 0xFFFFFF; - default: - return BiomeColorHelper.getGrassColorAtPos(worldIn, pos); - } - } - - // berrybush item should not be tinted, even though the model is - @Override - public int getItemRenderColor(IBlockState state, int tintIndex) - { - switch ((FoliageType) state.getValue(VARIANT)) - { - case BERRYBUSH: - return 0xFFFFFF; - default: - return this.getRenderColor(state); - } - } - - // different variants have different sizes - @Override - public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) - { - switch ((FoliageType) worldIn.getBlockState(pos).getValue(VARIANT)) - { - case CLOVERPATCH: case LEAFPILE: case DEADLEAFPILE: - this.setBlockBoundsByRadiusAndHeight(0.5F, 0.015625F); - break; - case SHORTGRASS: - this.setBlockBounds(0.1F, 0F, 0.1F, 0.9F, 0.25F, 0.9F); - break; - case MEDIUMGRASS: - this.setBlockBounds(0.1F, 0F, 0.1F, 0.9F, 0.6F, 0.9F); - break; - default: - this.setBlockBoundsByRadiusAndHeight(0.4F, 0.8F); - break; - } - } - - - - - @Override - public boolean canBlockStay(World world, BlockPos pos, IBlockState state) - { - IBlockState groundState = world.getBlockState(pos.down()); - Block groundBlock = groundState.getBlock(); - - // TODO: the 1.7 code contained this line: - // if (block == Blocks.air && world.provider.dimensionId != -1 ? (world.getFullBlockLightValue(x, y, z) >= 8 || world.canBlockSeeTheSky(x, y, z)) : false) return false; - // which can be expressed a bit more clearly as this: - // - // boolean notInNether = !(world.provider instanceof net.minecraft.world.WorldProviderHell); - // boolean inAir = (groundBlock == Blocks.air); - // boolean wellLit = (world.getLight(pos) >= 8 || world.canSeeSky(pos)); - // if (inAir && notInNether && wellLit) {return false;} - // - // That looks bonkers to me, so I'm ignoring it for now - need to ask the others - - boolean onFertile = (groundBlock == Blocks.dirt || groundBlock == BOPBlocks.dirt || groundBlock == Blocks.mycelium || groundBlock == Blocks.grass); - if (groundBlock instanceof BlockBOPGrass) - { - switch ((BlockBOPGrass.BOPGrassType) groundState.getValue(BlockBOPGrass.VARIANT)) - { - case SPECTRAL_MOSS: case SMOLDERING: - break; - case OVERGROWN_NETHERRACK: case LOAMY: case SANDY: case SILTY: case ORIGIN: default: - onFertile = true; - break; - } - } - return onFertile; - } - - - - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { - switch ((FoliageType) state.getValue(VARIANT)) - { - // poison ivy throws up occasional spell particles - case POISONIVY: - if (rand.nextInt(32)==0) - { - worldIn.spawnParticle(EnumParticleTypes.SPELL_MOB, (double)((float)pos.getX() + rand.nextFloat()), (double)((float)pos.getY() + 1.1F), (double)((float)pos.getZ() + rand.nextFloat()), 0.0D, 0.0D, 0.0D); - } - break; - - default: - break; - } - super.randomDisplayTick(worldIn, pos, state, rand); - } - - - @Override - public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) - { - super.updateTick(worldIn, pos, state, rand); - switch ((FoliageType) state.getValue(VARIANT)) - { - case BUSH: - // every now and then berries grow on a bush - if (rand.nextInt(80) > 0 && worldIn.getLightFromNeighbors(pos.up()) >= 9) - { - worldIn.setBlockState(pos, state.withProperty(VARIANT, FoliageType.BERRYBUSH)); - } - break; - - default: - break; - } - } - - - @Override - public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) - { - switch ((FoliageType) state.getValue(VARIANT)) - { - case POISONIVY: - // poison ivy poisons players who walk into it - if (entity instanceof EntityPlayer) { - ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(Potion.poison.id, 100)); - } - break; - - default: - break; - } - } - - @Override - public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) - { - switch ((FoliageType) state.getValue(VARIANT)) - { - case BERRYBUSH: - // an activated berry bush turns into a regular bush and drops a berry - worldIn.setBlockState(pos, state.withProperty(VARIANT, FoliageType.BUSH)); - EntityItem berries = new EntityItem(worldIn, (double)pos.getX(), (double)pos.getY(), (double)pos.getZ(), new ItemStack(BOPItems.berries)); - if (!worldIn.isRemote) - { - worldIn.spawnEntityInWorld(berries); - if (!(playerIn instanceof FakePlayer)) - { - berries.onCollideWithPlayer(playerIn); - } - return true; - } - break; - - default: - break; - } - return super.onBlockActivated(worldIn, pos, state, playerIn, side, hitX, hitY, hitZ); - } - - - @Override - public boolean isShearable(ItemStack item, IBlockAccess world, BlockPos pos) { - return true; - } - - @Override - public List onSheared(ItemStack item, IBlockAccess world, BlockPos pos, int fortune) { - - // start with an empty stack - List ret = new java.util.ArrayList(); - - // add items based on the VARIANT - IBlockState state = world.getBlockState(pos); - switch ((FoliageType) state.getValue(VARIANT)) - { - case BERRYBUSH: - // BERRYBUSH gives a regular bush and a berry when sheared - ret.add(new ItemStack(this, 1, this.getMetaFromState(this.getDefaultState().withProperty(VARIANT, FoliageType.BUSH)))); - ret.add(new ItemStack(BOPItems.berries, 1)); - break; - - default: - // default is to get the block unaltered - ret.add(new ItemStack(this, 1, this.getMetaFromState(state))); - break; - } - return ret; - } - -} \ No newline at end of file diff --git a/src/main/java/biomesoplenty/common/init/ModBlocks.java b/src/main/java/biomesoplenty/common/init/ModBlocks.java index d6d5db337..4024a7030 100644 --- a/src/main/java/biomesoplenty/common/init/ModBlocks.java +++ b/src/main/java/biomesoplenty/common/init/ModBlocks.java @@ -62,7 +62,8 @@ import biomesoplenty.common.block.BlockCoral; import biomesoplenty.common.block.BlockCrystal; import biomesoplenty.common.block.BlockDoubleFoliage; import biomesoplenty.common.block.BlockFlesh; -import biomesoplenty.common.block.BlockFoliage; +import biomesoplenty.common.block.BlockBOPPlant0; +import biomesoplenty.common.block.BlockBOPPlant1; import biomesoplenty.common.block.BlockFruit; import biomesoplenty.common.block.BlockGem; import biomesoplenty.common.block.BlockGemOre; @@ -220,7 +221,8 @@ public class ModBlocks tree_moss = registerBlock( new BlockBOPVine(false), "tree_moss" ); wisteria = registerBlock( new BlockBOPVine(false), "wisteria" ); - foliage = registerBlock( new BlockFoliage(), "foliage" ); + plant_0 = registerBlock( new BlockBOPPlant0(), "plant_0" ); + plant_1 = registerBlock( new BlockBOPPlant1(), "plant_1" ); double_foliage = registerBlock( new BlockDoubleFoliage(), "double_foliage" ); honey_block = registerBlock( new BlockHoney(), "honey_block" ); diff --git a/src/main/java/biomesoplenty/common/init/ModItems.java b/src/main/java/biomesoplenty/common/init/ModItems.java index 6df7132fb..a9bbe5c36 100644 --- a/src/main/java/biomesoplenty/common/init/ModItems.java +++ b/src/main/java/biomesoplenty/common/init/ModItems.java @@ -8,20 +8,7 @@ package biomesoplenty.common.init; -import static biomesoplenty.api.item.BOPItems.ash; -import static biomesoplenty.api.item.BOPItems.berries; -import static biomesoplenty.api.item.BOPItems.crystal_shard; -import static biomesoplenty.api.item.BOPItems.filled_honeycomb; -import static biomesoplenty.api.item.BOPItems.fleshchunk; -import static biomesoplenty.api.item.BOPItems.gem; -import static biomesoplenty.api.item.BOPItems.honeycomb; -import static biomesoplenty.api.item.BOPItems.mudball; -import static biomesoplenty.api.item.BOPItems.peach; -import static biomesoplenty.api.item.BOPItems.pear; -import static biomesoplenty.api.item.BOPItems.persimmon; -import static biomesoplenty.api.item.BOPItems.turnip; -import static biomesoplenty.api.item.BOPItems.turnip_seeds; -import static biomesoplenty.api.item.BOPItems.wading_boots; +import static biomesoplenty.api.item.BOPItems.*; import java.util.ArrayList; import java.util.List; @@ -64,6 +51,7 @@ public class ModItems gem = registerItem(new ItemGem(), "gem"); ash = registerItem(new Item(), "ash"); berries = registerItem(new ItemFood(1, 0.1F, false), "berries"); + wildcarrots = registerItem(new ItemFood(3, 0.5F, false), "wildcarrots"); // armor // TODO: do we really want durability of -1? does that mean it lasts forever? diff --git a/src/main/resources/assets/biomesoplenty/blockstates/cheese0.json b/src/main/resources/assets/biomesoplenty/blockstates/cheese0.json deleted file mode 100644 index a4b9ac4d2..000000000 --- a/src/main/resources/assets/biomesoplenty/blockstates/cheese0.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "biomesoplenty:ash_block" } - } -} diff --git a/src/main/resources/assets/biomesoplenty/blockstates/cheese1.json b/src/main/resources/assets/biomesoplenty/blockstates/cheese1.json deleted file mode 100644 index a4b9ac4d2..000000000 --- a/src/main/resources/assets/biomesoplenty/blockstates/cheese1.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "variants": { - "normal": { "model": "biomesoplenty:ash_block" } - } -} diff --git a/src/main/resources/assets/biomesoplenty/blockstates/foliage.json b/src/main/resources/assets/biomesoplenty/blockstates/plant_0.json similarity index 79% rename from src/main/resources/assets/biomesoplenty/blockstates/foliage.json rename to src/main/resources/assets/biomesoplenty/blockstates/plant_0.json index 5493e4878..c5d743852 100644 --- a/src/main/resources/assets/biomesoplenty/blockstates/foliage.json +++ b/src/main/resources/assets/biomesoplenty/blockstates/plant_0.json @@ -12,6 +12,9 @@ "variant=koru": { "model": "biomesoplenty:koru" }, "variant=cloverpatch": { "model": "biomesoplenty:cloverpatch" }, "variant=leafpile": { "model": "biomesoplenty:leafpile" }, - "variant=deadleafpile": { "model": "biomesoplenty:deadleafpile" } + "variant=deadleafpile": { "model": "biomesoplenty:deadleafpile" }, + "variant=deadgrass": { "model": "biomesoplenty:deadgrass" }, + "variant=desertgrass": { "model": "biomesoplenty:desertgrass" }, + "variant=desertsprouts": { "model": "biomesoplenty:desertsprouts" } } } \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/blockstates/plant_1.json b/src/main/resources/assets/biomesoplenty/blockstates/plant_1.json new file mode 100644 index 000000000..de907de5d --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/blockstates/plant_1.json @@ -0,0 +1,15 @@ +{ + "variants": { + "variant=dunegrass": { "model": "biomesoplenty:dunegrass" }, + "variant=spectralfern": { "model": "biomesoplenty:spectralfern" }, + "variant=thorn": { "model": "biomesoplenty:thorn" }, + "variant=wildrice": { "model": "biomesoplenty:wildrice" }, + "variant=cattail": { "model": "biomesoplenty:cattail" }, + "variant=rivercane": { "model": "biomesoplenty:rivercane" }, + "variant=wildcarrot": { "model": "biomesoplenty:wildcarrot_block" }, + "variant=tinycactus": { "model": "biomesoplenty:tinycactus" }, + "variant=witherwart": { "model": "biomesoplenty:witherwart" }, + "variant=reed": { "model": "biomesoplenty:reed" }, + "variant=root": { "model": "biomesoplenty:root" } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/cattail.json b/src/main/resources/assets/biomesoplenty/models/block/cattail.json new file mode 100644 index 000000000..4fe030c2e --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/cattail.json @@ -0,0 +1,6 @@ +{ + "parent": "block/crop", + "textures": { + "crop": "biomesoplenty:blocks/cattail" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/cloverpatch.json b/src/main/resources/assets/biomesoplenty/models/block/cloverpatch.json index 5228c8d42..61c304c40 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/cloverpatch.json +++ b/src/main/resources/assets/biomesoplenty/models/block/cloverpatch.json @@ -3,4 +3,4 @@ "textures": { "texture": "biomesoplenty:blocks/cloverpatch" } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/deadgrass.json b/src/main/resources/assets/biomesoplenty/models/block/deadgrass.json new file mode 100644 index 000000000..d483613c1 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/deadgrass.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/deadgrass" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/deadleafpile.json b/src/main/resources/assets/biomesoplenty/models/block/deadleafpile.json index ba6868d53..973c37e20 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/deadleafpile.json +++ b/src/main/resources/assets/biomesoplenty/models/block/deadleafpile.json @@ -3,4 +3,4 @@ "textures": { "texture": "biomesoplenty:blocks/deadleafpile" } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/desertgrass.json b/src/main/resources/assets/biomesoplenty/models/block/desertgrass.json new file mode 100644 index 000000000..330cca36c --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/desertgrass.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/desertgrass" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/desertsprouts.json b/src/main/resources/assets/biomesoplenty/models/block/desertsprouts.json new file mode 100644 index 000000000..c829c0b56 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/desertsprouts.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/desertsprouts" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/dunegrass.json b/src/main/resources/assets/biomesoplenty/models/block/dunegrass.json new file mode 100644 index 000000000..1bade939c --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/dunegrass.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/dunegrass" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/leafpile.json b/src/main/resources/assets/biomesoplenty/models/block/leafpile.json index bbe430932..216b5458f 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/leafpile.json +++ b/src/main/resources/assets/biomesoplenty/models/block/leafpile.json @@ -3,4 +3,4 @@ "textures": { "texture": "biomesoplenty:blocks/leafpile" } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/reed.json b/src/main/resources/assets/biomesoplenty/models/block/reed.json new file mode 100644 index 000000000..fd5a2e05f --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/reed.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/reed" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/rivercane.json b/src/main/resources/assets/biomesoplenty/models/block/rivercane.json new file mode 100644 index 000000000..652979998 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/rivercane.json @@ -0,0 +1,6 @@ +{ + "parent": "block/crop", + "textures": { + "crop": "biomesoplenty:blocks/rivercane" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/root.json b/src/main/resources/assets/biomesoplenty/models/block/root.json new file mode 100644 index 000000000..07f7b0f2d --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/root.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/root" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/shrub.json b/src/main/resources/assets/biomesoplenty/models/block/shrub.json index 9df22fc19..66f6fe703 100644 --- a/src/main/resources/assets/biomesoplenty/models/block/shrub.json +++ b/src/main/resources/assets/biomesoplenty/models/block/shrub.json @@ -3,6 +3,6 @@ "textures": { "colored": "biomesoplenty:blocks/shrub_branch", "greyscale": "biomesoplenty:blocks/shrub", - "particle": "biomesoplenty:blocks/shrub_branch" + "particle": "biomesoplenty:blocks/shrub" } } diff --git a/src/main/resources/assets/biomesoplenty/models/block/spectralfern.json b/src/main/resources/assets/biomesoplenty/models/block/spectralfern.json new file mode 100644 index 000000000..56ff0a28b --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/spectralfern.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/spectralfern" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/thorn.json b/src/main/resources/assets/biomesoplenty/models/block/thorn.json new file mode 100644 index 000000000..ea3f48b2f --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/thorn.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/thorn" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/tinycactus.json b/src/main/resources/assets/biomesoplenty/models/block/tinycactus.json new file mode 100644 index 000000000..1f02983c2 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/tinycactus.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/tinycactus" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/wildcarrot_block.json b/src/main/resources/assets/biomesoplenty/models/block/wildcarrot_block.json new file mode 100644 index 000000000..c8f98f138 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/wildcarrot_block.json @@ -0,0 +1,6 @@ +{ + "parent": "block/crop", + "textures": { + "crop": "biomesoplenty:blocks/wildcarrot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/block/wildrice.json b/src/main/resources/assets/biomesoplenty/models/block/wildrice.json new file mode 100644 index 000000000..c91fa3993 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/wildrice.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cross", + "textures": { + "cross": "biomesoplenty:blocks/wildrice" + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/block/witherwart.json b/src/main/resources/assets/biomesoplenty/models/block/witherwart.json new file mode 100644 index 000000000..4e2c3a704 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/witherwart.json @@ -0,0 +1,6 @@ +{ + "parent": "block/crop", + "textures": { + "crop": "biomesoplenty:blocks/witherwart" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/models/item/berrybush.json b/src/main/resources/assets/biomesoplenty/models/item/berrybush.json index fc28c5b94..e6df7e4d5 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/berrybush.json +++ b/src/main/resources/assets/biomesoplenty/models/item/berrybush.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/bush.json b/src/main/resources/assets/biomesoplenty/models/item/bush.json index a97114bde..cbc6000c9 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/bush.json +++ b/src/main/resources/assets/biomesoplenty/models/item/bush.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/cattail.json b/src/main/resources/assets/biomesoplenty/models/item/cattail.json new file mode 100644 index 000000000..eca13587c --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/cattail.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/cattail" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/cloverpatch.json b/src/main/resources/assets/biomesoplenty/models/item/cloverpatch.json index fcd07f8a3..ac77368d5 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/cloverpatch.json +++ b/src/main/resources/assets/biomesoplenty/models/item/cloverpatch.json @@ -15,4 +15,5 @@ "scale": [ 1.7, 1.7, 1.7 ] } } -} \ No newline at end of file +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/dampgrass.json b/src/main/resources/assets/biomesoplenty/models/item/dampgrass.json index 53b633a15..291873402 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/dampgrass.json +++ b/src/main/resources/assets/biomesoplenty/models/item/dampgrass.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/deadgrass.json b/src/main/resources/assets/biomesoplenty/models/item/deadgrass.json new file mode 100644 index 000000000..1cb2f29a5 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/deadgrass.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/deadgrass" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/deadleafpile.json b/src/main/resources/assets/biomesoplenty/models/item/deadleafpile.json index 270c7f3f5..e21c7e6b0 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/deadleafpile.json +++ b/src/main/resources/assets/biomesoplenty/models/item/deadleafpile.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/desertgrass.json b/src/main/resources/assets/biomesoplenty/models/item/desertgrass.json new file mode 100644 index 000000000..942fa1452 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/desertgrass.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/desertgrass" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/desertsprouts.json b/src/main/resources/assets/biomesoplenty/models/item/desertsprouts.json new file mode 100644 index 000000000..378860256 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/desertsprouts.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/desertsprouts" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/dunegrass.json b/src/main/resources/assets/biomesoplenty/models/item/dunegrass.json new file mode 100644 index 000000000..1b065f505 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/dunegrass.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/dunegrass" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/koru.json b/src/main/resources/assets/biomesoplenty/models/item/koru.json index 249e82d7f..43d88dca2 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/koru.json +++ b/src/main/resources/assets/biomesoplenty/models/item/koru.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/leafpile.json b/src/main/resources/assets/biomesoplenty/models/item/leafpile.json index fdf59766c..30620afa3 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/leafpile.json +++ b/src/main/resources/assets/biomesoplenty/models/item/leafpile.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/mediumgrass.json b/src/main/resources/assets/biomesoplenty/models/item/mediumgrass.json index 5e473b6cb..0c5f59f7c 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/mediumgrass.json +++ b/src/main/resources/assets/biomesoplenty/models/item/mediumgrass.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/poisonivy.json b/src/main/resources/assets/biomesoplenty/models/item/poisonivy.json index c135407f4..a6347f941 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/poisonivy.json +++ b/src/main/resources/assets/biomesoplenty/models/item/poisonivy.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/reed.json b/src/main/resources/assets/biomesoplenty/models/item/reed.json new file mode 100644 index 000000000..051c76aeb --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/reed.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/reed" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/rivercane.json b/src/main/resources/assets/biomesoplenty/models/item/rivercane.json new file mode 100644 index 000000000..b2fb29cce --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/rivercane.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/rivercane" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/root.json b/src/main/resources/assets/biomesoplenty/models/item/root.json new file mode 100644 index 000000000..a6c53ac11 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/root.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/root" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/shortgrass.json b/src/main/resources/assets/biomesoplenty/models/item/shortgrass.json index 1414f3789..43b9bcab6 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/shortgrass.json +++ b/src/main/resources/assets/biomesoplenty/models/item/shortgrass.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/shrub.json b/src/main/resources/assets/biomesoplenty/models/item/shrub.json index 4fe91b15d..6c125f370 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/shrub.json +++ b/src/main/resources/assets/biomesoplenty/models/item/shrub.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/spectralfern.json b/src/main/resources/assets/biomesoplenty/models/item/spectralfern.json new file mode 100644 index 000000000..25061a442 --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/spectralfern.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/spectralfern" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/sprout.json b/src/main/resources/assets/biomesoplenty/models/item/sprout.json index dce4540fa..135223656 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/sprout.json +++ b/src/main/resources/assets/biomesoplenty/models/item/sprout.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/thorn.json b/src/main/resources/assets/biomesoplenty/models/item/thorn.json new file mode 100644 index 000000000..4d0d6003b --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/thorn.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/thorn" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/tinycactus.json b/src/main/resources/assets/biomesoplenty/models/item/tinycactus.json new file mode 100644 index 000000000..4988337fa --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/tinycactus.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/tinycactus" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/wheatgrass.json b/src/main/resources/assets/biomesoplenty/models/item/wheatgrass.json index ea90a3d0e..bcddc3434 100644 --- a/src/main/resources/assets/biomesoplenty/models/item/wheatgrass.json +++ b/src/main/resources/assets/biomesoplenty/models/item/wheatgrass.json @@ -16,3 +16,4 @@ } } } + diff --git a/src/main/resources/assets/biomesoplenty/models/item/wildcarrot_block.json b/src/main/resources/assets/biomesoplenty/models/item/wildcarrot_block.json new file mode 100644 index 000000000..4cad5187d --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/wildcarrot_block.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/wildcarrot" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/wildcarrots.json b/src/main/resources/assets/biomesoplenty/models/item/wildcarrots.json new file mode 100644 index 000000000..00a9df7ca --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/wildcarrots.json @@ -0,0 +1,18 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:items/wildcarrots" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} diff --git a/src/main/resources/assets/biomesoplenty/models/item/wildrice.json b/src/main/resources/assets/biomesoplenty/models/item/wildrice.json new file mode 100644 index 000000000..28c142b1a --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/wildrice.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/wildrice" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/models/item/witherwart.json b/src/main/resources/assets/biomesoplenty/models/item/witherwart.json new file mode 100644 index 000000000..728657b5b --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/item/witherwart.json @@ -0,0 +1,19 @@ +{ + "parent": "builtin/generated", + "textures": { + "layer0": "biomesoplenty:blocks/witherwart" + }, + "display": { + "thirdperson": { + "rotation": [ -90, 0, 0 ], + "translation": [ 0, 1, -3 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson": { + "rotation": [ 0, -135, 25 ], + "translation": [ 0, 4, 2 ], + "scale": [ 1.7, 1.7, 1.7 ] + } + } +} + diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/cattail.png b/src/main/resources/assets/biomesoplenty/textures/blocks/cattail.png new file mode 100644 index 0000000000000000000000000000000000000000..71c12071d42bcf64438c68c93d7b210a7b385ba4 GIT binary patch literal 593 zcmV-X0N2bPDNB8 zb~7$DE-^7j^FlWO00GTOL_t(IPjyqtPC`KtWMBTk1rAP{CVJ4sgZzX?{k7KWmx1>rRx+8Pr@FhU=b-}BYPCwQ*Yo-h27^JR)oOX+ z{P}uHI4kh=aY5MSg@#DK=-r<%Pl31Fh9aob=~$V7{9H>onQJr}r4CrFw7*|KqtUR; z@7^WLl&iSd3e#gfMU55jpy6dTLeHHnbux29zTWTJ3T0??Rt{1%>XG6|*pEBtdM8H3 zpiM!B#N+$|$1oSzIOQE2->g&fv0id*KSMV5rgP1zxLP0k>&v&qk0gvY-|6*rMmn71}x{r{Ij<9sI z8>d3R%6GPMfOp4XgeD9A!N8H^X~#(vk-tQFX=c#n7nZ!2+^rZPhXdB4G`N|AFpXwh z++7ZFk2~z>jAr0*BOE}o*F#JY!vYbzv$0HLSvQ~YI+%g4nV8^^PL!$ f{K7k2p5D00000NkvXXu0mjfN*Dym literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/deadgrass.png b/src/main/resources/assets/biomesoplenty/textures/blocks/deadgrass.png new file mode 100644 index 0000000000000000000000000000000000000000..4ade1c19b4422c7eb53f0a7881c18f61e83865f6 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KYKsOp@j zi(`m||J#6*T!#!qzT|INr;wK+etSpLj=&f%SKE$7|NfgAWqz&@?0Rr;GV@Yn{mC=0 zKl}H?a9+A%@Gsdsc75vyLO10ve_y?==bG%(-N)9wJn!}V^V>z9f9k&Y+FuIJdQixf zvF^6%p-9_{@7Zl?jq@+uI*@lWNXA&J_wc&JNB56kXLI{&^m1Xi*N+3bQfmJ;t2tiX zv4FYbvm(RV$sgr@i&`;1xY}C6@3xOMzqM1`$JO`O-aVJJVz$2sV|i)tFhVG?F*ZO- gCh@}~!9Laazgi`nzpS@U2KtP_)78&qol`;+0G+OgSO5S3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/desertgrass.png b/src/main/resources/assets/biomesoplenty/textures/blocks/desertgrass.png new file mode 100644 index 0000000000000000000000000000000000000000..d037ae5f035aa110171688df330a4cfcc85eb326 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0gN_s>q|3=E9y zo-U3d7XHZ+tj)Y@*7W@2PkqF?dR5YaS83_Lm9FS(a42~h^W1}X#x#5 z+vMC%pHfoz^YrP&gk!H>MHuwvoSq|NFJdWhFF>2Z)>OaKi$RR&wQzLcCpz~S=`qd nk`7;Ka@fB8m<+J`?g==@Z#J5 zrzL#<)Av8MpwmyXGE7m~oFnGH9 KxvXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0005kNkl=gZ)f5wU+d9SH2XW^cFqF{c_nNP++fz0E$8 zzVnx`c7)1VX&~3jWCGAfXKIoLC&1}~2JjFnkjVn@tCcpOJ>lkabm0T2RtD0Wkn)ZK z7&PixJCq6=K-#O<+IIm+Ejtj)q1ifCni`m>W_9MBjdJG@fJ~ys;M7|#pmhdk8xUP= z#h3YJ5P;SpC^u6$Es_fC|5fM{H$ADEmjR;A$K)oh#&$_7Ql6uGsOsL}y-*_crMw1P-Lz(m-KHkU>MSG9VF*n9E5A;k67wcvptCoJaFK+hy3!q2J znEm*=pK5#kBI!Il}q@_GOVKNWn6 zl;Znd7zc%KNT!;2@6=2S*0=kS%Z(tL4Ps@h=)yXRsK7x8$sOu&ExV+#s1C! zuCJDHelm)iKWoSzMp5`N4C^R{i&F(wK6Vdqx$Xc6;juKo!$|-D0000N2bPDNB8 zb~7$DE-^7j^FlWO00GQNL_t(IPlZxhOF~f)_Mh|=L`9p>^3X;Fm64TL*ka)|OU=~G z#6*cC+ldM+vbvZ=3lS}Z5C##|L;k3VnbVz{M)keSH{Y2#XO^S+3(1%PzUcqR56<3u z$XZw|t|q$MpnRS&ztHrVjD{Y*yqhD!mht3h-vMM~iw6keAh7gBIAMS(b39*PGb%8>`hqk{FSWxx*@eMxufYhsSD_J~iESQvndZL!jL z#6%woIpgibLxR%hvn;ma9;oENtw0~~Rc{wyt0aEhh{TAknFB*o1M#Pn8?NIXNXACU z_YT#Q{XPpqHWPxdT?|Ez4l#Ec%3#7EzB0nxSq%P>TEM}6NdhQ3`qlkQdUeM*6Xil2 eFj{rB8qFs!o%}uxD;Zk=0000<{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900DwYL_t(IPkocwP69y?Mf-bP;)4hdn+O5}&o~2`7|wU3F{e!Y!9ew_2?f?{P^UYu7TH%^bk)MJ1`{&V_q?b6?*%}xBR=ALE!Q{#`<;qbkmM{FcmY5KNr6r?qXJ3p|`}SKhx<{&wjhC&h{$R;OuAy|F+PJ?zG>a zlT|0gj58l90~;(z+Q1vBR{CfUn#C&> zwXzxXp91tW?l#l`n{6X7xd&`4_x4H$0)QD<{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^7j^FlWO00D7HL_t(IPh$Xq>_FrHlPjbDgV>4gn*XQO#Qkr|@cN$2C;Tmqy!yX>UVeFwNki#RF!vq*(v2jCTaHgDj-Lbbr3v|2=bx|7Z9afcYSc zKy;3e^8Xko6)+nPKqeQ2S)d3`EA#yy<)DPB5D3=yr-8)+%_Sjn;kNQ%#+;hq|G}2h za1HLd{QsA>#{BOu4Tp=Z>q~{Z2m{o_K%58z$)4K(lbs>nfjK$NNALgY?j%eDcFrvL z50Zp(8HysT!0hGiaVUx-?G^ub7Y3sm5MieP7O05ON0k7A{qxKISRi-TeVL?2vO zff<>3%7fua~J00k>L;{PvcfutKa z*fc5g|AGcYXyXDP+s~|N#;y)q7+?eK>2{dvlAIukq9X$mQ24-+CDlY(gcE?mWL8xm r`G(~CtC6p{A;BE189m0x1PlxSLByf_g0wu200000NkvXXu0mjfMkCsE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/spectralfern.png b/src/main/resources/assets/biomesoplenty/textures/blocks/spectralfern.png new file mode 100644 index 0000000000000000000000000000000000000000..578ed2beb76f64ec73b2b3d47f5a62c4cf1a74db GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KYKsA`(0 zi(`m||I&bif(;5h$@204YOI==H?%ujsz@os=u~t)IhXBudCS$W4?aYn$h5CB|6SSD z`+FD5v-t}iEqpoS%*$A5ff@JiuDIOx&&KCVi;uX==k1)g)_lBnyq!x!DV_209JP=m ztfpbbS=~ED4Yv6-9^ahH$o6ARb=6q%lQEz)k@EX}wpkTp8QnZdNk^Z6al Y#;S>0DYDE7Ko>H2y85}Sb4q9e0L9g1e*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/thorn.png b/src/main/resources/assets/biomesoplenty/textures/blocks/thorn.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7653f97dae41d66ed3f622ab3977205e0939fc GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$0figD*u3fvQe;x;Tbd_?J%d=3+7wa4A;fe{gH7wc`hd&83PJKQdbPEZa3%GsCC; z)l%adRqx;W-2XmtmZ|(bTgwdlGPahxH&KwgzHNG z$hF>Fbl-?^)kKN2`(KIfGRI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/tinycactus.png b/src/main/resources/assets/biomesoplenty/textures/blocks/tinycactus.png new file mode 100644 index 0000000000000000000000000000000000000000..6194f38e473c4ade1055ce7f625070a71137fb80 GIT binary patch literal 590 zcmV-U0N2bPDNB8 zb~7$DE-^7j^FlWO00GKLL_t(IPi0d}OPfIyok&b#Osn}6L=ej`qXoD^%^Xf&*Cx7)I({7$DMzWflXzztQVjRsLJ zmyO*dv0AN4tO^u^$02z1OeXWLU=Zw1OCl}htM7&)daD-|%|^ZA6Bd3;3s^&Bq`4{#hu za$MxNZ^b$`@o#-O8O5Ju5yw8Ejrf@%5L3rSFa$fjp|^JK*5u z4S1&7U$LVomVbQ2R$?04$r*$~A!!f{2JL@Ft#uTEKtP%-9t5#++`oau0@hBZrI=Uj c<^nK(0d4kjcH;cXUjP6A07*qoM6N<$g5j+Fv;Y7A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/wildcarrot.png b/src/main/resources/assets/biomesoplenty/textures/blocks/wildcarrot.png new file mode 100644 index 0000000000000000000000000000000000000000..8618c7428f6645198e3e0bb5278042c54d6f7bb1 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxL735kHCP2GC{^MbQ4*Y=R#Ki=l*$m0n3-3i=jR%tP-d)Ws%L2E{@KZ#fq}8v z)5S5w!aw=Mw)N>d!v4?CIWr;u?zw{fkL+(stY=)GmMrdmjOYLV|I0a&MO9c~xVdx2 zSwRP`P^MTOarrY9TYhWL@Ux!IzHH*rd-H!CPY6q36WhFg^Z)n8#vKQ@9{*bZ;!+0N zT#dQ^c~}iYdH8(!5?BjQJO67x^O0S9i_S)t?#34jECYGWuA2R?t-AZ~ws{i|CrkD= zy^X01(hqLE<=w`b!r)PAELR;!W-e$K6 z$LdwXRSnoQnKaurI%YXcYxv>T>6Tzyz#L<}SJG#*?|+W+h0Z~v-) z_~+FBs##h86aSnPE)Mu1T($W?jk_zSM_$X()!TMG`M+}V=Kt5Pw*0*w5cVT~&H5kp z@7_H6@5*}b|JJKh{?C?N+3?f%tKt9DBd!NB9{@v^hao21clJ}ms;9t6WAJqKb6Mw< G&;$VIOW3Ud literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/wildrice.png b/src/main/resources/assets/biomesoplenty/textures/blocks/wildrice.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa38a15d34410e1fe3d222665ec7015cee5c571 GIT binary patch literal 699 zcmV;s0!00ZP)N2bZe?^J zG%heMHD!e|WdHyIIY~r8R5(vfliN;HK^TSSH9W*)Jlz=a5KjS&BBivYNDE#NKpT1n zY9odxP>Dc+vfDxl7e=4J!~{G6#wXCkQ;bj0rn`NC-+X^FJ6_D5nKkQQvu4d~Q?J*} z&rgoDS}oITHodW()BpLru2^CtqWrJh1+i=9*KSF6H*@miBffB#UF`BGTtf4@}a zO(7;r8NW;vgIcsQ9rQLawOY;0$9q%}k?P!ttZd!)2s8v;*EO+HSULM!d9hB7lONO_ zx1E#%?<-k(n7J(2Mtm{dr)zMM)u;+CPX&})*c=uGR%b%GLn3!w7~k?Amba^M;jD`r z5uqTKy&`0Q+nrKco;w3=2Uy|U#atWc>^-18LO5tN8m1?7Oup?bt00>!qw0UYevT1W^PLFSBEBW&ta z088apV=|uX5dY9Axg9v7IgBMPs9ngoB)l%)K@F5SwcamF`oZC|3f>(!t|X2_|Fqb? hKI|h32RE+kntyZtbYe!lvI6;>1s;*b z3=DjGL736~_k^`TL8%hgh?3y^w370~qEv=}#LT=BJwMkFg)(D3Q$0gN_s>q|3=E7c zo-U3d7XC~9eX|ca2%KFxA>+V;N&KEKm7;FTu^1+742X(4I(d>z)hopX`F+_>odbKdz5 z5Bax*8UEea!fG7DCOFsXpeuuo+Maz!y3&3ue%;CF>%HTGgTdhkuRyF?{d8(IP15e1=@vv zvGUBE$&>4FGq~i7(z}N@&%a;8F14SD@v_O1wPNz}$4XYa?#a1({r?(Yi;IUpPdmF- feRq-RdkcHnhZ+Wf=C!+kp~m3p>gTe~DWM4f<;$Gz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/biomesoplenty/textures/items/wildcarrots.png b/src/main/resources/assets/biomesoplenty/textures/items/wildcarrots.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4227ce57b5c034549198c2d6160fb4a76de5c7 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkBK$x-p&dPkCAbW|YuPgf z*ARs=V?9$nLqqq^PUZ{@jP{-`jv*HQ$sb}YSo;bYCucqWAE2goV7VaMr@m)FX$}WB z?fDdp{>D#(aEo)>ey^Xmyl>Uai4!M2yzp-)Pw&&t|BgSNEq(jH|J^*! zw8K1%I~h_0!fyY*U3_qsqg1-T9`j@2-(r8}Tkqt`zGHhNEGg{+=z22I30YY&ZEX@hozj<(RdBX#%4` zI8bDxqaH&gcglgC$*(2(mO7X!GN&;AiYk7vjv*5$w@x90VUv>p?`5E_q_hoM(VxO!p7=L5h1XYh3O Kb6Mw<&;$Uc%C%Jh literal 0 HcmV?d00001