Disable damage between Teammates

Discussion in 'Plugin Development' started by Serilum, Nov 18, 2012.

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

    Serilum

    Hello, I'm trying to disable damage between the players of 2 teams. If they are in the same team, it indeed disables damage. BUT if they are neutral/enemies (not in the same team) it shows an error message in the console for every damage taken.

    Would someone know what the problem here is, and possibly add a solution to that answer? :)

    My code:
    Code:java
    1. @EventHandler(priority = EventPriority.LOWEST)
    2. public void onEntityDamage(EntityDamageEvent event)
    3. {
    4. Player attacker;
    5. Player defender;
    6. Team attTeam;
    7. Team defTeam;
    8. if(event.isCancelled())
    9. return;
    10. if(!(event instanceof EntityDamageByEntityEvent));
    11. EntityDamageByEntityEvent entEvent = (EntityDamageByEntityEvent)event;
    12. if((entEvent.getDamager() instanceof Projectile) && (entEvent.getEntity() instanceof Player))
    13. {
    14. if(((Projectile)entEvent.getDamager()).getShooter() instanceof Player)
    15. {
    16. attacker = (Player)((Projectile)entEvent.getDamager()).getShooter();
    17. defender = (Player)entEvent.getEntity();
    18. } else
    19. {
    20. return;
    21. }
    22. } else
    23. if((entEvent.getDamager() instanceof Player) && (entEvent.getEntity() instanceof Player))
    24. {
    25. attacker = (Player)entEvent.getDamager();
    26. defender = (Player)entEvent.getEntity();
    27. } else
    28. {
    29. return;
    30. }
    31. attTeam = CommandInterpreter.getTeam(attacker);
    32. defTeam = CommandInterpreter.getTeam(defender);
    33. if(attTeam.getName().equalsIgnoreCase(defTeam.getName()))
    34. {
    35. event.setCancelled(true);
    36. return;
    37. }
    38. }


    Error Code:
    Code:
    17:07:03 [SEVERE] Could not pass event EntityDamageEvent to Teams v1.6.5
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:341)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at net.minecraft.server.Entity.y(Entity.java:314)
            at net.minecraft.server.EntityLiving.y(EntityLiving.java:307)
            at net.minecraft.server.Entity.j_(Entity.java:230)
            at net.minecraft.server.EntityLiving.j_(EntityLiving.java:482)
            at net.minecraft.server.EntityBat.j_(SourceFile:106)
            at net.minecraft.server.World.entityJoinedWorld(World.java:1333)
            at net.minecraft.server.WorldServer.entityJoinedWorld(WorldServer.java:5
    46)
            at net.minecraft.server.World.playerJoinedWorld(World.java:1315)
            at net.minecraft.server.World.tickEntities(World.java:1193)
            at net.minecraft.server.WorldServer.tickEntities(WorldServer.java:444)
            at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:577)
            at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
            at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
    Caused by: java.lang.ClassCastException: org.bukkit.event.entity.EntityDamageEve
    nt cannot be cast to org.bukkit.event.entity.EntityDamageByEntityEvent
            at me.Teams.TeamPvPEntityListener.onEntityDamage(TeamPvPEntityL
    istener.java:37)
            at sun.reflect.GeneratedMethodAccessor247.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:339)
            ... 18 more
     
  2. Offline

    fireblast709

    Code:java
    1. if(!(event instanceof EntityDamageByEntityEvent));

    Should be
    Code:java
    1. if(!(event instanceof EntityDamageByEntityEvent)) return;

    This would solve your error, but why not just use EntityDamageByEntityEvent instead of EntityDamageEvent?
     
  3. Offline

    Serilum

    I haven't really had experience with EntityDamageByEntityEvent, would that make a difference?
    Tried your fix, and that specific error is gone, but was replaced by a new one:
    - The problem seems to be on line 59 (33 in code at top of page)

    This piece:
    Code:java
    1. attTeam = CommandInterpreter.getTeam(attacker);
    2. defTeam = CommandInterpreter.getTeam(defender);
    3. if(attTeam.getName().equalsIgnoreCase(defTeam.getName()))
    4. {
    5. event.setCancelled(true);
    6. return;
    7. }


    Error Code:
    Code:
    17:19:34 [SEVERE] Could not pass event EntityDamageByEntityEvent to Teams v1.6
    .5
    org.bukkit.event.EventException
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:341)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62)
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:477)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:462)
            at org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(CraftEventFa
    ctory.java:80)
            at org.bukkit.craftbukkit.event.CraftEventFactory.callEntityDamageEvent(
    CraftEventFactory.java:364)
            at org.bukkit.craftbukkit.event.CraftEventFactory.handleEntityDamageEven
    t(CraftEventFactory.java:386)
            at net.minecraft.server.EntityLiving.damageEntity(EntityLiving.java:658)
     
            at net.minecraft.server.EntityHuman.damageEntity(EntityHuman.java:605)
            at net.minecraft.server.EntityPlayer.damageEntity(EntityPlayer.java:306)
     
            at net.minecraft.server.EntityHuman.attack(EntityHuman.java:794)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:1056)
            at net.minecraft.server.Packet7UseEntity.handle(SourceFile:36)
            at net.minecraft.server.NetworkManager.b(NetworkManager.java:290)
            at net.minecraft.server.NetServerHandler.d(NetServerHandler.java:112)
            at net.minecraft.server.ServerConnection.b(SourceFile:39)
            at net.minecraft.server.DedicatedServerConnection.b(SourceFile:30)
            at net.minecraft.server.MinecraftServer.r(MinecraftServer.java:595)
            at net.minecraft.server.DedicatedServer.r(DedicatedServer.java:222)
            at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:493)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:426)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:856)
    Caused by: java.lang.NullPointerException
            at me.Teams.TeamPvPEntityListener.onEntityDamage(TeamPvPEntityL
    istener.java:59)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:339)
            ... 21 more
     
  4. Offline

    fireblast709

    Code:java
    1. @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled=true)
    2. public void onEntityDamage(EntityDamageByEntityEvent event)
    3. {
    4. if(!(event.getEntity() instanceof Player) || !(event.getDamager() instanceof Projectile || event.getDamager() instanceof Player))
    5. {
    6. return;
    7. }
    8. Player attacker = null;
    9. Player defender = (Player)event.getEntity();
    10. Team attTeam;
    11. Team defTeam;
    12. if(entEvent.getDamager() instanceof Projectile)
    13. {
    14. if(((Projectile)entEvent.getDamager()).getShooter() instanceof Player)
    15. {
    16. attacker = (Player)((Projectile)entEvent.getDamager()).getShooter();
    17. }
    18. else
    19. {
    20. return;
    21. }
    22. }
    23. else(entEvent.getDamager() instanceof Player)
    24. {
    25. attacker = (Player)entEvent.getDamager();
    26. }
    27. attTeam = CommandInterpreter.getTeam(attacker);
    28. defTeam = CommandInterpreter.getTeam(defender);
    29. if(attTeam.getName().equalsIgnoreCase(defTeam.getName()))
    30. {
    31. event.setCancelled(true);
    32. return;
    33. }
    34. }

    I do not know about the NPE, cannot find the specific line. Though this code would possibly fix that
     
  5. Offline

    Serilum

    It seems to be giving an error at:
    Code:java
    1. else(event.getDamager() instanceof Player)
    2. {
    3. attacker = (Player)event.getDamager();
    4. }


    "else(event.getDamager() instanceof Player)"
    "The left-hand side of an assignment should be a variable"
     
  6. Offline

    fireblast709

    o my bad... remove the (event.getDamager() instanceof Player)
     
  7. Offline

    Serilum

    Still doesn't seem to work, the NPE is in this line:
    Code:java
    1. if(attTeam.getName().equalsIgnoreCase(defTeam.getName()))
     
  8. Offline

    fireblast709

    either attTeam or defTeam is null
     
  9. Offline

    Serilum

    I'm not sure, it gets the name from the Attacker/Defender. Since they are both there I can't really see how they can be null
     
Thread Status:
Not open for further replies.

Share This Page