Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.maideniles.fancyfurnishings.blocks.kitchen;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Locale;
- import java.util.stream.Stream;
- import com.maideniles.fancyfurnishings.FancyFurnishings;
- import com.maideniles.fancyfurnishings.ModBlocks;
- import com.maideniles.fancyfurnishings.ModItems;
- import com.maideniles.fancyfurnishings.blocks.base.BlockFurnishingBase;
- import com.maideniles.fancyfurnishings.blocks.kitchen.BlockCounter.CounterType;
- import com.maideniles.fancyfurnishings.blocks.kitchen.BlockFridge.FridgeType;
- import com.maideniles.fancyfurnishings.util.BlockStateHandler;
- import com.maideniles.fancyfurnishings.util.IFridgeConnect;
- import com.maideniles.fancyfurnishings.util.IHasModel;
- import net.minecraft.block.Block;
- import net.minecraft.block.BlockHorizontal;
- import net.minecraft.block.material.Material;
- import net.minecraft.block.properties.IProperty;
- import net.minecraft.block.properties.PropertyBool;
- import net.minecraft.block.properties.PropertyDirection;
- import net.minecraft.block.properties.PropertyEnum;
- import net.minecraft.block.state.BlockStateContainer;
- import net.minecraft.block.state.IBlockState;
- import net.minecraft.entity.EntityLivingBase;
- import net.minecraft.item.Item;
- import net.minecraft.item.ItemBlock;
- import net.minecraft.item.ItemStack;
- import net.minecraft.util.EnumFacing;
- import net.minecraft.util.IStringSerializable;
- import net.minecraft.util.math.BlockPos;
- import net.minecraft.world.IBlockAccess;
- import net.minecraft.world.World;
- public class BlockFridge extends Block {
- public static final PropertyDirection FACING = BlockHorizontal.FACING;
- public static final PropertyEnum FRIDGE_TYPE = PropertyEnum.create("fridge_type", FridgeType.class);
- public BlockFridge(String name, Material materialIn) {
- super(materialIn);
- setUnlocalizedName(name);
- setRegistryName(name); setCreativeTab(FancyFurnishings.fancyfurnishingsblocks);
- ModBlocks.BLOCKS.add(this); ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName())); this.setDefaultState(this.getDefaultState().withProperty(FACING, EnumFacing.NORTH).withProperty(FRIDGE_TYPE, FridgeType.SINGLE));
- }
- @Override
- protected BlockStateContainer createBlockState() {
- return new BlockStateContainer(this, new IProperty[] { FACING, FRIDGE_TYPE });
- }
- public enum FridgeType implements IStringSerializable{
- SINGLE(0), UP_LEFT(0), UP_RIGHT(1), DOWN_LEFT(2), DOWN_RIGHT(3);
- private final int meta;
- FridgeType(int meta) {
- this.meta = meta;
- }
- @Override
- public String getName() {
- return this.toString().toLowerCase();
- }
- public int getMeta() {
- return this.meta;
- }
- public static FridgeType getFromMeta(int meta) {
- for (FridgeType type : FridgeType.values()) {
- if((type != FridgeType.SINGLE) && (type.getMeta() == meta)) {
- return type;
- }
- }
- return FridgeType.SINGLE;
- }
- }
- @Override
- public IBlockState getStateFromMeta(int meta) {
- return this.getDefaultState().withProperty(FRIDGE_TYPE, FridgeType.getFromMeta((meta & 0b1100) >> 2)).withProperty(FACING, EnumFacing.getHorizontal(meta & 0b0011));
- }
- @Override
- public int getMetaFromState(IBlockState state) {
- return (((FridgeType) state.getValue(FRIDGE_TYPE)).getMeta() << 2) | state.getValue(FACING).getHorizontalIndex();
- }
- public boolean canFridgeBeExtended(IBlockAccess world, BlockPos existingFridgePos, BlockPos extensionFridgePos, EnumFacing extensionFridgeFacing) {
- IBlockState existingFridge = world.getBlockState(existingFridgePos);
- FridgeType fridgeType = (FridgeType) existingFridge.getValue(FRIDGE_TYPE);
- EnumFacing facing = existingFridge.getValue(FACING);
- if(extensionFridgeFacing != facing) // don't connect to fridge with different facing
- return false;
- BlockPos fridgeUpLeft = null;
- BlockPos fridgeUpRight = null;
- BlockPos fridgeDownLeft = null;
- BlockPos fridgeDownRight = null;
- // assign all variables
- switch (fridgeType) {
- case SINGLE:
- return true;
- case UP_LEFT:
- fridgeUpLeft = existingFridgePos;
- break;
- case UP_RIGHT:
- fridgeUpLeft = existingFridgePos.offset(facing.rotateY());
- break;
- case DOWN_LEFT:
- fridgeUpLeft = existingFridgePos.up();
- break;
- case DOWN_RIGHT:
- fridgeUpLeft = existingFridgePos.up().offset(facing.rotateY());
- break;
- }
- fridgeUpRight = fridgeUpLeft.offset(facing.rotateYCCW());
- fridgeDownLeft = fridgeUpLeft.down();
- fridgeDownRight = fridgeUpRight.down();
- // return true if there is an empty space in the fridge structure
- // or if there is nothing added to the right side of the structure so that the current left side could become the right side
- return Stream.of(fridgeUpLeft, fridgeUpRight, fridgeDownLeft, fridgeDownRight).anyMatch(extensionFridgePos::equals)
- || (Stream.of(fridgeUpRight, fridgeDownRight).allMatch(world::isAirBlock) && Stream.of(fridgeUpLeft.offset(facing.rotateY()),
- fridgeDownLeft.offset(facing.rotateY())).anyMatch(existingFridge::equals));
- }
- public IBlockState getStateForPos(IBlockAccess
- world, BlockPos pos, EnumFacing facing, boolean changeBlocks) {
- IBlockState state = this.getDefaultState().withProperty(FACING, facing).withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
- EnumFacing facingOpp = facing.getOpposite();
- for (EnumFacing direction : EnumFacing.VALUES) {
- if((direction != facing) && (direction !=facingOpp) && ((World) world).getBlockState(pos.offset(direction)).getBlock()
- instanceof BlockFridge && this.canFridgeBeExtended(world, pos.offset(direction), pos, facing)) {
- BlockPos existingFridgePos = pos.offset(direction);
- IBlockState existingFridge = world.getBlockState(existingFridgePos);
- FridgeType fridgeType = (FridgeType) existingFridge.getValue(FRIDGE_TYPE);
- EnumFacing extensionFridgeFacing = existingFridge.getValue(FACING);
- if(extensionFridgeFacing != facing) // don't connect to fridge with different facing
- break;
- BlockPos fridgeUpLeft = null;
- BlockPos fridgeUpRight = null;
- BlockPos fridgeDownLeft = null;
- BlockPos fridgeDownRight = null;
- // assign all variables
- switch (fridgeType) {
- case SINGLE:
- FridgeType typeExtension = FridgeType.SINGLE;
- if (existingFridgePos.equals (pos.offset(facing.rotateYCCW()))) {
- fridgeType = FridgeType.UP_LEFT;
- typeExtension = FridgeType.UP_RIGHT;
- } else if (existingFridgePos.equals(pos.offset(facing.rotateY()))) {
- // is rotateYXZ a thing?
- fridgeType = FridgeType.UP_RIGHT;
- typeExtension = FridgeType.UP_LEFT;
- } else if (existingFridgePos.equals (pos.up())) {
- fridgeType = FridgeType.UP_LEFT;
- typeExtension = FridgeType.DOWN_LEFT;
- } else if (existingFridgePos.equals (pos.down())) {
- fridgeType = FridgeType.DOWN_LEFT;
- typeExtension = FridgeType.UP_LEFT;
- }
- state = state.withProperty(FRIDGE_TYPE, typeExtension);
- if (changeBlocks) {
- ((World) world).setBlockState(pos, state);
- ((World) world).setBlockState(existingFridgePos, existingFridge.withProperty(FRIDGE_TYPE, fridgeType));
- }
- return state;
- case UP_LEFT:
- fridgeUpLeft = existingFridgePos;
- break;
- case UP_RIGHT:
- fridgeUpLeft = existingFridgePos.offset(facing.rotateY());
- break;
- case DOWN_LEFT:
- fridgeUpLeft = existingFridgePos.up();
- break;
- case DOWN_RIGHT:
- fridgeUpLeft = existingFridgePos.up().offset(facing.rotateY());
- break;
- }
- fridgeUpRight = fridgeUpLeft.offset(facing.rotateYCCW());
- fridgeDownLeft = fridgeUpLeft.down();
- fridgeDownRight = fridgeUpRight.down();
- BlockPos[] fridges = {fridgeUpLeft, fridgeUpRight, fridgeDownLeft, fridgeDownRight};
- for (int i = 0; i < fridges.length; i++) {
- if(pos.equals(fridges[i])) {
- state = state.withProperty(FRIDGE_TYPE, (i==0) ? FridgeType.UP_LEFT : ((i==1) ? FridgeType.UP_RIGHT : ((i == 2) ? FridgeType.DOWN_LEFT : FridgeType.DOWN_RIGHT)));
- if(changeBlocks) {
- ((World) world).setBlockState(pos, state);
- }
- return state;
- }
- }
- if(Stream.of(fridgeUpRight, fridgeDownRight).allMatch(world::isAirBlock) && Stream.of(fridgeUpLeft.offset(facing.rotateY()), fridgeDownLeft.offset(facing.rotateY())).anyMatch(existingFridge::equals)) {
- state = state.withProperty(FRIDGE_TYPE, (pos.equals(fridgeUpLeft.offset(facing.rotateY())) ? FridgeType.UP_LEFT : FridgeType.DOWN_LEFT));
- if(changeBlocks) {
- ((World) world).setBlockState(pos, state);
- IBlockState fridgeUpLeftState = world.getBlockState(fridgeUpLeft);
- if((fridgeUpLeftState.getBlock() instanceof BlockFridge) && (fridgeUpLeftState.getValue(FACING) == facing)) {
- ((World) world).setBlockState(fridgeUpLeft, fridgeUpLeftState .withProperty(FRIDGE_TYPE, FridgeType.UP_RIGHT));
- }
- IBlockState fridgeDownLeftState = world.getBlockState(fridgeDownLeft);
- if((fridgeDownLeftState.getBlock() instanceof BlockFridge) && (fridgeDownLeftState.getValue(FACING) == facing)) {
- ((World) world).setBlockState(fridgeDownLeft, fridgeDownLeftState .withProperty(FRIDGE_TYPE, FridgeType.DOWN_RIGHT));
- }
- }
- }
- return state;
- }
- }
- state = state.withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
- if (changeBlocks) {
- ((World) world).setBlockState(pos, state);
- }
- return state;
- }
- @Override
- public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
- if((state.getValue(FRIDGE_TYPE) == FridgeType.UP_LEFT) && (this.getStateForPos(worldIn, pos, state.getValue(FACING), false).getValue(FRIDGE_TYPE) == FridgeType.SINGLE)) {
- return state.withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
- } else {
- return state;
- }
- }
- public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
- this.getStateForPos(worldIn, pos, state.getValue(FACING), true);
- }
- @Override
- public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
- return this.getStateForPos(worldIn, pos, placer.getHorizontalFacing().getOpposite(), false);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement