Solved EntityDamageEntityEvent PvP

Discussion in 'Plugin Development' started by Triangle_Aiden, Jan 15, 2014.

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

    Triangle_Aiden

    Hello,

    I am writing a plugin that disables PvP for a person when the respawn for a set amount of time given in the config file. It needs to stop the protected player from being hit and hitting others.

    Anytime a player hits another player I am getting an error which I don't fully understand what it's telling me.

    My code stops a protected player from being hit even though it gives the error in console, but it is not stopping a protected player from hitting other. (it tells the player that they can't do it, but the event isn't canceled).

    Code:java
    1. public boolean isProtected(Player player) {
    2. if ((protections.get(player.getName()) < (System.currentTimeMillis() - (getConfig().getInt("protectionTime")) * 1000))) {
    3. return false;
    4. } else {
    5. return true;
    6. }
    7. }
    8.  
    9. public void activateProtection(Player player) {
    10. protections.put(player.getName(), System.currentTimeMillis());
    11. player.sendMessage("You are protected from pvp");
    12. }
    13.  
    14. @EventHandler
    15. public void onPvp(EntityDamageByEntityEvent event) {
    16. if (getConfig().getBoolean("protectionEnabled")) {
    17. if (event.getEntity() instanceof Player) {
    18. if (event.getDamager() instanceof Player) {
    19. Player damager = (Player) event.getDamager();
    20. Player damaged = (Player) event.getEntity();
    21.  
    22. if(isProtected(damaged)) {
    23. event.setCancelled(true);
    24. damager.sendMessage("He is protected");
    25. }
    26.  
    27. if(isProtected(damager)) {
    28. event.setCancelled(true);
    29. damager.sendMessage("You are protected!");
    30. }
    31.  
    32.  
    33. }
    34. }
    35. }
    36. }
    37.  
    38. @EventHandler
    39. public void onRespawn(PlayerRespawnEvent event) {
    40. activateProtection(event.getPlayer());
    41. }
    42.  
    43. ....


    Code:
    [00:00:11] [Server thread/ERROR]: Could not pass event EntityDamageByEntityEvent to PvPShield v1.0
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:481) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:466) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:94) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:382) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:410) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.EntityLiving.damageEntity(EntityLiving.java:656) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.EntityHuman.damageEntity(EntityHuman.java:746) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.EntityPlayer.damageEntity(EntityPlayer.java:446) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.EntityHuman.attack(EntityHuman.java:918) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:1092) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInUseEntity.a(SourceFile:55) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInUseEntity.handle(SourceFile:10) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.NetworkManager.a(NetworkManager.java:146) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.ServerConnection.c(SourceFile:134) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:655) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [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:617) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
    Caused by: java.lang.NullPointerException
        at com.daawsomest.shield.PvPShield.isProtected(PvPShield.java:43) ~[?:?]
        at com.daawsomest.shield.PvPShield.onPvp(PvPShield.java:63) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_45]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_45]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_45]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_45]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        ... 20 more
     
  2. Offline

    StealerSlain

    Show us more code..
     
  3. Offline

    DreadTank27

    And in the code you gave us I can't tell what line is 43
     
  4. Offline

    Triangle_Aiden

    Line 63 is: if ((protections.get(player.getName()) < (System.currentTimeMillis() - (getConfig().getInt("protectionTime")) * 1000))) {

    Code:java
    1. package com.daawsomest.shield;
    2.  
    3. import java.util.HashMap;
    4. import java.util.List;
    5.  
    6. import org.bukkit.Bukkit;
    7. import org.bukkit.ChatColor;
    8. import org.bukkit.command.Command;
    9. import org.bukkit.command.CommandSender;
    10. import org.bukkit.entity.Player;
    11. import org.bukkit.event.EventHandler;
    12. import org.bukkit.event.Listener;
    13. import org.bukkit.event.entity.EntityDamageByEntityEvent;
    14. import org.bukkit.event.player.PlayerCommandPreprocessEvent;
    15. import org.bukkit.event.player.PlayerRespawnEvent;
    16. import org.bukkit.plugin.PluginManager;
    17. import org.bukkit.plugin.java.JavaPlugin;
    18.  
    19. public class PvPShield extends JavaPlugin implements Listener {
    20.  
    21. HashMap<String, Long> protections = new HashMap<String, Long>();
    22. List<String> commandList;
    23.  
    24. public void onEnable() {
    25. getLogger().info("PvP Shield was enabled!");
    26.  
    27. PluginManager pm = getServer().getPluginManager();
    28. pm.registerEvents(this, this);
    29.  
    30. getConfig().options().copyDefaults(true);
    31. this.saveConfig();
    32.  
    33. commandList = getConfig().getStringList("blockedCommands");
    34.  
    35. }
    36.  
    37. public void onDisable() {
    38. //this.saveDefaultConfig();
    39. getLogger().info("PvP Shield was disabled!");
    40. }
    41.  
    42. public boolean isProtected(Player player) {
    43. if ((protections.get(player.getName()) < (System.currentTimeMillis() - (getConfig().getInt("protectionTime")) * 1000))) { //LINE43///////////////////////////////
    44. return false;
    45. } else {
    46. return true;
    47. }
    48. }
    49.  
    50. public void activateProtection(Player player) {
    51. protections.put(player.getName(), System.currentTimeMillis());
    52. player.sendMessage("You are protected from pvp");
    53. }
    54.  
    55. @EventHandler
    56. public void onPvp(EntityDamageByEntityEvent event) {
    57. if (getConfig().getBoolean("protectionEnabled")) {
    58. if (event.getEntity() instanceof Player) {
    59. if (event.getDamager() instanceof Player) {
    60. Player damager = (Player) event.getDamager();
    61. Player damaged = (Player) event.getEntity();
    62.  
    63. if(isProtected(damaged)) {//LINE 63
    64. event.setCancelled(true);
    65. damager.sendMessage("He is protected");
    66. }
    67.  
    68. if(isProtected(damager)) {
    69. event.setCancelled(true);
    70. damager.sendMessage("You are protected!");
    71. }
    72.  
    73.  
    74. }
    75. }
    76. }
    77. }
    78.  
    79. @EventHandler
    80. public void onRespawn(PlayerRespawnEvent event) {
    81. activateProtection(event.getPlayer());
    82. }
    83.  
    84. @EventHandler
    85. public void onPlayerCommandPreProcess(PlayerCommandPreprocessEvent event) {
    86. Player player = event.getPlayer();
    87. String cmd = event.getMessage();
    88. String[] cmdArgs = cmd.split(" ");
    89.  
    90. if (isProtected(player)) { //LINE
    91. if (commandList.contains(cmdArgs[0])) {
    92. event.setCancelled(true);
    93. player.sendMessage(ChatColor.RED + "You can not use this command while protected");
    94. }
    95. }
    96. }
    97.  
    98. @SuppressWarnings("unchecked")
    99. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    100. Player player = (Player) sender;
    101.  
    102. if (cmd.getName().equalsIgnoreCase("shield")) {
    103.  
    104. if (args.length == 1) {
    105. if (args[0].equalsIgnoreCase("on")) {
    106. if(player.hasPermission("shield.admin")) {
    107. activateProtection(player);
    108. } else {
    109. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    110. }
    111. }
    112.  
    113. else if (args[0].equalsIgnoreCase("time")) {
    114. if(player.hasPermission("shield.admin")) {
    115. player.sendMessage(ChatColor.YELLOW + "Protection time is set to " + Integer.toString(getConfig().getInt("protectionTime")) + " seconds");
    116. } else {
    117. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    118. }
    119. }
    120.  
    121. else if (args[0].equalsIgnoreCase("cancel")) {
    122. if (isProtected(player)) {
    123. protections.put(player.getName(), new Long(0));
    124. player.sendMessage(ChatColor.GREEN + "Protection was canceled");
    125. } else {
    126. player.sendMessage(ChatColor.RED + "You have no current protections!");
    127. }
    128. }
    129.  
    130. else if (args[0].equalsIgnoreCase("enable")) {
    131. if(player.hasPermission("shield.admin")) {
    132. getConfig().set("protectionEnabled", true);
    133. saveConfig();
    134. player.sendMessage(ChatColor.GREEN + "Shields enabled");
    135. } else {
    136. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    137. }
    138. }
    139.  
    140. else if (args[0].equalsIgnoreCase("disable")) {
    141. if(player.hasPermission("shield.admin")) {
    142. getConfig().set("protectionEnabled", false);
    143. saveConfig();
    144. player.sendMessage(ChatColor.GREEN + "Shields disabled");
    145. } else {
    146. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    147. }
    148. }
    149. }
    150.  
    151. else if (args.length == 2) {
    152. if (args[0].equalsIgnoreCase("on")) {
    153. if(player.hasPermission("shield.admin")) {
    154. Player whoToProtect = Bukkit.getServer().getPlayer(args[1]);
    155. activateProtection(whoToProtect);
    156. } else {
    157. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    158. }
    159. }
    160.  
    161. else if (args[0].equalsIgnoreCase("add")) {
    162. if(player.hasPermission("shield.admin")) {
    163. if (args[1].contains("/")) {
    164. ((List<String>) getConfig().getList("blockedCommands")).add(args[1]);
    165. this.saveConfig();
    166. player.sendMessage(ChatColor.YELLOW + args[1] + ChatColor.GREEN + " was add to command list");
    167. }
    168. else {
    169. player.sendMessage(ChatColor.RED + "Please use a valiad command");
    170. }
    171. }
    172.  
    173. else {
    174. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    175. }
    176. }
    177.  
    178. else if (args[0].equalsIgnoreCase("remove")) {
    179. if(player.hasPermission("shield.admin")) {
    180. if (args[1].contains("/")) {
    181. ((List<String>) getConfig().getList("blockedCommands")).remove(args[1]);
    182. this.saveConfig();
    183. player.sendMessage(ChatColor.YELLOW + args[1] + ChatColor.GREEN + " was removed from command list");
    184. }
    185. else {
    186. player.sendMessage(ChatColor.RED + "Please use a valiad command");
    187. }
    188. }
    189. }
    190. }
    191.  
    192. else if (args.length == 3) {
    193. if (args[0].equalsIgnoreCase("time") && args[1].equalsIgnoreCase("set")) {
    194. if(player.hasPermission("shield.admin"));
    195. int seconds;
    196.  
    197. try {
    198. seconds = Integer.parseInt(args[2]);
    199. getConfig().set("protectionTime", seconds);
    200. saveConfig();
    201. player.sendMessage(ChatColor.GREEN + "Protection time set to " + Integer.toString(seconds) + " seconds");
    202. } catch (NumberFormatException ex) {
    203. player.sendMessage(ChatColor.RED + "Invalid time");
    204. }
    205. } else {
    206. player.sendMessage(ChatColor.RED + "You do not have permission to do that");
    207. }
    208. }
    209. }
    210.  
    211. else {
    212. player.sendMessage("incorrect args");
    213. }
    214. return true;
    215. }
    216. }
    217.  
     
  5. Offline

    DreadTank27

    You're trying to use a Player in a HashMap of Strings and Longs :/
     
  6. Offline

    Tster

    From what I can see this is your problem:
    Code:java
    1. if((protections.get(player.getName())<(System.currentTimeMillis()-(getConfig().getInt("protectionTime"))*1000))){//LINE43///////////////////////////////


    Why? This if is being called regardless of whether the player has respawned or not.
    Before this, you need to check:
    if (protections.get(player.getName()).exists)) = true {
    }
    ^ please don't copy pasta the bit above, exists might need brackets... exists()
    if it doesn't exist, return false, otherwise continue with code
     
  7. Offline

    Triangle_Aiden

    DreadTank27 Tster Thanks for the replies. I'll try to fix it up tomorrow.

    I just had a look and i used player.getName() which returns the players name as a string.


    I tried protections.get(player.getName()).exist() and protections.get(player.getName()).exist but neither of them work.

    EDIT:
    Could I do it like this?
    Code:java
    1. public boolean isProtected(Player player) {
    2. if(protections.containsKey(player.getName())) {
    3. if ((protections.get(player.getName()) < (System.currentTimeMillis() - (getConfig().getInt("protectionTime")) * 1000))) {
    4. return false;
    5. } else {
    6. return true;
    7. }
    8. } else {
    9. return false;
    10. }
    11. }


    EDIT EDIT:
    Yes that worked and fixed everything

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 6, 2016
Thread Status:
Not open for further replies.

Share This Page