Advertisement
Cool_boy21

Turrets

Apr 25th, 2017
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.60 KB | None | 0 0
  1. package coolboy.turret;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Collection;
  6. import java.util.List;
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.ChatColor;
  9. import org.bukkit.GameMode;
  10. import org.bukkit.Location;
  11. import org.bukkit.Material;
  12. import org.bukkit.Particle;
  13. import org.bukkit.Sound;
  14. import org.bukkit.block.Block;
  15. import org.bukkit.entity.ArmorStand;
  16. import org.bukkit.entity.Arrow;
  17. import org.bukkit.entity.Entity;
  18. import org.bukkit.entity.EntityType;
  19. import org.bukkit.entity.Player;
  20. import org.bukkit.entity.SpectralArrow;
  21. import org.bukkit.entity.TippedArrow;
  22. import org.bukkit.event.EventHandler;
  23. import org.bukkit.event.Listener;
  24. import org.bukkit.event.block.Action;
  25. import org.bukkit.event.inventory.InventoryClickEvent;
  26. import org.bukkit.event.player.PlayerArmorStandManipulateEvent;
  27. import org.bukkit.event.player.PlayerInteractEvent;
  28. import org.bukkit.inventory.Inventory;
  29. import org.bukkit.inventory.ItemFlag;
  30. import org.bukkit.inventory.ItemStack;
  31. import org.bukkit.inventory.meta.ItemMeta;
  32. import org.bukkit.inventory.meta.PotionMeta;
  33. import org.bukkit.metadata.FixedMetadataValue;
  34. import org.bukkit.plugin.Plugin;
  35. import org.bukkit.plugin.java.JavaPlugin;
  36. import org.bukkit.potion.PotionData;
  37. import org.bukkit.potion.PotionEffect;
  38. import org.bukkit.potion.PotionEffectType;
  39. import org.bukkit.potion.PotionType;
  40. import org.bukkit.scheduler.BukkitRunnable;
  41. import org.bukkit.util.EulerAngle;
  42. import org.bukkit.util.Vector;
  43.  
  44. public class Main extends JavaPlugin implements Listener {
  45.     String preffix = ChatColor.GRAY + "[" + ChatColor.GREEN + "Turret" + ChatColor.GRAY + "]" + ChatColor.DARK_GREEN + " ";
  46.     String team = "none";
  47.     boolean teams = false;
  48.     List<Entity> stands = new ArrayList<>();
  49.     Plugin plugin = this;
  50.     int liveTime = 20*60*5;
  51.    
  52.    
  53.     @Override
  54.     public void onEnable() {
  55.         Bukkit.getPluginManager().registerEvents(this, this);
  56.         Bukkit.getLogger().info(preffix + "Enabled.");
  57.     }
  58.  
  59.     @Override
  60.     public void onDisable() {
  61.         for (Entity standy : stands) {
  62.             standy.remove();
  63.         }
  64.         Bukkit.getLogger().info(preffix + "Disabled.");
  65.     }
  66.  
  67.     @EventHandler
  68.     public void interactEvent(PlayerInteractEvent event) {
  69.         Player player = event.getPlayer();
  70.         int nearEntity = 0;
  71.         if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
  72.                 && event.getClickedBlock().getType().equals(Material.STRUCTURE_BLOCK)
  73.                 && event.hasItem()
  74.                 && event.getItem().getType().equals(Material.IRON_BARDING)
  75.                 && event.getItem().getItemMeta().getLore().contains("Створює Турель")) {
  76.             Block block = event.getClickedBlock();
  77.             Location location = block.getLocation();
  78.             Collection<Entity> near = block.getLocation().add(0, 1, 0).getWorld().getNearbyEntities(block.getLocation(), 2, 2, 2);
  79.             for (Entity st : near) {
  80.                 if (st instanceof ArmorStand && st.getName().startsWith("Турель")) {
  81.                     nearEntity = 1;
  82.                 }
  83.             }
  84.             if (nearEntity == 0) {
  85.                 ArmorStand turret = (ArmorStand) location.getWorld().spawnEntity(location.add(0.5, 1, 0.5), EntityType.ARMOR_STAND);
  86.                 turret.getEquipment().setHelmet(new ItemStack(Material.DISPENSER, 1));
  87.                 turret.setSmall(true);
  88.                 turret.setInvulnerable(true);
  89.                 turret.setCustomName("Турель");
  90.                 turret.setGravity(false);
  91.                 turret.setCustomNameVisible(true);
  92.                 turret.setMetadata("turret", new FixedMetadataValue(this, true));
  93.                 turret.setMetadata("lived", new FixedMetadataValue(this, 0));
  94.                 turret.setMetadata("type", new FixedMetadataValue(this, "normal"));
  95.  
  96.                 if (player.getScoreboard().getTeam("white").hasEntry(player.getName())) {
  97.                     player.getScoreboard().getTeam("white").addEntry(turret.getUniqueId().toString());
  98.                     team = "white";
  99.                 }
  100.                 if (player.getScoreboard().getTeam("black").hasEntry(player.getName())) {
  101.                     player.getScoreboard().getTeam("black").addEntry(turret.getUniqueId().toString());
  102.                     team = "black";
  103.                 }
  104.                 if ("none".equals(team)) {
  105.                     teams = true;
  106.                 }
  107.                 runTurret(turret, team, player);
  108.                 stands.add(turret);
  109.             }
  110.         }
  111.     }
  112.  
  113.     public void runTurret(ArmorStand turret, String team, Player player) {
  114.         new BukkitRunnable() {
  115.             @Override
  116.             public void run() {
  117.  
  118.                 if (turret.isDead()) {
  119.                     stands.remove(turret);
  120.                     this.cancel();
  121.                 }
  122.                 Location rotate = turret.getLocation();
  123.                 rotate.setYaw(0);
  124.                 List<Entity> list = turret.getNearbyEntities(7, 5, 7);
  125.                 for (Entity mob : list) {
  126.  
  127.                     if (mob instanceof Player) {
  128.                         Player playery = (Player) mob;
  129.                         if (       !mob.getName().equals(player.getName())
  130.                                 && !playery.getGameMode().equals(GameMode.SPECTATOR)
  131.                                 && !playery.getGameMode().equals(GameMode.CREATIVE)
  132.                                 && !playery.getScoreboard().getTeam(team).hasEntry(playery.getName())
  133.                                 ) {
  134.                             Vector vector = mob.getLocation().toVector().subtract(turret.getLocation().toVector());
  135.  
  136.                             switch (turret.getMetadata("type").get(0).asString()) {
  137.                                 case "fire":
  138.                                     launchArrow(turret, vector).setFireTicks(5000);;
  139.                                     break;
  140.                                 case "slow":
  141.                                     launchTippedArrow(turret, vector, new PotionEffect(PotionEffectType.SLOW, 200, 0));
  142.                                     break;
  143.                                 case "poison":
  144.                                     launchTippedArrow(turret, vector, new PotionEffect(PotionEffectType.POISON, 20, 0));
  145.                                     break;
  146.                                 case "glow":
  147.                                     turret.launchProjectile(SpectralArrow.class).setVelocity(vector);
  148.                                     break;
  149.                                 default:
  150.                                     launchArrow(turret, vector);
  151.                                     break;
  152.                             }
  153.  
  154.                             double dX = turret.getLocation().getX() - mob.getLocation().getX();
  155.                             double dZ = turret.getLocation().getZ() - mob.getLocation().getZ();
  156.                             double yaw = Math.atan2(dZ, dX) + Math.PI / 2;
  157.                             turret.setHeadPose(new EulerAngle(0, yaw, 0));
  158.                             /*
  159.                     turret.teleport(new Location(turret.getLocation().getWorld(),
  160.                             turret.getLocation().getX(),
  161.                             turret.getLocation().getY(),
  162.                             turret.getLocation().getZ(),
  163.                             yaw, 0));*/
  164.                             break;
  165.                         }
  166.                     }
  167.                 }
  168.                 turret.setMetadata("lived", new FixedMetadataValue(plugin, turret.getMetadata("lived").get(0).asInt() + 40));
  169.                 turret.setCustomName("Турель "+Integer.toString((liveTime-turret.getMetadata("lived").get(0).asInt())/20)+"с");
  170.                 if (turret.getMetadata("lived").get(0).asInt() > liveTime) {
  171.                     turret.getLocation().getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, turret.getLocation(), 300);
  172.                     turret.getLocation().getWorld().playSound(turret.getLocation(), Sound.ENTITY_BLAZE_HURT, 50, 0);
  173.                     turret.remove();
  174.                     stands.remove(turret);
  175.                     this.cancel();
  176.                 }
  177.             }
  178.         }.runTaskTimer(this, 0, 40);
  179.     }
  180.  
  181.     @EventHandler
  182.     public void stand(PlayerArmorStandManipulateEvent event) {
  183.         Player player = event.getPlayer();
  184.         if (event.getRightClicked().getName().equals("Турель")
  185.                 && event.getPlayer().getScoreboard().getTeam(team).hasEntry(player.getName())
  186.                 && event.getRightClicked().getMetadata("type").get(0).asString().equals("normal")){
  187.            
  188.             Inventory inv = Bukkit.createInventory(player, 9, ChatColor.RED + "Турель");
  189.             event.getPlayer().setMetadata("turretEdit", new FixedMetadataValue(this, event.getRightClicked()));
  190.  
  191.             ItemStack fire = new ItemStack(Material.BLAZE_POWDER, 1);
  192.             ItemMeta firem = fire.getItemMeta();
  193.             firem.setDisplayName("Вогонь");
  194.             firem.setLore(Arrays.asList("Створює запалені стріли", "Вартість: 10 рівнів"));
  195.             fire.setItemMeta(firem);
  196.  
  197.             ItemStack slow = new ItemStack(Material.PACKED_ICE, 1);
  198.             ItemMeta slowm = slow.getItemMeta();
  199.             slowm.setDisplayName("Заповільнення");
  200.             slowm.setLore(Arrays.asList("Створює заповільнюючі стріли", "Вартість: 10 рівнів"));
  201.             slow.setItemMeta(slowm);
  202.  
  203.             ItemStack glow = new ItemStack(Material.SPECTRAL_ARROW, 1);
  204.             ItemMeta glowm = glow.getItemMeta();
  205.             glowm.setDisplayName("Підсвічування");
  206.             glowm.setLore(Arrays.asList("Створює спектральні стріли", "Вартість: 20 рівнів"));
  207.             glow.setItemMeta(glowm);
  208.  
  209.             ItemStack poison = new ItemStack(Material.POTION, 1);
  210.             PotionMeta meta = (PotionMeta) poison.getItemMeta();
  211.             meta.setBasePotionData(new PotionData(PotionType.POISON, false, false));
  212.             meta.setDisplayName("Отрута");
  213.             meta.setLore(Arrays.asList("Створює отруєні стріли", "Вартість: 15 рівнів"));
  214.             meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
  215.             poison.setItemMeta(meta);
  216.  
  217.             ItemStack exit = new ItemStack(Material.BARRIER, 1);
  218.             ItemMeta exitm = exit.getItemMeta();
  219.             exitm.setDisplayName("Вихід");
  220.             exit.setItemMeta(exitm);
  221.  
  222.             inv.setItem(0, fire);
  223.             inv.setItem(1, slow);
  224.             inv.setItem(2, poison);
  225.             inv.setItem(3, glow);
  226.             inv.setItem(8, exit);
  227.             player.openInventory(inv);
  228.         }
  229.         event.setCancelled(true);
  230.     }
  231.  
  232.     @EventHandler
  233.     public void upgrade(InventoryClickEvent event) {
  234.         String message = ChatColor.RED + "У вас недостатньо досвіду";
  235.         if (!event.getInventory().getName().equalsIgnoreCase(ChatColor.WHITE + "Турель")) return;
  236.        
  237.             event.setCancelled(true);
  238.             Player player = (Player) event.getWhoClicked();
  239.             if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.BARRIER || !event.getCurrentItem().hasItemMeta()) {
  240.                 player.closeInventory();
  241.             }
  242.             ArmorStand stand = (ArmorStand) event.getWhoClicked().getMetadata("turretEdit").get(0).value();
  243.             if (null != event.getCurrentItem()) {
  244.                 switch (event.getCurrentItem().getItemMeta().getDisplayName()) {
  245.                     case "Вогонь":
  246.                         if (player.getLevel() > 10) {
  247.                             player.setLevel(player.getLevel() - 10);
  248.                             stand.setMetadata("type", new FixedMetadataValue(this, "fire"));
  249.                             stand.setMetadata("lived", new FixedMetadataValue(this, 0));
  250.                             player.closeInventory();
  251.                         } else {
  252.                             player.sendMessage(message);
  253.                         }
  254.                         break;
  255.                     case "Отрута":
  256.                         if (player.getLevel() > 15) {
  257.                             player.setLevel(player.getLevel() - 15);
  258.                             stand.setMetadata("type", new FixedMetadataValue(this, "poison"));
  259.                             stand.setMetadata("lived", new FixedMetadataValue(this, 0));
  260.                             player.closeInventory();
  261.                         } else {
  262.                             player.sendMessage(message);
  263.                         }
  264.                         break;
  265.                     case "Заповільнення":
  266.                         if (player.getLevel() > 10) {
  267.                             player.setLevel(player.getLevel() - 15);
  268.                         stand.setMetadata("type", new FixedMetadataValue(this, "slow"));
  269.                         stand.setMetadata("lived", new FixedMetadataValue(this, 0));
  270.                         player.closeInventory();
  271.                         } else {
  272.                             player.sendMessage(message);
  273.                         }
  274.                         break;
  275.                     case "Підсвічування":
  276.                         if (player.getLevel() > 20) {
  277.                             player.setLevel(player.getLevel() - 15);
  278.                         stand.setMetadata("type", new FixedMetadataValue(this, "glow"));
  279.                         stand.setMetadata("lived", new FixedMetadataValue(this, 0));
  280.                         player.closeInventory();
  281.                         } else {
  282.                             player.sendMessage(message);
  283.                         }
  284.                         break;
  285.                     case "Вихід":
  286.                         player.closeInventory();
  287.                         break;
  288.                 }
  289.             }
  290.         }
  291.  
  292.     public Arrow launchArrow(ArmorStand stand, Vector vector) {
  293.         Arrow arrow = stand.launchProjectile(Arrow.class);
  294.         arrow.setVelocity(vector.multiply(0.4));
  295.         arrow.setCritical(false);
  296.         arrow.spigot().setDamage(2);
  297.         return arrow;
  298.     }
  299.  
  300.     public TippedArrow launchTippedArrow(ArmorStand stand, Vector vector, PotionEffect effect) {
  301.         TippedArrow arrow = stand.launchProjectile(TippedArrow.class);
  302.         arrow.setVelocity(vector.multiply(0.4));
  303.         arrow.setCritical(false);
  304.         arrow.spigot().setDamage(2);
  305.         arrow.addCustomEffect(effect, true);
  306.         return arrow;
  307.     }
  308. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement