Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
3,497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.91 KB | None | 0 0
  1. package com.maideniles.fancyfurnishings.blocks.kitchen;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Locale;
  6. import java.util.stream.Stream;
  7.  
  8. import com.maideniles.fancyfurnishings.FancyFurnishings;
  9. import com.maideniles.fancyfurnishings.ModBlocks;
  10. import com.maideniles.fancyfurnishings.ModItems;
  11. import com.maideniles.fancyfurnishings.blocks.base.BlockFurnishingBase;
  12. import com.maideniles.fancyfurnishings.blocks.kitchen.BlockCounter.CounterType;
  13. import com.maideniles.fancyfurnishings.blocks.kitchen.BlockFridge.FridgeType;
  14. import com.maideniles.fancyfurnishings.util.BlockStateHandler;
  15. import com.maideniles.fancyfurnishings.util.IFridgeConnect;
  16. import com.maideniles.fancyfurnishings.util.IHasModel;
  17.  
  18. import net.minecraft.block.Block;
  19. import net.minecraft.block.BlockHorizontal;
  20. import net.minecraft.block.material.Material;
  21. import net.minecraft.block.properties.IProperty;
  22. import net.minecraft.block.properties.PropertyBool;
  23. import net.minecraft.block.properties.PropertyDirection;
  24. import net.minecraft.block.properties.PropertyEnum;
  25. import net.minecraft.block.state.BlockStateContainer;
  26. import net.minecraft.block.state.IBlockState;
  27. import net.minecraft.entity.EntityLivingBase;
  28. import net.minecraft.item.Item;
  29. import net.minecraft.item.ItemBlock;
  30. import net.minecraft.item.ItemStack;
  31. import net.minecraft.util.EnumFacing;
  32. import net.minecraft.util.IStringSerializable;
  33. import net.minecraft.util.math.BlockPos;
  34. import net.minecraft.world.IBlockAccess;
  35. import net.minecraft.world.World;
  36.  
  37.  
  38. public class BlockFridge extends Block {
  39.     public static final PropertyDirection FACING = BlockHorizontal.FACING;
  40.     public static final PropertyEnum FRIDGE_TYPE = PropertyEnum.create("fridge_type", FridgeType.class);
  41.  
  42.     public BlockFridge(String name, Material materialIn) {
  43.         super(materialIn);
  44.         setUnlocalizedName(name);
  45.         setRegistryName(name); setCreativeTab(FancyFurnishings.fancyfurnishingsblocks);
  46.         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));
  47.     }
  48.  
  49.     @Override
  50.     protected BlockStateContainer createBlockState() {
  51.         return new BlockStateContainer(this, new IProperty[] { FACING, FRIDGE_TYPE });
  52.     }
  53.  
  54.     public enum FridgeType implements IStringSerializable{
  55.         SINGLE(0), UP_LEFT(0), UP_RIGHT(1), DOWN_LEFT(2), DOWN_RIGHT(3);
  56.         private final int meta;
  57.  
  58.         FridgeType(int meta) {
  59.              this.meta = meta;
  60.         }
  61.  
  62.         @Override
  63.         public String getName() {
  64.             return this.toString().toLowerCase();
  65.         }
  66.  
  67.         public int getMeta() {
  68.             return this.meta;
  69.         }
  70.  
  71.         public static FridgeType getFromMeta(int meta) {
  72.                 for (FridgeType type : FridgeType.values()) {
  73.             if((type != FridgeType.SINGLE) && (type.getMeta() == meta)) {
  74.                 return type;
  75.             }
  76.         }
  77.         return FridgeType.SINGLE;
  78.         }
  79.     }
  80.  
  81.    
  82.    
  83.     @Override
  84.     public IBlockState getStateFromMeta(int meta) {
  85.         return this.getDefaultState().withProperty(FRIDGE_TYPE, FridgeType.getFromMeta((meta & 0b1100) >> 2)).withProperty(FACING, EnumFacing.getHorizontal(meta & 0b0011));
  86.     }
  87.  
  88.     @Override
  89.     public int getMetaFromState(IBlockState state) {
  90.         return (((FridgeType) state.getValue(FRIDGE_TYPE)).getMeta() << 2) | state.getValue(FACING).getHorizontalIndex();
  91.     }
  92.    
  93.     public boolean canFridgeBeExtended(IBlockAccess world, BlockPos existingFridgePos, BlockPos extensionFridgePos, EnumFacing extensionFridgeFacing) {
  94.         IBlockState existingFridge = world.getBlockState(existingFridgePos);
  95.         FridgeType fridgeType = (FridgeType) existingFridge.getValue(FRIDGE_TYPE);
  96.         EnumFacing facing = existingFridge.getValue(FACING);
  97.         if(extensionFridgeFacing != facing) // don't connect to fridge with different facing
  98.         return false;
  99.         BlockPos fridgeUpLeft = null;
  100.         BlockPos fridgeUpRight = null;
  101.         BlockPos fridgeDownLeft = null;
  102.         BlockPos fridgeDownRight = null;
  103.         // assign all variables
  104.         switch (fridgeType) {
  105.             case SINGLE:
  106.                 return true;
  107.             case UP_LEFT:
  108.                 fridgeUpLeft = existingFridgePos;
  109.                 break;
  110.             case UP_RIGHT:
  111.                 fridgeUpLeft = existingFridgePos.offset(facing.rotateY());
  112.                 break;
  113.             case DOWN_LEFT:
  114.                 fridgeUpLeft = existingFridgePos.up();
  115.                 break;
  116.             case DOWN_RIGHT:
  117.                 fridgeUpLeft = existingFridgePos.up().offset(facing.rotateY());
  118.                 break;
  119.         }
  120.         fridgeUpRight = fridgeUpLeft.offset(facing.rotateYCCW());
  121.         fridgeDownLeft = fridgeUpLeft.down();
  122.         fridgeDownRight = fridgeUpRight.down();
  123.         // return true if there is an empty space in the fridge structure
  124.         // or if there is nothing added to the right side of the structure so that the current left side could become the right side
  125.         return Stream.of(fridgeUpLeft, fridgeUpRight, fridgeDownLeft, fridgeDownRight).anyMatch(extensionFridgePos::equals)
  126.                 || (Stream.of(fridgeUpRight, fridgeDownRight).allMatch(world::isAirBlock) && Stream.of(fridgeUpLeft.offset(facing.rotateY()),
  127.                 fridgeDownLeft.offset(facing.rotateY())).anyMatch(existingFridge::equals));
  128. }
  129.    
  130.    
  131.    
  132.     public IBlockState getStateForPos(IBlockAccess
  133.  world, BlockPos pos, EnumFacing facing, boolean changeBlocks) {
  134.         IBlockState state = this.getDefaultState().withProperty(FACING, facing).withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
  135.         EnumFacing facingOpp = facing.getOpposite();
  136.         for (EnumFacing direction : EnumFacing.VALUES) {
  137.             if((direction != facing) && (direction !=facingOpp) && ((World) world).getBlockState(pos.offset(direction)).getBlock()
  138.                     instanceof BlockFridge && this.canFridgeBeExtended(world, pos.offset(direction), pos,  facing)) {
  139.                
  140.                 BlockPos existingFridgePos = pos.offset(direction);
  141.                 IBlockState existingFridge = world.getBlockState(existingFridgePos);
  142.                 FridgeType fridgeType = (FridgeType) existingFridge.getValue(FRIDGE_TYPE);
  143.                 EnumFacing extensionFridgeFacing = existingFridge.getValue(FACING);
  144.                 if(extensionFridgeFacing != facing) // don't connect to fridge with different facing
  145.                 break;
  146.                 BlockPos fridgeUpLeft = null;
  147.                 BlockPos fridgeUpRight = null;
  148.                 BlockPos fridgeDownLeft = null;
  149.                 BlockPos fridgeDownRight = null;
  150.                 // assign all variables
  151.                 switch (fridgeType) {
  152.                     case SINGLE:
  153.                         FridgeType typeExtension = FridgeType.SINGLE;
  154.                         if (existingFridgePos.equals (pos.offset(facing.rotateYCCW()))) {
  155.                             fridgeType = FridgeType.UP_LEFT;
  156.                             typeExtension = FridgeType.UP_RIGHT;
  157.                         } else if (existingFridgePos.equals(pos.offset(facing.rotateY()))) {
  158.                         // is rotateYXZ a thing?
  159.                             fridgeType = FridgeType.UP_RIGHT;
  160.                             typeExtension = FridgeType.UP_LEFT;
  161.                         } else if (existingFridgePos.equals (pos.up())) {
  162.                             fridgeType = FridgeType.UP_LEFT;
  163.                             typeExtension = FridgeType.DOWN_LEFT;
  164.                         } else if (existingFridgePos.equals (pos.down())) {
  165.                             fridgeType = FridgeType.DOWN_LEFT;
  166.                             typeExtension = FridgeType.UP_LEFT;
  167.                         }
  168.                         state = state.withProperty(FRIDGE_TYPE, typeExtension);
  169.                         if (changeBlocks) {
  170.                             ((World) world).setBlockState(pos, state);
  171.                             ((World) world).setBlockState(existingFridgePos, existingFridge.withProperty(FRIDGE_TYPE, fridgeType));
  172.                         }
  173.                         return state;
  174.                     case UP_LEFT:
  175.                         fridgeUpLeft = existingFridgePos;
  176.                         break;
  177.                     case UP_RIGHT:
  178.                         fridgeUpLeft = existingFridgePos.offset(facing.rotateY());
  179.                         break;
  180.                     case DOWN_LEFT:
  181.                         fridgeUpLeft = existingFridgePos.up();
  182.                         break;
  183.                     case DOWN_RIGHT:
  184.                         fridgeUpLeft = existingFridgePos.up().offset(facing.rotateY());
  185.                         break;
  186.                 }
  187.                 fridgeUpRight = fridgeUpLeft.offset(facing.rotateYCCW());
  188.                 fridgeDownLeft = fridgeUpLeft.down();
  189.                 fridgeDownRight = fridgeUpRight.down();
  190.                 BlockPos[] fridges = {fridgeUpLeft, fridgeUpRight, fridgeDownLeft, fridgeDownRight};
  191.                 for (int i = 0; i < fridges.length; i++) {
  192.                 if(pos.equals(fridges[i])) {
  193.                     state = state.withProperty(FRIDGE_TYPE, (i==0) ? FridgeType.UP_LEFT : ((i==1) ? FridgeType.UP_RIGHT : ((i == 2) ? FridgeType.DOWN_LEFT : FridgeType.DOWN_RIGHT)));
  194.                     if(changeBlocks) {
  195.                         ((World) world).setBlockState(pos, state);
  196.                     }
  197.                     return state;
  198.                 }
  199.             }
  200.             if(Stream.of(fridgeUpRight, fridgeDownRight).allMatch(world::isAirBlock) && Stream.of(fridgeUpLeft.offset(facing.rotateY()), fridgeDownLeft.offset(facing.rotateY())).anyMatch(existingFridge::equals)) {
  201.                 state = state.withProperty(FRIDGE_TYPE, (pos.equals(fridgeUpLeft.offset(facing.rotateY())) ? FridgeType.UP_LEFT : FridgeType.DOWN_LEFT));
  202.                 if(changeBlocks) {
  203.                     ((World) world).setBlockState(pos, state);
  204.                     IBlockState fridgeUpLeftState = world.getBlockState(fridgeUpLeft);
  205.                     if((fridgeUpLeftState.getBlock() instanceof BlockFridge) && (fridgeUpLeftState.getValue(FACING) == facing)) {
  206.                         ((World) world).setBlockState(fridgeUpLeft, fridgeUpLeftState .withProperty(FRIDGE_TYPE, FridgeType.UP_RIGHT));
  207.                     }
  208.                     IBlockState fridgeDownLeftState = world.getBlockState(fridgeDownLeft);
  209.                     if((fridgeDownLeftState.getBlock() instanceof BlockFridge) && (fridgeDownLeftState.getValue(FACING) == facing)) {
  210.                         ((World) world).setBlockState(fridgeDownLeft, fridgeDownLeftState .withProperty(FRIDGE_TYPE, FridgeType.DOWN_RIGHT));
  211.                     }
  212.                 }
  213.             }
  214.             return state;
  215.             }
  216.         }
  217.         state = state.withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
  218.         if (changeBlocks) {
  219.             ((World) world).setBlockState(pos, state);
  220.         }
  221.         return state;
  222.     }
  223.    
  224.     @Override
  225.     public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
  226.         if((state.getValue(FRIDGE_TYPE) == FridgeType.UP_LEFT) && (this.getStateForPos(worldIn, pos, state.getValue(FACING), false).getValue(FRIDGE_TYPE) == FridgeType.SINGLE)) {
  227.             return state.withProperty(FRIDGE_TYPE, FridgeType.SINGLE);
  228.         } else {
  229.             return state;
  230.         }
  231.     }
  232.    
  233.  
  234.    
  235.     public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
  236.         this.getStateForPos(worldIn, pos, state.getValue(FACING), true);
  237.     }  
  238.    
  239.     @Override
  240.     public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
  241.         return this.getStateForPos(worldIn, pos, placer.getHorizontalFacing().getOpposite(), false);
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement