@HawkEvent(dataType = {DataType.LAVA_FLOW, DataType.WATER_FLOW})
  public void onBlockFromTo(BlockFromToEvent event) {
    List<Integer> fluidBlocks =
        Arrays.asList(
            0, 27, 28, 31, 32, 37, 38, 39, 40, 50, 51, 55, 59, 66, 69, 70, 75, 76, 78, 93, 94);

    Location loc = event.getToBlock().getLocation();
    BlockState from = event.getBlock().getState();
    BlockState to = event.getToBlock().getState();
    MaterialData data = from.getData();

    // Lava
    if (from.getTypeId() == 10 || from.getTypeId() == 11) {

      // Flowing into a normal block
      if (fluidBlocks.contains(to.getTypeId())) {
        data.setData((byte) (from.getRawData() + 1));
        from.setData(data);
      }

      // Flowing into water
      else if (to.getTypeId() == 8 || to.getTypeId() == 9) {
        from.setTypeId(event.getFace() == BlockFace.DOWN ? 10 : 4);
        data.setData((byte) 0);
        from.setData(data);
      }
      DataManager.addEntry(new BlockChangeEntry("Environment", DataType.LAVA_FLOW, loc, to, from));

    }

    // Water
    else if (from.getTypeId() == 8 || from.getTypeId() == 9) {

      // Normal block
      if (fluidBlocks.contains(to.getTypeId())) {
        data.setData((byte) (from.getRawData() + 1));
        from.setData(data);
        DataManager.addEntry(
            new BlockChangeEntry("Environment", DataType.WATER_FLOW, loc, to, from));
      }

      // If we are flowing over lava, cobble or obsidian will form
      BlockState lower = event.getToBlock().getRelative(BlockFace.DOWN).getState();
      if (lower.getTypeId() == 10 || lower.getTypeId() == 11) {
        from.setTypeId(lower.getData().getData() == 0 ? 49 : 4);
        loc.setY(loc.getY() - 1);
        DataManager.addEntry(
            new BlockChangeEntry("Environment", DataType.WATER_FLOW, loc, lower, from));
      }
    }
  }
 @Override
 public void toggleLeverOrButton(Block block) {
   if (block.getType() == Material.STONE_BUTTON || block.getType() == Material.WOOD_BUTTON) {
     BlockState state = block.getState();
     Button button = (Button) state.getData();
     button.setPowered(true);
     state.update();
   } else if (block.getType() == Material.LEVER) {
     BlockState state = block.getState();
     Lever lever = (Lever) state.getData();
     lever.setPowered(!lever.isPowered());
     state.update();
   }
 }
Exemple #3
0
  private Block getBlock(final Material material, final TreeSpecies type) {
    // TODO correct this once new trees are implemented correctly
    BlockState state = Mockito.mock(BlockState.class);
    if (material == Material.LOG_2) {
      Mockito.when(state.getData())
          .thenReturn(new MaterialData(material, (byte) (type.getData() - 4)));
    } else {
      Mockito.when(state.getData()).thenReturn(new Tree(type));
    }

    Block block = Mockito.mock(Block.class);
    Mockito.when(block.getType()).thenReturn(material);
    Mockito.when(block.getState()).thenReturn(state);
    Mockito.when(block.getWorld()).thenReturn(null);

    return block;
  }
Exemple #4
0
 /**
  * Checks if the object corresponds to provided parameters
  *
  * @param block Block to compare to
  * @return <b>true</b> if the conditions are met, <b>false</b> otherwise
  */
 public boolean equals(BlockState block) {
   if (ItemsWithMetadata.checkAgainst(block.getTypeId())) {
     return block.getType().equals(this.block.getType())
         && block.getData().getData() == this.block.getData().getData();
   } else {
     return block.getType().equals(this.block.getType());
   }
 }
 private static BlockFace getAttachedFace(Block lever) {
   BlockState state = lever.getState();
   MaterialData md = state.getData();
   if (md instanceof Attachable) {
     BlockFace face = ((Attachable) md).getAttachedFace();
     return face.getOppositeFace();
   } else {
     return null;
   }
 }
 /**
  * Get the face a blockState is dependent on.
  *
  * @param blockState The blockState.
  * @return The face the blockState i s attached by.
  */
 public static BlockFace getAttachingFace(BlockState blockState) {
   if (blockState.getData() instanceof Attachable)
     return ((Attachable) blockState.getData()).getAttachedFace();
   if (blockState instanceof Rails)
     switch (blockState.getRawData()) {
       case 5:
         return BlockFace.WEST;
       case 4:
         return BlockFace.EAST;
       case 3:
         return BlockFace.NORTH;
       case 2:
         return BlockFace.SOUTH;
       default:
         return BlockFace.DOWN;
     }
   if (DEPENDENT_DOWN_BLOCKS.contains(blockState.getTypeId())) return BlockFace.DOWN;
   return BlockFace.SELF;
 }
  @Override
  public void placeBlock(
      GlowPlayer player,
      GlowBlockState state,
      BlockFace face,
      ItemStack holding,
      Vector clickedLoc) {
    super.placeBlock(player, state, face, holding, clickedLoc);

    MaterialData data = state.getData();
    if (data instanceof Chest) {
      Chest chest = (Chest) data;
      GlowBlock chestBlock = state.getBlock();

      BlockFace normalFacing = getOppositeBlockFace(player.getLocation(), false);

      Collection<BlockFace> attachedChests = searchChests(chestBlock);
      if (attachedChests.isEmpty()) {
        chest.setFacingDirection(normalFacing);
        state.setData(chest);
        return;
      } else if (attachedChests.size() > 1) {
        GlowServer.logger.warning("Chest placed near two other chests!");
        return;
      }

      BlockFace otherPart = attachedChests.iterator().next();

      GlowBlock otherPartBlock = chestBlock.getRelative(otherPart);
      BlockState otherPartState = otherPartBlock.getState();
      MaterialData otherPartData = otherPartState.getData();

      if (otherPartData instanceof Chest) {
        Chest otherChest = (Chest) otherPartData;
        BlockFace facing =
            getFacingDirection(normalFacing, otherChest.getFacing(), otherPart, player);

        chest.setFacingDirection(facing);
        state.setData(chest);

        otherChest.setFacingDirection(facing);
        otherPartState.setData(otherChest);
        otherPartState.update();
      } else {
        warnMaterialData(Chest.class, otherPartData);
      }
    } else {
      warnMaterialData(Chest.class, data);
    }
  }
  private boolean handleBlockState(BlockState blockState, boolean greenTerra) {
    byte greenThumbStage = getGreenThumbStage();

    switch (blockState.getType()) {
      case CROPS:
        Crops crops = (Crops) blockState.getData();

        if (greenTerra) {
          crops.setState(CropState.MEDIUM);
        } else {
          switch (greenThumbStage) {
            case 4:
              crops.setState(CropState.SMALL);
              break;
            case 3:
              crops.setState(CropState.VERY_SMALL);
              break;
            case 2:
              crops.setState(CropState.GERMINATED);
              break;
            default:
              crops.setState(CropState.SEEDED);
              break;
          }
        }

        return true;

      case CARROT:
      case POTATO:
        if (greenTerra) {
          blockState.setRawData(CropState.MEDIUM.getData());
        } else {
          blockState.setRawData(greenThumbStage);
        }

        return true;

      case NETHER_WARTS:
        NetherWarts warts = (NetherWarts) blockState.getData();

        if (greenTerra || greenThumbStage > 2) {
          warts.setState(NetherWartsState.STAGE_TWO);
        } else if (greenThumbStage == 2) {
          warts.setState(NetherWartsState.STAGE_ONE);
        } else {
          warts.setState(NetherWartsState.SEEDED);
        }

        return true;

      case COCOA:
        CocoaPlant plant = (CocoaPlant) blockState.getData();

        if (greenTerra || getGreenThumbStage() > 1) {
          plant.setSize(CocoaPlantSize.MEDIUM);
        } else {
          plant.setSize(CocoaPlantSize.SMALL);
        }

        return true;

      default:
        return false;
    }
  }
  public static void smartLogBlockBreak(Consumer consumer, String playerName, Block origin) {

    WorldConfig wcfg = getWorldConfig(origin.getWorld());
    if (wcfg == null) return;

    Block checkBlock = origin.getRelative(BlockFace.UP);
    if (BukkitUtils.getRelativeTopBreakabls().contains(checkBlock.getType())) {
      if (wcfg.isLogging(Logging.SIGNTEXT) && checkBlock.getType() == Material.SIGN_POST) {
        consumer.queueSignBreak(playerName, (Sign) checkBlock.getState());
      } else if (checkBlock.getType() == Material.IRON_DOOR
          || checkBlock.getType() == Material.WOOD_DOOR) {
        Block doorBlock = checkBlock;
        // If the doorBlock is the top half a door the player simply punched a door
        // this will be handled later.
        if (doorBlock.getData() != 8 && doorBlock.getData() != 9) {
          doorBlock = doorBlock.getRelative(BlockFace.UP);
          // Fall back check just in case the top half wasn't a door
          if (doorBlock.getType() == Material.IRON_DOOR
              || doorBlock.getType() == Material.WOOD_DOOR) {
            consumer.queueBlockBreak(playerName, doorBlock.getState());
          }
          consumer.queueBlockBreak(playerName, checkBlock.getState());
        }
      } else {
        consumer.queueBlockBreak(playerName, checkBlock.getState());
      }
    }

    List<Location> relativeBreakables =
        BukkitUtils.getBlocksNearby(origin, BukkitUtils.getRelativeBreakables());
    if (relativeBreakables.size() != 0) {
      for (Location location : relativeBreakables) {
        final Material blockType = location.getBlock().getType();
        final BlockState blockState = location.getBlock().getState();
        final MaterialData data = blockState.getData();
        switch (blockType) {
          case REDSTONE_TORCH_ON:
          case REDSTONE_TORCH_OFF:
            if (blockState
                .getBlock()
                .getRelative(((RedstoneTorch) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case TORCH:
            if (blockState
                .getBlock()
                .getRelative(((Torch) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case COCOA:
            if (blockState
                .getBlock()
                .getRelative(((CocoaPlant) data).getAttachedFace().getOppositeFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case LADDER:
            if (blockState
                .getBlock()
                .getRelative(((Ladder) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case LEVER:
            if (blockState
                .getBlock()
                .getRelative(((Lever) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case TRIPWIRE_HOOK:
            if (blockState
                .getBlock()
                .getRelative(((TripwireHook) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case WOOD_BUTTON:
          case STONE_BUTTON:
            if (blockState
                .getBlock()
                .getRelative(((Button) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case WALL_SIGN:
            if (blockState
                .getBlock()
                .getRelative(((org.bukkit.material.Sign) data).getAttachedFace())
                .equals(origin)) {
              if (wcfg.isLogging(Logging.SIGNTEXT)) {
                consumer.queueSignBreak(playerName, (Sign) blockState);
              } else {
                consumer.queueBlockBreak(playerName, blockState);
              }
            }
            break;
          case TRAP_DOOR:
            if (blockState
                .getBlock()
                .getRelative(((TrapDoor) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          default:
            consumer.queueBlockBreak(playerName, blockState);
            break;
        }
      }
    }

    // Special door check
    if (origin.getType() == Material.IRON_DOOR || origin.getType() == Material.WOOD_DOOR) {
      Block doorBlock = origin;

      // Up or down?
      if (origin.getData() != 8 && origin.getData() != 9) {
        doorBlock = doorBlock.getRelative(BlockFace.UP);
      } else {
        doorBlock = doorBlock.getRelative(BlockFace.DOWN);
      }

      if (doorBlock.getType() == Material.IRON_DOOR || doorBlock.getType() == Material.WOOD_DOOR) {
        consumer.queueBlockBreak(playerName, doorBlock.getState());
      }
    }

    // Do this down here so that the block is added after blocks sitting on it
    consumer.queueBlockBreak(playerName, origin.getState());
  }
Exemple #10
0
  public static void smartLogBlockBreak(Consumer consumer, String playerName, Block origin) {

    WorldConfig wcfg = getWorldConfig(origin.getWorld());
    if (wcfg == null) return;

    Block checkBlock = origin.getRelative(BlockFace.UP);
    if (BukkitUtils.getRelativeTopBreakabls().contains(checkBlock.getTypeId())) {
      if (wcfg.isLogging(Logging.SIGNTEXT) && checkBlock.getType() == Material.SIGN_POST) {
        consumer.queueSignBreak(playerName, (Sign) checkBlock.getState());
      } else {
        consumer.queueBlockBreak(playerName, checkBlock.getState());
      }
    }

    List<Location> relativeBreakables =
        BukkitUtils.getBlocksNearby(origin, BukkitUtils.getRelativeBreakables());
    if (relativeBreakables.size() != 0) {
      for (Location location : relativeBreakables) {
        final Material blockType = location.getBlock().getType();
        final BlockState blockState = location.getBlock().getState();
        final MaterialData data = blockState.getData();
        switch (blockType) {
          case REDSTONE_TORCH_ON:
          case REDSTONE_TORCH_OFF:
            if (blockState
                .getBlock()
                .getRelative(((RedstoneTorch) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case TORCH:
            if (blockState
                .getBlock()
                .getRelative(((Torch) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case COCOA:
            if (blockState
                .getBlock()
                .getRelative(((CocoaPlant) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case LADDER:
            if (blockState
                .getBlock()
                .getRelative(((Ladder) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case LEVER:
            if (blockState
                .getBlock()
                .getRelative(((Lever) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case TRIPWIRE_HOOK:
            if (blockState
                .getBlock()
                .getRelative(((TripwireHook) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case WOOD_BUTTON:
          case STONE_BUTTON:
            if (blockState
                .getBlock()
                .getRelative(((Button) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          case WALL_SIGN:
            if (blockState
                .getBlock()
                .getRelative(((org.bukkit.material.Sign) data).getAttachedFace())
                .equals(origin)) {
              if (wcfg.isLogging(Logging.SIGNTEXT)) {
                consumer.queueSignBreak(playerName, (Sign) blockState);
              } else {
                consumer.queueBlockBreak(playerName, blockState);
              }
            }
            break;
          case TRAP_DOOR:
            if (blockState
                .getBlock()
                .getRelative(((TrapDoor) data).getAttachedFace())
                .equals(origin)) {
              consumer.queueBlockBreak(playerName, blockState);
            }
            break;
          default:
            consumer.queueBlockBreak(playerName, blockState);
            break;
        }
      }
    }
    // Do this down here so that the block is added after blocks sitting on it
    consumer.queueBlockBreak(playerName, origin.getState());
  }