@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityExplode(final EntityExplodeEvent event) { if (arena == null) { return; } boolean contains = false; for (final ArenaRegion region : arena.getRegionsByType(RegionType.BATTLE)) { if (region.getShape().contains(new PABlockLocation(event.getLocation()))) { contains = true; break; } } if (!contains) { return; } final Set<PABlock> blocks = SpawnManager.getPABlocksContaining(arena, "block"); // final Set<PABlockLocation> for (final Block b : event.blockList()) { final PABlockLocation loc = new PABlockLocation(b.getLocation()); for (final PABlock pb : blocks) { if (pb.getLocation().getDistanceSquared(loc) < 1) { final String blockTeam = pb.getName().split("block")[0]; try { arena.broadcast( Language.parse( arena, MSG.GOAL_BLOCKDESTROY_SCORE, Language.parse(arena, MSG.DEATHCAUSE_BLOCK_EXPLOSION) + ChatColor.YELLOW, arena.getTeam(blockTeam).getColoredName() + ChatColor.YELLOW, String.valueOf(getLifeMap().get(blockTeam) - 1))); } catch (final Exception e) { Bukkit.getLogger().severe("[PVP Arena] team unknown/no lives: " + blockTeam); e.printStackTrace(); } takeBlock(arena.getTeam(blockTeam).getColor().name(), pb.getLocation()); reduceLivesCheckEndAndCommit(arena, blockTeam); } } } }
@Override public boolean overlapsWith(final ArenaRegion paRegion) { if (paRegion.getShape() instanceof CuboidRegion) { // compare 2 cuboids if (getMinimumLocation().getX() > paRegion.locs[1].getX() || getMinimumLocation().getY() > paRegion.locs[1].getY() || getMinimumLocation().getZ() > paRegion.locs[1].getZ()) { return false; } if (paRegion.locs[0].getX() > getMaximumLocation().getX() || paRegion.locs[0].getY() > getMaximumLocation().getY() || paRegion.locs[0].getZ() > getMaximumLocation().getZ()) { return false; } return true; } else if (paRegion.getShape() instanceof SphericRegion) { // we are cube and search for intersecting sphere final PABlockLocation thisCenter = getMaximumLocation().getMidpoint(getMinimumLocation()); final PABlockLocation thatCenter = paRegion.locs[1].getMidpoint(paRegion.locs[0]); final Double thatRadius = paRegion.locs[0].getDistance(paRegion.locs[1]) / 2; if (contains(thatCenter)) { return true; // the sphere is inside! } final PABlockLocation offset = thatCenter.pointTo(thisCenter, thatRadius); // offset is pointing from that to this return this.contains(offset); } else if (paRegion.getShape() instanceof CylindricRegion) { // we are cube and search for intersecting cylinder final PABlockLocation thisCenter = getMaximumLocation().getMidpoint(getMinimumLocation()); final PABlockLocation thatCenter = paRegion.locs[1].getMidpoint(paRegion.locs[0]); if (getMaximumLocation().getY() < paRegion.locs[0].getY()) { return false; } if (getMinimumLocation().getY() > paRegion.locs[1].getY()) { return false; } thisCenter.setY(thatCenter.getY()); if (contains(thatCenter)) { return true; // the sphere is inside! } final Double thatRadius = paRegion.locs[0].getDistance(paRegion.locs[1]) / 2; final PABlockLocation offset = thatCenter.pointTo(thisCenter, thatRadius); // offset is pointing from that to this return this.contains(offset); } else { PVPArena.instance .getLogger() .warning("Region Shape not supported: " + paRegion.getShape().getName()); } return false; }