All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.minecraft.server.BlockVine Maven / Gradle / Ivy

package net.minecraft.server;

import org.bukkit.craftbukkit.event.CraftEventFactory;

import java.util.Iterator;
import java.util.Random;

public class BlockVine extends Block {

  public static final BlockStateBoolean UP = BlockStateBoolean.of("up");
  public static final BlockStateBoolean NORTH = BlockStateBoolean.of("north");
  public static final BlockStateBoolean EAST = BlockStateBoolean.of("east");
  public static final BlockStateBoolean SOUTH = BlockStateBoolean.of("south");
  public static final BlockStateBoolean WEST = BlockStateBoolean.of("west");
  public static final BlockStateBoolean[] Q = new BlockStateBoolean[]{BlockVine.UP, BlockVine.NORTH, BlockVine.SOUTH, BlockVine.WEST, BlockVine.EAST};

  public BlockVine() {
    super(Material.REPLACEABLE_PLANT);
    this.j(this.blockStateList.getBlockData().set(BlockVine.UP, Boolean.FALSE).set(BlockVine.NORTH, Boolean.FALSE).set(BlockVine.EAST, Boolean.FALSE).set(BlockVine.SOUTH, Boolean.FALSE).set(BlockVine.WEST, Boolean.FALSE));
    this.a(true);
    this.a(CreativeModeTab.c);
  }

  public static BlockStateBoolean getDirection(EnumDirection enumdirection) {
    switch (BlockVine.SyntheticClass_1.a[enumdirection.ordinal()]) {
      case 1:
        return BlockVine.UP;

      case 2:
        return BlockVine.NORTH;

      case 3:
        return BlockVine.SOUTH;

      case 4:
        return BlockVine.EAST;

      case 5:
        return BlockVine.WEST;

      default:
        throw new IllegalArgumentException(enumdirection + " is an invalid choice");
    }
  }

  public static int d(IBlockData iblockdata) {
    int i = 0;
    BlockStateBoolean[] ablockstateboolean = BlockVine.Q;
    int j = ablockstateboolean.length;

    for (BlockStateBoolean blockstateboolean : ablockstateboolean) {
      if (iblockdata.get(blockstateboolean)) {
        ++i;
      }
    }

    return i;
  }

  public IBlockData updateState(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
    return iblockdata.set(BlockVine.UP, iblockaccess.getType(blockposition.up()).getBlock().u());
  }

  public void j() {
    this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
  }

  public boolean c() {
    return false;
  }

  public boolean d() {
    return false;
  }

  public boolean a(World world, BlockPosition blockposition) {
    return true;
  }

  public void updateShape(IBlockAccess iblockaccess, BlockPosition blockposition) {
    float f = 0.0625F;
    float f1 = 1.0F;
    float f2 = 1.0F;
    float f3 = 1.0F;
    float f4 = 0.0F;
    float f5 = 0.0F;
    float f6 = 0.0F;
    boolean flag = false;

    if (iblockaccess.getType(blockposition).get(BlockVine.WEST)) {
      f4 = 0.0625F;
      f1 = 0.0F;
      f2 = 0.0F;
      f5 = 1.0F;
      f3 = 0.0F;
      f6 = 1.0F;
      flag = true;
    }

    if (iblockaccess.getType(blockposition).get(BlockVine.EAST)) {
      f1 = Math.min(f1, 0.9375F);
      f4 = 1.0F;
      f2 = 0.0F;
      f5 = 1.0F;
      f3 = 0.0F;
      f6 = 1.0F;
      flag = true;
    }

    if (iblockaccess.getType(blockposition).get(BlockVine.NORTH)) {
      f6 = Math.max(f6, 0.0625F);
      f3 = 0.0F;
      f1 = 0.0F;
      f4 = 1.0F;
      f2 = 0.0F;
      f5 = 1.0F;
      flag = true;
    }

    if (iblockaccess.getType(blockposition).get(BlockVine.SOUTH)) {
      f3 = Math.min(f3, 0.9375F);
      f6 = 1.0F;
      f1 = 0.0F;
      f4 = 1.0F;
      f2 = 0.0F;
      f5 = 1.0F;
      flag = true;
    }

    if (!flag && this.c(iblockaccess.getType(blockposition.up()).getBlock())) {
      f2 = 0.9375F;
      f5 = 1.0F;
      f1 = 0.0F;
      f4 = 1.0F;
      f3 = 0.0F;
      f6 = 1.0F;
    }

    this.a(f1, f2, f3, f4, f5, f6);
  }

  public AxisAlignedBB a(World world, BlockPosition blockposition, IBlockData iblockdata) {
    return null;
  }

  public boolean canPlace(World world, BlockPosition blockposition, EnumDirection enumdirection) {
    switch (BlockVine.SyntheticClass_1.a[enumdirection.ordinal()]) {
      case 1:
        return this.c(world.getType(blockposition.up()).getBlock());

      case 2:
      case 3:
      case 4:
      case 5:
        return this.c(world.getType(blockposition.shift(enumdirection.opposite())).getBlock());

      default:
        return false;
    }
  }

  private boolean c(Block block) {
    return block.d() && block.material.isSolid();
  }

  private boolean e(World world, BlockPosition blockposition, IBlockData iblockdata) {
    IBlockData iblockdata1 = iblockdata;

    for (EnumDirection enumdirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
      BlockStateBoolean blockstateboolean = getDirection(enumdirection);

      if (iblockdata.get(blockstateboolean) && !this.c(world.getType(blockposition.shift(enumdirection)).getBlock())) {
        IBlockData iblockdata2 = world.getType(blockposition.up());

        if (iblockdata2.getBlock() != this || !iblockdata2.get(blockstateboolean)) {
          iblockdata = iblockdata.set(blockstateboolean, Boolean.FALSE);
        }
      }
    }

    if (d(iblockdata) == 0) {
      return false;
    } else {
      if (iblockdata1 != iblockdata) {
        world.setTypeAndData(blockposition, iblockdata, 2);
      }

      return true;
    }
  }

  public void doPhysics(World world, BlockPosition pos, IBlockData iblockdata, Block block) {
    if (!world.isClientSide && !this.e(world, pos, iblockdata)) {
      this.b(world, pos, iblockdata, 0);
      world.setAir(pos);
    }

  }

  public void b(World world, BlockPosition pos, IBlockData iblockdata, Random random) {
    if (!world.isClientSide) {
      if (world.random.nextInt(4) == 0) {
        byte b0 = 4;
        int i = 5;
        boolean flag = false;

        label188:
        for (int j = -b0; j <= b0; ++j) {
          for (int k = -b0; k <= b0; ++k) {
            for (int l = -1; l <= 1; ++l) {
              if (world.getType(pos.a(j, l, k)).getBlock() == this) {
                --i;
                if (i <= 0) {
                  flag = true;
                  break label188;
                }
              }
            }
          }
        }

        EnumDirection enumdirection = EnumDirection.a(random);
        BlockPosition blockposition1 = pos.up();
        EnumDirection enumdirection1;

        if (enumdirection == EnumDirection.UP && pos.getY() < 255 && world.isEmpty(blockposition1)) {
          if (!flag) {
            IBlockData iblockdata1 = iblockdata;

            for (EnumDirection enumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
              enumdirection1 = enumDirection;
              if (random.nextBoolean() || !this.c(world.getType(blockposition1.shift(enumdirection1)).getBlock())) {
                iblockdata1 = iblockdata1.set(getDirection(enumdirection1), Boolean.FALSE);
              }
            }

            if (iblockdata1.get(BlockVine.NORTH) || iblockdata1.get(BlockVine.EAST) || iblockdata1.get(BlockVine.SOUTH) || iblockdata1.get(BlockVine.WEST)) {
              // CraftBukkit start - Call BlockSpreadEvent
              // world.setTypeAndData(blockposition1, iblockdata1, 2);
              org.bukkit.block.Block source = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
              org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ());
              CraftEventFactory.handleBlockSpreadEvent(block, source, this, toLegacyData(iblockdata1));
              // CraftBukkit end
            }

          }
        } else {
          BlockPosition blockposition2;

          if (enumdirection.k().c() && !iblockdata.get(getDirection(enumdirection))) {
            if (!flag) {
              blockposition2 = pos.shift(enumdirection);
              Block block = world.getType(blockposition2).getBlock();

              if (block.material == Material.AIR) {
                enumdirection1 = enumdirection.e();
                EnumDirection enumdirection2 = enumdirection.f();
                boolean flag1 = iblockdata.get(getDirection(enumdirection1));
                boolean flag2 = iblockdata.get(getDirection(enumdirection2));
                BlockPosition blockposition3 = blockposition2.shift(enumdirection1);
                BlockPosition blockposition4 = blockposition2.shift(enumdirection2);

                // CraftBukkit start - Call BlockSpreadEvent
                org.bukkit.block.Block source = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
                org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());

                if (flag1 && this.c(world.getType(blockposition3).getBlock())) {
                  // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2);
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection1), Boolean.TRUE)));
                } else if (flag2 && this.c(world.getType(blockposition4).getBlock())) {
                  // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2);
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection2), Boolean.TRUE)));
                } else if (flag1 && world.isEmpty(blockposition3) && this.c(world.getType(pos.shift(enumdirection1)).getBlock())) {
                  // world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2);
                  bukkitBlock = world.getWorld().getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ());
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.TRUE)));
                } else if (flag2 && world.isEmpty(blockposition4) && this.c(world.getType(pos.shift(enumdirection2)).getBlock())) {
                  // world.setTypeAndData(blockposition4, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2);
                  bukkitBlock = world.getWorld().getBlockAt(blockposition4.getX(), blockposition4.getY(), blockposition4.getZ());
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.TRUE)));
                } else if (this.c(world.getType(blockposition2.up()).getBlock())) {
                  // world.setTypeAndData(blockposition2, this.getBlockData(), 2);
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData()));
                }
                // CraftBukkit end
              } else if (block.material.k() && block.d()) {
                world.setTypeAndData(pos, iblockdata.set(getDirection(enumdirection), Boolean.TRUE), 2);
              }

            }
          } else {
            if (pos.getY() > 1) {
              blockposition2 = pos.down();
              IBlockData iblockdata2 = world.getType(blockposition2);
              Block block1 = iblockdata2.getBlock();
              IBlockData iblockdata3;
              Iterator iterator1;
              EnumDirection enumdirection3;

              if (block1.material == Material.AIR) {
                iblockdata3 = iblockdata;
                iterator1 = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();

                while (iterator1.hasNext()) {
                  enumdirection3 = (EnumDirection) iterator1.next();
                  if (random.nextBoolean()) {
                    iblockdata3 = iblockdata3.set(getDirection(enumdirection3), Boolean.FALSE);
                  }
                }

                if (iblockdata3.get(BlockVine.NORTH) || iblockdata3.get(BlockVine.EAST) || iblockdata3.get(BlockVine.SOUTH) || iblockdata3.get(BlockVine.WEST)) {
                  // CraftBukkit start - Call BlockSpreadEvent
                  // world.setTypeAndData(blockposition2, iblockdata3, 2);
                  org.bukkit.block.Block source = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
                  org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());
                  CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(iblockdata3));
                  // CraftBukkit end
                }
              } else if (block1 == this) {
                iblockdata3 = iblockdata2;
                iterator1 = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();

                while (iterator1.hasNext()) {
                  enumdirection3 = (EnumDirection) iterator1.next();
                  BlockStateBoolean blockstateboolean = getDirection(enumdirection3);

                  if (random.nextBoolean() && iblockdata.get(blockstateboolean)) {
                    iblockdata3 = iblockdata3.set(blockstateboolean, Boolean.TRUE);
                  }
                }

                if (iblockdata3.get(BlockVine.NORTH) || iblockdata3.get(BlockVine.EAST) || iblockdata3.get(BlockVine.SOUTH) || iblockdata3.get(BlockVine.WEST)) {
                  world.setTypeAndData(blockposition2, iblockdata3, 2);
                }
              }
            }

          }
        }
      }
    }
  }

  public IBlockData getPlacedState(World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2, int i, EntityLiving entityliving) {
    IBlockData iblockdata = this.getBlockData().set(BlockVine.UP, Boolean.FALSE).set(BlockVine.NORTH, Boolean.FALSE).set(BlockVine.EAST, Boolean.FALSE).set(BlockVine.SOUTH, Boolean.FALSE).set(BlockVine.WEST, Boolean.FALSE);

    return enumdirection.k().c() ? iblockdata.set(getDirection(enumdirection.opposite()), Boolean.TRUE) : iblockdata;
  }

  public Item getDropType(IBlockData iblockdata, Random random, int i) {
    return null;
  }

  public int a(Random random) {
    return 0;
  }

  public void a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, TileEntity tileentity) {
    if (!world.isClientSide && entityhuman.bZ() != null && entityhuman.bZ().getItem() == Items.SHEARS) {
      entityhuman.b(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)]);
      a(world, blockposition, new ItemStack(Blocks.VINE, 1, 0));
    } else {
      super.a(world, entityhuman, blockposition, iblockdata, tileentity);
    }

  }

  public IBlockData fromLegacyData(int i) {
    return this.getBlockData().set(BlockVine.SOUTH, (i & 1) > 0).set(BlockVine.WEST, (i & 2) > 0).set(BlockVine.NORTH, (i & 4) > 0).set(BlockVine.EAST, (i & 8) > 0);
  }

  public int toLegacyData(IBlockData iblockdata) {
    int i = 0;

    if (iblockdata.get(BlockVine.SOUTH)) {
      i |= 1;
    }

    if (iblockdata.get(BlockVine.WEST)) {
      i |= 2;
    }

    if (iblockdata.get(BlockVine.NORTH)) {
      i |= 4;
    }

    if (iblockdata.get(BlockVine.EAST)) {
      i |= 8;
    }

    return i;
  }

  protected BlockStateList getStateList() {
    return new BlockStateList(this, BlockVine.UP, BlockVine.NORTH, BlockVine.EAST, BlockVine.SOUTH, BlockVine.WEST);
  }

  static class SyntheticClass_1 {

    static final int[] a = new int[EnumDirection.values().length];

    static {
      try {
        BlockVine.SyntheticClass_1.a[EnumDirection.UP.ordinal()] = 1;
      } catch (NoSuchFieldError ignored) {
      }

      try {
        BlockVine.SyntheticClass_1.a[EnumDirection.NORTH.ordinal()] = 2;
      } catch (NoSuchFieldError ignored) {
      }

      try {
        BlockVine.SyntheticClass_1.a[EnumDirection.SOUTH.ordinal()] = 3;
      } catch (NoSuchFieldError ignored) {
      }

      try {
        BlockVine.SyntheticClass_1.a[EnumDirection.EAST.ordinal()] = 4;
      } catch (NoSuchFieldError ignored) {
      }

      try {
        BlockVine.SyntheticClass_1.a[EnumDirection.WEST.ordinal()] = 5;
      } catch (NoSuchFieldError ignored) {
      }

    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy