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

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

package net.minecraft.server;

import com.google.common.cache.LoadingCache;
import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.world.PortalCreateEvent;

import java.util.Random;

public class BlockPortal extends BlockHalfTransparent {

  public static final BlockStateEnum AXIS = BlockStateEnum.of("axis", EnumDirection.EnumAxis.class, EnumDirection.EnumAxis.X, EnumDirection.EnumAxis.Z);

  public BlockPortal() {
    super(Material.PORTAL, false);
    this.j(this.blockStateList.getBlockData().set(BlockPortal.AXIS, EnumDirection.EnumAxis.X));
    this.a(true);
  }

  public static int a(EnumDirection.EnumAxis enumdirection_enumaxis) {
    return enumdirection_enumaxis == EnumDirection.EnumAxis.X ? 1 : (enumdirection_enumaxis == EnumDirection.EnumAxis.Z ? 2 : 0);
  }

  public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
    super.b(world, blockposition, iblockdata, random);
    if (world.spigotConfig.enableZombiePigmenPortalSpawns && world.worldProvider.d() && world.getGameRules().getBoolean("doMobSpawning") && random.nextInt(2000) < world.getDifficulty().a()) { // Spigot
      int i = blockposition.getY();

      BlockPosition blockposition1;

      for (blockposition1 = blockposition; !World.a(world, blockposition1) && blockposition1.getY() > 0; blockposition1 = blockposition1.down()) {
      }

      if (i > 0 && !world.getType(blockposition1.up()).getBlock().isOccluding()) {
        // CraftBukkit - set spawn reason to NETHER_PORTAL
        Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL);

        if (entity != null) {
          entity.portalCooldown = entity.aq();
        }
      }
    }

  }

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

  public void updateShape(IBlockAccess iblockaccess, BlockPosition blockposition) {
    EnumDirection.EnumAxis enumdirection_enumaxis = iblockaccess.getType(blockposition).get(BlockPortal.AXIS);
    float f = 0.125F;
    float f1 = 0.125F;

    if (enumdirection_enumaxis == EnumDirection.EnumAxis.X) {
      f = 0.5F;
    }

    if (enumdirection_enumaxis == EnumDirection.EnumAxis.Z) {
      f1 = 0.5F;
    }

    this.a(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1);
  }

  public boolean d() {
    return false;
  }

  public boolean e(World world, BlockPosition blockposition) {
    BlockPortal.Shape blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.X);

    if (blockportal_shape.d() && blockportal_shape.e == 0) {
      // CraftBukkit start - return portalcreator
      return blockportal_shape.createPortal();
      // return true;
    } else {
      BlockPortal.Shape blockportal_shape1 = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.Z);

      if (blockportal_shape1.d() && blockportal_shape1.e == 0) {
        return blockportal_shape1.createPortal();
        // return true;
        // CraftBukkit end
      } else {
        return false;
      }
    }
  }

  public void doPhysics(World world, BlockPosition blockposition, IBlockData iblockdata, Block block) {
    EnumDirection.EnumAxis enumdirection_enumaxis = iblockdata.get(BlockPortal.AXIS);
    BlockPortal.Shape blockportal_shape;

    if (enumdirection_enumaxis == EnumDirection.EnumAxis.X) {
      blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.X);
      if (!blockportal_shape.d() || blockportal_shape.e < blockportal_shape.width * blockportal_shape.height) {
        world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData());
      }
    } else if (enumdirection_enumaxis == EnumDirection.EnumAxis.Z) {
      blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.Z);
      if (!blockportal_shape.d() || blockportal_shape.e < blockportal_shape.width * blockportal_shape.height) {
        world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData());
      }
    }

  }

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

  public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
    if (entity.vehicle == null && entity.passenger == null) {
      // CraftBukkit start - Entity in portal
      EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()));
      world.getServer().getPluginManager().callEvent(event);
      // CraftBukkit end
      entity.d(blockposition);
    }

  }

  public IBlockData fromLegacyData(int i) {
    return this.getBlockData().set(BlockPortal.AXIS, (i & 3) == 2 ? EnumDirection.EnumAxis.Z : EnumDirection.EnumAxis.X);
  }

  public int toLegacyData(IBlockData iblockdata) {
    return a(iblockdata.get(BlockPortal.AXIS));
  }

  protected BlockStateList getStateList() {
    return new BlockStateList(this, BlockPortal.AXIS);
  }

  public ShapeDetector.ShapeDetectorCollection f(World world, BlockPosition blockposition) {
    EnumDirection.EnumAxis enumdirection_enumaxis = EnumDirection.EnumAxis.Z;
    BlockPortal.Shape blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.X);
    LoadingCache loadingcache = ShapeDetector.a(world, true);

    if (!blockportal_shape.d()) {
      enumdirection_enumaxis = EnumDirection.EnumAxis.X;
      blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.Z);
    }

    if (!blockportal_shape.d()) {
      return new ShapeDetector.ShapeDetectorCollection(blockposition, EnumDirection.NORTH, EnumDirection.UP, loadingcache, 1, 1, 1);
    } else {
      int[] aint = new int[EnumDirection.EnumAxisDirection.values().length];
      EnumDirection enumdirection = blockportal_shape.c.f();
      BlockPosition blockposition1 = blockportal_shape.position.up(blockportal_shape.a() - 1);
      EnumDirection.EnumAxisDirection[] aenumdirection_enumaxisdirection = EnumDirection.EnumAxisDirection.values();
      int i = aenumdirection_enumaxisdirection.length;

      int j;

      for (j = 0; j < i; ++j) {
        EnumDirection.EnumAxisDirection enumdirection_enumaxisdirection = aenumdirection_enumaxisdirection[j];
        ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection = new ShapeDetector.ShapeDetectorCollection(enumdirection.c() == enumdirection_enumaxisdirection ? blockposition1 : blockposition1.shift(blockportal_shape.c, blockportal_shape.b() - 1), EnumDirection.a(enumdirection_enumaxisdirection, enumdirection_enumaxis), EnumDirection.UP, loadingcache, blockportal_shape.b(), blockportal_shape.a(), 1);

        for (int k = 0; k < blockportal_shape.b(); ++k) {
          for (int l = 0; l < blockportal_shape.a(); ++l) {
            ShapeDetectorBlock shapedetectorblock = shapedetector_shapedetectorcollection.a(k, l, 1);

            if (shapedetectorblock.a() != null && shapedetectorblock.a().getBlock().getMaterial() != Material.AIR) {
              ++aint[enumdirection_enumaxisdirection.ordinal()];
            }
          }
        }
      }

      EnumDirection.EnumAxisDirection enumdirection_enumaxisdirection1 = EnumDirection.EnumAxisDirection.POSITIVE;
      EnumDirection.EnumAxisDirection[] aenumdirection_enumaxisdirection1 = EnumDirection.EnumAxisDirection.values();

      j = aenumdirection_enumaxisdirection1.length;

      for (int i1 = 0; i1 < j; ++i1) {
        EnumDirection.EnumAxisDirection enumdirection_enumaxisdirection2 = aenumdirection_enumaxisdirection1[i1];

        if (aint[enumdirection_enumaxisdirection2.ordinal()] < aint[enumdirection_enumaxisdirection1.ordinal()]) {
          enumdirection_enumaxisdirection1 = enumdirection_enumaxisdirection2;
        }
      }

      return new ShapeDetector.ShapeDetectorCollection(enumdirection.c() == enumdirection_enumaxisdirection1 ? blockposition1 : blockposition1.shift(blockportal_shape.c, blockportal_shape.b() - 1), EnumDirection.a(enumdirection_enumaxisdirection1, enumdirection_enumaxis), EnumDirection.UP, loadingcache, blockportal_shape.b(), blockportal_shape.a(), 1);
    }
  }

  public static class Shape {

    private final World a;
    private final EnumDirection.EnumAxis b;
    private final EnumDirection c;
    private final EnumDirection d;
    java.util.Collection blocks = new java.util.HashSet<>(); // CraftBukkit - add field
    private int e = 0;
    private BlockPosition position;
    private int height;
    private int width;

    public Shape(World world, BlockPosition blockposition, EnumDirection.EnumAxis enumdirection_enumaxis) {
      this.a = world;
      this.b = enumdirection_enumaxis;
      if (enumdirection_enumaxis == EnumDirection.EnumAxis.X) {
        this.d = EnumDirection.EAST;
        this.c = EnumDirection.WEST;
      } else {
        this.d = EnumDirection.NORTH;
        this.c = EnumDirection.SOUTH;
      }

      for (BlockPosition blockposition1 = blockposition; blockposition.getY() > blockposition1.getY() - 21 && blockposition.getY() > 0 && this.a(world.getType(blockposition.down()).getBlock()); blockposition = blockposition.down()) {
      }

      int i = this.a(blockposition, this.d) - 1;

      if (i >= 0) {
        this.position = blockposition.shift(this.d, i);
        this.width = this.a(this.position, this.c);
        if (this.width < 2 || this.width > 21) {
          this.position = null;
          this.width = 0;
        }
      }

      if (this.position != null) {
        this.height = this.c();
      }

    }

    protected int a(BlockPosition blockposition, EnumDirection enumdirection) {
      int i;

      for (i = 0; i < 22; ++i) {
        BlockPosition blockposition1 = blockposition.shift(enumdirection, i);

        if (!this.a(this.a.getType(blockposition1).getBlock()) || this.a.getType(blockposition1.down()).getBlock() != Blocks.OBSIDIAN) {
          break;
        }
      }

      Block block = this.a.getType(blockposition.shift(enumdirection, i)).getBlock();

      return block == Blocks.OBSIDIAN ? i : 0;
    }

    public int a() {
      return this.height;
    }

    public int b() {
      return this.width;
    }

    protected int c() {
      // CraftBukkit start
      this.blocks.clear();
      org.bukkit.World bworld = this.a.getWorld();
      // CraftBukkit end
      int i;

      label56:
      for (this.height = 0; this.height < 21; ++this.height) {
        for (i = 0; i < this.width; ++i) {
          BlockPosition blockposition = this.position.shift(this.c, i).up(this.height);
          Block block = this.a.getType(blockposition).getBlock();

          if (!this.a(block)) {
            break label56;
          }

          if (block == Blocks.PORTAL) {
            ++this.e;
          }

          if (i == 0) {
            block = this.a.getType(blockposition.shift(this.d)).getBlock();
            if (block != Blocks.OBSIDIAN) {
              break label56;
              // CraftBukkit start - add the block to our list
            } else {
              BlockPosition pos = blockposition.shift(this.d);
              blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
              // CraftBukkit end
            }
          } else if (i == this.width - 1) {
            block = this.a.getType(blockposition.shift(this.c)).getBlock();
            if (block != Blocks.OBSIDIAN) {
              break label56;
              // CraftBukkit start - add the block to our list
            } else {
              BlockPosition pos = blockposition.shift(this.c);
              blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
              // CraftBukkit end
            }
          }
        }
      }

      for (i = 0; i < this.width; ++i) {
        if (this.a.getType(this.position.shift(this.c, i).up(this.height)).getBlock() != Blocks.OBSIDIAN) {
          this.height = 0;
          break;
          // CraftBukkit start - add the block to our list
        } else {
          BlockPosition pos = this.position.shift(this.c, i).up(this.height);
          blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
          // CraftBukkit end
        }
      }

      if (this.height <= 21 && this.height >= 3) {
        return this.height;
      } else {
        this.position = null;
        this.width = 0;
        this.height = 0;
        return 0;
      }
    }

    protected boolean a(Block block) {
      return block.material == Material.AIR || block == Blocks.FIRE || block == Blocks.PORTAL;
    }

    public boolean d() {
      return this.position != null && this.width >= 2 && this.width <= 21 && this.height >= 3 && this.height <= 21;
    }

    // CraftBukkit start - return boolean
    public boolean createPortal() {
      org.bukkit.World bworld = this.a.getWorld();

      // Copy below for loop
      for (int i = 0; i < this.width; ++i) {
        BlockPosition blockposition = this.position.shift(this.c, i);

        for (int j = 0; j < this.height; ++j) {
          BlockPosition pos = blockposition.up(j);
          blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
        }
      }

      PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE);
      this.a.getServer().getPluginManager().callEvent(event);

      if (event.isCancelled()) {
        return false;
      }
      // CraftBukkit end
      for (int i = 0; i < this.width; ++i) {
        BlockPosition blockposition = this.position.shift(this.c, i);

        for (int j = 0; j < this.height; ++j) {
          this.a.setTypeAndData(blockposition.up(j), Blocks.PORTAL.getBlockData().set(BlockPortal.AXIS, this.b), 2);
        }
      }

      return true; // CraftBukkit
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy