Readded planks

This commit is contained in:
Adubbz 2014-09-29 08:30:39 +10:00
parent d67115ac6f
commit 21edcbe5a6
60 changed files with 718 additions and 14 deletions

View File

@ -8,18 +8,59 @@
package biomesoplenty.api.block;
import java.util.Collection;
import java.util.List;
import biomesoplenty.api.IConfigurable;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public abstract class BOPBlock extends Block implements IConfigurable
{
protected BOPBlock(Material material)
private final PropertyEnum variantProperty;
protected BOPBlock(Material material, PropertyEnum variantProperty)
{
super(material);
this.variantProperty = variantProperty;
}
protected BOPBlock(Material material)
{
this(material, null);
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List list)
{
if (hasVariants())
{
for (Enum value : getVariants())
{
list.add(new ItemStack(item, 1, value.ordinal()));
}
}
else
{
list.add(new ItemStack(item, 1, 0));
}
}
@Override
public int damageDropped(IBlockState state)
{
return this.getMetaFromState(state);
}
@Override
//TODO: Account for configurations (which are provided by Forge and thus, cannot be done at this time)
public boolean isEnabled(Object... args)
@ -33,4 +74,24 @@ public abstract class BOPBlock extends Block implements IConfigurable
return false;
}
public final boolean hasVariants()
{
return variantProperty != null;
}
public final PropertyEnum getVariantProperty()
{
return variantProperty;
}
public final Collection<Enum> getVariants()
{
return (Collection<Enum>)variantProperty.getAllowedValues();
}
public final Enum getVariantFromMeta(int metadata)
{
return (Enum)this.getStateFromMeta(metadata).getValue(variantProperty);
}
}

View File

@ -13,4 +13,5 @@ import net.minecraft.block.Block;
public class BOPBlocks
{
public static Block ash_block;
public static Block planks;
}

View File

@ -0,0 +1,44 @@
/*******************************************************************************
* 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.asm;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
public class ASMUtil
{
public static ClassNode getClassNode(byte[] classBytes)
{
ClassReader reader = new ClassReader(classBytes);
ClassNode node = new ClassNode();
reader.accept(node, 0);
return node;
}
public static byte[] getBytes(ClassNode classNode)
{
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
classNode.accept(writer);
return writer.toByteArray();
}
public static MethodNode getMethodNode(ClassNode classNode, String methodName, String desc)
{
for (MethodNode method : classNode.methods)
{
if (method.name.equals(methodName) && method.desc.equals(desc)) return method;
}
throw new RuntimeException(methodName + " doesn't exist in " + classNode.name + "!");
}
}

View File

@ -0,0 +1,47 @@
/*******************************************************************************
* 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.asm;
import java.util.Map;
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
//TODO: Remove this or the ModelBakeryTransformer. It shouldn't be needed.
public class BOPLoadingPlugin implements IFMLLoadingPlugin
{
@Override
public String[] getASMTransformerClass()
{
return new String[] { ModelBakeryTransformer.class.getName() };
}
@Override
public String getModContainerClass()
{
return null;
}
@Override
public String getSetupClass()
{
return null;
}
@Override
public void injectData(Map<String, Object> data)
{
}
@Override
public String getAccessTransformerClass()
{
return null;
}
}

View File

@ -0,0 +1,65 @@
/*******************************************************************************
* 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.asm;
import java.util.Iterator;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import net.minecraft.launchwrapper.IClassTransformer;
public class ModelBakeryTransformer implements IClassTransformer
{
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass)
{
if (name.equals("net.minecraft.client.resources.model.ModelBakery"))
{
ClassNode classNode = ASMUtil.getClassNode(basicClass);
MethodNode variantsMethodNode = ASMUtil.getMethodNode(classNode, "registerVariantNames", "()V");
InsnList instructions = new InsnList();
instructions.add(new VarInsnNode(Opcodes.ALOAD, 0));
instructions.add(new FieldInsnNode(Opcodes.GETFIELD, "net/minecraft/client/resources/model/ModelBakery", "variantNames", "Ljava/util/Map;"));
instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, "biomesoplenty/client/util/ModelHelper", "customVariantNames", "Ljava/util/HashMap;"));
instructions.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, "java/util/Map", "putAll", "(Ljava/util/Map;)V", true));
variantsMethodNode.instructions.insertBefore(getRegisterVariantsInsertionPoint(variantsMethodNode), instructions);
return ASMUtil.getBytes(classNode);
}
return basicClass;
}
private AbstractInsnNode getRegisterVariantsInsertionPoint(MethodNode methodNode)
{
Iterator<AbstractInsnNode> iterator = methodNode.instructions.iterator();
AbstractInsnNode returnNode = null;
while (iterator.hasNext())
{
AbstractInsnNode currentNode = iterator.next();
if (currentNode.getOpcode() == Opcodes.RETURN) returnNode = currentNode;
}
if (returnNode != null) return returnNode;
throw new RuntimeException("The insertion point for registerVariantsNames() in ModelBakery was not found");
}
}

View File

@ -8,9 +8,19 @@
package biomesoplenty.client.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import com.google.common.collect.Lists;
import biomesoplenty.api.block.BOPBlock;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockModelShapes;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.block.statemap.StateMap;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
@ -19,6 +29,14 @@ import net.minecraftforge.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class ModelHelper
{
public static HashMap<Item, ArrayList<String>> customVariantNames = new HashMap();
public static void addVariantName(Item item, String... names)
{
if (customVariantNames.containsKey(item)) customVariantNames.get(item).addAll(Arrays.asList(names));
else customVariantNames.put(item, Lists.newArrayList(names));
}
public static void registerItem(Item item, int metadata, String itemName)
{
getItemModelMesher().register(item, metadata, new ModelResourceLocation(itemName, "inventory"));
@ -43,4 +61,14 @@ public class ModelHelper
{
return Minecraft.getMinecraft().getRenderItem().getItemModelMesher();
}
public static void regsiterBlockVariants(BOPBlock block, String name)
{
getBlockModelShapes().func_178121_a(block, (new StateMap.Builder()).func_178440_a(block.getVariantProperty()).func_178439_a("_" + name).build());
}
public static BlockModelShapes getBlockModelShapes()
{
return getItemModelMesher().getModelManager().getBlockModelShapes();
}
}

View File

@ -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.common.block;
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.util.IStringSerializable;
import biomesoplenty.api.block.BOPBlock;
import biomesoplenty.common.util.inventory.CreativeTabBOP;
//TODO: Commented methods and calls
public class BOPBlockPlanks extends BOPBlock
{
public static PropertyEnum VARIANT_PROP = PropertyEnum.create("variant", PlankType.class);
public BOPBlockPlanks()
{
super(Material.wood, VARIANT_PROP);
this.setDefaultBlockState(this.blockState.getBaseState().withProperty(VARIANT_PROP, PlankType.SACRED_OAK));
this.setHardness(2.0F);
//this.setHarvestLevel("axe", 0);
this.setStepSound(Block.soundTypeWood);
this.setCreativeTab(CreativeTabBOP.instance);
}
@Override
public IBlockState getStateFromMeta(int meta)
{
return this.getDefaultState().withProperty(VARIANT_PROP, PlankType.values()[meta]);
}
@Override
public int getMetaFromState(IBlockState state)
{
return ((PlankType)state.getValue(VARIANT_PROP)).ordinal();
}
@Override
protected BlockState createBlockState()
{
return new BlockState(this, new IProperty[] { VARIANT_PROP });
}
public static enum PlankType implements IStringSerializable
{
SACRED_OAK,
CHERRY,
DARK,
FIR,
ETHEREAL,
MAGIC,
MANGROVE,
PALM,
REDWOOD,
WILLOW,
BAMBOO_THATCHING,
PINE,
HELL_BARK,
JACARANDA,
MAHOGANY;
@Override
public String getName()
{
return this.name().toLowerCase();
}
}
}

View File

@ -0,0 +1,19 @@
/*******************************************************************************
* 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.BlockLog;
public class BlockBOPLog extends BlockLog
{
public BlockBOPLog()
{
}
}

View File

@ -9,9 +9,16 @@
package biomesoplenty.common.init;
import static biomesoplenty.api.block.BOPBlocks.ash_block;
import static biomesoplenty.api.block.BOPBlocks.planks;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.Item;
import net.minecraft.util.IStringSerializable;
import biomesoplenty.api.block.BOPBlock;
import biomesoplenty.client.util.ModelHelper;
import biomesoplenty.common.block.BOPBlockPlanks;
import biomesoplenty.common.block.BlockAsh;
import biomesoplenty.common.item.ItemBlockWithVariants;
import biomesoplenty.common.util.RegistryUtil;
import biomesoplenty.core.BiomesOPlenty;
@ -22,16 +29,31 @@ public class ModBlocks
public static void init()
{
ash_block = registerBlock(new BlockAsh(), "ash_block");
planks = registerBlock(new BOPBlockPlanks(), "planks");
}
private static Block registerBlock(Block block, String name)
private static Block registerBlock(BOPBlock block, String name)
{
block.setUnlocalizedName(name);
block = RegistryUtil.registerBlock(block, name);
for (IBlockState state : (ImmutableList<IBlockState>)block.getBlockState().getValidStates())
if (block.hasVariants())
{
BiomesOPlenty.proxy.registerBlockForMeshing(block, block.getMetaFromState(state), name);
RegistryUtil.registerBlock(block, ItemBlockWithVariants.class, name);
for (Enum variant : block.getVariants())
{
String variantName = ((IStringSerializable)variant).getName() + "_" + name;
ModelHelper.addVariantName(Item.getItemFromBlock(block), BiomesOPlenty.MOD_ID + ":" + variantName);
BiomesOPlenty.proxy.registerBlockForMeshing(block, variant.ordinal(), variantName);
}
}
else
{
RegistryUtil.registerBlock(block, name);
ModelHelper.addVariantName(Item.getItemFromBlock(block), BiomesOPlenty.MOD_ID + ":" + name);
BiomesOPlenty.proxy.registerBlockForMeshing(block, 0, name);
}
return block;

View File

@ -0,0 +1,46 @@
/*******************************************************************************
* 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.item;
import net.minecraft.block.Block;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IStringSerializable;
import biomesoplenty.api.block.BOPBlock;
public class ItemBlockWithVariants extends ItemBlock
{
public ItemBlockWithVariants(Block block)
{
super(block);
this.setMaxDurability(0);
this.setHasSubtypes(true);
}
@Override
public int getMetadata(int metadata)
{
return metadata;
}
@Override
public String getUnlocalizedName(ItemStack stack)
{
BOPBlock bopBlock = (BOPBlock)this.blockInstance;
if (bopBlock.hasVariants())
{
Enum variant = bopBlock.getVariantFromMeta(stack.getMetadata());
return super.getUnlocalizedName() + "." + ((IStringSerializable)variant).getName();
}
else return super.getUnlocalizedName();
}
}

View File

@ -0,0 +1,14 @@
/*******************************************************************************
* 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.util;
public class ReflectionHelper
{
//Various fields used in Reflection. These should be checked with every update.
}

View File

@ -9,9 +9,10 @@
package biomesoplenty.core;
import java.util.ArrayList;
import java.util.Map.Entry;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import biomesoplenty.api.block.BOPBlock;
import biomesoplenty.client.util.ModelHelper;
public class ClientProxy extends CommonProxy
@ -23,25 +24,25 @@ public class ClientProxy extends CommonProxy
{
for (ModelEntry modelEntry : blocksToRegister)
{
ModelHelper.registerItem(modelEntry.item, modelEntry.metadata, BiomesOPlenty.MOD_ID + ":" + modelEntry.name);
ModelHelper.registerBlock(modelEntry.block, modelEntry.metadata, BiomesOPlenty.MOD_ID + ":" + modelEntry.name);
}
}
@Override
public void registerBlockForMeshing(Block block, int metadata, String name)
public void registerBlockForMeshing(BOPBlock block, int metadata, String name)
{
blocksToRegister.add(new ModelEntry(Item.getItemFromBlock(block), metadata, name));
blocksToRegister.add(new ModelEntry(block, metadata, name));
}
private static class ModelEntry
{
public Item item;
public BOPBlock block;
public int metadata;
public String name;
public ModelEntry(Item item, int metadata, String name)
public ModelEntry(BOPBlock block, int metadata, String name)
{
this.item = item;
this.block = block;
this.metadata = metadata;
this.name = name;
}

View File

@ -8,6 +8,7 @@
package biomesoplenty.core;
import biomesoplenty.api.block.BOPBlock;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
@ -15,5 +16,5 @@ public class CommonProxy
{
public void registerRenderers() {}
public void registerBlockForMeshing(Block block, int metadata, String name) {}
public void registerBlockForMeshing(BOPBlock block, int metadata, String name) {}
}

View File

@ -0,0 +1,19 @@
{
"variants": {
"variant=sacred_oak": { "model": "biomesoplenty:sacred_oak_planks" },
"variant=cherry": { "model": "biomesoplenty:cherry_planks" },
"variant=dark": { "model": "biomesoplenty:dark_planks" },
"variant=fir": { "model": "biomesoplenty:fir_planks" },
"variant=ethereal": { "model": "biomesoplenty:ethereal_planks" },
"variant=magic": { "model": "biomesoplenty:magic_planks" },
"variant=mangrove": { "model": "biomesoplenty:mangrove_planks" },
"variant=palm": { "model": "biomesoplenty:palm_planks" },
"variant=redwood": { "model": "biomesoplenty:redwood_planks" },
"variant=willow": { "model": "biomesoplenty:willow_planks" },
"variant=bamboo_thatching": { "model": "biomesoplenty:bamboo_thatching" },
"variant=pine": { "model": "biomesoplenty:pine_planks" },
"variant=hell_bark": { "model": "biomesoplenty:hell_bark_planks" },
"variant=jacaranda": { "model": "biomesoplenty:jacaranda_planks" },
"variant=mahogany": { "model": "biomesoplenty:mahogany_planks" }
}
}

View File

@ -1 +1,17 @@
tile.ash_block.name=Ash Block
tile.planks.sacred_oak.name=Sacred Oak Wood Planks
tile.planks.cherry.name=Cherry Wood Planks
tile.planks.dark.name=Dark Wood Planks
tile.planks.fir.name=Fir Wood Planks
tile.planks.ethereal.name=Ethereal Wood Planks
tile.planks.magic.name=Magic Wood Planks
tile.planks.mangrove.name=Mangrove Wood Planks
tile.planks.palm.name=Palm Wood Planks
tile.planks.redwood.name=Redwood Wood Planks
tile.planks.willow.name=Willow Wood Planks
tile.planks.bamboo_thatching.name=Bamboo Thatching
tile.planks.pine.name=Pine Wood Planks
tile.planks.hell_bark.name=Hell Bark Wood Planks
tile.planks.jacaranda.name=Jacaranda Wood Planks
tile.planks.mahogany.name=Mahogany Wood Planks

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/bamboo_thatching"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/cherry_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/dark_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/ethereal_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/fir_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/hell_bark_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/jacaranda_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/magic_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/mahogany_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/mangrove_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/palm_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/pine_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/redwood_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/sacred_oak_planks"
}
}

View File

@ -0,0 +1,6 @@
{
"parent": "block/cube_all",
"textures": {
"all": "biomesoplenty:blocks/willow_planks"
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/bamboo_thatching",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/cherry_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/dark_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/ethereal_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/fir_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/hell_bark_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/jacaranda_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/magic_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/mahogany_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/mangrove_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/palm_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/pine_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/redwood_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/sacred_oak_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

View File

@ -0,0 +1,10 @@
{
"parent": "biomesoplenty:block/willow_planks",
"display": {
"thirdperson": {
"rotation": [ 10, -45, 170 ],
"translation": [ 0, 1.5, -2.75 ],
"scale": [ 0.375, 0.375, 0.375 ]
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B