/* * This file is part of Libelula Minecraft Edition Project. * * Libelula Minecraft Edition is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Libelula Minecraft Edition is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Libelula Minecraft Edition. * If not, see <http://www.gnu.org/licenses/>. * */ package me.libelula.climber; import com.sk89q.worldedit.BlockVector; import java.util.ArrayList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.Potion; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionType; /** * * @author Diego D'Onofrio <ddonofrio@member.fsf.org> */ public class Round { private final Game g; private int round; private int tickCounter; private final List<Integer> reward; private boolean allowPVP; Main.LocationComparator locationComp; private class Listener implements org.bukkit.event.Listener { @EventHandler(ignoreCancelled = true) public void onQuitEvent(PlayerQuitEvent e) { if (g.isInGame(e.getPlayer())) { g.removePlayer(e.getPlayer()); } } @EventHandler(ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent e) { boolean moveIntoArena = false; BlockVector min = g.getArena().area.getMinimumPoint(); BlockVector max = g.getArena().area.getMaximumPoint(); if (e.getTo().getWorld().getName().equals(g.getArena().capturePoint.getWorld().getName())) { if (e.getTo().getBlockX() >= min.getX() && e.getTo().getBlockX() <= max.getBlockX() && e.getTo().getBlockY() >= min.getY() && e.getTo().getBlockY() <= max.getBlockY() && e.getTo().getBlockZ() >= min.getZ() && e.getTo().getBlockZ() <= max.getBlockZ()) { moveIntoArena = true; } } if (g.getTeam(e.getPlayer()) == null) { if (moveIntoArena) { if (!e.getPlayer().isOp()) { e.getPlayer().teleport(g.getPlugin().mapMan.getLobby()); g.getPlugin().teamMan.backToNormal(e.getPlayer()); } return; } } else { if (!moveIntoArena) { // g.getPlugin().getLogger().info("Debug: fuera de Area " +e.getTo() + " " + g.getArena().area.getMinimumPoint() + " / " + g.getArena().area.getMaximumPoint()); g.messageAll(e.getPlayer().getName() + " ha caído fuera de la arena."); g.moveToSpawn(e.getPlayer()); } } if (g.getArena().capturePoint.getBlockX() == e.getTo().getBlockX() && g.getArena().capturePoint.getBlockY() == e.getTo().getBlockY() && g.getArena().capturePoint.getBlockZ() == e.getTo().getBlockZ() && g.getArena().capturePoint.getWorld().getName().equals(e.getTo().getWorld().getName())) { g.moveAllToSpawn(); g.messageAll(ChatColor.GOLD + e.getPlayer().getDisplayName() + " captura el punto"); int score = g.getPlugin().teamMan.getScore(e.getPlayer()).getScore(); g.getPlugin().teamMan.getScore(e.getPlayer()).setScore(score + reward.get(round)); g.playSoundAll(Sound.EXPLODE); /* Location pointLoc = e.getTo(); pointLoc.setY(e.getTo().getY() - round); pointLoc.getBlock().setType(Material.WOOL); pointLoc.getBlock().setData(g.getPlugin().teamMan.getDyeColor(e.getPlayer()).getData()); */ g.announsePoint(); round++; tickCounter = 0; } } @EventHandler(ignoreCancelled = true) public void onPlayerDeath(PlayerDeathEvent e) { Player player = e.getEntity(); if (g.getTeam(player) != null) { String deathMessage = e.getDeathMessage(); e.setDeathMessage(""); e.setDroppedExp(0); e.setKeepLevel(true); e.getDrops().clear(); g.moveToSpawn(player); g.messageAll(ChatColor.GRAY + deathMessage); } } @EventHandler(ignoreCancelled = true) public void onPlayerDamage(EntityDamageByEntityEvent e) { Player player; if (e.getEntity() instanceof Player) { player = (Player) e.getEntity(); //e.setCancelled(true); e.setDamage(0.001); return; } else { return; } /* boolean melee = true; boolean headshot = false; Player damager = null; if (e.getDamager() instanceof Player) { damager = (Player) e.getDamager(); } else if (e.getDamager() instanceof Arrow) { final Arrow arrow = (Arrow) e.getDamager(); if (arrow.getShooter() instanceof Player) { damager = (Player) arrow.getShooter(); melee = false; double y = arrow.getLocation().getY(); double shotY = player.getLocation().getY(); headshot = y - shotY > 1.35d; } } if (damager == null) { return; } String playerTeam = g.getTeam(player); if (playerTeam == null) { return; } String damagerTeam = g.getTeam(damager); if (damagerTeam == null) { e.setCancelled(true); return; } if (!allowPVP) { e.setCancelled(true); return; } boolean dead = e.getDamage() >= player.getHealth(); if (dead) { e.setCancelled(true); } damageControl(damager, player, melee, headshot, dead, e); */ } } public Round(Game game) { g = game; reward = new ArrayList<>(); reward.add(5); reward.add(5); reward.add(10); reward.add(15); reward.add(15); reward.add(15); reward.add(25); reward.add(25); reward.add(35); reward.add(45); reward.add(55); reward.add(65); reward.add(75); reward.add(85); reward.add(95); reward.add(100); reward.add(100); locationComp = new Main.LocationComparator(); g.getPlugin().getServer().getPluginManager().registerEvents(new Round.Listener(), g.getPlugin()); allowPVP = true; // g.getPlugin().getLogger().info("Debug: " + g.getArena().name); // g.getPlugin().getLogger().info("Debug: MinPlayer " + g.getArena().minPlayers); // g.getPlugin().getLogger().info("Debug: MaxPlayer " + g.getArena().maxPlayers); // g.getPlugin().getLogger().info("Debug: Area " + g.getArena().area.getMinimumPoint() + " / " + g.getArena().area.getMaximumPoint()); } public void setRound(int roundNumber) { this.round = roundNumber; tickCounter = 0; } public void tick() { switch (round) { case 0: allowPVP = true; switch (tickCounter) { case 0: roundConditioner(); g.messageAll(ChatColor.GOLD + "#1: Conociendo el terreno: " + ChatColor.YELLOW + "Se el primero en subir a la torre primero a la torre."); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 1: switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#2: Dando caña: " + ChatColor.YELLOW + "Utiliza tu espada para alejar a los enemigos."); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack sword = new ItemStack(Material.WOOD_SWORD); //sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); g.giveToAllplayers(sword); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 2: switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#3: Más caña: " + ChatColor.YELLOW + "¡Empuje a tu espada, pega y trepa rápido!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 3); //sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 2); g.giveToAllplayers(sword); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 3: switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#4: Arco y espada: " + ChatColor.YELLOW + "¡Empújalos y llega a la cima!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(16); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 2); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 4: // 5 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#5: Arco y espada: " + ChatColor.YELLOW + "¡Empújalos y llega a la cima!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(31); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 3); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 5: //6ta switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#6: Salta y corre: " + ChatColor.YELLOW + "¡Aprovecha tu salto y llega a la cima!"); PotionEffect effect = new PotionEffect(PotionEffectType.JUMP, 20, 3); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(35); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 2); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 3); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 6:// 7ma switch (tickCounter) { case 0: break; case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#7: Dales caña: " + ChatColor.YELLOW + "¡Has todo lo posible por ganar, usa todo lo que tienes!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack witch = new ItemStack(Material.MONSTER_EGG, 1, (short) 66); ItemStack sword = new ItemStack(Material.WOOD_SWORD); ItemStack arrows = new ItemStack(Material.ARROW); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 3); arrows.setAmount(32); ItemStack bow = new ItemStack(Material.BOW); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 3); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); g.giveToAllplayers(witch); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 7: //8va switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#8: Arco y espada: " + ChatColor.YELLOW + "¡Empújalos y llega a la cima!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(32); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 4); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 5); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 8: //9na switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#9: Pega muuuy fuerte: " + ChatColor.YELLOW + "¡Empújalos y llega a la cima!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack witch = new ItemStack(Material.MONSTER_EGG, 1, (short) 66); ItemStack creeper = new ItemStack(Material.MONSTER_EGG, 1, (short) 50); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 8); g.giveToAllplayers(sword); g.giveToAllplayers(witch); g.giveToAllplayers(creeper); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 9: //10 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#10: Pega y corre: " + ChatColor.YELLOW + "¡Corre y pega!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(32); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 4); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 6); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 10: // 11 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#11: Cuida tus flechas: " + ChatColor.YELLOW + ""); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(6); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 4); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 7); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 11: // 12 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#12: Dales caña! " + ChatColor.YELLOW + ""); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: Potion potion = new Potion(PotionType.SPEED, 2, true, false); // 7 segundos Potion potion2 = new Potion(PotionType.SLOWNESS, 2, true, false); // 7 segundos ItemStack potionspeed = potion.toItemStack(8); ItemStack potionslownes = potion2.toItemStack(8); ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(6); ItemStack sword = new ItemStack(Material.WOOD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 5); g.giveToAllplayers(potionspeed); g.giveToAllplayers(potionslownes); g.giveToAllplayers(sword); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 12: // 13 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#13: Triunfo de hierro: " + ChatColor.YELLOW + "¡Escala a la cima para el triunfo!"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: PotionEffect effect = new PotionEffect(PotionEffectType.JUMP, 2, 3); g.giveEffectToAllPlayers(effect); ItemStack slowness = new ItemStack(373, 5, (short) 8234); ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(30); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.IRON_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 6); sword.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 1); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 7); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(slowness); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 13: // 14 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#14: Triunfo de oro: " + ChatColor.YELLOW + ""); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack poison = new ItemStack(373, 3, (short) 16388); ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(30); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.GOLD_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 6); sword.addUnsafeEnchantment(Enchantment.DURABILITY, 6); sword.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 6); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 7); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(poison); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; case 14: // 15 switch (tickCounter) { case 1: roundConditioner(); g.messageAll(ChatColor.GOLD + "#15: Triunfo de diamante: " + ChatColor.YELLOW + "Ultima ronda"); g.messageAll(ChatColor.GREEN + "Recompensa: " + reward.get(round) + " pts."); break; case 10: ItemStack creeper = new ItemStack(Material.MONSTER_EGG, 10, (short) 66); ItemStack arrows = new ItemStack(Material.ARROW); arrows.setAmount(30); ItemStack bow = new ItemStack(Material.BOW); ItemStack sword = new ItemStack(Material.DIAMOND_SWORD); sword.addUnsafeEnchantment(Enchantment.KNOCKBACK, 6); sword.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 3); bow.addUnsafeEnchantment(Enchantment.ARROW_KNOCKBACK, 10); g.giveToAllplayers(sword); g.giveToAllplayers(bow); g.giveToAllplayers(creeper); g.giveToAllplayers(arrows); break; case 20: g.openCages(); break; case 30: g.closeCages(); break; } break; default: if (round > 14) { g.announseWinner(); g.endGame(); } } tickCounter++; if (tickCounter > 90 && round >= 0) { g.messageAll(ChatColor.ITALIC + "Se agotó el tiempo de la ronda."); round++; tickCounter = 0; g.moveAllToSpawn(); } //g.getPlugin().getLogger().info("Round: " + round + " tick: " + tickCounter); } private void roundConditioner() { g.closeCages(); List<Entity> entList = g.getArena().capturePoint.getWorld().getEntities(); for (Entity current : entList) { if ((current instanceof Item) || current.getType() == EntityType.CREEPER || current.getType() == EntityType.WITCH) { current.remove(); System.out.println("Eliminada entidad: " + current.getType()); } } } private void damageControl(Player damager, Player player, boolean melee, boolean headshot, boolean dead, EntityDamageByEntityEvent e) { if (headshot) { dead = true; } if (dead) { List<Player> involved = new ArrayList<>(); involved.add(player); involved.add(damager); if (headshot) { g.messageAll(damager.getDisplayName() + ChatColor.GRAY + ChatColor.ITALIC + " >--O--> " + player.getDisplayName(), involved); } else { if (melee) { g.messageAll(damager.getDisplayName() + ChatColor.GRAY + ChatColor.ITALIC + " -I----- " + player.getDisplayName(), involved); } else { g.messageAll(damager.getDisplayName() + ChatColor.GRAY + ChatColor.ITALIC + " >----> " + player.getDisplayName(), involved); } } int score = g.getPlugin().teamMan.getScore(player).getScore(); g.getPlugin().teamMan.getScore(player).setScore(score - 1); score = g.getPlugin().teamMan.getScore(damager).getScore(); g.getPlugin().teamMan.getScore(damager).setScore(score + 1); g.moveToSpawn(player); for (int i = 0; i < 5; i++) { damager.playSound(player.getLocation(), Sound.ORB_PICKUP, 100, i); } } } }