public void spawn() { Location location = data.region().getRandom(match.getRandom()).toLocation(world); effects(Sound.BLOCK_NOTE_BASEDRUM, Particle.CLOUD); Entity entity = world.spawn(location, (Class) data.appearance().getEntityClass()); entity.setKnockbackReduction(1); data.name().ifPresent(name -> { entity.setCustomName(ChatColor.translateAlternateColorCodes('`', name)); entity.setCustomNameVisible(true); }); switch(data.appearance()) { // TODO: Support more appearances later case ENDER_CRYSTAL: ifInstance(entity, EnderCrystal.class, crystal -> crystal.setShowingBottom(false)); break; case PRIMED_TNT: ifInstance(entity, TNTPrimed.class, tnt -> tnt.setFuseTicks(Integer.MAX_VALUE)); break; } this.entity = Optional.of(entity); spawnAt = Optional.empty(); }
@Override public void run() { // Ender dragon was not found. Forcibly respawn it if (world.getEntitiesByClass(EnderDragon.class).size() == 0) { this.plugin.getLogger().warning("Something went wrong! Had to forcibly reset dragon battle..."); this.battle.resetBattleState(); this.removeCrystals(); plugin.getDEDManager().getWorldWrapper(world).startRespawn(0); return; } // Ensure all crystals are not invulnerable this.world.getEntitiesByClass(EnderCrystal.class).forEach(c -> { c.setInvulnerable(false); c.setBeamTarget(null); }); }
@EventHandler public void onPlayerSwitchWorlds(PlayerChangedWorldEvent event) { World world = event.getPlayer().getWorld(); if (world.getEnvironment() != Environment.THE_END) return; EndWorldWrapper worldWrapper = manager.getWorldWrapper(world); // Start the respawn countdown if joining an empty world if (plugin.getConfig().getBoolean("respawn-on-join", false)) { if (world.getPlayers().size() > 1 || worldWrapper.isRespawnInProgress() || world.getEntitiesByClass(EnderDragon.class).size() == 0) return; manager.getWorldWrapper(world).startRespawn(RespawnType.JOIN); } // Reset end crystal states just in case something went awry if (!worldWrapper.isRespawnInProgress()) { world.getEntitiesByClass(EnderCrystal.class).forEach(e -> { e.setInvulnerable(false); e.setBeamTarget(null); }); } }
public void takeFlag(BPPlayer bpHolder, EnderCrystal flag, Team damagerTeam, Team flagTeam) { int flagTeamId = Team.getId(flagTeam); holders[flagTeamId] = bpHolder; String holderName = bpHolder.getPVPName(); isDropped[flagTeamId] = false; Player holder = bpHolder.getPlayer(); SoundManager.playTeamSound(game, Sound.ENDERDRAGON_HIT, 1F, 1F, flagTeam); SoundManager.playTeamSound(game, Sound.ORB_PICKUP, 1F, 1F, damagerTeam); bpHolder.getStatistics().increaseFlagTakes(1); Achievement.checkFlagTakes(bpHolder); slowDown(holder); showHolderEffect(holder, flagTeam); colorArmorByFlag(holder, flagTeam); giveCompass(holder); NametagEditManager.updateNametag(bpHolder); bpHolder.setPlayerListName(); if(flagTeam == Team.RED) game.broadcast(MessageType.FLAG_TAKE_RED.getTranslation().getValue(holderName)); else if(flagTeam == Team.BLUE) game.broadcast(MessageType.FLAG_TAKE_BLUE.getTranslation().getValue(holderName)); }
public void destroyGarbage() { int i = 0; for (Location loc : DespawningIce) { loc.getBlock().setType(Material.AIR); i++; } plugin.getLogger().info("Destroying " + i + " undeleted Ice Powerup blocks."); List<Track> tracks = plugin.getTrackRegistry().getTracks(); for (Track track : tracks) { track.getItemBoxes().forEach(ItemBox::despawn); Collection<Marker> markers = track.getMarkerHandler().getMarkers().values(); for (Marker marker : markers) { marker.setVisualized(false); } track.getWorld().getEntities().stream().filter(e -> e instanceof EnderCrystal || e instanceof Horse || e.hasMetadata("MarkerLocation") || e.getName().startsWith("§9Marker")).forEach(Entity::remove); } }
public void reloadConfigs() { reloadConfig(); //EquestrianDash.getInstance().setupItemBoxes(); getTrackRegistry().getTracks().forEach(track -> { track.getWorld().getEntitiesByClass(EnderCrystal.class).forEach(EnderCrystal::remove); track.reloadTrackData(); track.reloadItemBoxData(); new BukkitRunnable() { @Override public void run() { track.getItemBoxes().stream().filter(itembox -> itembox.getEnderCrystal() == null || itembox.getEnderCrystal().isDead()).forEach(ItemBox::spawn); } }.runTaskLater(plugin, 1); }); }
public static void despawnEntities(Entity[] list) { for (Entity e : list) { if (e == null || e.getUniqueId() == null) continue; if (e instanceof Player) continue; try { if (MobManager.spawnedMobs != null && MobManager.spawnedMobs.containsKey(e.getUniqueId())) { MobManager.spawnedMobs.get(e.getUniqueId()).despawn(); } if (NPCManager.npcs != null && NPCManager.npcs.containsKey(e.getUniqueId())) { NPCManager.npcs.remove(e.getUniqueId()).despawn(); } if (e instanceof Item || e instanceof LivingEntity || e instanceof ArmorStand || e instanceof Projectile || e instanceof EnderCrystal) { if (e instanceof LivingEntity) ((LivingEntity) e).setHealth(0.0); DropManager dm = plugin.getInstance(DropManager.class); if (dm != null) { Entity label = dm.removeLabel(e.getUniqueId()); if (label != null) label.remove(); e.remove(); } } } catch (Exception ex) { ex.printStackTrace(); } } }
@EventHandler public void onPlayerJoin(PlayerJoinEvent event) { // Version notification Player player = event.getPlayer(); if (player.isOp() && plugin.isNewVersionAvailable()) { this.plugin.sendMessage(player, ChatColor.GRAY + "A new version is available for download (Version " + this.plugin.getNewVersion() + "). " + RESOURCE_PAGE); } World world = player.getWorld(); if (world.getEnvironment() != Environment.THE_END) return; EndWorldWrapper worldWrapper = manager.getWorldWrapper(world); // Reset end crystal states just in case something went awry if (!worldWrapper.isRespawnInProgress()) { world.getEntitiesByClass(EnderCrystal.class).forEach(e -> { e.setInvulnerable(false); e.setBeamTarget(null); }); } // Dragon respawn logic if (!plugin.getConfig().getBoolean("respawn-on-join", false)) return; if (!world.getPlayers().isEmpty() || manager.getWorldWrapper(world).isRespawnInProgress() || world.getEntitiesByClass(EnderDragon.class).size() == 0) return; manager.getWorldWrapper(world).startRespawn(RespawnType.JOIN); }
@EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { Entity entity = event.getEntity(); if (!(entity instanceof EnderCrystal) || event.getEntity().getWorld().getEnvironment() != Environment.THE_END || !entity.isInvulnerable()) return; event.setCancelled(true); }
@EventHandler public void onAttemptRespawn(PlayerInteractEvent event) { Player player = event.getPlayer(); ItemStack item = event.getItem(); if (item == null || item.getType() != Material.END_CRYSTAL) return; if (plugin.getConfig().getBoolean("allow-crystal-respawns")) return; World world = player.getWorld(); EndWorldWrapper worldWrapper = plugin.getDEDManager().getWorldWrapper(world); if (worldWrapper.isRespawnInProgress() || !world.getEntitiesByClass(EnderDragon.class).isEmpty()) { Set<EnderCrystal> crystals = PortalCrystal.getAllSpawnedCrystals(world); // Check for 3 crystals because PlayerInteractEvent is fired first if (crystals.size() < 3) return; for (EnderCrystal crystal : crystals) { crystal.getLocation().getBlock().setType(Material.AIR); // Remove fire world.dropItem(crystal.getLocation(), END_CRYSTAL_ITEM); crystal.remove(); } plugin.getNMSAbstract().sendActionBar(ChatColor.RED + "You cannot manually respawn a dragon!", player); player.sendMessage(ChatColor.RED + "You cannot manually respawn a dragon!"); event.setCancelled(true); } }
@EventHandler public void onRuneHit(EntityDamageByEntityEvent event){ if(event.getEntity() instanceof EnderCrystal){ if(event.getDamager() instanceof Player){ event.setCancelled(true); event.getEntity().remove(); Player player = (Player) event.getDamager(); int rand = ThreadLocalRandom.current().nextInt(100); if(rand <= 50){ World world = event.getEntity().getWorld(); Location loc = event.getEntity().getLocation(); world.createExplosion(loc.getX(), loc.getY(), loc.getZ(), 0, false, false); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); Message.sendCenteredMessage(player, ChatColor.BOLD + "Rune"); Message.sendCenteredMessage(player, ChatColor.YELLOW + "You fail to harvest any runes."); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); return; }else{ Enchantments[] enchants = Enchantments.values(); Enchantments ench = enchants[ThreadLocalRandom.current().nextInt(enchants.length - 1)]; int level = ThreadLocalRandom.current().nextInt(enchantclass.getMaxLevel(ench)); if(level == 0) level = 1; event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), new ca.damocles.itemblueprints.Rune(ench, level, ThreadLocalRandom.current().nextInt(100), ThreadLocalRandom.current().nextInt(100)).getItemStack()); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); Message.sendCenteredMessage(player, ChatColor.BOLD + "Rune"); Message.sendCenteredMessage(player, ChatColor.YELLOW + "You successefuly harvest some runes."); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); return; } } } }
@EventHandler public void runeCreation(PlayerInteractEntityEvent event){ if(event.getRightClicked() instanceof EnderCrystal){ event.setCancelled(true); if(event.getHand().equals(EquipmentSlot.OFF_HAND)) return; event.getRightClicked().remove(); Player player = event.getPlayer(); int rand = ThreadLocalRandom.current().nextInt(100); if(rand <= 50){ World world = event.getRightClicked().getWorld(); Location loc = event.getRightClicked().getLocation(); world.createExplosion(loc.getX(), loc.getY(), loc.getZ(), 2, false, false); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); Message.sendCenteredMessage(player, ChatColor.BOLD + "Rune"); Message.sendCenteredMessage(player, ChatColor.YELLOW + "You fail to harvest any runes."); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); return; }else{ Enchantments[] enchants = Enchantments.values(); Enchantments ench = enchants[ThreadLocalRandom.current().nextInt(enchants.length - 1)]; int level = ThreadLocalRandom.current().nextInt(enchantclass.getMaxLevel(ench) + 1); if(level == 0) level = 1; event.getRightClicked().getWorld().dropItem(event.getRightClicked().getLocation(), new ca.damocles.itemblueprints.Rune(ench, level, ThreadLocalRandom.current().nextInt(100), ThreadLocalRandom.current().nextInt(100)).getItemStack()); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); Message.sendCenteredMessage(player, ChatColor.BOLD + "Rune"); Message.sendCenteredMessage(player, ChatColor.YELLOW + "You successefuly harvest some runes."); Message.sendCenteredMessage(player, ChatColor.GREEN+"----------------------------------------------------"); return; } } return; }
public FlagManager(CTFGame game) { this.game = game; defaultFlagLocations = new Location[2]; flags = new EnderCrystal[2]; holders = new BPPlayer[2]; score = new int[2]; timeoutIn = new int[2]; isDropped = new boolean[] { false, false }; }
public EnderCrystal spawnFlag(Location loc, Team team) { int teamId = Team.getId(team); loc = ground(loc); World world = loc.getWorld(); Chunk chunk = world.getChunkAt(loc); if (!chunk.isLoaded()) chunk.load(); EnderCrystal ec = (EnderCrystal) world.spawnEntity(loc, EntityType.ENDER_CRYSTAL); flags[teamId] = ec; return ec; }
public void onTryFlagTake(EntityDamageByEntityEvent event) { Entity damagerEntity = event.getDamager(); EntityType damagerEntityType = damagerEntity.getType(); if (damagerEntityType == EntityType.PLAYER) { Player damager = (Player) damagerEntity; if (damager.isDead()) return; BPPlayer bpDamager = BPPlayer.get(damager); if(!bpDamager.isInGame()) return; Game damagerGame = bpDamager.getGame(); if(!damagerGame.equals(game)) return; EnderCrystal flag = (EnderCrystal) event.getEntity(); Team damagerTeam = ((CTFProperties) bpDamager.getGameProperties()).getTeam(); if(damagerTeam != null) flagTouch(bpDamager, flag, damagerTeam, true); } }
public void flagTouch(BPPlayer bpPlayer, EnderCrystal flag, Team damagerTeam, boolean chain) { Team flagTeam = getFlagTeam(flag); if(flagTeam != null) { Player player = bpPlayer.getPlayer(); if(Team.areEnemies(damagerTeam, flagTeam)) { takeFlag(bpPlayer, flag, damagerTeam, flagTeam); flag.remove(); player.sendMessage(MessageType.FLAG_STEAL.getTranslation().getValue()); } else if (isAtDefaultLocation(flag)) { if (isHoldingFlag(bpPlayer)) captureFlag(bpPlayer, damagerTeam); else player.sendMessage(MessageType.FLAG_INFO.getTranslation().getValue()); } else returnFlag(bpPlayer, flagTeam); } else { flag.remove(); if(chain) for(Entity entity : flag.getNearbyEntities(0, 0, 0)) if(entity instanceof EnderCrystal) { EnderCrystal cur = (EnderCrystal) entity; flagTouch(bpPlayer, cur, damagerTeam, false); } } }
public Team getFlagTeam(EnderCrystal ec) { for (int i = 0; i < 2; i++) if (flags[i] != null) if (flags[i].equals(ec)) return Team.getById(i); return null; }
public boolean isAtDefaultLocation(EnderCrystal ec) { Team team = getFlagTeam(ec); if (team != null) { int teamId = Team.getId(team); Location loc = ec.getLocation(); Location defaultLoc = defaultFlagLocations[teamId]; return sameXZ(loc, defaultLoc); } return false; }
public boolean isTeamFlag(EnderCrystal ec) { for (int i = 0; i < 2; i++) if (flags[i] != null) if (flags[i].equals(ec)) return true; return false; }
@Override @Nullable protected Location[] get(Event e) { if (entity.getSingle(e) == null) { return null; } if (entity.getSingle(e) instanceof EnderCrystal) { return new Location[]{((EnderCrystal)entity.getSingle(e)).getBeamTarget()}; } return null; }
@Override public void change(Event e, Object[] delta, Changer.ChangeMode mode){ if (entity.getSingle(e) == null) { return; } if (entity.getSingle(e) instanceof EnderCrystal) { if (mode == ChangeMode.SET) { ((EnderCrystal)entity.getSingle(e)).setBeamTarget((Location)delta[0]); } else { ((EnderCrystal)entity.getSingle(e)).setBeamTarget(null); } } }
@Override @Nullable protected Boolean[] get(Event e) { if (entity.getSingle(e) == null) { return null; } if (entity.getSingle(e) instanceof EnderCrystal) { return new Boolean[]{((EnderCrystal)entity.getSingle(e)).isShowingBottom()}; } return null; }
@Override public void change(Event e, Object[] delta, Changer.ChangeMode mode){ if (entity.getSingle(e) == null) { return; } if (entity.getSingle(e) instanceof EnderCrystal) { if (mode == ChangeMode.SET) { ((EnderCrystal)entity.getSingle(e)).setShowingBottom((Boolean)delta[0]); } } }
public void spawnCrystals(){ for(Entity ent : Bukkit.getWorld("EstiNet").getEntities()){ if(ent.getType().equals(EntityType.ENDER_CRYSTAL)){ ent.remove(); } } for(Location loc : Basis.crystals.keySet()){ Bukkit.getWorld("EstiNet").spawn(loc, EnderCrystal.class); } }
public void onEntityExplode(EntityExplodeEvent event) { if(event.getEntityType().equals(EntityType.ENDER_CRYSTAL)){ event.setCancelled(true); Bukkit.getScheduler().scheduleSyncDelayedTask(Bukkit.getServer().getPluginManager().getPlugin("gFeatures"), new Runnable() { public void run(){ Bukkit.getWorld(Basic.mapName).spawn(Basic.flag, EnderCrystal.class); } }, 20L); } }
@Override public void execute(String cmd, Player p, String[] args) { for (Entity e : p.getNearbyEntities(20, 20, 20)) { if (e instanceof EnderCrystal) { e.remove(); } } }
@EventHandler public void onDamage(EntityDamageEvent event) { Entity e = event.getEntity(); if(event.getCause() == EntityDamageEvent.DamageCause.FALL) { event.setCancelled(true); return; } if (e instanceof EnderCrystal) { event.setCancelled(true); } if(e instanceof Player) { Player p = (Player) e; if ((p.getHealth() - event.getFinalDamage()) <= 0) { plugin.getRacerHandler().respawnPlayer(p); event.setCancelled(true); } } GameHandler.GameState gameState = plugin.getGameHandler().getGameState(); if (gameState != GameHandler.GameState.RACE_IN_PROGRESS) { event.setCancelled(true); } }
@EventHandler public void onSpawn(EntitySpawnEvent event) { //plugin.getLogger().info("SPAWN EVENT!"); if(event.getEntity() instanceof EnderCrystal) { ItemBox itemBox = plugin.getItemBoxRegistry().getByLocation(event.getLocation().getBlock().getLocation()); if(itemBox != null && !itemBox.getEnderCrystal().equals(event.getEntity())) { event.setCancelled(true); } } }
public static void registerSpawner(EnderCrystal spawner, DungeonBoss dungeonBoss) { spawners.put(spawner.getUniqueId(), dungeonBoss); }
@Override public void run() { if (this.secondsUntilRespawn > 0) { if (announceRespawn) { if (this.currentMessage >= announceMessages.size()) this.currentMessage = 0; // Show actionbar messages String message = announceMessages.get(currentMessage++) .replace("%time%", String.valueOf(secondsUntilRespawn)) .replace("%formatted-time%", this.getFormattedTime(secondsUntilRespawn)); plugin.getNMSAbstract().broadcastActionBar(message, worldWrapper.getWorld()); } this.secondsUntilRespawn--; return; } // Only respawn if a Player is in the World World world = this.worldWrapper.getWorld(); if (world.getPlayers().size() <= 0) return; // Start respawn process PortalCrystal crystalPos = PortalCrystal.values()[currentCrystal++]; Location crystalLocation = crystalPos.getRelativeToPortal(world); World crystalWorld = crystalLocation.getWorld(); Chunk crystalChunk = crystalWorld.getChunkAt(crystalLocation); if (!crystalChunk.isLoaded()) crystalChunk.load(); // Remove any existing crystal EnderCrystal existingCrystal = crystalPos.get(world); if (existingCrystal != null) existingCrystal.remove(); crystalPos.spawn(world); crystalWorld.createExplosion(crystalLocation.getX(), crystalLocation.getY(), crystalLocation.getZ(), 0F, false, false); crystalWorld.spawnParticle(Particle.EXPLOSION_HUGE, crystalLocation, 0); // All crystals respawned if (currentCrystal >= 4) { // If dragon already exists, cancel the respawn process if (crystalWorld.getEntitiesByClass(EnderDragon.class).size() >= 1) { plugin.getLogger().warning("An EnderDragon is already present in world " + crystalWorld.getName() + ". Dragon respawn cancelled"); this.nmsAbstract.broadcastActionBar(ChatColor.RED + "Dragon respawn abandonned! Dragon already exists! Slay it!", crystalWorld); // Destroy all crystals for (PortalCrystal portalCrystal : PortalCrystal.values()) { Location location = portalCrystal.getRelativeToPortal(world); portalCrystal.get(world).remove(); crystalWorld.getPlayers().forEach(p -> p.playSound(location, Sound.BLOCK_FIRE_EXTINGUISH, 1000, 1)); crystalWorld.createExplosion(location.getX(), location.getY(), location.getZ(), 0F, false, false); } this.cancel(); return; } this.dragonBattle.respawnEnderDragon(); RespawnSafeguardRunnable.newTimeout(plugin, worldWrapper.getWorld(), dragonBattle); BattleStateChangeEvent bscEventRespawning = new BattleStateChangeEvent(dragonBattle, dragon, BattleState.CRYSTALS_SPAWNING, BattleState.DRAGON_RESPAWNING); Bukkit.getPluginManager().callEvent(bscEventRespawning); this.worldWrapper.stopRespawn(); this.cancel(); } }
private void removeCrystals() { this.world.getEntitiesByClass(EnderCrystal.class).forEach(Entity::remove); }
@EventHandler public void onEntityExplode(EntityExplodeEvent event){ if(event.getEntity() instanceof EnderCrystal){ event.setCancelled(true); } }