package game.block; import game.entity.types.EntityLiving; import game.init.Blocks; import game.init.SoundEvent; import game.item.CheatTab; import game.item.ItemStack; import game.material.Material; import game.model.ModelRotation; import game.properties.IProperty; import game.properties.PropertyBool; import game.properties.PropertyDirection; import game.renderer.BlockLayer; import game.renderer.blockmodel.ModelBlock; import game.rng.Random; import game.world.BlockPos; import game.world.BoundingBox; import game.world.Facing; import game.world.IWorldAccess; import game.world.State; import game.world.World; import game.world.WorldServer; public class BlockTripWireHook extends Block { public static final PropertyDirection FACING = PropertyDirection.create("facing", Facing.Plane.HORIZONTAL); public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyBool ATTACHED = PropertyBool.create("attached"); public static final PropertyBool SUSPENDED = PropertyBool.create("suspended"); public BlockTripWireHook() { super(Material.circuits); this.setDefaultState(this.getBaseState().withProperty(FACING, Facing.NORTH).withProperty(POWERED, Boolean.valueOf(false)).withProperty(ATTACHED, Boolean.valueOf(false)).withProperty(SUSPENDED, Boolean.valueOf(false))); this.setTab(CheatTab.tabTech); // this.setTickRandomly(true); } /** * Get the actual Block state of this Block at the given position. This applies properties not visible in the * metadata, such as fence connections. */ public State getActualState(State state, IWorldAccess worldIn, BlockPos pos) { return state.withProperty(SUSPENDED, Boolean.valueOf(!World.isSolidSurface(worldIn.getState(pos.down())))); } public BoundingBox getCollisionBoundingBox(World worldIn, BlockPos pos, State state) { return null; } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube() { return false; } public boolean isFullCube() { return false; } /** * Check whether this Block can be placed on the given side */ public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, Facing side) { return side.getAxis().isHorizontal() && worldIn.getState(pos.offset(side.getOpposite())).getBlock().isNormalCube(); } public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { for (Facing enumfacing : Facing.Plane.HORIZONTAL) { if (worldIn.getState(pos.offset(enumfacing)).getBlock().isNormalCube()) { return true; } } return false; } /** * Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the * IBlockstate */ public State onBlockPlaced(World worldIn, BlockPos pos, Facing facing, float hitX, float hitY, float hitZ, int meta, EntityLiving placer) { State iblockstate = this.getState().withProperty(POWERED, Boolean.valueOf(false)).withProperty(ATTACHED, Boolean.valueOf(false)).withProperty(SUSPENDED, Boolean.valueOf(false)); if (facing.getAxis().isHorizontal()) { iblockstate = iblockstate.withProperty(FACING, facing); } return iblockstate; } /** * Called by ItemBlocks after a block is set in the world, to allow post-place logic */ public void onBlockPlacedBy(World worldIn, BlockPos pos, State state, EntityLiving placer, ItemStack stack) { this.triggerHookAt(worldIn, pos, state, false, false, -1, (State)null); } /** * Called when a neighboring block changes. */ public void onNeighborBlockChange(World worldIn, BlockPos pos, State state, Block neighborBlock) { if (neighborBlock != this) { if (this.checkForDrop(worldIn, pos, state)) { Facing enumfacing = (Facing)state.getValue(FACING); if (!worldIn.getState(pos.offset(enumfacing.getOpposite())).getBlock().isNormalCube()) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); } } } } public void triggerHookAt(World worldIn, BlockPos pos, State hookState, boolean removed, boolean triggered, int wireDist, State wireState) { Facing enumfacing = (Facing)hookState.getValue(FACING); boolean attached = ((Boolean)hookState.getValue(ATTACHED)).booleanValue(); boolean powered = ((Boolean)hookState.getValue(POWERED)).booleanValue(); boolean floating = !worldIn.isBlockSolid(pos.down()); boolean nowAttached = !removed; boolean nowPowered = false; int i = 0; State[] aiblockstate = new State[42]; for (int j = 1; j < 42; ++j) { BlockPos blockpos = pos.offset(enumfacing, j); State iblockstate = worldIn.getState(blockpos); if (iblockstate.getBlock() == Blocks.tripwire_hook) { if (iblockstate.getValue(FACING) == enumfacing.getOpposite()) { i = j; } break; } if (iblockstate.getBlock() != Blocks.string && j != wireDist) { aiblockstate[j] = null; nowAttached = false; } else { if (j == wireDist) { iblockstate = wireState == null ? iblockstate : wireState; // (State)Objects.firstNonNull(wireState, iblockstate); } boolean flag5 = !((Boolean)iblockstate.getValue(BlockTripWire.DISARMED)).booleanValue(); boolean flag6 = ((Boolean)iblockstate.getValue(BlockTripWire.POWERED)).booleanValue(); boolean flag7 = ((Boolean)iblockstate.getValue(BlockTripWire.SUSPENDED)).booleanValue(); nowAttached &= flag7 == floating; nowPowered |= flag5 && flag6; aiblockstate[j] = iblockstate; if (j == wireDist) { worldIn.scheduleUpdate(pos, this, this.tickRate(worldIn, pos)); nowAttached &= flag5; } } } nowAttached = nowAttached & i > 1; nowPowered = nowPowered & nowAttached; State iblockstate1 = this.getState().withProperty(ATTACHED, Boolean.valueOf(nowAttached)).withProperty(POWERED, Boolean.valueOf(nowPowered)); if (i > 0) { BlockPos blockpos1 = pos.offset(enumfacing, i); Facing enumfacing1 = enumfacing.getOpposite(); worldIn.setState(blockpos1, iblockstate1.withProperty(FACING, enumfacing1), 3); this.notifyTriggered(worldIn, blockpos1, enumfacing1); this.playerTriggerSounds(worldIn, blockpos1, nowAttached, nowPowered, attached, powered); } this.playerTriggerSounds(worldIn, pos, nowAttached, nowPowered, attached, powered); if (!removed) { worldIn.setState(pos, iblockstate1.withProperty(FACING, enumfacing), 3); if (triggered) { this.notifyTriggered(worldIn, pos, enumfacing); } } if (attached != nowAttached) { for (int k = 1; k < i; ++k) { BlockPos blockpos2 = pos.offset(enumfacing, k); State iblockstate2 = aiblockstate[k]; if (iblockstate2 != null && worldIn.getState(blockpos2).getBlock() != Blocks.air) { worldIn.setState(blockpos2, iblockstate2.withProperty(ATTACHED, Boolean.valueOf(nowAttached)), 3); } } } } /** * Called randomly when setTickRandomly is set to true (used by e.g. crops to grow, etc.) */ public void randomTick(WorldServer worldIn, BlockPos pos, State state, Random random) { } public void updateTick(WorldServer worldIn, BlockPos pos, State state, Random rand) { this.triggerHookAt(worldIn, pos, state, false, true, -1, (State)null); } private void playerTriggerSounds(World worldIn, BlockPos pos, boolean attached, boolean powered, boolean wasAttached, boolean wasPowered) { if (powered && !wasPowered) { worldIn.playSound(SoundEvent.CLICK, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.1D, (double)pos.getZ() + 0.5D, 0.4F, 0.6F); } else if (!powered && wasPowered) { worldIn.playSound(SoundEvent.CLICK, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.1D, (double)pos.getZ() + 0.5D, 0.4F, 0.5F); } else if (attached && !wasAttached) { worldIn.playSound(SoundEvent.CLICK, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.1D, (double)pos.getZ() + 0.5D, 0.4F, 0.7F); } else if (!attached && wasAttached) { worldIn.playSound(SoundEvent.BOWHIT, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.1D, (double)pos.getZ() + 0.5D, 0.4F, 1.2F / (worldIn.rand.floatv() * 0.2F + 0.9F)); } } private void notifyTriggered(World worldIn, BlockPos pos, Facing face) { worldIn.notifyNeighborsOfStateChange(pos, this); worldIn.notifyNeighborsOfStateChange(pos.offset(face.getOpposite()), this); } private boolean checkForDrop(World worldIn, BlockPos pos, State state) { if (!this.canPlaceBlockAt(worldIn, pos)) { this.dropBlockAsItem(worldIn, pos, state, 0); worldIn.setBlockToAir(pos); return false; } else { return true; } } public void setBlockBoundsBasedOnState(IWorldAccess worldIn, BlockPos pos) { float f = 0.1875F; switch ((Facing)worldIn.getState(pos).getValue(FACING)) { case EAST: this.setBlockBounds(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f); break; case WEST: this.setBlockBounds(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f); break; case SOUTH: this.setBlockBounds(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F); break; case NORTH: this.setBlockBounds(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F); } } public void onBlockRemoved(WorldServer worldIn, BlockPos pos, State state) { boolean flag = ((Boolean)state.getValue(ATTACHED)).booleanValue(); boolean flag1 = ((Boolean)state.getValue(POWERED)).booleanValue(); if (flag || flag1) { this.triggerHookAt(worldIn, pos, state, true, false, -1, (State)null); } if (flag1) { worldIn.notifyNeighborsOfStateChange(pos, this); worldIn.notifyNeighborsOfStateChange(pos.offset(((Facing)state.getValue(FACING)).getOpposite()), this); } super.onBlockRemoved(worldIn, pos, state); } public int getWeakPower(IWorldAccess worldIn, BlockPos pos, State state, Facing side) { return ((Boolean)state.getValue(POWERED)).booleanValue() ? 15 : 0; } public int getStrongPower(IWorldAccess worldIn, BlockPos pos, State state, Facing side) { return !((Boolean)state.getValue(POWERED)).booleanValue() ? 0 : (state.getValue(FACING) == side ? 15 : 0); } /** * Can this block provide power. Only wire currently seems to have this change based on its state. */ public boolean canProvidePower() { return true; } public BlockLayer getBlockLayer() { return BlockLayer.CUTOUT_MIPPED; } /** * Convert the given metadata into a BlockState for this Block */ public State getStateFromMeta(int meta) { return this.getState().withProperty(FACING, Facing.getHorizontal(meta & 3)).withProperty(POWERED, Boolean.valueOf((meta & 8) > 0)).withProperty(ATTACHED, Boolean.valueOf((meta & 4) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(State state) { int i = 0; i = i | ((Facing)state.getValue(FACING)).getHorizontalIndex(); if (((Boolean)state.getValue(POWERED)).booleanValue()) { i |= 8; } if (((Boolean)state.getValue(ATTACHED)).booleanValue()) { i |= 4; } return i; } protected IProperty[] getProperties() { return new IProperty[] {FACING, POWERED, ATTACHED, SUSPENDED}; } public boolean isMagnetic() { return true; } public ModelBlock getModel(String name, State state) { ModelBlock model; if(state.getValue(ATTACHED)) { if(state.getValue(SUSPENDED)) { if(state.getValue(POWERED)) model = new ModelBlock("oak_planks") .add(7.75f, 2.5f, 0, 8.25f, 2.5f, 6.7f).rotate(8, 0, 0, Facing.Axis.X, -22.5f, true) .d("trip_wire").uv(0, 8, 16, 6).rot(90).noCull() .u("trip_wire").uv(0, 6, 16, 8).rot(90).noCull() .add(6.2f, 4.2f, 6.7f, 9.8f, 5, 10.3f) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 4.2f, 9.1f, 8.6f, 5, 9.1f) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 4.2f, 7.9f, 8.6f, 5, 7.9f) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 4.2f, 7.9f, 7.4f, 5, 9.1f) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 4.2f, 7.9f, 8.6f, 5, 9.1f) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14).rotate(8, 6, 14, Facing.Axis.X, -22.5f, false) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); else model = new ModelBlock("oak_planks") .add(7.75f, 3.5f, 0, 8.25f, 3.5f, 6.7f).rotate(8, 0, 0, Facing.Axis.X, -22.5f, true) .d("trip_wire").uv(0, 8, 16, 6).rot(90).noCull() .u("trip_wire").uv(0, 6, 16, 8).rot(90).noCull() .add(6.2f, 4.2f, 6.7f, 9.8f, 5, 10.3f) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 4.2f, 9.1f, 8.6f, 5, 9.1f) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 4.2f, 7.9f, 8.6f, 5, 7.9f) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 4.2f, 7.9f, 7.4f, 5, 9.1f) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 4.2f, 7.9f, 8.6f, 5, 9.1f) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14).rotate(8, 6, 14, Facing.Axis.X, -22.5f, false) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); } else { if(state.getValue(POWERED)) model = new ModelBlock("oak_planks") .add(7.75f, 0.5f, 0, 8.25f, 0.5f, 6.7f).rotate(8, 0, 0, Facing.Axis.X, -22.5f, true) .d("trip_wire").uv(0, 8, 16, 6).rot(90).noCull() .u("trip_wire").uv(0, 6, 16, 8).rot(90).noCull() .add(6.2f, 4.2f, 6.7f, 9.8f, 5, 10.3f) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 4.2f, 9.1f, 8.6f, 5, 9.1f) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 4.2f, 7.9f, 8.6f, 5, 7.9f) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 4.2f, 7.9f, 7.4f, 5, 9.1f) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 4.2f, 7.9f, 8.6f, 5, 9.1f) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14).rotate(8, 6, 14, Facing.Axis.X, -22.5f, false) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); else model = new ModelBlock("oak_planks") .add(7.75f, 1.5f, 0, 8.25f, 1.5f, 6.7f).rotate(8, 0, 0, Facing.Axis.X, -22.5f, true) .d("trip_wire").uv(0, 8, 16, 6).rot(90).noCull() .u("trip_wire").uv(0, 6, 16, 8).rot(90).noCull() .add(6.2f, 4.2f, 6.7f, 9.8f, 5, 10.3f) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 4.2f, 9.1f, 8.6f, 5, 9.1f) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 4.2f, 7.9f, 8.6f, 5, 7.9f) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 4.2f, 7.9f, 7.4f, 5, 9.1f) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 4.2f, 7.9f, 8.6f, 5, 9.1f) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); } } else { if(state.getValue(POWERED)) model = new ModelBlock("oak_planks") .add(6.2f, 4.2f, 6.7f, 9.8f, 5, 10.3f) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 4.2f, 9.1f, 8.6f, 5, 9.1f) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 4.2f, 7.9f, 8.6f, 5, 7.9f) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 4.2f, 7.9f, 7.4f, 5, 9.1f) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 4.2f, 7.9f, 8.6f, 5, 9.1f) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14).rotate(8, 6, 14, Facing.Axis.X, -22.5f, false) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); else model = new ModelBlock("oak_planks") .add(6.2f, 3.8f, 7.9f, 9.8f, 4.6f, 11.5f).rotate(8, 6, 5.2f, Facing.Axis.X, -45, false) .d("tripwire_hook").uv(5, 3, 11, 9).noCull() .u("tripwire_hook").uv(5, 3, 11, 9).noCull() .n("tripwire_hook").uv(5, 3, 11, 4).noCull() .s("tripwire_hook").uv(5, 8, 11, 9).noCull() .w("tripwire_hook").uv(5, 8, 11, 9).noCull() .e("tripwire_hook").uv(5, 3, 11, 4).noCull() .add(7.4f, 3.8f, 10.3f, 8.6f, 4.6f, 10.3f).rotate(8, 6, 5.2f, Facing.Axis.X, -45, false) .n("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(7.4f, 3.8f, 9.1f, 8.6f, 4.6f, 9.1f).rotate(8, 6, 5.2f, Facing.Axis.X, -45, false) .s("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 3.8f, 9.1f, 7.4f, 4.6f, 10.3f).rotate(8, 6, 5.2f, Facing.Axis.X, -45, false) .e("tripwire_hook").uv(7, 8, 9, 9).noCull() .add(8.6f, 3.8f, 9.1f, 8.6f, 4.6f, 10.3f).rotate(8, 6, 5.2f, Facing.Axis.X, -45, false) .w("tripwire_hook").uv(7, 3, 9, 4).noCull() .add(7.4f, 5.2f, 10, 8.8f, 6.8f, 14).rotate(8, 6, 14, Facing.Axis.X, 45, false) .d().uv(7, 9, 9, 14).noCull() .u().uv(7, 2, 9, 7).noCull() .n().uv(7, 9, 9, 11).noCull() .s().uv(7, 9, 9, 11).noCull() .w().uv(2, 9, 7, 11).noCull() .e().uv(9, 9, 14, 11).noCull() .add(6, 1, 14, 10, 9, 16) .d().uv(6, 14, 10, 16).noCull() .u().uv(6, 0, 10, 2).noCull() .n().uv(6, 7, 10, 15) .s().uv(6, 7, 10, 15).noCull() .w().uv(0, 7, 2, 15).noCull() .e().uv(14, 7, 16, 15).noCull(); } return model.rotate(ModelRotation.getNorthRot(state.getValue(FACING))); } }