Solved [Help] checking ItemStack in inventory

Discussion in 'Plugin Development' started by DeluXeNationMC, Jun 15, 2014.

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

    DeluXeNationMC

    Currently this is my code:
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. if(event.getDamager() instanceof Player){
    9. if(event.getEntity() instanceof Player){
    10.  
    11. Player attacker = (Player)event.getDamager();
    12. Player victim = (Player)event.getEntity();
    13.  
    14. if(attacker.getInventory().contains(itemFireArrow, 1)){
    15. victim.setFireTicks(80);
    16. }
    17. }
    18. }
    19. }
    20. }

    As i expected this unfortunately doesn't work, could you please show me the correct way of doing this? Or what i am doing wrong?
    I would really would like to know how since this would be very useful in the future.
    Thanks :)
     
  2. Are you trying to check whether the attacker has a fire arrow or if the attacker is a fire arrow?
     
  3. Offline

    DeluXeNationMC

    Extremelyd1 If the attacker has a fire arrow, I am sorry that I didn't say what I was trying to check.

    EDIT: Spelling mistake.

    *bump*

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  4. Are you sure the player you are checking, does have a arrow, with display name Fire Arrow in white??
     
    Ice3ider4 likes this.
  5. Offline

    Ice3ider4

    It works for me using this code:
    Code:java
    1. if(player.getInventory().contains(itemFireArrow)){
    2. //Do stuff
    3. }
     
  6. Offline

    DeluXeNationMC

    I will test the suggestions above when I get home. Thank you all for helping me. Extremelyd1 Ice3ider4
     
  7. DeluXeNationMC The problem probably was that the attacker didn't have a FireArrow that was renamed in his inventory.
     
  8. Offline

    DeluXeNationMC

    Extremelyd1 This is how i am getting the "Fire Arrow":
    Code:java
    1. //craftingFireArrow
    2. public void craftingFireArrow(){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. ShapedRecipe recipeFireArrow = new ShapedRecipe(itemFireArrow);
    9. recipeFireArrow.shape(
    10. "##I",
    11. "#$#",
    12. "@##");
    13. recipeFireArrow.setIngredient('$', Material.STICK);
    14. recipeFireArrow.setIngredient('@', Material.FEATHER);
    15. recipeFireArrow.setIngredient('I', Material.BLAZE_POWDER);
    16. Bukkit.getServer().addRecipe(recipeFireArrow);
    17. }

    (There is nothing wrong with the code above)
    My code currently:
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. if(event.getDamager() instanceof Player){
    9. if(event.getEntity() instanceof Player){
    10.  
    11. Player attacker = (Player)event.getDamager();
    12. Player victim = (Player)event.getEntity();
    13.  
    14. attacker.sendMessage(ChatColor.GOLD + "Debug Message 1");
    15. if(attacker.getInventory().contains(itemFireArrow)){
    16. attacker.sendMessage(ChatColor.GOLD + "Debug Message 2");
    17. victim.setFireTicks(80);
    18. }
    19. }
    20. }
    21. }
    22. }

    The debug messages don't even go off :(
    Any suggestions? Extremelyd1 Ice3ider4
     
  9. Offline

    Ice3ider4

    Hm... and the first debug messages goes off?
     
  10. Offline

    DeluXeNationMC

    Ice3ider4 Unfortunately they don't, does this code work for you?

    *bump*
    EDIT: Just realized my first two "bumps" ever!

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  11. DeluXeNationMC Then either the damager or entity isn't a player, or the event does not fire.
     
  12. Offline

    Ice3ider4

  13. Offline

    DeluXeNationMC

    Ice3ider4 I am shooting myself so... But I am not 100% sure if the event if firing.
    I did register the events: Bukkit.getServer().getPluginManager().registerEvents(this, this); I currently only have one class so no problem.
    I have an idea couldn't I loop through the attackers inventory and check if an item has a certain displayname/lore with for(int i){ what would be the best way to do this? I would just like to thank you guys for all your help :)
    EDIT: Wait if(event.getDamager() instanceof Player){ But isn't the damager the arrow?
     
  14. DeluXeNationMC If you're shooting yourself, the damager is an arrow, not a player. A simple debug statement would've told you this
     
    Garris0n likes this.
  15. Offline

    DeluXeNationMC

    AdamQpzm Lol just edited my post
    AdamQpzm How would i go about fixing this (Im not asking for code)
     
  16. Offline

    DeluXeNationMC

    AdamQpzm I don't see what i'm doing wrong:
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. Projectile proj = (Projectile)event.getDamager();
    9. Arrow arrow = (Arrow)proj;
    10. Player attacker = (Player)arrow.getShooter();
    11. Player victim = (Player)event.getEntity();
    12.  
    13. if(event.getDamager() instanceof Arrow){
    14. if(attacker instanceof Player){
    15.  
    16. if(attacker.getInventory().contains(itemFireArrow)){
    17.  
    18. victim.setFireTicks(80);
    19. }
    20. }
    21. }
    22. }
    23. }
     
  17. DeluXeNationMC
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. Projectile proj = (Projectile)event.getDamager(); // Hey Java! I know the damager is a projectile so give me it as a projectile please!
    9. Arrow arrow = (Arrow)proj; // Hey Java! I know that projectile is an arrow, so give me it as an arrow please!
    10. Player attacker = (Player)arrow.getShooter(); // Hey Java! I know that arrow was shot by a player, so give me it as a player please!
    11. Player victim = (Player)event.getEntity(); // Hey Java! I know the entity that got damaged was a player, so give me it as a player please!
    12.  
    13. if(event.getDamager() instanceof Arrow){ // Hey Java! Is the damager an arrow?
    14. if(attacker instanceof Player){ // Hey Java! You remember I told you about that player? Is that player a player?
    15.  
    16. if(attacker.getInventory().contains(itemFireArrow)){
    17.  
    18. victim.setFireTicks(80);
    19. }
    20. }
    21. }
    22. }
    23. }


    See my comments. Hopefully you'll notice that some things are illogical/in wrong order
     
  18. Offline

    Ice3ider4

    AdamQpzm
    Shouldn't you use this code after checking whether the damager is an arrow and the entity is a player?

    Code:java
    1. Projectile proj = (Projectile)event.getDamager(); // Hey Java! I know the damager is a projectile so give me it as a projectile please!
    2. Arrow arrow = (Arrow)proj; // Hey Java! I know that projectile is an arrow, so give me it as an arrow please!
    3. Player attacker = (Player)arrow.getShooter(); // Hey Java! I know that arrow was shot by a player, so give me it as a player please!
    4. Player victim = (Player)event.getEntity(); // Hey Java! I know the entity that got damaged was a player, so give me it as a player please!
     
  19. Ice3ider4 Wasn't my code and I think you missed the point of the comments :)
     
    Mattkx9 and Ice3ider4 like this.
  20. Offline

    DeluXeNationMC

    AdamQpzm I feel very stupid right now. Could you help me out? :(
     
  21. DeluXeNationMC Have you made the checks actually check before you do casting?
     
  22. Offline

    DeluXeNationMC

    I am very sorry I still don't understand..
     
  23. DeluXeNationMC You need to check if X is and instanceof Y before casting X to Y, not after
     
  24. Offline

    DeluXeNationMC

    AdamQpzm I'm getting frustrated. I am going to take a break, I am desperate to know what i am doing wrong. (Its probally something very stupid)
    EDIT: At least after this I will have learnt something
     
  25. Offline

    DeluXeNationMC

    Ice3ider4 AdamQpzm This still dosn't work..
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. if(event.getDamager() instanceof Arrow){
    9. Arrow arrow = (Arrow)event.getDamager();
    10. if(arrow.getShooter() instanceof Player){
    11. Player attacker = (Player)arrow.getShooter();
    12. if(attacker.getInventory().contains(itemFireArrow)){
    13. LivingEntity victim = (LivingEntity)event.getEntity();
    14.  
    15. victim.setFireTicks(80);
    16. }
    17. }
    18. }
    19. }
    20. }

    Can you guys see what i am doing wrong? :/
     
  26. Offline

    Ice3ider4

    DeluXeNationMC Dou you get an error in your console or is there just nothing happening? If so try to send some debug messages to check where the code stops :) But the code seems to be right. And you're sure that you registered the event? :)
     
  27. Offline

    DeluXeNationMC

    Ice3ider4 I am very sure i registered the events, I will try debug messages right now. (I really want this code to work)

    Ice3ider4 (Read the comments)
    Code:java
    1. @EventHandler
    2. public void onPlayerDamage10(EntityDamageByEntityEvent event){
    3. ItemStack itemFireArrow = new ItemStack(Material.ARROW, 1);
    4. ItemMeta metaFireArrow = itemFireArrow.getItemMeta();
    5. metaFireArrow.setDisplayName(ChatColor.WHITE + "Fire Arrow");
    6. itemFireArrow.setItemMeta(metaFireArrow);
    7.  
    8. Bukkit.broadcastMessage("Debug1");
    9. if(event.getDamager() instanceof Arrow){
    10. Arrow arrow = (Arrow)event.getDamager();
    11. if(arrow.getShooter() instanceof Player){
    12. Bukkit.broadcastMessage("Debug2"); //Reaches here if I shoot myself or another player
    13. Player attacker = (Player)arrow.getShooter();
    14. if(attacker.getInventory().contains(itemFireArrow)){
    15. Bukkit.broadcastMessage("Debug3");
    16. LivingEntity victim = (LivingEntity)event.getEntity();
    17.  
    18. victim.setFireTicks(80);
    19. Bukkit.broadcastMessage("Debug4"); //Reaches here if I shoot any mob
    20. }
    21. }
    22. }
    23. }
    24. }

    Right now i have no clue why.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 8, 2016
  28. Offline

    GeorgeeeHD

    DeluXeNationMC this is how i would do it. Inside a EntityShootBowEvent

    Code:java
    1. Check if entity is a player {
    2.  
    3. //Check for the itemstack in the players inventory {
    4. event.getProjectile().setFireTicks(20); //Would set the arrow on fire for 1 second after shooting it.
    5. //}
    6.  
    7. }
     
  29. Offline

    DeluXeNationMC

    GeorgeeeHD Thank you for the reply, I would like to do other things aswell like give them confusion with a confusion arrow. Thats why i'm using this methode
     
Thread Status:
Not open for further replies.

Share This Page