Schematicannon Physics

- Blocks fired now follow a semi-reasonable trajectory
- Added models and animations
- Added a Creative block for use with the cannon to ignore materials
This commit is contained in:
simibubi 2019-07-13 12:55:28 +02:00
parent b66aa4c4d3
commit c6c9a8f8eb
27 changed files with 877 additions and 29 deletions

View file

@ -1,6 +1,8 @@
package com.simibubi.create;
import com.simibubi.create.block.CreativeCrateBlock;
import com.simibubi.create.block.IJustForRendering;
import com.simibubi.create.block.RenderingBlock;
import com.simibubi.create.block.SchematicTableBlock;
import com.simibubi.create.block.SchematicannonBlock;
import com.simibubi.create.block.symmetry.BlockSymmetryCrossPlane;
@ -16,6 +18,10 @@ import net.minecraftforge.registries.IForgeRegistry;
public enum AllBlocks {
SCHEMATICANNON(new SchematicannonBlock()),
SCHEMATICANNON_CONNECTOR(new RenderingBlock()),
SCHEMATICANNON_PIPE(new RenderingBlock()),
CREATIVE_CRATE(new CreativeCrateBlock()),
SCHEMATIC_TABLE(new SchematicTableBlock()),
SYMMETRY_PLANE(new BlockSymmetryPlane()),

View file

@ -3,13 +3,16 @@ package com.simibubi.create;
import java.util.function.Supplier;
import com.simibubi.create.block.SchematicTableTileEntity;
import com.simibubi.create.block.SchematicannonRenderer;
import com.simibubi.create.block.SchematicannonTileEntity;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
@ -40,10 +43,11 @@ public enum AllTileEntities {
}
public static void registerRenderers() {
bind(SchematicannonTileEntity.class, new SchematicannonRenderer());
}
// private static <T extends TileEntity> void bind(Class<T> clazz, TileEntityRenderer<? super T> renderer) {
// ClientRegistry.bindTileEntitySpecialRenderer(clazz, renderer);
// }
private static <T extends TileEntity> void bind(Class<T> clazz, TileEntityRenderer<? super T> renderer) {
ClientRegistry.bindTileEntitySpecialRenderer(clazz, renderer);
}
}

View file

@ -0,0 +1,35 @@
package com.simibubi.create.block;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
public class CreativeCrateBlock extends Block {
protected static final VoxelShape shape = makeCuboidShape(1, 0, 1, 15, 14, 15);
public CreativeCrateBlock() {
super(Properties.create(Material.WOOD));
}
@Override
public boolean isSolid(BlockState state) {
return false;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return shape;
}
@Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
return shape;
}
}

View file

@ -0,0 +1,12 @@
package com.simibubi.create.block;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
public class RenderingBlock extends Block implements IJustForRendering {
public RenderingBlock() {
super(Properties.create(Material.AIR));
}
}

View file

@ -1,12 +1,17 @@
package com.simibubi.create.block;
import net.minecraft.block.BlockRenderType;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.ContainerBlock;
import net.minecraft.block.HorizontalBlock;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
@ -14,15 +19,27 @@ import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
public class SchematicTableBlock extends ContainerBlock {
@SuppressWarnings("deprecation")
public class SchematicTableBlock extends HorizontalBlock implements ITileEntityProvider {
public SchematicTableBlock() {
super(Properties.from(Blocks.OAK_PLANKS));
}
@Override
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.MODEL;
protected void fillStateContainer(Builder<Block, BlockState> builder) {
builder.add(HORIZONTAL_FACING);
super.fillStateContainer(builder);
}
@Override
public boolean isSolid(BlockState state) {
return false;
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite());
}
@Override
@ -63,4 +80,16 @@ public class SchematicTableBlock extends ContainerBlock {
}
public boolean eventReceived(BlockState state, World worldIn, BlockPos pos, int id, int param) {
super.eventReceived(state, worldIn, pos, id, param);
TileEntity tileentity = worldIn.getTileEntity(pos);
return tileentity == null ? false : tileentity.receiveClientEvent(id, param);
}
@Nullable
public INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos) {
TileEntity tileentity = worldIn.getTileEntity(pos);
return tileentity instanceof INamedContainerProvider ? (INamedContainerProvider) tileentity : null;
}
}

View file

@ -45,14 +45,14 @@ public class SchematicTableContainer extends Container {
this.player = inv.player;
this.te = te;
inputSlot = new Slot(tableInventory, 0, 31, 15) {
inputSlot = new Slot(tableInventory, 0, -9, 15) {
@Override
public boolean isItemValid(ItemStack stack) {
return AllItems.EMPTY_BLUEPRINT.typeOf(stack);
}
};
outputSlot = new Slot(tableInventory, 1, 115, 15) {
outputSlot = new Slot(tableInventory, 1, 75, 15) {
@Override
public boolean isItemValid(ItemStack stack) {
return false;

View file

@ -33,6 +33,12 @@ public class SchematicannonBlock extends Block {
return stateIn;
}
@Override
public boolean isSolid(BlockState state) {
return false;
}
@Override
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) {
((SchematicannonTileEntity) world.getTileEntity(pos)).findInventories();

View file

@ -0,0 +1,120 @@
package com.simibubi.create.block;
import com.mojang.blaze3d.platform.GlStateManager;
import com.simibubi.create.AllBlocks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class SchematicannonRenderer extends TileEntityRenderer<SchematicannonTileEntity> {
@Override
public void render(SchematicannonTileEntity tileEntityIn, double x, double y, double z, float partialTicks,
int destroyStage) {
Minecraft.getInstance().getTextureManager().bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE);
double yaw = 0;
double pitch = 40;
double recoil = 0;
BlockPos pos = tileEntityIn.getPos();
if (tileEntityIn.target != null) {
// Calculate Angle of Cannon
Vec3d diff = new Vec3d(tileEntityIn.target.subtract(pos));
if (tileEntityIn.previousTarget != null) {
diff = (new Vec3d(tileEntityIn.previousTarget)
.add(new Vec3d(tileEntityIn.target.subtract(tileEntityIn.previousTarget)).scale(partialTicks)))
.subtract(new Vec3d(pos));
}
double diffX = diff.getX();
double diffZ = diff.getZ();
yaw = MathHelper.atan2(diffX, diffZ);
yaw = yaw / Math.PI * 180;
float distance = MathHelper.sqrt(diffX * diffX + diffZ * diffZ);
double yOffset = 0 + distance * 2f;
pitch = MathHelper.atan2(distance, diff.getY() * 3 + yOffset);
pitch = pitch / Math.PI * 180 + 10;
}
if (!tileEntityIn.flyingBlocks.isEmpty()) {
for (SchematicannonTileEntity.LaunchedBlock block : tileEntityIn.flyingBlocks) {
if (block.ticksRemaining == 0)
continue;
// Calculate position of flying block
Vec3d start = new Vec3d(tileEntityIn.getPos().add(.5f, 1, .5f));
Vec3d target = new Vec3d(block.target).add(-.5, 0, 1);
Vec3d distance = target.subtract(start);
double targetY = target.y - start.y;
double throwHeight = Math.sqrt(distance.lengthSquared()) * .6f + targetY;
Vec3d cannonOffset = distance.add(0, throwHeight, 0).normalize().scale(2);
start = start.add(cannonOffset);
double progress = ((double) block.totalTicks - (block.ticksRemaining + 1 - partialTicks))
/ block.totalTicks;
Vec3d blockLocationXZ = new Vec3d(x + .5, y + .5, z + .5)
.add(target.subtract(start).scale(progress).mul(1, 0, 1));
// Height is determined through a bezier curve
double t = progress;
double yOffset = 2 * (1 - t) * t * throwHeight + t * t * targetY;
Vec3d blockLocation = blockLocationXZ.add(0, yOffset + 1, 0).add(cannonOffset);
// Offset to position
GlStateManager.pushMatrix();
GlStateManager.translated(blockLocation.x, blockLocation.y, blockLocation.z);
// Rotation and Scaling effects
double scale = .3f;
GlStateManager.rotated(360 * t * 2, 1, 1, 0);
GlStateManager.scaled(scale, scale, scale);
// Render the Block
Minecraft.getInstance().getBlockRendererDispatcher().renderBlockBrightness(block.state, 1);
GlStateManager.popMatrix();
// Minecraft.getInstance().world.addParticle(ParticleTypes.END_ROD, blockLocation.x, blockLocation.y,
// blockLocation.z, 0, 0, 0);
// Apply Recoil if block was just launched
if ((block.ticksRemaining + 1 - partialTicks) > block.totalTicks - 10) {
recoil = Math.max(recoil, (block.ticksRemaining + 1 - partialTicks) - block.totalTicks + 10);
}
}
}
GlStateManager.pushMatrix();
GlStateManager.translated(x + .5f, y, z + 1 - .5f);
GlStateManager.rotated(yaw, 0, 1, 0);
GlStateManager.translated(-0.5f, 0, 0.5f);
Minecraft.getInstance().getBlockRendererDispatcher()
.renderBlockBrightness(AllBlocks.SCHEMATICANNON_CONNECTOR.get().getDefaultState(), 1);
GlStateManager.popMatrix();
GlStateManager.pushMatrix();
GlStateManager.translated(x + .5f, y + .90f, z + 1 - .5f);
GlStateManager.rotated(yaw, 0, 1, 0);
GlStateManager.rotated(pitch, 1, 0, 0);
GlStateManager.translated(-0.5f, -.90f, 0.5f);
GlStateManager.translated(0, -recoil / 100, 0);
Minecraft.getInstance().getBlockRendererDispatcher()
.renderBlockBrightness(AllBlocks.SCHEMATICANNON_PIPE.get().getDefaultState(), 1);
GlStateManager.popMatrix();
super.render(tileEntityIn, x, y, z, partialTicks, destroyStage);
}
}

View file

@ -11,6 +11,7 @@ import java.util.List;
import org.apache.commons.io.IOUtils;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.ServerSchematicLoader;
import com.simibubi.create.schematic.Cuboid;
@ -19,50 +20,109 @@ import com.simibubi.create.utility.TileEntitySynced;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.ListNBT;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.Explosion;
import net.minecraft.world.gen.feature.template.PlacementSettings;
import net.minecraft.world.gen.feature.template.Template;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
public class SchematicannonTileEntity extends TileEntitySynced implements ITickableTileEntity {
public static final int PLACEMENT_DELAY = 2;
public static final int PLACEMENT_DELAY = 10;
private SchematicWorld reader;
private BlockPos currentPos;
public BlockPos currentPos;
public BlockPos anchor;
public String schematicToPrint;
public boolean missingBlock;
public boolean creative;
public BlockPos target;
public BlockPos previousTarget;
public List<IItemHandler> attachedInventories;
public List<LaunchedBlock> flyingBlocks;
private int cooldown;
public class LaunchedBlock {
public int totalTicks;
public int ticksRemaining;
public BlockPos target;
public BlockState state;
public LaunchedBlock(BlockPos target, BlockState state) {
this.target = target;
this.state = state;
totalTicks = (int) (Math.max(10, MathHelper.sqrt(MathHelper.sqrt(target.distanceSq(pos))) * 4f));
ticksRemaining = totalTicks;
}
public LaunchedBlock(BlockPos target, BlockState state, int ticksLeft, int total) {
this.target = target;
this.state = state;
this.totalTicks = total;
this.ticksRemaining = ticksLeft;
}
public void update() {
if (ticksRemaining > 0)
ticksRemaining--;
}
}
public SchematicannonTileEntity() {
this(AllTileEntities.Schematicannon.type);
}
@Override
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
@OnlyIn(Dist.CLIENT)
@Override
public AxisAlignedBB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB;
}
public SchematicannonTileEntity(TileEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn);
attachedInventories = new LinkedList<>();
flyingBlocks = new LinkedList<>();
}
public void findInventories() {
creative = false;
for (Direction facing : Direction.values()) {
if (AllBlocks.CREATIVE_CRATE.typeOf(world.getBlockState(pos.offset(facing)))) {
creative = true;
}
TileEntity tileEntity = world.getTileEntity(pos.offset(facing));
if (tileEntity != null) {
LazyOptional<IItemHandler> capability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing.getOpposite());
LazyOptional<IItemHandler> capability = tileEntity
.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing.getOpposite());
if (capability.isPresent()) {
attachedInventories.add(capability.orElse(null));
}
@ -72,16 +132,86 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
@Override
public void read(CompoundNBT compound) {
if (compound.contains("Target")) {
target = NBTUtil.readBlockPos(compound.getCompound("Target"));
}
if (compound.contains("FlyingBlocks")) {
ListNBT tagBlocks = compound.getList("FlyingBlocks", 10);
if (tagBlocks.isEmpty())
flyingBlocks.clear();
boolean pastDead = false;
for (int i = 0; i < tagBlocks.size(); i++) {
CompoundNBT c = tagBlocks.getCompound(i);
BlockPos readBlockPos = NBTUtil.readBlockPos(c.getCompound("Target"));
BlockState readBlockState = NBTUtil.readBlockState(c.getCompound("Block"));
int int1 = c.getInt("TicksLeft");
int int2 = c.getInt("TotalTicks");
// Always write to Server tile
if (!world.isRemote) {
flyingBlocks.add(new LaunchedBlock(readBlockPos, readBlockState, int1, int2));
continue;
}
// Delete all Client side blocks that are now missing on the server
while (!pastDead && !flyingBlocks.isEmpty() && !flyingBlocks.get(0).target.equals(readBlockPos)) {
flyingBlocks.remove(0);
}
pastDead = true;
// Add new server side blocks
if (i >= flyingBlocks.size()) {
flyingBlocks.add(new LaunchedBlock(readBlockPos, readBlockState, int1, int2));
continue;
}
// Don't do anything with existing
}
}
super.read(compound);
}
@Override
public CompoundNBT write(CompoundNBT compound) {
if (target != null) {
compound.put("Target", NBTUtil.writeBlockPos(target));
}
ListNBT tagBlocks = new ListNBT();
for (LaunchedBlock b : flyingBlocks) {
CompoundNBT c = new CompoundNBT();
c.putInt("TotalTicks", b.totalTicks);
c.putInt("TicksLeft", b.ticksRemaining);
c.put("Target", NBTUtil.writeBlockPos(b.target));
c.put("Block", NBTUtil.writeBlockState(b.state));
tagBlocks.add(c);
}
compound.put("FlyingBlocks", tagBlocks);
return super.write(compound);
}
@Override
public void tick() {
previousTarget = target;
List<LaunchedBlock> toRemove = new LinkedList<>();
for (LaunchedBlock b : flyingBlocks) {
b.update();
if (b.ticksRemaining <= 0 && !world.isRemote) {
world.setBlockState(b.target, b.state);
toRemove.add(b);
}
}
flyingBlocks.removeAll(toRemove);
if (world.isRemote)
return;
if (schematicToPrint == null)
@ -117,7 +247,8 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
BlockPos size = reader.getBounds().getSize();
BlockState state;
do {
if (!missingBlock)
// Find next block to place
if (!missingBlock || creative)
currentPos = currentPos.offset(Direction.EAST);
if (currentPos.getX() > size.getX()) {
currentPos = new BlockPos(0, currentPos.getY(), currentPos.getZ() + 1);
@ -136,6 +267,28 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
state = reader.getBlockState(anchor.add(currentPos));
} while (state.getBlock() == Blocks.AIR);
target = anchor.add(currentPos);
// Update orientation
world.notifyBlockUpdate(getPos(), getBlockState(), getBlockState(), 3);
if (creative) {
launchBlock(currentPos.add(anchor), state);
missingBlock = false;
return;
}
if (world.getBlockState(target).getBlock() == state.getBlock()) {
// Don't overwrite tiles
if (world.getTileEntity(target) != null)
return;
// Overwrite in case its rotated
launchBlock(target, state);
missingBlock = false;
}
// Search for required item
missingBlock = true;
ItemStack requiredItem = new ItemStack(BlockItem.BLOCK_TO_ITEM.getOrDefault(state.getBlock(), Items.AIR));
for (IItemHandler iItemHandler : attachedInventories) {
@ -144,12 +297,18 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
if (!stackInSlot.isItemEqual(requiredItem))
continue;
iItemHandler.extractItem(slot, 1, false);
world.setBlockState(currentPos.add(anchor), state);
launchBlock(target, state);
missingBlock = false;
return;
}
}
}
private void launchBlock(BlockPos target, BlockState state) {
flyingBlocks.add(new LaunchedBlock(target, state));
Vec3d explosionPos = new Vec3d(pos).add(new Vec3d(target.subtract(pos)).normalize());
this.world.createExplosion((Entity) null, explosionPos.x, explosionPos.y + 1.5f, explosionPos.z, 0,
Explosion.Mode.NONE);
}
}

View file

@ -2,7 +2,10 @@ package com.simibubi.create.gui;
import java.util.List;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.platform.GlStateManager;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.Create;
import com.simibubi.create.block.SchematicTableContainer;
import com.simibubi.create.gui.widgets.AbstractSimiWidget;
@ -11,12 +14,19 @@ import com.simibubi.create.gui.widgets.OptionScrollArea;
import com.simibubi.create.gui.widgets.ScrollArea;
import com.simibubi.create.gui.widgets.SimiButton;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.IHasContainer;
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.client.model.data.EmptyModelData;
public class SchematicTableScreen extends ContainerScreen<SchematicTableContainer>
implements IHasContainer<SchematicTableContainer> {
@ -44,7 +54,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
super.init();
xTopLeft = (width - GuiResources.SCHEMATIC_TABLE.width) / 2;
yTopLeft = (height - GuiResources.SCHEMATIC_TABLE.height) / 2;
xMainWindow = xTopLeft;
xMainWindow = xTopLeft - 40;
yMainWindow = yTopLeft - 80;
buttons.clear();
@ -82,6 +92,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
if (schematics == null) {
font.drawStringWithShadow(" No Schematics Saved ", xMainWindow + 39, yMainWindow + 26, 0xFFDD44);
}
}
@Override
@ -93,7 +104,36 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
int width = (int) (GuiResources.SCHEMATIC_TABLE_PROGRESS.width * MathHelper.lerp(pt, lastProgress, progress));
int height = GuiResources.SCHEMATIC_TABLE_PROGRESS.height;
GlStateManager.disableLighting();
blit(xMainWindow + 94, yMainWindow + 56, GuiResources.SCHEMATIC_TABLE_PROGRESS.startX, GuiResources.SCHEMATIC_TABLE_PROGRESS.startY, width, height);
blit(xMainWindow + 94, yMainWindow + 56, GuiResources.SCHEMATIC_TABLE_PROGRESS.startX,
GuiResources.SCHEMATIC_TABLE_PROGRESS.startY, width, height);
GlStateManager.pushLightingAttributes();
GlStateManager.pushMatrix();
GlStateManager.enableBlend();
GlStateManager.enableRescaleNormal();
GlStateManager.enableAlphaTest();
GlStateManager.alphaFunc(516, 0.1F);
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
GlStateManager.translated(xTopLeft + 220, yTopLeft + 30, 200);
GlStateManager.rotatef(140, -.1f, 1, -.2f);
GlStateManager.scaled(50, -50, 50);
Minecraft.getInstance().getTextureManager().bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE);
BufferBuilder buffer = Tessellator.getInstance().getBuffer();
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
minecraft.getBlockRendererDispatcher().renderBlock(AllBlocks.SCHEMATIC_TABLE.get().getDefaultState(),
new BlockPos(0, 0, 0), minecraft.world, buffer, minecraft.world.rand, EmptyModelData.INSTANCE);
Tessellator.getInstance().draw();
GlStateManager.disableAlphaTest();
GlStateManager.disableRescaleNormal();
GlStateManager.popMatrix();
GlStateManager.popAttributes();
renderHoveredToolTip(mouseX, mouseY);
for (Widget w : buttons) {

View file

@ -0,0 +1,6 @@
{
"forgemarker": 1,
"variants": {
"": { "model": "create:block/creative_crate" }
}
}

View file

@ -1,6 +1,12 @@
{
"forgemarker": 1,
"defaults": {
"model": "create:block/schematic_table"
},
"variants": {
"": { "model": "block/crafting_table" }
"facing=north": { "model": "create:block/schematic_table", "y": 180 },
"facing=south": { "model": "create:block/schematic_table" },
"facing=east": { "model": "create:block/schematic_table", "y": 270 },
"facing=west": { "model": "create:block/schematic_table", "y": 90 }
}
}

View file

@ -1,6 +1,6 @@
{
"forgemarker": 1,
"variants": {
"": { "model": "block/dropper_vertical" }
"": { "model": "create:block/schematicannon_base" }
}
}

View file

@ -0,0 +1,6 @@
{
"forgemarker": 1,
"variants": {
"": { "model": "create:block/schematicannon_connector" }
}
}

View file

@ -0,0 +1,6 @@
{
"forgemarker": 1,
"variants": {
"": { "model": "create:block/schematicannon_pipe" }
}
}

View file

@ -0,0 +1,24 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"textures": {
"0": "create:block/creative_crate_side",
"1": "create:block/creative_crate_top",
"particle": "create:block/creative_crate_top"
},
"elements": [
{
"name": "Cube",
"from": [ 1.0, 0.0, 1.0 ],
"to": [ 15.0, 14.0, 15.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"east": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"west": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"up": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"down": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }
}
}
]
}

View file

@ -0,0 +1,77 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"textures": {
"0": "create:block/schematic_table_side",
"1": "create:block/schematic_table_top",
"particle": "create:block/schematic_table_side"
},
"elements": [
{
"name": "base",
"from": [ 5.0, 0.0, 5.0 ],
"to": [ 11.0, 12.0, 11.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 6.0 ] },
"down": { "texture": "#0", "uv": [ 5.0, 6.0, 11.0, 12.0 ] }
}
},
{
"name": "Top",
"from": [ 0.0, 12.0, -2.0 ],
"to": [ 16.0, 15.0, 14.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] },
"down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 11.0, 4.0 ],
"to": [ 12.0, 14.0, 11.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] },
"east": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] },
"south": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] },
"west": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] },
"down": { "texture": "#1", "uv": [ 4.0, 4.0, 12.0, 11.0 ] }
}
},
{
"name": "Cube",
"from": [ 1.0, 12.0, 15.0 ],
"to": [ 15.0, 13.0, 16.0 ],
"rotation": { "origin": [ 8.0, 14.0, 16.0 ], "axis": "x", "angle": 22.5 },
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 12.0, 15.0, 13.0 ] },
"east": { "texture": "#0", "uv": [ 6.0, 14.0, 7.0, 15.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] },
"west": { "texture": "#0", "uv": [ 7.0, 14.0, 8.0, 15.0 ] },
"up": { "texture": "#0", "uv": [ 1.0, 13.0, 15.0, 14.0 ] },
"down": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 0.0, 4.0 ],
"to": [ 12.0, 2.0, 12.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 5.0, 14.0, 13.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 6.0, 14.0, 14.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 14.0, 9.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 4.0, 14.0, 12.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 5.0, 8.0, 13.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 5.0, 12.0, 13.0 ] }
}
}
]
}

View file

@ -0,0 +1,52 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/stonecutter_side",
"1": "block/stonecutter_bottom",
"2": "block/smooth_stone_slab_side",
"particle": "block/stonecutter_side"
},
"elements": [
{
"name": "Cube",
"from": [ 1.0, 0.0, 1.0 ],
"to": [ 15.0, 8.0, 15.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"up": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"down": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ -3.0, -0.1, 5.0 ],
"to": [ 19.0, 3.0, 11.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 5.0, 16.0, 8.0 ] },
"east": { "texture": "#2", "uv": [ 2.0, 5.0, 8.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 13.0, 16.0, 16.0 ] },
"west": { "texture": "#2", "uv": [ 2.0, 13.0, 8.0, 16.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 10.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ -3.0, -0.2, 5.0 ],
"to": [ 19.0, 3.0, 11.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 5.0, 16.0, 8.0 ] },
"east": { "texture": "#2", "uv": [ 2.0, 5.0, 8.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 13.0, 16.0, 16.0 ] },
"west": { "texture": "#2", "uv": [ 2.0, 13.0, 8.0, 16.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 10.0, 16.0, 16.0 ] }
}
}
]
}

View file

@ -0,0 +1,48 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/spruce_log",
"1": "block/dark_oak_log_top"
},
"elements": [
{
"name": "Cube",
"from": [ 0.5, 8.0, 0.5 ],
"to": [ 15.5, 11.0, 15.5 ],
"faces": {
"north": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"south": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"up": { "texture": "#0", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.0, 9.0, 0.0 ],
"to": [ 14.0, 20.0, 3.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"south": { "texture": "#1", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 1.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 11.0, 3.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.0, 9.0, 13.0 ],
"to": [ 14.0, 20.0, 16.0 ],
"faces": {
"north": { "texture": "#1", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"south": { "texture": "#1", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"up": { "texture": "#0", "uv": [ 0.0, 0.0, 4.0, 1.0 ] },
"down": { "texture": "#0", "uv": [ 0.0, 0.0, 11.0, 3.0 ] }
}
}
]
}

View file

@ -0,0 +1,61 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"textures": {
"0": "block/anvil_top",
"1": "block/anvil",
"2": "block/dispenser_front_vertical"
},
"elements": [
{
"name": "Cube",
"from": [ 3.4999999925494194, 12.0, 3.5000000074505806 ],
"to": [ 12.49999999254942, 19.0, 12.50000000745058 ],
"faces": {
"north": { "texture": "#0", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"up": { "texture": "#0", "uv": [ 4.0, 7.0, 13.0, 16.0 ] },
"down": { "texture": "#0", "uv": [ 4.0, 7.0, 13.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 6.499999992549419, 12.50000000745058, -1.4999999925494194 ],
"to": [ 10.49999999254942, 16.50000000745058, 17.50000000745058 ],
"faces": {
"north": { "texture": "#1", "uv": [ 10.0, 8.0, 14.0, 12.0 ] },
"east": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 4.0 ] },
"south": { "texture": "#1", "uv": [ 10.0, 8.0, 14.0, 12.0 ] },
"west": { "texture": "#1", "uv": [ 0.0, 8.0, 16.0, 12.0 ] },
"up": { "texture": "#1", "uv": [ 3.0, 0.0, 7.0, 16.0 ] },
"down": { "texture": "#1", "uv": [ 12.0, 0.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.500000007450581, 19.0, 4.500000007450581 ],
"to": [ 11.50000000745058, 30.0, 11.50000000745058 ],
"faces": {
"north": { "texture": "#1", "uv": [ 8.0, 1.0, 15.0, 12.0 ] },
"east": { "texture": "#1", "uv": [ 1.0, 1.0, 8.0, 12.0 ] },
"south": { "texture": "#1", "uv": [ 8.0, 1.0, 15.0, 12.0 ] },
"west": { "texture": "#1", "uv": [ 1.0, 1.0, 8.0, 12.0 ] },
"up": { "texture": "#1", "uv": [ 4.0, 7.0, 11.0, 14.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 29.0, 4.0 ],
"to": [ 12.0, 31.0, 12.0 ],
"faces": {
"north": { "texture": "#2", "uv": [ 6.0, 0.0, 14.0, 2.0 ] },
"east": { "texture": "#2", "uv": [ 3.0, 0.0, 11.0, 2.0 ] },
"south": { "texture": "#2", "uv": [ 5.0, 0.0, 13.0, 2.0 ] },
"west": { "texture": "#2", "uv": [ 2.0, 0.0, 10.0, 2.0 ] },
"up": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] },
"down": { "texture": "#2", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }
}
}
]
}

View file

@ -0,0 +1,3 @@
{
"parent": "create:block/creative_crate"
}

View file

@ -1,3 +1,3 @@
{
"parent": "block/crafting_table"
"parent": "create:block/schematic_table"
}

View file

@ -1,3 +1,151 @@
{
"parent": "block/dropper_vertical"
"__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)",
"parent": "block/cube",
"textures": {
"0": "block/stonecutter_side",
"1": "block/stonecutter_bottom",
"2": "block/smooth_stone_slab_side",
"3": "block/spruce_log",
"4": "block/dark_oak_log_top",
"5": "block/anvil_top",
"6": "block/anvil",
"7": "block/dispenser_front_vertical"
},
"elements": [
{
"name": "Cube",
"from": [ 1.0, 0.0, 1.0 ],
"to": [ 15.0, 8.0, 15.0 ],
"faces": {
"north": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"south": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"west": { "texture": "#0", "uv": [ 1.0, 8.0, 15.0, 16.0 ] },
"up": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"down": { "texture": "#1", "uv": [ 1.0, 1.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ -3.0, -0.1, 5.0 ],
"to": [ 19.0, 3.0, 11.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 5.0, 16.0, 8.0 ] },
"east": { "texture": "#2", "uv": [ 2.0, 5.0, 8.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 13.0, 16.0, 16.0 ] },
"west": { "texture": "#2", "uv": [ 2.0, 13.0, 8.0, 16.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 10.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ -3.0, -0.2, 5.0 ],
"to": [ 19.0, 3.0, 11.0 ],
"rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": -45.0 },
"faces": {
"north": { "texture": "#2", "uv": [ 0.0, 5.0, 16.0, 8.0 ] },
"east": { "texture": "#2", "uv": [ 2.0, 5.0, 8.0, 8.0 ] },
"south": { "texture": "#2", "uv": [ 0.0, 13.0, 16.0, 16.0 ] },
"west": { "texture": "#2", "uv": [ 2.0, 13.0, 8.0, 16.0 ] },
"up": { "texture": "#2", "uv": [ 0.0, 0.0, 16.0, 6.0 ] },
"down": { "texture": "#2", "uv": [ 0.0, 10.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 0.5, 8.0, 0.5 ],
"to": [ 15.5, 11.0, 15.5 ],
"faces": {
"north": { "texture": "#3", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"south": { "texture": "#3", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 16.0, 3.0 ] },
"up": { "texture": "#3", "uv": [ 1.0, 1.0, 15.0, 15.0 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 15.0, 15.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.0, 9.0, 0.0 ],
"to": [ 14.0, 20.0, 3.0 ],
"faces": {
"north": { "texture": "#4", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"south": { "texture": "#4", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"up": { "texture": "#3", "uv": [ 0.0, 0.0, 4.0, 1.0 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 11.0, 3.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.0, 9.0, 13.0 ],
"to": [ 14.0, 20.0, 16.0 ],
"faces": {
"north": { "texture": "#4", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"east": { "texture": "#3", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"south": { "texture": "#4", "uv": [ 2.0, 2.0, 14.0, 14.0 ] },
"west": { "texture": "#3", "uv": [ 0.0, 0.0, 3.0, 11.0 ] },
"up": { "texture": "#3", "uv": [ 0.0, 0.0, 4.0, 1.0 ] },
"down": { "texture": "#3", "uv": [ 0.0, 0.0, 11.0, 3.0 ] }
}
},
{
"name": "Cube",
"from": [ 3.4999999925494194, 12.0, 3.5000000074505806 ],
"to": [ 12.49999999254942, 19.0, 12.50000000745058 ],
"rotation": { "origin": [ 8.5, 14.5, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#5", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"east": { "texture": "#5", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"south": { "texture": "#5", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"west": { "texture": "#5", "uv": [ 4.0, 9.0, 13.0, 16.0 ] },
"up": { "texture": "#5", "uv": [ 4.0, 7.0, 13.0, 16.0 ] },
"down": { "texture": "#5", "uv": [ 4.0, 7.0, 13.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 6.499999992549419, 12.50000000745058, -1.4999999925494194 ],
"to": [ 10.49999999254942, 16.50000000745058, 17.50000000745058 ],
"rotation": { "origin": [ 8.50000000745058, 14.50000000745058, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#6", "uv": [ 10.0, 8.0, 14.0, 12.0 ] },
"east": { "texture": "#6", "uv": [ 0.0, 0.0, 16.0, 4.0 ] },
"south": { "texture": "#6", "uv": [ 10.0, 8.0, 14.0, 12.0 ] },
"west": { "texture": "#6", "uv": [ 0.0, 8.0, 16.0, 12.0 ] },
"up": { "texture": "#6", "uv": [ 3.0, 0.0, 7.0, 16.0 ] },
"down": { "texture": "#6", "uv": [ 12.0, 0.0, 16.0, 16.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.500000007450581, 19.0, 4.500000007450581 ],
"to": [ 11.50000000745058, 30.0, 11.50000000745058 ],
"rotation": { "origin": [ 8.5, 14.5, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#6", "uv": [ 8.0, 1.0, 15.0, 12.0 ] },
"east": { "texture": "#6", "uv": [ 1.0, 1.0, 8.0, 12.0 ] },
"south": { "texture": "#6", "uv": [ 8.0, 1.0, 15.0, 12.0 ] },
"west": { "texture": "#6", "uv": [ 1.0, 1.0, 8.0, 12.0 ] },
"up": { "texture": "#6", "uv": [ 4.0, 7.0, 11.0, 14.0 ] }
}
},
{
"name": "Cube",
"from": [ 4.0, 29.0, 4.0 ],
"to": [ 12.0, 31.0, 12.0 ],
"rotation": { "origin": [ 8.5, 14.5, 8.0 ], "axis": "z", "angle": 45.0 },
"faces": {
"north": { "texture": "#7", "uv": [ 6.0, 0.0, 14.0, 2.0 ] },
"east": { "texture": "#7", "uv": [ 3.0, 0.0, 11.0, 2.0 ] },
"south": { "texture": "#7", "uv": [ 5.0, 0.0, 13.0, 2.0 ] },
"west": { "texture": "#7", "uv": [ 2.0, 0.0, 10.0, 2.0 ] },
"up": { "texture": "#7", "uv": [ 4.0, 4.0, 12.0, 12.0 ] },
"down": { "texture": "#7", "uv": [ 4.0, 4.0, 12.0, 12.0 ] }
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B