mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-25 06:27:41 +01:00
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:
parent
b66aa4c4d3
commit
c6c9a8f8eb
27 changed files with 877 additions and 29 deletions
|
@ -1,6 +1,8 @@
|
||||||
package com.simibubi.create;
|
package com.simibubi.create;
|
||||||
|
|
||||||
|
import com.simibubi.create.block.CreativeCrateBlock;
|
||||||
import com.simibubi.create.block.IJustForRendering;
|
import com.simibubi.create.block.IJustForRendering;
|
||||||
|
import com.simibubi.create.block.RenderingBlock;
|
||||||
import com.simibubi.create.block.SchematicTableBlock;
|
import com.simibubi.create.block.SchematicTableBlock;
|
||||||
import com.simibubi.create.block.SchematicannonBlock;
|
import com.simibubi.create.block.SchematicannonBlock;
|
||||||
import com.simibubi.create.block.symmetry.BlockSymmetryCrossPlane;
|
import com.simibubi.create.block.symmetry.BlockSymmetryCrossPlane;
|
||||||
|
@ -16,6 +18,10 @@ import net.minecraftforge.registries.IForgeRegistry;
|
||||||
public enum AllBlocks {
|
public enum AllBlocks {
|
||||||
|
|
||||||
SCHEMATICANNON(new SchematicannonBlock()),
|
SCHEMATICANNON(new SchematicannonBlock()),
|
||||||
|
SCHEMATICANNON_CONNECTOR(new RenderingBlock()),
|
||||||
|
SCHEMATICANNON_PIPE(new RenderingBlock()),
|
||||||
|
CREATIVE_CRATE(new CreativeCrateBlock()),
|
||||||
|
|
||||||
SCHEMATIC_TABLE(new SchematicTableBlock()),
|
SCHEMATIC_TABLE(new SchematicTableBlock()),
|
||||||
|
|
||||||
SYMMETRY_PLANE(new BlockSymmetryPlane()),
|
SYMMETRY_PLANE(new BlockSymmetryPlane()),
|
||||||
|
|
|
@ -3,13 +3,16 @@ package com.simibubi.create;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import com.simibubi.create.block.SchematicTableTileEntity;
|
import com.simibubi.create.block.SchematicTableTileEntity;
|
||||||
|
import com.simibubi.create.block.SchematicannonRenderer;
|
||||||
import com.simibubi.create.block.SchematicannonTileEntity;
|
import com.simibubi.create.block.SchematicannonTileEntity;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.tileentity.TileEntityType;
|
import net.minecraft.tileentity.TileEntityType;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraftforge.event.RegistryEvent;
|
import net.minecraftforge.event.RegistryEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
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;
|
||||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
|
||||||
|
|
||||||
|
@ -40,10 +43,11 @@ public enum AllTileEntities {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerRenderers() {
|
public static void registerRenderers() {
|
||||||
|
bind(SchematicannonTileEntity.class, new SchematicannonRenderer());
|
||||||
}
|
}
|
||||||
|
|
||||||
// private static <T extends TileEntity> void bind(Class<T> clazz, TileEntityRenderer<? super T> renderer) {
|
private static <T extends TileEntity> void bind(Class<T> clazz, TileEntityRenderer<? super T> renderer) {
|
||||||
// ClientRegistry.bindTileEntitySpecialRenderer(clazz, renderer);
|
ClientRegistry.bindTileEntitySpecialRenderer(clazz, renderer);
|
||||||
// }
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
12
src/main/java/com/simibubi/create/block/RenderingBlock.java
Normal file
12
src/main/java/com/simibubi/create/block/RenderingBlock.java
Normal 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,12 +1,17 @@
|
||||||
package com.simibubi.create.block;
|
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.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
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.entity.player.PlayerEntity;
|
||||||
import net.minecraft.inventory.InventoryHelper;
|
import net.minecraft.inventory.InventoryHelper;
|
||||||
import net.minecraft.inventory.container.INamedContainerProvider;
|
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.tileentity.TileEntity;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.math.BlockPos;
|
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.IBlockReader;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class SchematicTableBlock extends ContainerBlock {
|
@SuppressWarnings("deprecation")
|
||||||
|
public class SchematicTableBlock extends HorizontalBlock implements ITileEntityProvider {
|
||||||
|
|
||||||
public SchematicTableBlock() {
|
public SchematicTableBlock() {
|
||||||
super(Properties.from(Blocks.OAK_PLANKS));
|
super(Properties.from(Blocks.OAK_PLANKS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockRenderType getRenderType(BlockState state) {
|
protected void fillStateContainer(Builder<Block, BlockState> builder) {
|
||||||
return BlockRenderType.MODEL;
|
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
|
@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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,14 +45,14 @@ public class SchematicTableContainer extends Container {
|
||||||
this.player = inv.player;
|
this.player = inv.player;
|
||||||
this.te = te;
|
this.te = te;
|
||||||
|
|
||||||
inputSlot = new Slot(tableInventory, 0, 31, 15) {
|
inputSlot = new Slot(tableInventory, 0, -9, 15) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isItemValid(ItemStack stack) {
|
public boolean isItemValid(ItemStack stack) {
|
||||||
return AllItems.EMPTY_BLUEPRINT.typeOf(stack);
|
return AllItems.EMPTY_BLUEPRINT.typeOf(stack);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
outputSlot = new Slot(tableInventory, 1, 115, 15) {
|
outputSlot = new Slot(tableInventory, 1, 75, 15) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isItemValid(ItemStack stack) {
|
public boolean isItemValid(ItemStack stack) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -33,6 +33,12 @@ public class SchematicannonBlock extends Block {
|
||||||
return stateIn;
|
return stateIn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSolid(BlockState state) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) {
|
public void onNeighborChange(BlockState state, IWorldReader world, BlockPos pos, BlockPos neighbor) {
|
||||||
((SchematicannonTileEntity) world.getTileEntity(pos)).findInventories();
|
((SchematicannonTileEntity) world.getTileEntity(pos)).findInventories();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.ServerSchematicLoader;
|
import com.simibubi.create.ServerSchematicLoader;
|
||||||
import com.simibubi.create.schematic.Cuboid;
|
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.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.Items;
|
import net.minecraft.item.Items;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.nbt.CompressedStreamTools;
|
import net.minecraft.nbt.CompressedStreamTools;
|
||||||
|
import net.minecraft.nbt.ListNBT;
|
||||||
|
import net.minecraft.nbt.NBTUtil;
|
||||||
import net.minecraft.tileentity.ITickableTileEntity;
|
import net.minecraft.tileentity.ITickableTileEntity;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.tileentity.TileEntityType;
|
import net.minecraft.tileentity.TileEntityType;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
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.PlacementSettings;
|
||||||
import net.minecraft.world.gen.feature.template.Template;
|
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.common.util.LazyOptional;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
public class SchematicannonTileEntity extends TileEntitySynced implements ITickableTileEntity {
|
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 SchematicWorld reader;
|
||||||
private BlockPos currentPos;
|
public BlockPos currentPos;
|
||||||
public BlockPos anchor;
|
public BlockPos anchor;
|
||||||
public String schematicToPrint;
|
public String schematicToPrint;
|
||||||
public boolean missingBlock;
|
public boolean missingBlock;
|
||||||
|
public boolean creative;
|
||||||
|
|
||||||
|
public BlockPos target;
|
||||||
|
public BlockPos previousTarget;
|
||||||
|
|
||||||
public List<IItemHandler> attachedInventories;
|
public List<IItemHandler> attachedInventories;
|
||||||
|
public List<LaunchedBlock> flyingBlocks;
|
||||||
|
|
||||||
private int cooldown;
|
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() {
|
public SchematicannonTileEntity() {
|
||||||
this(AllTileEntities.Schematicannon.type);
|
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) {
|
public SchematicannonTileEntity(TileEntityType<?> tileEntityTypeIn) {
|
||||||
super(tileEntityTypeIn);
|
super(tileEntityTypeIn);
|
||||||
attachedInventories = new LinkedList<>();
|
attachedInventories = new LinkedList<>();
|
||||||
|
flyingBlocks = new LinkedList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void findInventories() {
|
public void findInventories() {
|
||||||
|
creative = false;
|
||||||
for (Direction facing : Direction.values()) {
|
for (Direction facing : Direction.values()) {
|
||||||
|
|
||||||
|
if (AllBlocks.CREATIVE_CRATE.typeOf(world.getBlockState(pos.offset(facing)))) {
|
||||||
|
creative = true;
|
||||||
|
}
|
||||||
|
|
||||||
TileEntity tileEntity = world.getTileEntity(pos.offset(facing));
|
TileEntity tileEntity = world.getTileEntity(pos.offset(facing));
|
||||||
if (tileEntity != null) {
|
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()) {
|
if (capability.isPresent()) {
|
||||||
attachedInventories.add(capability.orElse(null));
|
attachedInventories.add(capability.orElse(null));
|
||||||
}
|
}
|
||||||
|
@ -72,16 +132,86 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(CompoundNBT compound) {
|
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);
|
super.read(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompoundNBT write(CompoundNBT compound) {
|
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);
|
return super.write(compound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
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)
|
if (world.isRemote)
|
||||||
return;
|
return;
|
||||||
if (schematicToPrint == null)
|
if (schematicToPrint == null)
|
||||||
|
@ -117,7 +247,8 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
|
||||||
BlockPos size = reader.getBounds().getSize();
|
BlockPos size = reader.getBounds().getSize();
|
||||||
BlockState state;
|
BlockState state;
|
||||||
do {
|
do {
|
||||||
if (!missingBlock)
|
// Find next block to place
|
||||||
|
if (!missingBlock || creative)
|
||||||
currentPos = currentPos.offset(Direction.EAST);
|
currentPos = currentPos.offset(Direction.EAST);
|
||||||
if (currentPos.getX() > size.getX()) {
|
if (currentPos.getX() > size.getX()) {
|
||||||
currentPos = new BlockPos(0, currentPos.getY(), currentPos.getZ() + 1);
|
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));
|
state = reader.getBlockState(anchor.add(currentPos));
|
||||||
} while (state.getBlock() == Blocks.AIR);
|
} 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;
|
missingBlock = true;
|
||||||
ItemStack requiredItem = new ItemStack(BlockItem.BLOCK_TO_ITEM.getOrDefault(state.getBlock(), Items.AIR));
|
ItemStack requiredItem = new ItemStack(BlockItem.BLOCK_TO_ITEM.getOrDefault(state.getBlock(), Items.AIR));
|
||||||
for (IItemHandler iItemHandler : attachedInventories) {
|
for (IItemHandler iItemHandler : attachedInventories) {
|
||||||
|
@ -144,12 +297,18 @@ public class SchematicannonTileEntity extends TileEntitySynced implements ITicka
|
||||||
if (!stackInSlot.isItemEqual(requiredItem))
|
if (!stackInSlot.isItemEqual(requiredItem))
|
||||||
continue;
|
continue;
|
||||||
iItemHandler.extractItem(slot, 1, false);
|
iItemHandler.extractItem(slot, 1, false);
|
||||||
world.setBlockState(currentPos.add(anchor), state);
|
launchBlock(target, state);
|
||||||
missingBlock = false;
|
missingBlock = false;
|
||||||
return;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,10 @@ package com.simibubi.create.gui;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.GlStateManager;
|
import com.mojang.blaze3d.platform.GlStateManager;
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
import com.simibubi.create.Create;
|
import com.simibubi.create.Create;
|
||||||
import com.simibubi.create.block.SchematicTableContainer;
|
import com.simibubi.create.block.SchematicTableContainer;
|
||||||
import com.simibubi.create.gui.widgets.AbstractSimiWidget;
|
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.ScrollArea;
|
||||||
import com.simibubi.create.gui.widgets.SimiButton;
|
import com.simibubi.create.gui.widgets.SimiButton;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.IHasContainer;
|
import net.minecraft.client.gui.IHasContainer;
|
||||||
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
|
import net.minecraft.client.gui.screen.inventory.ContainerScreen;
|
||||||
import net.minecraft.client.gui.widget.Widget;
|
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.entity.player.PlayerInventory;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
|
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||||
|
|
||||||
public class SchematicTableScreen extends ContainerScreen<SchematicTableContainer>
|
public class SchematicTableScreen extends ContainerScreen<SchematicTableContainer>
|
||||||
implements IHasContainer<SchematicTableContainer> {
|
implements IHasContainer<SchematicTableContainer> {
|
||||||
|
@ -44,7 +54,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
|
||||||
super.init();
|
super.init();
|
||||||
xTopLeft = (width - GuiResources.SCHEMATIC_TABLE.width) / 2;
|
xTopLeft = (width - GuiResources.SCHEMATIC_TABLE.width) / 2;
|
||||||
yTopLeft = (height - GuiResources.SCHEMATIC_TABLE.height) / 2;
|
yTopLeft = (height - GuiResources.SCHEMATIC_TABLE.height) / 2;
|
||||||
xMainWindow = xTopLeft;
|
xMainWindow = xTopLeft - 40;
|
||||||
yMainWindow = yTopLeft - 80;
|
yMainWindow = yTopLeft - 80;
|
||||||
buttons.clear();
|
buttons.clear();
|
||||||
|
|
||||||
|
@ -82,6 +92,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
|
||||||
if (schematics == null) {
|
if (schematics == null) {
|
||||||
font.drawStringWithShadow(" No Schematics Saved ", xMainWindow + 39, yMainWindow + 26, 0xFFDD44);
|
font.drawStringWithShadow(" No Schematics Saved ", xMainWindow + 39, yMainWindow + 26, 0xFFDD44);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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 width = (int) (GuiResources.SCHEMATIC_TABLE_PROGRESS.width * MathHelper.lerp(pt, lastProgress, progress));
|
||||||
int height = GuiResources.SCHEMATIC_TABLE_PROGRESS.height;
|
int height = GuiResources.SCHEMATIC_TABLE_PROGRESS.height;
|
||||||
GlStateManager.disableLighting();
|
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);
|
renderHoveredToolTip(mouseX, mouseY);
|
||||||
for (Widget w : buttons) {
|
for (Widget w : buttons) {
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"forgemarker": 1,
|
||||||
|
"variants": {
|
||||||
|
"": { "model": "create:block/creative_crate" }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,12 @@
|
||||||
{
|
{
|
||||||
"forgemarker": 1,
|
"forgemarker": 1,
|
||||||
|
"defaults": {
|
||||||
|
"model": "create:block/schematic_table"
|
||||||
|
},
|
||||||
"variants": {
|
"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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"forgemarker": 1,
|
"forgemarker": 1,
|
||||||
"variants": {
|
"variants": {
|
||||||
"": { "model": "block/dropper_vertical" }
|
"": { "model": "create:block/schematicannon_base" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"forgemarker": 1,
|
||||||
|
"variants": {
|
||||||
|
"": { "model": "create:block/schematicannon_connector" }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"forgemarker": 1,
|
||||||
|
"variants": {
|
||||||
|
"": { "model": "create:block/schematicannon_pipe" }
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 ] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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 ] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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 ] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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 ] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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 ] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"parent": "create:block/creative_crate"
|
||||||
|
}
|
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"parent": "block/crafting_table"
|
"parent": "create:block/schematic_table"
|
||||||
}
|
}
|
|
@ -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 |
Loading…
Reference in a new issue