Added apple trees

This commit is contained in:
Sollace 2019-01-25 17:22:41 +02:00
parent 35851d3f23
commit cc710b93eb
23 changed files with 626 additions and 24 deletions

View file

@ -1,16 +1,28 @@
package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.block.BlockAlfalfa;
import com.minelittlepony.unicopia.block.BlockFruitLeaves;
import com.minelittlepony.unicopia.block.BlockCloud;
import com.minelittlepony.unicopia.block.BlockCloudAnvil;
import com.minelittlepony.unicopia.block.BlockCloudSlab;
import com.minelittlepony.unicopia.block.BlockCloudStairs;
import com.minelittlepony.unicopia.block.BlockSugar;
import com.minelittlepony.unicopia.block.BlockTomatoPlant;
import com.minelittlepony.unicopia.block.IColourful;
import com.minelittlepony.unicopia.block.USapling;
import com.minelittlepony.unicopia.block.BlockCloudDoor;
import com.minelittlepony.unicopia.block.BlockCloudFarm;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.color.BlockColors;
import net.minecraft.client.renderer.color.ItemColors;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.world.ColorizerFoliage;
import net.minecraft.world.biome.BiomeColorHelper;
import net.minecraft.world.gen.feature.WorldGenTrees;
import net.minecraftforge.registries.IForgeRegistry;
public class UBlocks {
@ -33,10 +45,41 @@ public class UBlocks {
public static final Block sugar_block = new BlockSugar(Unicopia.MODID, "sugar_block");
public static final USapling apple_tree = new USapling(Unicopia.MODID, "apple_sapling")
.setTreeGen((w, s, m) -> new WorldGenTrees(true, 5, Blocks.LOG.getDefaultState(), UBlocks.apple_leaves.getDefaultState(), false));
public static final Block apple_leaves = new BlockFruitLeaves(Unicopia.MODID, "apple_leaves", apple_tree)
.setBaseGrowthChance(1200)
.setTint(0xFFEE81)
.setHarvestFruit(w -> UItems.apple.getRandomApple(w.rand, null))
.setUnharvestFruit(w -> new ItemStack(UItems.rotten_apple));
static void registerBlocks(IForgeRegistry<Block> registry) {
registry.registerAll(cloud, cloud_stairs, double_cloud_slab, cloud_slab, mist_door, anvil, cloud_farmland,
sugar_block,
alfalfa,
tomato_plant);
tomato_plant,
apple_tree, apple_leaves);
}
static void registerColors(ItemColors items, BlockColors blocks) {
items.registerItemColorHandler((stack, tint) -> {
@SuppressWarnings("deprecation")
IBlockState state = ((ItemBlock)stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata());
return blocks.colorMultiplier(state, null, null, tint);
}, apple_leaves);
blocks.registerBlockColorHandler((state, world, pos, tint) -> {
Block block = state.getBlock();
if (block instanceof IColourful) {
return ((IColourful)block).getCustomTint(state, tint);
}
if (world != null && pos != null) {
return BiomeColorHelper.getFoliageColorAtPos(world, pos);
}
return ColorizerFoliage.getFoliageColorBasic();
}, apple_leaves);
}
}

View file

@ -4,6 +4,7 @@ import com.minelittlepony.unicopia.item.ItemApple;
import com.minelittlepony.unicopia.item.ItemCereal;
import com.minelittlepony.unicopia.item.ItemCloud;
import com.minelittlepony.unicopia.item.ItemCurse;
import com.minelittlepony.unicopia.item.ItemFruitLeaves;
import com.minelittlepony.unicopia.item.ItemOfHolding;
import com.minelittlepony.unicopia.item.ItemRottenApple;
import com.minelittlepony.unicopia.item.ItemSpell;
@ -14,6 +15,7 @@ import com.minelittlepony.unicopia.item.ItemTomatoSeeds;
import com.minelittlepony.unicopia.item.ItemZapApple;
import com.minelittlepony.unicopia.item.UItemBlock;
import com.minelittlepony.unicopia.item.UItemMultiTexture;
import com.minelittlepony.unicopia.item.UItemDecoration;
import com.minelittlepony.unicopia.item.UItemSlab;
import com.minelittlepony.unicopia.spell.SpellRegistry;
@ -25,7 +27,6 @@ import net.minecraft.init.Blocks;
import net.minecraft.init.Enchantments;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemSeedFood;
@ -53,7 +54,6 @@ public class UItems {
.setSubTypes("zap_apple", "red", "green", "sweet", "sour");
public static final ItemApple rotten_apple = new ItemRottenApple(Unicopia.MODID, "rotten_apple");
public static final ItemApple cooked_zap_apple = new ItemApple(Unicopia.MODID, "cooked_zap_apple");
public static final Item cloud_matter = new Item()
@ -73,25 +73,18 @@ public class UItems {
}, INTERACT_WITH_CLOUDS)
.setRegistryName(Unicopia.MODID, "cloud_block");
public static final Item cloud_stairs = new UItemBlock(UBlocks.cloud_stairs, INTERACT_WITH_CLOUDS)
.setTranslationKey("cloud_stairs")
.setRegistryName(Unicopia.MODID, "cloud_stairs");
public static final Item cloud_stairs = new UItemBlock(UBlocks.cloud_stairs, Unicopia.MODID, "cloud_stairs", INTERACT_WITH_CLOUDS);
public static final Item cloud_farmland = new UItemBlock(UBlocks.cloud_farmland, INTERACT_WITH_CLOUDS)
.setTranslationKey("cloud_farmland")
.setRegistryName(Unicopia.MODID, "cloud_farmland");
public static final Item cloud_farmland = new UItemBlock(UBlocks.cloud_farmland, Unicopia.MODID, "cloud_farmland", INTERACT_WITH_CLOUDS);
public static final Item anvil = new UItemBlock(UBlocks.anvil, INTERACT_WITH_CLOUDS)
.setTranslationKey("cloud_anvil")
.setRegistryName(Unicopia.MODID, "anvil");
public static final Item anvil = new UItemBlock(UBlocks.anvil, Unicopia.MODID, "anvil", INTERACT_WITH_CLOUDS)
.setTranslationKey("cloud_anvil");
public static final Item mist_door = new ItemDoor(UBlocks.mist_door)
.setTranslationKey("mist_door")
.setRegistryName(Unicopia.MODID, "mist_door");
public static final Item sugar_block = new ItemBlock(UBlocks.sugar_block)
.setTranslationKey("sugar_block")
.setRegistryName(Unicopia.MODID, "sugar_block");
public static final Item sugar_block = new UItemDecoration(UBlocks.sugar_block, Unicopia.MODID, "sugar_block");
public static final Item cloud_slab = new UItemSlab(UBlocks.cloud_slab, UBlocks.cloud_slab, UBlocks.double_cloud_slab, INTERACT_WITH_CLOUDS)
.setTranslationKey("cloud_slab")
@ -122,6 +115,10 @@ public class UItems {
public static final ItemTomato cloudsdale_tomato = new ItemTomato(Unicopia.MODID, "cloudsdale_tomato", 16, 4);
public static final ItemTomatoSeeds tomato_seeds = new ItemTomatoSeeds(Unicopia.MODID, "tomato_seeds");
public static final Item apple_seeds = new UItemDecoration(UBlocks.apple_tree, Unicopia.MODID, "apple_seeds");
public static final Item apple_leaves = new ItemFruitLeaves(UBlocks.apple_leaves, Unicopia.MODID, "apple_leaves");
static void registerItems(IForgeRegistry<Item> registry) {
RegistryLockSpinner.unlock(Item.REGISTRY);
@ -140,7 +137,9 @@ public class UItems {
cereal, sugar_cereal, sugar_block,
rotten_apple, zap_apple, cooked_zap_apple,
cloudsdale_tomato, tomato_seeds, tomato);
cloudsdale_tomato, tomato_seeds, tomato,
apple_seeds, apple_leaves);
if (UClient.isClientSide()) {
registerAllVariants(apple, apple.getVariants());
@ -168,6 +167,8 @@ public class UItems {
registerAllVariants(tomato, "tomato", "rotten_tomato");
registerAllVariants(cloudsdale_tomato, "cloudsdale_tomato", "rotten_cloudsdale_tomato");
registerAllVariants(tomato_seeds, "tomato_seeds");
registerAllVariants(apple_seeds, "apple_seeds");
registerAllVariants(apple_leaves, "apple_leaves");
BuildInTexturesBakery.getBuiltInTextures().add(new ResourceLocation("unicopia", "items/empty_slot_gem"));
}

View file

@ -161,6 +161,7 @@ public class Unicopia implements IGuiHandler {
@SubscribeEvent
public static void registerItemColoursStatic(ColorHandlerEvent.Item event) {
UItems.registerColors(event.getItemColors());
UBlocks.registerColors(event.getItemColors(), event.getBlockColors());
}
@SubscribeEvent

View file

@ -0,0 +1,250 @@
package com.minelittlepony.unicopia.block;
import java.util.Random;
import java.util.function.Function;
import javax.annotation.Nonnull;
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLeaves;
import net.minecraft.block.BlockPlanks.EnumType;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemDye;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome.TempCategory;
public class BlockFruitLeaves extends BlockLeaves implements IColourful {
public static final PropertyBool HEAVY = PropertyBool.create("heavy");
private final Block sapling;
private boolean hardy;
private int baseGrowthChance;
private int customTint;
private Function<World, ItemStack> fruitProducer = w -> ItemStack.EMPTY;
private Function<World, ItemStack> compostProducer = w -> ItemStack.EMPTY;
public BlockFruitLeaves(String domain, String name, Block sapling) {
setTranslationKey(name);
setRegistryName(domain, name);
setDefaultState(blockState.getBaseState()
.withProperty(HEAVY, false)
.withProperty(CHECK_DECAY, true)
.withProperty(DECAYABLE, true)
);
this.sapling = sapling;
}
public BlockFruitLeaves setHardy(boolean value) {
hardy = value;
return this;
}
public BlockFruitLeaves setHarvestFruit(@Nonnull Function<World, ItemStack> producer) {
fruitProducer = producer;
return this;
}
public BlockFruitLeaves setUnharvestFruit(@Nonnull Function<World, ItemStack> producer) {
compostProducer = producer;
return this;
}
public BlockFruitLeaves setBaseGrowthChance(int chance) {
baseGrowthChance = chance;
return this;
}
public BlockFruitLeaves setTint(int tint) {
customTint = tint;
return this;
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return Blocks.LEAVES.getDefaultState().isOpaqueCube();
}
@Override
public BlockRenderLayer getRenderLayer() {
setGraphicsLevel(!Blocks.LEAVES.getDefaultState().isOpaqueCube());
return super.getRenderLayer();
}
@Deprecated
@Override
public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
setGraphicsLevel(!Blocks.LEAVES.getDefaultState().isOpaqueCube());
return super.shouldSideBeRendered(blockState, blockAccess, pos, side);
}
@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
return Item.getItemFromBlock(sapling);
}
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
ItemStack stack = player.getHeldItem(hand);
if (PlayerSpeciesList.instance().getPlayer(player).getPlayerSpecies().canUseEarth()) {
if (stack.isEmpty()) {
if (state.getValue(HEAVY)) {
dropApple(world, pos, state, 0);
world.setBlockState(pos, state.withProperty(HEAVY, false));
}
} else if (stack.getItem() instanceof ItemDye && EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.WHITE) {
if (!state.getValue(HEAVY)) {
world.setBlockState(pos, state.withProperty(HEAVY, true));
if (!world.isRemote) {
world.playEvent(2005, pos, 0);
}
if (!player.capabilities.isCreativeMode) {
stack.shrink(1);
}
}
}
return true;
}
return false;
}
@Override
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
if (!world.isRemote && world.isAreaLoaded(pos, 1)) {
if (state.getValue(CHECK_DECAY) && state.getValue(DECAYABLE)) {
int growthChance = getGrowthChance(world, pos, state);
if (!state.getValue(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
world.setBlockState(pos, state.withProperty(HEAVY, true));
} else {
growthChance /= 10;
if (state.getValue(HEAVY) && (growthChance <= 0 || rand.nextInt(growthChance) == 0)) {
dropApple(world, pos, state, 0);
world.setBlockState(pos, state.withProperty(HEAVY, false));
} else {
super.updateTick(world, pos, state, rand);
}
}
}
}
}
protected int getGrowthChance(World world, BlockPos pos, IBlockState state) {
int chance = baseGrowthChance;
if (!hardy && !world.isDaytime()) {
chance *= 40;
}
if (world.getLight(pos) >= 4) {
chance /= 3;
}
TempCategory temp = world.getBiome(pos).getTempCategory();
if (!hardy && temp == TempCategory.COLD) {
chance *= 1000;
}
if (temp == TempCategory.WARM) {
chance /= 100;
}
if (temp == TempCategory.MEDIUM) {
chance /= 50;
}
return chance;
}
@Override
public int getCustomTint(IBlockState state, int tint) {
return customTint;
}
@Override
protected void dropApple(World world, BlockPos pos, IBlockState state, int chance) {
if (state.getValue(HEAVY)) {
Function<World, ItemStack> fruit = world.rand.nextInt(40) == 0 ? compostProducer : fruitProducer;
spawnAsEntity(world, pos, fruit.apply(world));
world.playSound(null, pos, SoundEvents.ENTITY_ITEMFRAME_PLACE, SoundCategory.BLOCKS, 0.3F, 1);
}
}
@Override
public NonNullList<ItemStack> onSheared(ItemStack item, net.minecraft.world.IBlockAccess world, BlockPos pos, int fortune) {
return NonNullList.withSize(1, new ItemStack(this, 1, 0));
}
@Override
public EnumType getWoodType(int meta) {
return EnumType.OAK;
}
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState()
.withProperty(HEAVY, (meta & 1) != 0)
.withProperty(DECAYABLE, (meta & 2) != 0)
.withProperty(CHECK_DECAY, (meta & 4) != 0);
}
@Override
public int getMetaFromState(IBlockState state) {
int i = 0;
if (state.getValue(HEAVY)) {
i |= 1;
}
if (!state.getValue(DECAYABLE)) {
i |= 2;
}
if (state.getValue(CHECK_DECAY)) {
i |= 4;
}
return i;
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, HEAVY, CHECK_DECAY, DECAYABLE);
}
}

View file

@ -0,0 +1,7 @@
package com.minelittlepony.unicopia.block;
import net.minecraft.block.state.IBlockState;
public interface IColourful {
int getCustomTint(IBlockState state, int tint);
}

View file

@ -0,0 +1,14 @@
package com.minelittlepony.unicopia.block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
@FunctionalInterface
public interface ITreeGen {
WorldGenAbstractTree getTreeGen(World world, IBlockState state, boolean massive);
default boolean canGrowMassive() {
return false;
}
}

View file

@ -0,0 +1,166 @@
package com.minelittlepony.unicopia.block;
import java.util.Optional;
import java.util.Random;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.Block;
import net.minecraft.block.BlockSapling;
import net.minecraft.block.SoundType;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
import net.minecraftforge.common.property.IUnlistedProperty;
public class USapling extends BlockSapling implements ITreeGen {
private ITreeGen treeGen;
public USapling(String domain, String name) {
setRegistryName(domain, name);
setTranslationKey(name);
setSoundType(SoundType.PLANT);
setDefaultState(blockState.getBaseState().withProperty(STAGE, 0));
}
public USapling setTreeGen(ITreeGen gen) {
treeGen = gen;
return this;
}
@Override
public void generateTree(World world, BlockPos pos, IBlockState state, Random rand) {
boolean massive = canGrowMassive();
BlockPos i = massive ? findTwoByTwoSpace(world, pos, state) : pos;
if (i == null) {
massive = false;
i = BlockPos.ORIGIN;
}
// remove the sapling and any contributing siblings before growing the tree
setSaplingsState(world, Blocks.AIR.getDefaultState(), massive, i);
if (!getTreeGen(world, state, massive).generate(world, rand, i)) {
// place them back if tree growth failed
setSaplingsState(world, state, massive, i);
}
}
@Override
public void getSubBlocks(CreativeTabs tab, NonNullList<ItemStack> items) {
items.add(new ItemStack(this));
}
protected void setSaplingsState(World world, IBlockState state, boolean massive, BlockPos pos) {
if (massive) {
world.setBlockState(pos , state, 4);
world.setBlockState(pos.add(1, 0, 0), state, 4);
world.setBlockState(pos.add(0, 0, 1), state, 4);
world.setBlockState(pos.add(1, 0, 1), state, 4);
} else {
world.setBlockState(pos, state, 4);
}
}
@Override
public WorldGenAbstractTree getTreeGen(World world, IBlockState state, boolean massive) {
return treeGen.getTreeGen(world, state, massive);
}
@Override
public boolean canGrowMassive() {
return treeGen.canGrowMassive();
}
/**
* Looks for a suitable 2x2 space that a tree can grow in.
* Returns null if no such spaces were found.
*/
@Nullable
public BlockPos findTwoByTwoSpace(World world, BlockPos pos, IBlockState state) {
BlockPos xNegP = pos.add(-1, 0, 0);
BlockPos xPosP = pos.add( 1, 0, 0);
BlockPos zNegP = pos.add( 0, 0, -1);
BlockPos zPosP = pos.add( 0, 0, 1);
boolean xNeg = isMatch(state, world.getBlockState(xNegP));
boolean xPos = isMatch(state, world.getBlockState(xPosP));
boolean zNeg = isMatch(state, world.getBlockState(zNegP));
boolean zPos = isMatch(state, world.getBlockState(zPosP));
if (xNeg && zNeg) {
BlockPos corner = pos.add(-1, 0, -1);
if (isMatch(state, world.getBlockState(corner))) {
return corner;
}
}
if (xNeg && zPos && isMatch(state, world.getBlockState(pos.add(-1, 0, 1)))) {
return xNegP;
}
if (xPos && zNeg && isMatch(state, world.getBlockState(pos.add(1, 0, -1)))) {
return pos;
}
if (xPos && zPos && isMatch(state, world.getBlockState(pos.add(-1, 0, 1)))) {
return zNegP;
}
return null;
}
protected boolean isMatch(IBlockState state, IBlockState other) {
return other.getBlock() == this;
}
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState().withProperty(STAGE, (meta & 8) >> 3);
}
@Override
public int getMetaFromState(IBlockState state) {
int i = 0;
i |= state.getValue(STAGE) << 3;
return i;
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, new IProperty[] {STAGE}) {
@Override
protected StateImplementation createState(Block block, ImmutableMap<IProperty<?>, Comparable<?>> properties, @Nullable ImmutableMap<IUnlistedProperty<?>, Optional<?>> unlistedProperties) {
return new StateImplementation(block, properties) {
@Override
public <T extends Comparable<T>, V extends T> IBlockState withProperty(IProperty<T> property, V value) {
if (property == TYPE && !getProperties().containsKey(property)) {
return this;
}
return super.withProperty(property, value);
}
};
}
};
}
}

View file

@ -75,10 +75,6 @@ public class ItemApple extends ItemFood {
setRegistryName(domain, name);
}
public int getZapAppleMetadata() {
return 4;
}
public ItemApple setSubTypes(String... types) {
setHasSubtypes(true);
setMaxDamage(0);

View file

@ -0,0 +1,15 @@
package com.minelittlepony.unicopia.item;
import net.minecraft.block.Block;
public class ItemFruitLeaves extends UItemDecoration {
public ItemFruitLeaves(Block block, String domain, String name) {
super(block, domain, name);
}
@Override
public int getMetadata(int damage) {
return damage | 4;
}
}

View file

@ -4,18 +4,17 @@ import java.util.function.Predicate;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class UItemBlock extends ItemBlock {
public class UItemBlock extends UItemDecoration {
private final Predicate<EntityPlayer> abilityTest;
public UItemBlock(Block block, Predicate<EntityPlayer> abilityTest) {
super(block);
public UItemBlock(Block block, String domain, String name, Predicate<EntityPlayer> abilityTest) {
super(block, domain, name);
this.abilityTest = abilityTest;
}

View file

@ -0,0 +1,15 @@
package com.minelittlepony.unicopia.item;
import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;
public class UItemDecoration extends ItemBlock {
public UItemDecoration(Block block, String domain, String name) {
super(block);
setTranslationKey(name);
setRegistryName(domain, name);
setCreativeTab(block.getCreativeTab());
}
}

View file

@ -0,0 +1,13 @@
{
"variants": {
"normal": { "model": "unicopia:apple_leaves" },
"check_decay=false,decayable=false,heavy=false": { "model": "unicopia:apple_leaves" },
"check_decay=true,decayable=false,heavy=false": { "model": "unicopia:apple_leaves" },
"check_decay=false,decayable=true,heavy=false": { "model": "unicopia:apple_leaves" },
"check_decay=true,decayable=true,heavy=false": { "model": "unicopia:apple_leaves" },
"check_decay=false,decayable=false,heavy=true": { "model": "unicopia:apple_leaves_heavy" },
"check_decay=true,decayable=false,heavy=true": { "model": "unicopia:apple_leaves_heavy" },
"check_decay=false,decayable=true,heavy=true": { "model": "unicopia:apple_leaves_heavy" },
"check_decay=true,decayable=true,heavy=true": { "model": "unicopia:apple_leaves_heavy" }
}
}

View file

@ -0,0 +1,6 @@
{
"variants": {
"stage=0": { "model": "unicopia:apple_sapling" },
"stage=1": { "model": "unicopia:apple_sapling" }
}
}

View file

@ -9,6 +9,9 @@ tile.cloud_slab.enchanted.name=Enchanted Cloud Slab
tile.cloud_stairs.name=Cloud Stairs
tile.cloud_farmland.name=Tilled Clouds
tile.apple_leaves.name=Apple Leaves
tile.apple_sapling.name=Apple Seeds
tile.sugar_block.name=Block of Sugar
item.cloud_matter.name=Lump of Cloud
@ -60,6 +63,8 @@ item.zap_apple.green.name=Granny Smith Apple
item.zap_apple.sweet.name=Sweet Apple Acres Apple
item.zap_apple.sour.name=Sour Apple
item.apple_seeds.name=Apple Seeds
item.tomato.name=Tomato
item.tomato.rotten.name=Rotten Tomato
item.tomato_seeds.name=Tomato Seeds

View file

@ -0,0 +1,6 @@
{
"parent": "block/leaves",
"textures": {
"all": "unicopia:blocks/leaves_apple"
}
}

View file

@ -0,0 +1,38 @@
{
"parent": "block/leaves",
"textures": {
"all": "unicopia:blocks/leaves_apple",
"fruit": "minecraft:items/apple"
},
"elements": [
{ "from": [ 0, 0, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "down" },
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "up" },
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "north" },
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "south" },
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "west" },
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#all", "tintindex": 0, "cullface": "east" }
}
},
{ "from": [ 0.8, 0, 8 ],
"to": [ 15.2, 16, 8 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
"shade": false,
"faces": {
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#fruit" },
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#fruit" }
}
},
{ "from": [ 8, 0, 0.8 ],
"to": [ 8, 16, 15.2 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
"shade": false,
"faces": {
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#fruit" },
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#fruit" }
}
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "block/cross",
"textures": {
"cross": "unicopia:blocks/sapling_apple"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/red_apple_leaves"
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "unicopia:items/apple_seeds"
}
}

View file

@ -0,0 +1,12 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "unicopia:rotten_apple"
}
],
"result": {
"item": "unicopia:apple_seeds",
"count": 3
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB