mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-23 21:46:40 +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;
|
||||
|
||||
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()),
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
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,17 +19,29 @@ 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
|
||||
public boolean hasTileEntity() {
|
||||
return true;
|
||||
|
@ -49,18 +66,30 @@ public class SchematicTableBlock extends ContainerBlock {
|
|||
public TileEntity createNewTileEntity(IBlockReader worldIn) {
|
||||
return new SchematicTableTileEntity();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
if (worldIn.getTileEntity(pos) == null)
|
||||
return;
|
||||
|
||||
|
||||
SchematicTableTileEntity te = (SchematicTableTileEntity) worldIn.getTileEntity(pos);
|
||||
if (!te.inputStack.isEmpty())
|
||||
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), te.inputStack);
|
||||
if (!te.outputStack.isEmpty())
|
||||
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), te.outputStack);
|
||||
|
||||
|
||||
}
|
||||
|
||||
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.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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 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);
|
||||
|
@ -135,21 +266,49 @@ 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) {
|
||||
for (int slot = 0; slot < iItemHandler.getSlots(); slot++) {
|
||||
ItemStack stackInSlot = iItemHandler.getStackInSlot(slot);
|
||||
if (!stackInSlot.isItemEqual(requiredItem))
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
@ -73,7 +83,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
|
|||
GuiResources.SCHEMATIC_TABLE.draw(this, xMainWindow, yMainWindow);
|
||||
GuiResources.PLAYER_INVENTORY.draw(this, x, y + 20);
|
||||
|
||||
if (container.isUploading)
|
||||
if (container.isUploading)
|
||||
font.drawString("Uploading...", xMainWindow + 76, yMainWindow + 10, GuiResources.FONT_COLOR);
|
||||
else
|
||||
font.drawString("Choose a Schematic", xMainWindow + 50, yMainWindow + 10, GuiResources.FONT_COLOR);
|
||||
|
@ -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,8 +104,37 @@ 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) {
|
||||
if (w instanceof AbstractSimiWidget && w.isHovered()) {
|
||||
|
@ -117,7 +157,7 @@ public class SchematicTableScreen extends ContainerScreen<SchematicTableContaine
|
|||
progress = Create.cSchematicLoader.getProgress(container.schematicUploading);
|
||||
label.colored(0xCCDDFF);
|
||||
button.active = false;
|
||||
|
||||
|
||||
} else {
|
||||
progress = 0;
|
||||
lastProgress = 0;
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"forgemarker": 1,
|
||||
"variants": {
|
||||
"": { "model": "create:block/creative_crate" }
|
||||
}
|
||||
}
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"forgemarker": 1,
|
||||
"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