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

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

package net.minecraft.server;

import org.bukkit.block.BlockFace;
import org.bukkit.event.block.BlockFromToEvent;

import java.util.EnumSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;
// CraftBukkit end

public class BlockFlowing extends BlockFluids {

  int a;

  protected BlockFlowing(Material material) {
    super(material);
  }

  private void f(World world, BlockPosition blockposition, IBlockData iblockdata) {
    world.setTypeAndData(blockposition, b(this.material).getBlockData().set(BlockFlowing.LEVEL, iblockdata.get(BlockFlowing.LEVEL)), 2);
  }

  public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
    // CraftBukkit start
    org.bukkit.World bworld = world.getWorld();
    org.bukkit.Server server = world.getServer();
    org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
    // CraftBukkit end
    int i = iblockdata.get(BlockFlowing.LEVEL);
    byte b0 = 1;

    if (this.material == Material.LAVA && !world.worldProvider.n()) {
      b0 = 2;
    }

    int j = this.a(world);
    int k;

    if (i > 0) {
      int l = -100;

      this.a = 0;

      EnumDirection enumdirection;

      for (Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator(); iterator.hasNext(); l = this.a(world, blockposition.shift(enumdirection), l)) {
        enumdirection = (EnumDirection) iterator.next();
      }

      int i1 = l + b0;

      if (i1 >= 8 || l < 0) {
        i1 = -1;
      }

      if (this.e(world, blockposition.up()) >= 0) {
        k = this.e(world, blockposition.up());
        if (k >= 8) {
          i1 = k;
        } else {
          i1 = k + 8;
        }
      }

      if (this.a >= 2 && this.material == Material.WATER) {
        IBlockData iblockdata1 = world.getType(blockposition.down());

        if (iblockdata1.getBlock().getMaterial().isBuildable()) {
          i1 = 0;
        } else if (iblockdata1.getBlock().getMaterial() == this.material && iblockdata1.get(BlockFlowing.LEVEL).intValue() == 0) {
          i1 = 0;
        }
      }

      if (this.material == Material.LAVA && i < 8 && i1 < 8 && i1 > i && random.nextInt(4) != 0) {
        j *= 4;
      }

      if (i1 == i) {
        this.f(world, blockposition, iblockdata);
      } else {
        i = i1;
        if (i1 < 0) {
          world.setAir(blockposition);
        } else {
          iblockdata = iblockdata.set(BlockFlowing.LEVEL, Integer.valueOf(i1));
          world.setTypeAndData(blockposition, iblockdata, 2);
          world.a(blockposition, this, j);
          world.applyPhysics(blockposition, this);
        }
      }
    } else {
      this.f(world, blockposition, iblockdata);
    }

    IBlockData iblockdata2 = world.getType(blockposition.down());

    if (this.h(world, blockposition.down(), iblockdata2)) {
      // CraftBukkit start - Send "down" to the server
      BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN);
      if (server != null) {
        server.getPluginManager().callEvent(event);
      }
      if (!event.isCancelled()) {
        if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) {
          world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData());
          this.fizz(world, blockposition.down());
          return;
        }

        if (i >= 8) {
          this.flow(world, blockposition.down(), iblockdata2, i);
        } else {
          this.flow(world, blockposition.down(), iblockdata2, i + 8);
        }
      }
      // CraftBukkit end
    } else if (i >= 0 && (i == 0 || this.g(world, blockposition.down(), iblockdata2))) {
      Set set = this.f(world, blockposition);

      k = i + b0;
      if (i >= 8) {
        k = 1;
      }

      if (k >= 8) {
        return;
      }

      Iterator iterator1 = set.iterator();

      while (iterator1.hasNext()) {
        EnumDirection enumdirection1 = (EnumDirection) iterator1.next();

        // CraftBukkit start
        BlockFromToEvent event = new BlockFromToEvent(source, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection1));
        if (server != null) {
          server.getPluginManager().callEvent(event);
        }

        if (!event.isCancelled()) {
          this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k);
        }
        // CraftBukkit end
      }
    }

  }

  private void flow(World world, BlockPosition blockposition, IBlockData iblockdata, int i) {
    if (world.isLoaded(blockposition) && this.h(world, blockposition, iblockdata)) { // CraftBukkit - add isLoaded check
      if (iblockdata.getBlock() != Blocks.AIR) {
        if (this.material == Material.LAVA) {
          this.fizz(world, blockposition);
        } else {
          iblockdata.getBlock().b(world, blockposition, iblockdata, 0);
        }
      }

      world.setTypeAndData(blockposition, this.getBlockData().set(BlockFlowing.LEVEL, Integer.valueOf(i)), 3);
    }

  }

  private int a(World world, BlockPosition blockposition, int i, EnumDirection enumdirection) {
    int j = 1000;
    Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();

    while (iterator.hasNext()) {
      EnumDirection enumdirection1 = (EnumDirection) iterator.next();

      if (enumdirection1 != enumdirection) {
        BlockPosition blockposition1 = blockposition.shift(enumdirection1);
        IBlockData iblockdata = world.getType(blockposition1);

        if (!this.g(world, blockposition1, iblockdata) && (iblockdata.getBlock().getMaterial() != this.material || iblockdata.get(BlockFlowing.LEVEL).intValue() > 0)) {
          if (!this.g(world, blockposition1.down(), iblockdata)) {
            return i;
          }

          if (i < 4) {
            int k = this.a(world, blockposition1, i + 1, enumdirection1.opposite());

            if (k < j) {
              j = k;
            }
          }
        }
      }
    }

    return j;
  }

  private Set f(World world, BlockPosition blockposition) {
    int i = 1000;
    EnumSet enumset = EnumSet.noneOf(EnumDirection.class);
    Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();

    while (iterator.hasNext()) {
      EnumDirection enumdirection = (EnumDirection) iterator.next();
      BlockPosition blockposition1 = blockposition.shift(enumdirection);
      IBlockData iblockdata = world.getType(blockposition1);

      if (!this.g(world, blockposition1, iblockdata) && (iblockdata.getBlock().getMaterial() != this.material || iblockdata.get(BlockFlowing.LEVEL).intValue() > 0)) {
        int j;

        if (this.g(world, blockposition1.down(), world.getType(blockposition1.down()))) {
          j = this.a(world, blockposition1, 1, enumdirection.opposite());
        } else {
          j = 0;
        }

        if (j < i) {
          enumset.clear();
        }

        if (j <= i) {
          enumset.add(enumdirection);
          i = j;
        }
      }
    }

    return enumset;
  }

  private boolean g(World world, BlockPosition blockposition, IBlockData iblockdata) {
    Block block = world.getType(blockposition).getBlock();

    return block instanceof BlockDoor || block == Blocks.STANDING_SIGN || block == Blocks.LADDER || block == Blocks.REEDS || (block.material == Material.PORTAL || block.material.isSolid());
  }

  protected int a(World world, BlockPosition blockposition, int i) {
    int j = this.e(world, blockposition);

    if (j < 0) {
      return i;
    } else {
      if (j == 0) {
        ++this.a;
      }

      if (j >= 8) {
        j = 0;
      }

      return i >= 0 && j >= i ? i : j;
    }
  }

  private boolean h(World world, BlockPosition blockposition, IBlockData iblockdata) {
    Material material = iblockdata.getBlock().getMaterial();

    return material != this.material && material != Material.LAVA && !this.g(world, blockposition, iblockdata);
  }

  public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
    if (!this.e(world, blockposition, iblockdata)) {
      world.a(blockposition, this, this.a(world));
    }

  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy