Need help with shooting fire from sword

Discussion in 'Plugin Development' started by AeroMC, Aug 30, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    AeroMC

    So basically, I need help figuring out how I would be able to make a Stone Sword "shoot" Fire (The Item) and when it hits a player... The player would be set on fire

    I have a basic piece of code that lets the fire get shot out of the sword, but I don't know & need help on how I would be able to make it burn a player
     
  2. Offline

    JordyPwner

    AeroMC check if it hits a entity then if its true then set it on fire if not then cancel the event
     
  3. Offline

    AeroMC

    Sorry for sounding noobish, but could you give me an example?

    Code:java
    1. package me.troll.abilities;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.ChatColor;
    5. import org.bukkit.Location;
    6. import org.bukkit.Material;
    7. import org.bukkit.Sound;
    8. import org.bukkit.World;
    9. import org.bukkit.entity.Entity;
    10. import org.bukkit.entity.EntityType;
    11. import org.bukkit.entity.Item;
    12. import org.bukkit.entity.Player;
    13. import org.bukkit.event.EventHandler;
    14. import org.bukkit.event.Listener;
    15. import org.bukkit.event.block.Action;
    16. import org.bukkit.event.player.PlayerInteractEvent;
    17. import org.bukkit.event.player.PlayerPickupItemEvent;
    18. import org.bukkit.inventory.ItemStack;
    19. import org.bukkit.plugin.java.JavaPlugin;
    20. import org.bukkit.util.Vector;
    21.  
    22. public class MAIN extends JavaPlugin implements Listener {
    23.  
    24. public void onEnable() {
    25. Bukkit.getServer().getLogger().info("Plugin enabled!");
    26. Bukkit.getPluginManager().registerEvents(this, this);
    27. }
    28.  
    29. @EventHandler
    30. public void fireFromSword(PlayerInteractEvent event) {
    31. Player player = event.getPlayer();
    32. World world = player.getWorld();
    33. if (player.getItemInHand().getType() == Material.STONE_SWORD) {
    34. if (event.getAction() == Action.RIGHT_CLICK_AIR) {
    35. final Item grenade = world.dropItem(player.getEyeLocation(), new ItemStack(Material.FIRE));
    36. grenade.setVelocity(player.getEyeLocation().getDirection());
    37. for (Entity e : player.getNearbyEntities(5, 5, 5)) {
    38. if (e.getType() == EntityType.PLAYER) {
    39. player.setFireTicks(100);
    40. }
    41. }
    42. }
    43. }
    44. }
    45.  
    46. //Method for "hit"
    47. @EventHandler
    48. public void onFireHit(PlayerPickupItemEvent e) {
    49. Player p = e.getPlayer();
    50. ItemStack i = e.getItem().getItemStack();
    51. //Checks if the item was a ninja star
    52. if (i.getType().equals(Material.FIRE)) {
    53. Item item = e.getItem();
    54. //Checks if it is moving through the air
    55. if (item.getVelocity().length() < 1){
    56. //If item is still, does nothing
    57. e.setCancelled(false);
    58. }else if (item.getVelocity().length() > 1 ) {
    59. //If item is moving, kills the player and removes the item drop from the world
    60. //You can just hurt the player instead by doing the method below
    61. //p.setHealth(p.getMaxHealth() - [amount]);
    62. //Otherwise, this kills the player.
    63. e.setCancelled(true);
    64. p.setHealth(0.0);
    65. item.remove();}}}
    66.  
    67. //Method for throwing star
    68. @EventHandler
    69. public void onThrow(PlayerInteractEvent e) {
    70. Player p = e.getPlayer();
    71. //Checks if it is right clicked
    72. if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
    73. ItemStack hand = p.getItemInHand();
    74. //Checks if item is nether star
    75. if (hand.getType().equals(Material.NETHER_STAR)) {
    76. //Checks if item has name "Ninja Star"
    77. if (hand.getItemMeta().hasDisplayName()) {
    78. if (hand.getItemMeta().getDisplayName().equals("Ninja Star")) {
    79. //Throws the star
    80. Item item = p.getWorld().dropItem(p.getEyeLocation().add(new Vector(0, 1, 0)), hand);
    81. item.setVelocity(p.getEyeLocation().getDirection().multiply(3.0));
    82. p.getInventory().removeItem(new ItemStack(Material.NETHER_STAR, 1));
    83. item.setPickupDelay(2);
    84. //Tells the player that it was successful
    85. p.sendMessage("" + ChatColor.GRAY + ChatColor.ITALIC + "Works");
    86. }
    87. }
    88. }
    89. }
    90. }
    91.  
    92.  
    93. //Method for "hit"
    94. @EventHandler
    95. public void onHit(PlayerPickupItemEvent e) {
    96. Player p = e.getPlayer();
    97. ItemStack i = e.getItem().getItemStack();
    98. //Checks if the item was a ninja star
    99. if (i.getType().equals(Material.NETHER_STAR)) {
    100. if (i.getItemMeta().hasDisplayName()) {
    101. if (i.getItemMeta().getDisplayName().equals("Ninja Star")) {
    102. Item item = e.getItem();
    103. //Checks if it is moving through the air
    104. if (item.getVelocity().length() < 1){
    105. //If item is still, does nothing
    106. e.setCancelled(false);
    107. }else if (item.getVelocity().length() > 1 ) {
    108. //If item is moving, kills the player and removes the item drop from the world
    109. //You can just hurt the player instead by doing the method below
    110. //p.setHealth(p.getMaxHealth() - [amount]);
    111. //Otherwise, this kills the player.
    112. e.setCancelled(true);
    113. p.setHealth(0.0);
    114. item.remove();}}}
    115. }
    116. }
    117. }
     
  4. Offline

    JordyPwner

    AeroMC does ur code not work?
     
  5. Offline

    AeroMC

    JordyPwner The only thing it does is shoots the items, but it won't set the player on fire when they get hit

    EDIT: Also, how would I make it so the fire gets shot out repeatedly instead of one at a time?
     
  6. Offline

    TheMintyMate

    AeroMC
    My advise is that you do the following:
    When spawning fire items with velocity, apply a custom name which is that of the player who 'shot' the fire and "active_fire" :
    Code:
    item.getItemStack().getItemMeta().setDisplayName(player+"active_fire");
    
    Add this player to a list with "active_fire" :
    Code:
     exemptPlayer.add(player+"active_fire");
    
    Then detect when a player picks up an item with an event which contains if statements to determine correct conditions are met.

    Final Example:
    Code:
    ArrayList<String> exemptPlayer = new ArrayList<>();
    @EventHandler
    public void playerpickupitem(PlayerPickupItemEvent event){
    Player player = event.getPlayer();
    Item item = event.getItem();
    String itemName = item.getItemStack().getItemMeta().getDisplayName();
    if(!(exemptPlayer.contains(itemName))){
    /*if list doesnt contain item name, allow item to be picked up*/
    event.setCancelled(false);
    }
    if(exemptPlayer.contains(itemName) && player.getName().contains(itemName)){
    /*stop shooter from being on fire from own shot and item's name is listed*/
    event.setCancelled(true);
    }
    if(exemptPlayer.contains(itemName) && !(player.getName().contains(itemName))){
    /*if player is not shooter and item's name is listed*/
    /*remove item (despawn it)*/
    item.remove();
    int timeonfire = 80;
    /*20 ticks is aprox 1 second - when a server is running perfectly*/
    player.setFireTicks(timeonfire);
    /*got this to set player on fire for 4 seconds aprox, or 80 ticks*/
    }
    }
    
    Note: This code is untested, and more than likely contains loop-holes and bugs.

    Hope this helped,
    - Minty
     
  7. Offline

    AeroMC

    Thanks for the reply! :)
    1 Question (Again, sorry for sounding like a noob, I've only recently got back into Bukkit from leaving it a long time): Where would I put
    Code:java
    1. item.getItemStack().getItemMeta().setDisplayName(player+"active_fire");
    and
    Code:Java
    1.  
    2. exemptPlayer.add(player+"active_fire");
    3.  
     
    TheMintyMate likes this.
  8. Offline

    TheMintyMate

    Something like this:
    Code:
    ArrayList<String> exemptPlayer = new ArrayList<>();
    @EventHandler
    public void fireFromSword(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    World world = player.getWorld();
    if (player.getItemInHand().getType() == Material.STONE_SWORD) {
    if (event.getAction() == Action.RIGHT_CLICK_AIR) {
    Item grenade = world.dropItem(player.getEyeLocation(), new ItemStack(Material.FIRE));
    /*apply displayname*/           
    grenade.getItemStack().getItemMeta().setDisplayName(player.getName()+"active_fire");
    grenade.setVelocity(player.getEyeLocation().getDirection());
    /*add to exemptPlayer ArrayList*/
    exemptPlayer.add(player.getName()+"active_fire");
    }
    }
    }
    
    Please notify me of any errors that may occur in the testing procedure of the plugin so I can be a good inspector.

    Hope this also helped,
    - Minty

    Edit: If you like you could post your current code (with the above appended) and I'l tweak it for you - if your having further issues with it :)
     
  9. Offline

    AeroMC

    When I copy 'n' paste the code you gave me, I get an error "item.getItemStack().getItemMeta().setDisplayName(player+"active_fire");"
    "The method getItemStack() is undefined for the type ItemStack"

    EDIT: Nevermind :) I fixed the error... But one question! ;)
    How would I be able to keep it coming without having to keep clicking, just by holding it in?

    EDIT 2: It won't set the player on fire still :p

    Code:java
    1. package me.trollzor.kits;
    2.  
    3. import java.util.ArrayList;
    4.  
    5. import org.bukkit.Material;
    6. import org.bukkit.World;
    7. import org.bukkit.command.Command;
    8. import org.bukkit.command.CommandSender;
    9. import org.bukkit.enchantments.Enchantment;
    10. import org.bukkit.entity.Item;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.block.Action;
    14. import org.bukkit.event.entity.EntityDamageByEntityEvent;
    15. import org.bukkit.event.player.PlayerInteractEvent;
    16. import org.bukkit.inventory.ItemStack;
    17. import org.bukkit.inventory.meta.ItemMeta;
    18. import org.bukkit.plugin.java.JavaPlugin;
    19. import org.bukkit.potion.PotionEffect;
    20. import org.bukkit.potion.PotionEffectType;
    21.  
    22.  
    23. public class Main extends JavaPlugin {
    24.  
    25. public void onEnable(){
    26. getLogger().info("Enabled");
    27. }
    28.  
    29. public void onDisable(){
    30. getLogger().info("Disabled");
    31. }
    32. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
    33.  
    34. // Scout Sword
    35. ItemStack scoutSword = new ItemStack(Material.DIAMOND_SWORD, 1);
    36. scoutSword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 1);
    37. ItemMeta im = scoutSword.getItemMeta();
    38. im.setDisplayName("§b§oKnife");
    39. scoutSword.setItemMeta(im);
    40.  
    41. // Ninja Stars
    42. ItemStack ninjaStar = new ItemStack(Material.NETHER_STAR, 1);
    43. ItemMeta im1 = ninjaStar.getItemMeta();
    44. im1.setDisplayName("Ninja Star");
    45. ninjaStar.setItemMeta(im1);
    46.  
    47. Player player = (Player) sender;
    48. if(label.equalsIgnoreCase("knight")) {
    49. player.getInventory().clear();
    50. player.setHealth(15.0);
    51. player.setMaxHealth(15.0);
    52. ItemStack scoutHelmet = new ItemStack(Material.IRON_HELMET, 1);
    53. ItemStack scoutChestplate = new ItemStack(Material.IRON_CHESTPLATE, 1);
    54. ItemStack scoutLeggings = new ItemStack(Material.IRON_LEGGINGS, 1);
    55. ItemStack scoutBoots = new ItemStack(Material.IRON_BOOTS, 1);
    56. player.sendMessage("§9Class > §7You are now §aScout");
    57. player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 10000, 1));
    58. player.getInventory().addItem(scoutSword);
    59. player.getInventory().setHelmet(scoutHelmet);
    60. player.getInventory().setChestplate(scoutChestplate);
    61. player.getInventory().setLeggings(scoutLeggings);
    62. player.getInventory().setBoots(scoutBoots);
    63. player.getInventory().addItem(new ItemStack(Material.GOLDEN_APPLE, 10));
    64.  
    65. }else{ if(label.equalsIgnoreCase("ninja")) {
    66. player.getInventory().clear();
    67. player.setHealth(15.0);
    68. player.setMaxHealth(15.0);
    69. player.removePotionEffect(PotionEffectType.SPEED);
    70. ItemStack heavyHelmet = new ItemStack(Material.LEATHER_HELMET, 1);
    71. ItemStack heavyChestplate = new ItemStack(Material.LEATHER_CHESTPLATE, 1);
    72. ItemStack heavyLeggings = new ItemStack(Material.LEATHER_LEGGINGS, 1);
    73. ItemStack heavyBoots = new ItemStack(Material.LEATHER_BOOTS, 1);
    74. player.sendMessage("§9Class > §7You are now §aNinja");
    75. player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 1000000, 1));
    76. player.getInventory().addItem(new ItemStack(ninjaStar));
    77. player.getInventory().addItem(new ItemStack(ninjaStar));
    78. player.getInventory().addItem(new ItemStack(ninjaStar));
    79. player.getInventory().addItem(new ItemStack(ninjaStar));
    80. player.getInventory().addItem(new ItemStack(ninjaStar));
    81. player.getInventory().setHelmet(heavyHelmet);
    82. player.getInventory().setChestplate(heavyChestplate);
    83. player.getInventory().setLeggings(heavyLeggings);
    84. player.getInventory().setBoots(heavyBoots);
    85.  
    86. }else{ if(label.equalsIgnoreCase("kits")) {
    87. player.sendMessage("§7§m--------------------------------------------------");
    88. player.sendMessage("");
    89. player.sendMessage("§bKits:");
    90. player.sendMessage("");
    91. player.sendMessage("Scout");
    92. player.sendMessage("§7§o");
    93. }
    94.  
    95. return false;
    96. }
    97. return false;
    98. }
    99. return false;
    100. }
    101.  
    102. @EventHandler
    103. public void onDamage(EntityDamageByEntityEvent event) {
    104. if (event.getDamager() instanceof Player
    105. && ((Player)event.getDamager()).getItemInHand().getType() == Material.STONE_SWORD) {
    106. ItemStack sword = ((Player)event.getDamager()).getItemInHand();
    107. if (sword.hasItemMeta()
    108. && sword.getItemMeta().hasDisplayName()
    109. && sword.getItemMeta().getDisplayName().equalsIgnoreCase("Knife")) {
    110. event.setDamage(7.5);
    111. }
    112. }
    113. }
    114.  
    115. ArrayList<String> exemptPlayer = new ArrayList<>();
    116. @EventHandler
    117. public void fireFromSword(PlayerInteractEvent event) {
    118. Player player = event.getPlayer();
    119. World world = player.getWorld();
    120. ItemStack item = event.getItem();
    121. if (player.getItemInHand().getType() == Material.STONE_SWORD) {
    122. if (event.getAction() == Action.RIGHT_CLICK_AIR) {
    123. Item grenade = world.dropItem(player.getEyeLocation(), new ItemStack(Material.FIRE));
    124. item.getItemMeta().setDisplayName(player+"active_fire");
    125. grenade.getItemStack().getItemMeta().setDisplayName(player.getName()+"active_fire");
    126. grenade.setVelocity(player.getEyeLocation().getDirection());
    127. exemptPlayer.add(player+"active_fire");
    128. exemptPlayer.add(player.getName()+"active_fire");
    129. }
    130. }
    131. }
    132. }
     
  10. Offline

    GeorgeeeHD

    AeroMC You need to use a runnable to keep it going after being clicked once.

    Code:
    new BukkitRunnable() {
     
      @override
      public void run() {
     
          //Code to make fire shoot
     
      }
     
    }.runTaskTimer(timeBeforeRunnableStarts, intevalToRunAt);
     
  11. Offline

    AeroMC

    GeorgeeeHD

    I am soo(ooooo...) sorry about this, but could you show me an "example" I can't seem to get mine working :/ >.<
     
  12. Offline

    GeorgeeeHD

    AeroMC i did give an example...
     
  13. Offline

    AeroMC

    GeorgeeeHD I mean like could you show me what I have to put inside the runnable and how to set the timer thing, it won't work for me... I haven't used runnables before :p
     
Thread Status:
Not open for further replies.

Share This Page