Set Health Error

Discussion in 'Plugin Development' started by JungleSociety, Apr 1, 2014.

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

    JungleSociety

    Hello, I have recently created a plugin in which it has to damage nearby entities by a certain amount defined in the config. All of the code works fine, and it seems to damage the entities fine, but I get an error in console.

    Here's some of my code:
    Code:java
    1. package me.junglesociety.suicidebomber;
    2.  
    3. import java.util.List;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.Material;
    7. import org.bukkit.entity.Damageable;
    8. import org.bukkit.entity.Entity;
    9. import org.bukkit.entity.EntityType;
    10. import org.bukkit.entity.LivingEntity;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.Listener;
    14. import org.bukkit.event.block.Action;
    15. import org.bukkit.event.player.PlayerInteractEvent;
    16. import org.bukkit.inventory.ItemStack;
    17. import org.bukkit.plugin.java.JavaPlugin;
    18. import org.bukkit.scheduler.BukkitScheduler;
    19.  
    20. public class suicidebomber extends JavaPlugin implements Listener{
    21. @Override
    22. public void onEnable(){
    23. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    24. getConfig().options().copyDefaults(true);
    25. saveConfig();
    26. }
    27. @Override
    28. public void onDisable(){
    29.  
    30. }
    31. @EventHandler
    32. public void onClick(PlayerInteractEvent e){
    33. final Player player = e.getPlayer();
    34. ItemStack egg = new ItemStack(Material.MONSTER_EGG, player.getItemInHand().getAmount(), (byte) 120);
    35. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)){
    36. if(player.getItemInHand().equals(egg)){
    37. final LivingEntity villager = (LivingEntity) player.getLocation().getWorld().spawnEntity(e.getClickedBlock().getLocation().add(0, 2, 0), EntityType.VILLAGER);
    38. villager.setCustomName("Suicide Bomber");
    39. villager.setCustomNameVisible(true);
    40. e.setCancelled(true);
    41. BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
    42. scheduler.scheduleSyncDelayedTask(this, new Runnable() {
    43. @SuppressWarnings("deprecation")
    44. @Override
    45. public void run() {
    46. int x = villager.getLocation().getBlockX();
    47. int y = villager.getLocation().getBlockY();
    48. int z = villager.getLocation().getBlockZ();
    49. villager.getWorld().createExplosion(x, y, z, 3.0F, false, false);
    50. double radius = getConfig().getDouble("explosionradius");
    51. List<Entity> near = villager.getWorld().getEntities();
    52. for(Entity e : near) {
    53. if(e.getLocation().distance(villager.getLocation()) <= radius){
    54. ((Damageable) e).setHealth(((Damageable) e).getHealth() - getConfig().getDouble("damage"));
    55. }
    56. }
    57. villager.setHealth(0);
    58. }
    59. }, getConfig().getInt("secbeforeexplosion")*20);
    60. }
    61. }
    62. }
    63. }


    This is the error I get in console:
    [16:05:13 WARN]: [SuicideBomber] Task #61 for SuicideBomber v1.1 generated an ex
    ception
    java.lang.IllegalArgumentException: Health must be between 0 and 20.0
    at org.bukkit.craftbukkit.v1_7_R1.entity.CraftLivingEntity.setHealth(Cra
    ftLivingEntity.java:75) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at me.junglesociety.suicidebomber.suicidebomber$1.run(suicidebomber.java
    :54) ~[?:?]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java
    :53) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHea
    rtbeat(CraftScheduler.java:345) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks
    ]
    at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:5
    87) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
    50) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
    45) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
    :457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
    17) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]\

    And my config:
    secbeforeexplosion: 3
    damage: 8.0
    explosionradius: 5
     
  2. Offline

    JBoss925

    Let us see all ur code and set the type to java so we can see the line numbers. The error is in line 54
     
  3. Offline

    JungleSociety

  4. Offline

    JBoss925

    Should be working? Can we see ur config? Perhaps that? And maybe get the double like
    Code:java
    1. Double damage = getConfig().getDouble("damage");

    Then do:
    Code:java
    1. Double currenthealth = (Damageable) e.getHealth();

    Then try:
    Code:java
    1. (Damageable) e.setHealth(currenthealth - damage);


    Idk if it'll make a difference, it's probably something in the config but I'd do it anyway. It's different from how you're casting the damageable.
     
  5. Offline

    Syd

    java.lang.IllegalArgumentException: Health must be between 0 and 20.0

    Should explain itself?
     
  6. Offline

    JungleSociety

    JBoss925
    It didn't work, so this is my new code.

    Code:java
    1. package me.junglesociety.suicidebomber;
    2.  
    3. import java.util.List;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.Material;
    7. import org.bukkit.entity.Damageable;
    8. import org.bukkit.entity.Entity;
    9. import org.bukkit.entity.EntityType;
    10. import org.bukkit.entity.LivingEntity;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.Listener;
    14. import org.bukkit.event.block.Action;
    15. import org.bukkit.event.player.PlayerInteractEvent;
    16. import org.bukkit.inventory.ItemStack;
    17. import org.bukkit.plugin.java.JavaPlugin;
    18. import org.bukkit.scheduler.BukkitScheduler;
    19.  
    20. public class suicidebomber extends JavaPlugin implements Listener{
    21. @Override
    22. public void onEnable(){
    23. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    24. getConfig().options().copyDefaults(true);
    25. saveConfig();
    26. }
    27. @Override
    28. public void onDisable(){
    29.  
    30. }
    31. @EventHandler
    32. public void onClick(PlayerInteractEvent e){
    33. final Player player = e.getPlayer();
    34. ItemStack egg = new ItemStack(Material.MONSTER_EGG, player.getItemInHand().getAmount(), (byte) 120);
    35. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)){
    36. if(player.getItemInHand().equals(egg)){
    37. final LivingEntity villager = (LivingEntity) player.getLocation().getWorld().spawnEntity(e.getClickedBlock().getLocation().add(0, 2, 0), EntityType.VILLAGER);
    38. villager.setCustomName("Suicide Bomber");
    39. villager.setCustomNameVisible(true);
    40. e.setCancelled(true);
    41. BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
    42. scheduler.scheduleSyncDelayedTask(this, new Runnable() {
    43. @SuppressWarnings("deprecation")
    44. @Override
    45. public void run() {
    46. int x = villager.getLocation().getBlockX();
    47. int y = villager.getLocation().getBlockY();
    48. int z = villager.getLocation().getBlockZ();
    49. villager.getWorld().createExplosion(x, y, z, 3.0F, false, false);
    50. double radius = getConfig().getDouble("explosionradius");
    51. List<Entity> near = villager.getWorld().getEntities();
    52. for(Entity e : near) {
    53. if(e.getLocation().distance(villager.getLocation()) <= radius){
    54. double damage = getConfig().getDouble("damage");
    55. double currenthealth = (double) ((Damageable) e).getHealth();
    56. ((Damageable) e).setHealth(currenthealth - damage);
    57. }
    58. }
    59. villager.setHealth(0);
    60. }
    61. }, getConfig().getInt("secbeforeexplosion")*20);
    62. }
    63. }
    64. }


    This is the error now:

    [18:35:31 WARN]: [SuicideBomber] Task #95 for SuicideBomber v1.1 generated an ex
    ception
    java.lang.ClassCastException: org.bukkit.craftbukkit.v1_7_R1.entity.CraftArrow c
    annot be cast to org.bukkit.entity.Damageable
    at me.junglesociety.suicidebomber.suicidebomber$1.run(suicidebomber.java
    :55) ~[?:?]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java
    :53) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHea
    rtbeat(CraftScheduler.java:345) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks
    ]
    at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:5
    87) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
    50) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
    45) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
    :457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
    17) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]

    And this is the config:

    secbeforeexplosion: 3 #how many seconds before explosion
    damage: 8
    explosionradius: 5 #Radius of explosion
     
  7. Offline

    xTigerRebornx

    JungleSociety Check if the Entity instanceof Damageable before casting?
     
  8. Offline

    JungleSociety

    xTigerRebornx
    That seemed like a good solution, but I still get an error.

    Code:java
    1. package me.junglesociety.suicidebomber;
    2.  
    3. import java.util.List;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.Material;
    7. import org.bukkit.entity.Damageable;
    8. import org.bukkit.entity.Entity;
    9. import org.bukkit.entity.EntityType;
    10. import org.bukkit.entity.LivingEntity;
    11. import org.bukkit.entity.Player;
    12. import org.bukkit.event.EventHandler;
    13. import org.bukkit.event.Listener;
    14. import org.bukkit.event.block.Action;
    15. import org.bukkit.event.player.PlayerInteractEvent;
    16. import org.bukkit.inventory.ItemStack;
    17. import org.bukkit.plugin.java.JavaPlugin;
    18. import org.bukkit.scheduler.BukkitScheduler;
    19.  
    20. public class suicidebomber extends JavaPlugin implements Listener{
    21. @Override
    22. public void onEnable(){
    23. Bukkit.getServer().getPluginManager().registerEvents(this, this);
    24. getConfig().options().copyDefaults(true);
    25. saveConfig();
    26. }
    27. @Override
    28. public void onDisable(){
    29.  
    30. }
    31. @EventHandler
    32. public void onClick(PlayerInteractEvent e){
    33. final Player player = e.getPlayer();
    34. ItemStack egg = new ItemStack(Material.MONSTER_EGG, player.getItemInHand().getAmount(), (byte) 120);
    35. if(e.getAction().equals(Action.RIGHT_CLICK_BLOCK)){
    36. if(player.getItemInHand().equals(egg)){
    37. final LivingEntity villager = (LivingEntity) player.getLocation().getWorld().spawnEntity(e.getClickedBlock().getLocation().add(0, 2, 0), EntityType.VILLAGER);
    38. villager.setCustomName("Suicide Bomber");
    39. villager.setCustomNameVisible(true);
    40. e.setCancelled(true);
    41. BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
    42. scheduler.scheduleSyncDelayedTask(this, new Runnable() {
    43. @SuppressWarnings("deprecation")
    44. @Override
    45. public void run() {
    46. int x = villager.getLocation().getBlockX();
    47. int y = villager.getLocation().getBlockY();
    48. int z = villager.getLocation().getBlockZ();
    49. villager.getWorld().createExplosion(x, y, z, 3.0F, false, false);
    50. double radius = getConfig().getDouble("explosionradius");
    51. List<Entity> near = villager.getWorld().getEntities();
    52. for(Entity e : near) {
    53. if(e.getLocation().distance(villager.getLocation()) <= radius){
    54. if(e instanceof Damageable){
    55. double damage = getConfig().getDouble("damage");
    56. double currenthealth = ((Damageable) e).getHealth();
    57. ((Damageable) e).setHealth(currenthealth - damage);
    58. }
    59. }
    60. }
    61. villager.setHealth(0);
    62. }
    63. }, getConfig().getInt("secbeforeexplosion")*20);
    64. }
    65. }
    66. }
    67. }
    68.  


    The new error:

    [19:07:22 WARN]: [SuicideBomber] Task #61 for SuicideBomber v1.1 generated an ex
    ception
    java.lang.IllegalArgumentException: Health must be between 0 and 20.0
    at org.bukkit.craftbukkit.v1_7_R1.entity.CraftLivingEntity.setHealth(Cra
    ftLivingEntity.java:75) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at me.junglesociety.suicidebomber.suicidebomber$1.run(suicidebomber.java
    :57) ~[?:?]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftTask.run(CraftTask.java
    :53) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at org.bukkit.craftbukkit.v1_7_R1.scheduler.CraftScheduler.mainThreadHea
    rtbeat(CraftScheduler.java:345) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks
    ]
    at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:5
    87) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:2
    50) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:5
    45) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java
    :457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:6
    17) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
     
  9. Offline

    The Fancy Whale

    When setting health adding or subtracting I think you have to be careful if the final value goes over 20.0 or under 0.0
     
    JungleSociety likes this.
  10. Offline

    xTigerRebornx

    JungleSociety You need to check if the new health of the entity will be between 0 and 20
     
    JungleSociety likes this.
  11. Offline

    JBoss925

    Your value "damage" in the config is not a double. Just add ".0" after it. Also, check to see if the 0 > health > 20 . That can clear up an error. And as for splitting up ur method we now know that the error is insetting the health with xTigerRebornx 's code and the stack trace.
     
    JungleSociety likes this.
  12. Offline

    JungleSociety

  13. Offline

    JBoss925

  14. Offline

    JungleSociety

    JBoss925
    Like you said, I had to check if the players health was greater than 0 and less than 20, and then set the players health to 0 if it went below 0.
     
  15. Offline

    JBoss925

    Alright man, cool. Have fun coding whatever you're coding!
     
Thread Status:
Not open for further replies.

Share This Page