Disable PVP for players in an array list.

Discussion in 'Plugin Development' started by Zix, May 14, 2014.

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

    Zix

    I have 2 teams, red and blue. I want to disable PVP for players in the same array list. Evrything I have tried has failed. Could someone help me out?
     
  2. Offline

    TGRHavoc

  3. Offline

    Adriani6

    Zix DoctorDark
    Also check if player is hitting another player before cancelling the event, if you want to allow them to fight against mobs.
     
  4. Offline

    Zix

    This isn't working :/
    Code:java
    1. @EventHandler
    2. public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
    3. Player player = (Player) event.getEntity();
    4. Player damager = (Player) event.getDamager();
    5. if(player instanceof Player){
    6. if (red.contains(player.getName()) && red.contains(damager.getName())){
    7.  
    8. event.setCancelled(true);
    9.  
    10. }
    11. if (blue.contains(player.getName()) && blue.contains(damager.getName())){
    12.  
    13. event.setCancelled(true);
    14.  
    15. }
    16. }
    17. }
    18. }
     
  5. Offline

    Bartoke

    Don't forget to register the event too :)

    Code:java
    1. @EventHandler
    2. public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
    3. if(event.getEntity() instanceof Player && event.getDamager() instanceof Player){
    4. Player player = (Player) event.getEntity();
    5. Player damager = (Player) event.getDamager();
    6.  
    7. if (red.contains(player.getName()) && red.contains(damager.getName())){
    8. event.setCancelled(true);
    9. } else if (blue.contains(player.getName()) && blue.contains(damager.getName())){
    10. event.setCancelled(true);
    11. }
    12. }
    13. }
     
  6. Offline

    Zix

    Also how would I make this work with bows, as arrows are a separate entity
     
  7. Offline

    Garris0n

    The arrow has a getShooter method. Get the ProjectileSource, check if it's a player, cast to a player if it is, and check the list.

    Also, you do the instanceof check before casting, not after. If you do it after, it's redundant and you're going to get ClassCastExceptions all the time.
     
  8. Offline

    Zix

    This isnt working :/
    Code:java
    1. @EventHandler
    2. public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
    3. if(event.getEntity() instanceof Player && event.getDamager() instanceof Player){
    4. Player player = (Player) event.getEntity();
    5. Player damager = (Player) event.getDamager();
    6.  
    7. if (red.contains(player.getName()) && red.contains(damager.getName())){
    8. event.setCancelled(true);
    9. } else if (blue.contains(player.getName()) && blue.contains(damager.getName())){
    10. event.setCancelled(true);
    11. }
    12. } else if(event.getEntity() instanceof Arrow && event.getDamager() instanceof Player){
    13. Entity arrow = event.getEntity();
    14. if(((Projectile) arrow).getShooter() instanceof Player){
    15. Player player = (Player) arrow;
    16. Player damager = (Player) event.getDamager();
    17. if (red.contains(player.getName()) && red.contains(damager.getName())){
    18. event.setCancelled(true);
    19. } else if (blue.contains(player.
    20. getName()) && blue.contains(damager.getName())){
    21. event.setCancelled(true);
    22. }
    23. }
    24. }
    25. }
     
  9. Offline

    Zix

    Bomp.
     
  10. Offline

    Mathias Eklund

    Any errors?
     
  11. Offline

    Dubehh

    It is easier to use the Scoreboard teams.
    Since they disable arrow/projectiles automatically.
     
  12. Zix
    Code:
    else if(event.getEntity() instanceof Arrow && event.getDamager() instanceof Player)
    So... if an Arrow is being damaged by a Player?
     
    TGRHavoc and tommyhoogstra like this.
  13. Offline

    Zix

    AdamQpzm
    ._.
    Ill fix that, but i need to know why that code isnt working

    In fact yea, ill just do that

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

    TGRHavoc

    Zix
    The code probabally wasn't working because of the issue that AdamQpzm pointed out...
     
    AdamQpzm likes this.
  15. Offline

    Zix

    Alright I am really confused and loosing my patience as I have been working on this for ages, I switched to using scoreboard teams and it still doesn't work.

    Code:java
    1. package me.Zix.BorderClans;
    2.  
    3. import java.util.ArrayList;
    4.  
    5. import org.bukkit.Bukkit;
    6. import org.bukkit.ChatColor;
    7. import org.bukkit.Material;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.inventory.InventoryClickEvent;
    12. import org.bukkit.event.player.PlayerJoinEvent;
    13. import org.bukkit.inventory.ItemStack;
    14. import org.bukkit.plugin.java.JavaPlugin;
    15. import org.bukkit.scoreboard.DisplaySlot;
    16. import org.bukkit.scoreboard.Objective;
    17. import org.bukkit.scoreboard.Scoreboard;
    18. import org.bukkit.scoreboard.ScoreboardManager;
    19. import org.bukkit.scoreboard.Team;
    20.  
    21. public class BorderClans extends JavaPlugin implements Listener {
    22.  
    23. public void onEnable() {
    24.  
    25. getServer().getPluginManager().registerEvents(this, this);
    26. getConfig().options().copyDefaults(true);
    27.  
    28. }
    29.  
    30. ArrayList<Player> red = new ArrayList<Player>(0);
    31. ArrayList<Player> blue = new ArrayList<Player>(0);
    32.  
    33.  
    34.  
    35. @EventHandler
    36. public void onPlayerjoin(PlayerJoinEvent event){
    37.  
    38. Player player = event.getPlayer();
    39.  
    40. if(player.hasPlayedBefore() == true){
    41.  
    42. ScoreboardManager manager = Bukkit.getScoreboardManager();
    43. Scoreboard board = manager.getNewScoreboard();
    44. Team r = board.registerNewTeam("red");
    45. Team b = board.registerNewTeam("blue");
    46.  
    47. r.setAllowFriendlyFire(false);
    48. b.setAllowFriendlyFire(false);
    49.  
    50. String redteam = "red";
    51. String blueteam = "blue";
    52. String team = getConfig().getString(player.getName() + ".team");
    53.  
    54. if(team == null){
    55. if(red.size() == blue.size()){
    56.  
    57. String redconfig = "red";
    58. this.getConfig().set(player.getName() + ".team", redconfig);
    59. saveConfig();
    60.  
    61. r.addPlayer(player);
    62. red.add(player);
    63. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    64. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    65. player.setDisplayName(redprefix + player.getName() + "§f");
    66. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    67.  
    68. } else {
    69. if (red.size() < blue.size()){
    70. r.addPlayer(player);
    71. red.add(player);
    72. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    73. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    74. player.setDisplayName(redprefix + player.getName() + "§f");
    75. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    76.  
    77. String redconfig = "red";
    78. this.getConfig().set(player.getName() + ".team", redconfig);
    79. saveConfig();
    80.  
    81. } else if (blue.size() < red.size()){
    82. b.addPlayer(player);
    83. blue.add(player);
    84. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.BLUE + "Blue " + ChatColor.GRAY + "team!");
    85. String blueprefix = "§7[§9Blue§7][§a+§7]§9 ";
    86. player.setDisplayName(blueprefix + player.getName() + "§f");
    87. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 11));
    88.  
    89. String blueconfig = "blue";
    90. this.getConfig().set(player.getName() + ".team", blueconfig);
    91. saveConfig();
    92. }
    93. }
    94. } else if(team.equalsIgnoreCase(redteam)){
    95.  
    96. r.addPlayer(player);
    97. red.add(player);
    98. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    99. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    100. player.setDisplayName(redprefix + player.getName() + "§f");
    101. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    102.  
    103. } else if(team.equals(blueteam)){
    104.  
    105. b.addPlayer(player);
    106. blue.add(player);
    107. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.BLUE + "Blue " + ChatColor.GRAY + "team!");
    108. String blueprefix = "§7[§9Blue§7][§a+§7]§9 ";
    109. player.setDisplayName(blueprefix + player.getName() + "§f");
    110. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 11));
    111.  
    112. } else if(team.equals(null)){
    113. if(red.size() == blue.size()){
    114.  
    115. String redconfig = "red";
    116. this.getConfig().set(player.getName() + ".team", redconfig);
    117. saveConfig();
    118.  
    119. r.addPlayer(player);
    120. red.add(player);
    121. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    122. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    123. player.setDisplayName(redprefix + player.getName() + "§f");
    124. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    125.  
    126. } else {
    127. if (red.size() < blue.size()){
    128. r.addPlayer(player);
    129. red.add(player);
    130. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    131. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    132. player.setDisplayName(redprefix + player.getName() + "§f");
    133. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    134.  
    135. String redconfig = "red";
    136. this.getConfig().set(player.getName() + ".team", redconfig);
    137. saveConfig();
    138.  
    139. } else if (blue.size() < red.size()){
    140. b.addPlayer(player);
    141. blue.add(player);
    142. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.BLUE + "Blue " + ChatColor.GRAY + "team!");
    143. String blueprefix = "§7[§9Blue§7][§a+§7]§9 ";
    144. player.setDisplayName(blueprefix + player.getName() + "§f");
    145. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 11));
    146.  
    147. String blueconfig = "blue";
    148. this.getConfig().set(player.getName() + ".team", blueconfig);
    149. saveConfig();
    150. }
    151. }
    152. }
    153. } else if(player.hasPlayedBefore() == false){
    154.  
    155. ScoreboardManager manager = Bukkit.getScoreboardManager();
    156. Scoreboard board = manager.getNewScoreboard();
    157. Team r = board.registerNewTeam("red");
    158. Team b = board.registerNewTeam("blue");
    159.  
    160. r.setAllowFriendlyFire(false);
    161. b.setAllowFriendlyFire(false);
    162.  
    163. if(red.size() == blue.size()){
    164.  
    165. String redconfig = "red";
    166. this.getConfig().set(player.getName() + ".team", redconfig);
    167. saveConfig();
    168.  
    169. r.addPlayer(player);
    170. red.add(player);
    171. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    172. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    173. player.setDisplayName(redprefix + player.getName() + "§f");
    174. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    175.  
    176. } else if (red.size() < blue.size()){
    177. r.addPlayer(player);
    178. red.add(player);
    179. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.RED + "Red " + ChatColor.GRAY + "team!");
    180. String redprefix = "§7[§4Red§7][§c-§7]§4 ";
    181. player.setDisplayName(redprefix + player.getName() + "§f");
    182. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 14));
    183.  
    184. String redconfig = "red";
    185. this.getConfig().set(player.getName() + ".team", redconfig);
    186. saveConfig();
    187.  
    188. } else if (blue.size() < red.size()){
    189. b.addPlayer(player);
    190. blue.add(player);
    191. player.sendMessage(ChatColor.GRAY + "You have been put on " + ChatColor.BLUE + "Blue " + ChatColor.GRAY + "team!");
    192. String blueprefix = "§7[§9Blue§7][§a+§7]§9 ";
    193. player.setDisplayName(blueprefix + player.getName() + "§f");
    194. player.getInventory().setHelmet(new ItemStack(Material.WOOL, 1, (short) 11));
    195.  
    196. String blueconfig = "blue";
    197. this.getConfig().set(player.getName() + ".team", blueconfig);
    198. saveConfig();
    199. }
    200. }
    201. }
    202.  
    203.  
    204. @EventHandler
    205. public void onHelmetTouch(InventoryClickEvent event){
    206. if(event.getSlot() == 39){
    207. event.setCancelled(true);
    208. }
    209. }
    210. }
     
  16. Here body, i wrote this Listener for you ;) It will cancel the Event if both are in team blue or both are not. I didnt include a red Team, because if you only have 2 Teams it is logical that everybody who isnt in team blue is in team red. If not, you can add simply a isReg() method and add the few if cases.

    Much fun, Shmobi

    Code:java
    1. import java.util.ArrayList;
    2.  
    3. import org.bukkit.entity.Entity;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.event.EventHandler;
    6. import org.bukkit.event.Listener;
    7. import org.bukkit.event.entity.EntityDamageByEntityEvent;
    8.  
    9. public class TeamHandler implements Listener {
    10.  
    11. private ArrayList<Player> teamBlue;
    12.  
    13. public TeamHandler(ArrayList<Player> playerTeamBlue) {
    14. teamBlue = playerTeamBlue;
    15. }
    16.  
    17. @EventHandler
    18. public void onPlayerHitPlayer(EntityDamageByEntityEvent damageEvent) {
    19. Entity e1 = damageEvent.getEntity();
    20. Entity e2 = damageEvent.getDamager();
    21. if (e1 != null && e1 instanceof Player && e2 != null && e2 instanceof Player) {
    22. Player victom = (Player) e1;
    23. Player damager = (Player) e2;
    24. if (areInSameTeam(victom, damager)) {
    25. damageEvent.setCancelled(true);
    26. }
    27. }
    28. }
    29.  
    30. private boolean areInSameTeam(Player p1, Player p2) {
    31. if (isBlue(p1)) {
    32. if (isBlue(p2)) {
    33. return true;
    34. }
    35. return false;
    36. } else {
    37. if (isBlue(p2)) {
    38. return false;
    39. }
    40. return true;
    41. }
    42. }
    43.  
    44. private boolean isBlue(Player p) {
    45. for (Player player : teamBlue) {
    46. if (player.equals(p)) {
    47. return true;
    48. }
    49. }
    50. return false;
    51. }
    52.  
    53. }
    54.  
     
  17. Offline

    Zix

    Still not working :/
     
  18. Offline

    Zix

    Bamp.
     
  19. Offline

    macboinc

    Mabey EntityDamageEvent and check if the Player is on the same team.
     
  20. Offline

    Zix

    Urg.
    This is what I have got so far, still not working.
    Code:java
    1. @EventHandler
    2. public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
    3. if(event.getDamager() instanceof Player && event.getEntity() instanceof Player){
    4.  
    5. Player player = (Player) event.getEntity();
    6. Player damager = (Player) event.getDamager();
    7.  
    8. if (red.contains(player.getName()) && red.contains(damager.getName())){
    9.  
    10. event.setCancelled(true);
    11.  
    12. }
    13.  
    14. if (blue.contains(player.getName()) && blue.contains(damager.getName())){
    15.  
    16. event.setCancelled(true);
    17. }
    18. } else {
    19. if(event.getDamager() instanceof Arrow){
    20. Projectile arrow = (Projectile) event.getDamager();
    21. Entity shooter = (Entity) arrow.getShooter();
    22. if(shooter instanceof Player){
    23.  
    24. if(red.contains(((Player) shooter).getName()) && red.contains(event.getEntity())){
    25. event.setCancelled(true);
    26. }
    27.  
    28. if(blue.contains(((Player) shooter).getName()) && blue.contains(event.getEntity())){
    29. event.setCancelled(true);
    30. }
    31.  
    32. }
    33. }
    34. }
    35. }
     
  21. Offline

    Zix

    Bomp, this is kind of urgent :S
     
  22. Offline

    Azubuso

    Zix What isn't working exactly?
     
  23. Offline

    Zix

    Azubuso Players in the same array list can still hurt eachother
     
  24. Offline

    Zix

    Bampity bamp
     
  25. Offline

    Zix

    Bermp
     
  26. Offline

    PreFiXAUT

    Then do some debug -.-
    Add in every "if" a System.out.println and check your Console. Let it print your list and check if Players are in.
    When there isn't any logical fail in it, then it might be a bug, so you need to debug it. Everyone needs to do it.
     
Thread Status:
Not open for further replies.

Share This Page