Help With Battle Plugin

Discussion in 'Plugin Development' started by eleectricman226, Apr 12, 2014.

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

    eleectricman226

    So, I wanted to make a Battle plugin, and currently adding the Custom things about it, which i was doing the medic. (Medic Desc: 'Everyone within a 6 block range will heal half-heart/0.5s.')
    So, I am using this code, please tell me what i am doing wrong, Thanks.
    Code:
    Code:java
    1. @SuppressWarnings("deprecation")
    2. @EventHandler
    3. public void playerMoveEvent(PlayerMoveEvent e){
    4. Player player = e.getPlayer();
    5. for(Entity ent : player.getNearbyEntities(6, 6, 6)){
    6. if(ent instanceof Player){
    7. final Player entP = (Player) ent;
    8. if(Class.getChosenClass(entP).equalsIgnoreCase("MEDIC")){
    9. getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
    10.  
    11. public void run() {
    12. if(entP.getHealth() == 20) return;
    13. else{
    14. entP.setHealth(entP.getHealth() + 1);
    15. entP.sendMessage("Yes You Have Been Healed");
    16. }
    17. }
    18. }, 0L, 10L);
    19. }
    20. }
    21. }
    22. }

    (Just FYI, notice the 'Class.getChoosenClass', I used a capital C, so it didn't get confused with class)
     
  2. Offline

    zDylann

    Why are you initiating a repeating task every time a player moves?! Why not just run it onEnable, PlayerMoveEvent is called every time someone moves there camera or just moves in general. Are you getting any errors?
     
  3. Offline

    eleectricman226

    good point, just didn't know where to put the start of it, and yes i am getting errors:
    Code:
    [18:31:38] [Server thread/ERROR]: Could not pass event PlayerMoveEvent to Battle v0.1
    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 net.minecraft.server.v1_7_R1.PlayerConnection.a(PlayerConnection.java:227) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInFlying.a(SourceFile:137) [craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        at net.minecraft.server.v1_7_R1.PacketPlayInPositionLook.handle(SourceFile:20) [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 me.James.Battle.Main.ListenerClass.playerMoveEvent(ListenerClass.java:135) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.2-b2974jnks]
        ... 13 more
    i'm not sure if putting it in the onEnable will fix the errors, but i'll see, if you see anything else that isn't correct, just reply back, Thanks
     
  4. Offline

    zDylann



    Can you show me line 135 of ListenerClass.java or actually the whole class with a comment next to 135.
     
  5. Offline

    eleectricman226

    Well, i think a onPlayerJoin would be better cause i can get the player when they join, and it runs as soon as they join.

    Sure,
    Code:java
    1. package me.James.Battle.Main;
    2.  
    3.  
    4. import java.util.ArrayList;
    5. import java.util.List;
    6.  
    7.  
    8.  
    9.  
    10.  
    11.  
    12.  
    13. import org.bukkit.Bukkit;
    14. import org.bukkit.ChatColor;
    15. import org.bukkit.Material;
    16. import org.bukkit.entity.Entity;
    17. import org.bukkit.entity.Player;
    18. import org.bukkit.event.EventHandler;
    19. import org.bukkit.event.Listener;
    20. import org.bukkit.event.entity.PlayerDeathEvent;
    21. import org.bukkit.event.inventory.InventoryClickEvent;
    22. import org.bukkit.event.player.PlayerInteractEvent;
    23. import org.bukkit.event.player.PlayerJoinEvent;
    24. import org.bukkit.event.player.PlayerMoveEvent;
    25. import org.bukkit.inventory.Inventory;
    26. import org.bukkit.inventory.ItemStack;
    27. import org.bukkit.inventory.meta.ItemMeta;
    28. import org.bukkit.plugin.java.JavaPlugin;
    29.  
    30. public class ListenerClass extends JavaPlugin implements Listener {
    31.  
    32. @EventHandler
    33. public void Death(PlayerDeathEvent e){
    34. Player player = e.getEntity();
    35. if(!(player.getKiller() instanceof Player)) return;
    36. else{
    37. Player killer = player.getKiller();
    38. if(killer.getItemInHand().getType().equals(Material.WOOD_SWORD) || killer.getItemInHand().getType().equals(Material.STONE_SWORD) || killer.getItemInHand().getType().equals(Material.IRON_SWORD) || killer.getItemInHand().getType().equals(Material.GOLD_SWORD) || killer.getItemInHand().getType().equals(Material.DIAMOND_SWORD)){
    39. e.setDeathMessage(ChatColor.RED + killer.getName() + ChatColor.YELLOW + " Had No Troble Murderering" + ChatColor.RED + player.getName() + ChatColor.YELLOW + " Using A " + ChatColor.AQUA + killer.getItemInHand().getItemMeta().getDisplayName());
    40. }else if(killer.getItemInHand().getType().equals(Material.BOW)){
    41. e.setDeathMessage(ChatColor.RED + killer.getName() + ChatColor.YELLOW + " Sniped " + ChatColor.RED + player.getName());
    42. }
    43. }
    44. }
    45. @EventHandler
    46. public void playerChangeClass(PlayerInteractEvent e){
    47. Player player = e.getPlayer();
    48. if(e.getItem().getType() != null){
    49. if(e.getItem().getType().equals(Material.NETHER_STAR)){
    50. Inventory invin = Bukkit.createInventory(player, 9, ChatColor.BLUE + "Choose Your Class!");
    51. ItemStack item1 = new ItemStack(Material.IRON_SWORD);
    52. ItemMeta item1M = item1.getItemMeta();
    53. item1M.setDisplayName(ChatColor.DARK_RED + "Barbarian");
    54. List<String> alist1 = new ArrayList<String>();
    55. alist1.add(ChatColor.RED + "This class is the tank of the game, with good armor");
    56. alist1.add(ChatColor.RED + "and OK wepons to scare away enimies from team spawn.");
    57. item1M.setLore(alist1);
    58. item1.setItemMeta(item1M);
    59. invin.addItem(item1);
    60. //
    61. ItemStack item2 = new ItemStack(Material.POTION, 1, (short) 16421);
    62. ItemMeta item2M = item2.getItemMeta();
    63. item2M.setDisplayName(ChatColor.GREEN + "Medic");
    64. List<String> alist2 = new ArrayList<String>();
    65. alist2.add(ChatColor.DARK_GREEN + "Everyone within a 6 block range will heal half-heart/0.5s.");
    66. item2M.setLore(alist2);
    67. item2.setItemMeta(item2M);
    68. invin.addItem(item2);
    69. player.openInventory(invin);
    70. }else if(e.getItem().getType().equals(Material.EMERALD)){
    71. Inventory invin2 = Bukkit.createInventory(player, 9, ChatColor.GOLD + "Choose Your Team!");
    72. ItemStack item1 = new ItemStack(Material.WOOL, 1, (short) 14);
    73. ItemMeta item1M = item1.getItemMeta();
    74. item1M.setDisplayName(ChatColor.RED + "Red Team");
    75. List<String> alist1 = new ArrayList<String>();
    76. alist1.add(ChatColor.GOLD + "Join The " + ChatColor.RED + "Red " + ChatColor.GOLD + "Team!");
    77. item1M.setLore(alist1);
    78. item1.setItemMeta(item1M);
    79. invin2.addItem(item1);
    80. //
    81. ItemStack item2 = new ItemStack(Material.WOOL, 1, (short) 11);
    82. ItemMeta item2M = item2.getItemMeta();
    83. item2M.setDisplayName(ChatColor.BLUE + "Team Blue");
    84. List<String> alist2 = new ArrayList<String>();
    85. alist2.add(ChatColor.GOLD + "Join The " + ChatColor.BLUE + "Blue " + ChatColor.GOLD + "Team!");
    86. item2M.setLore(alist2);
    87. item2.setItemMeta(item2M);
    88. invin2.addItem(item2);
    89. player.openInventory(invin2);
    90. }else return;
    91. }
    92. }
    93. @EventHandler
    94. public void onPlayerEditInventory(InventoryClickEvent e){
    95. Player player = (Player) e.getWhoClicked();
    96. if(e.getInventory().getName().equals(ChatColor.BLUE + "Choose Your Class!") || e.getInventory().getName().equals(ChatColor.GOLD + "Choose Your Team!")){
    97. player.closeInventory();
    98. }
    99. if(e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Choose Your Class!") && e.getCurrentItem().getType().equals(Material.IRON_SWORD)){
    100. player.sendMessage(ChatColor.GOLD + "You Have Chosen The " + ChatColor.DARK_RED + "Barbarian" + ChatColor.GOLD + " Class!");
    101. Class.setClass("BARBARIAN", player);
    102. }else if(e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Choose Your Class!") && e.getCurrentItem().getType().equals(Material.POTION) && e.getCurrentItem().getDurability() == 16421){
    103. player.sendMessage(ChatColor.GOLD + "You Have Chosen The " + ChatColor.DARK_GREEN + "Medic" + ChatColor.GOLD + " Class!");
    104. Class.setClass("MEDIC", player);
    105. }else if(e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Choose Your Team!") && e.getCurrentItem().getType().equals(Material.WOOL) && e.getCurrentItem().getDurability() == 11){
    106. player.sendMessage(ChatColor.GOLD + "You Have Joined The " + ChatColor.BLUE + "Blue" + ChatColor.GOLD + " Team!");
    107. Team.setTeam("BLUE", player);
    108. }else if(e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Choose Your Team!") && e.getCurrentItem().getType().equals(Material.WOOL) && e.getCurrentItem().getDurability() == 14){
    109. player.sendMessage(ChatColor.GOLD + "You Have Joined The " + ChatColor.RED + "Red" + ChatColor.GOLD + " Team!");
    110. Team.setTeam("RED", player);
    111. }
    112. }
    113. @EventHandler
    114. public void onPlayerJoin(PlayerJoinEvent e){
    115. ItemStack item = new ItemStack(Material.NETHER_STAR);
    116. ItemMeta itemM = item.getItemMeta();
    117. itemM.setDisplayName(ChatColor.BLUE + "Choose Your Class!");
    118. item.setItemMeta(itemM);
    119. e.getPlayer().getInventory().addItem(item);
    120. //
    121. ItemStack item2 = new ItemStack(Material.EMERALD);
    122. ItemMeta item2M = item2.getItemMeta();
    123. item2M.setDisplayName(ChatColor.GOLD + "Choose Your Team!");
    124. item2.setItemMeta(item2M);
    125. e.getPlayer().getInventory().addItem(item2);
    126. }
    127.  
    128. @SuppressWarnings("deprecation")
    129. @EventHandler
    130. public void playerMoveEvent(PlayerMoveEvent e){
    131. Player player = e.getPlayer();
    132. for(Entity ent : player.getNearbyEntities(6, 6, 6)){
    133. if(ent instanceof Player){
    134. final Player entP = (Player) ent;
    135. if(Class.getChosenClass(entP).equalsIgnoreCase("MEDIC")){ //THIS IS LINE 125 RIGHT HERE I HOPE YOU CAN SEE THIS
    136. getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
    137.  
    138. public void run() {
    139. if(entP.getHealth() == 20) return;
    140. else{
    141. entP.setHealth(entP.getHealth() + 1);
    142. entP.sendMessage("Yes You Have Been Healed");
    143. }
    144. }
    145. }, 0L, 10L);
    146. }
    147. }
    148. }
    149. }
    150.  
    151.  
    152. }
    153.  


    And, the Class.java class (notice the cap C) is here:
    Code:java
    1. package me.James.Battle.Main;
    2.  
    3. import java.util.HashMap;
    4.  
    5. import org.bukkit.entity.Player;
    6.  
    7. public class Class {
    8. public static HashMap<String, String> Class = new HashMap<String, String>();
    9.  
    10. public static String getChosenClass(Player player){
    11. String team = null;
    12. if(Class.containsKey(player.getName() + ":BARBARIAN")){
    13. team = "BARBARIAN";
    14. }else if(Class.containsKey(player.getName() + ":MEDIC")){
    15. team = "MEDIC";
    16. }else return null;
    17. return team;
    18. }
    19. public static void setClass(String team, Player player){
    20. Class.remove(player.getName() + ":BARBARIAN");
    21. Class.remove(player.getName() + ":MEDIC");
    22. if(team.equalsIgnoreCase("BARBARIAN")){
    23. Class.put(player.getName() + ":BARBARIAN", null);
    24. }else if(team.equalsIgnoreCase("MEDIC")){
    25. Class.put(player.getName() + ":MEDIC", null);
    26. }else return;
    27.  
    28. }
    29. }
    30.  


    And if that wasn't enough, here's Team.java
    Code:java
    1. package me.James.Battle.Main;
    2.  
    3. import java.util.HashMap;
    4.  
    5. import org.bukkit.entity.Player;
    6.  
    7.  
    8. public class Team {
    9. public static HashMap<String, String> teams = new HashMap<String, String>();
    10.  
    11. public static String getTeam(Player player){
    12. String team = null;
    13. if(teams.containsKey(player.getName() + ":RED")){
    14. team = "RED";
    15. }else if(teams.containsKey(player.getName() + ":BLUE")){
    16. team = "BLUE";
    17. }else return null;
    18. return team;
    19. }
    20. public static void setTeam(String team, Player player){
    21. teams.remove(player.getName() + ":RED");
    22. teams.remove(player.getName() + ":BLUE");
    23. if(team.equalsIgnoreCase("RED")){
    24. teams.put(player.getName() + ":RED", null);
    25. }else if(team.equalsIgnoreCase("BLUE")){
    26. teams.put(player.getName() + ":BLUE", null);
    27. }else return;
    28.  
    29. }
    30. }


    Hmmmm, if i put it in a playerJoinEvent or the onEnable, most likely they will not automatically be a medic, meaning it will fail, i need it to check every millisecond or so, so i'll just use a while loop.

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

    zDylann

    So your getChosenClass method is returning null. You need to ensure everyone has there class set when you call that method or just call a null check when you want to use the method.
    Code:java
    1. String c = Class.getChosenClass(entP);
    2. if(c == null){
    3. return;
    4. }


    EDIT: In your getChosenClass method remove else return null; If its not either of the classes, team is already null so it will return null without that.
     
  7. Offline

    eleectricman226

    ah, so could i do:
    Code:
    if(Class.getChosenClass != null){
    if(Class.getChosenClass(entP).equalsIgnoreCase("MEDIC"){
     
    }
    }
     
  8. Offline

    zDylann

    Honestly I would do something like this on your PlayerMoveEvent:

    Code:java
    1.  
    2. @EventHandler
    3. public void playerMoveEvent(PlayerMoveEvent e){
    4. Player p = e.getPlayer();
    5. String c = Class.getChosenClass(p);
    6. if(c == null){
    7. e.setCancelled(true);
    8. return;
    9. }
    10.  
    11. //This will make it so you can't move until you pick your class.
    12. //Continue Healer class specifics
    13.  
    14. }
     
  9. Offline

    eleectricman226

    OK, good idea, as this will be on a bungee cord server, it would be OK

    I've also added a method so that there team and class are cleared from the HashMap on quit:
    Code:java
    1. @EventHandler
    2. public void onQuit(PlayerQuitEvent e){
    3. Team.teams.remove(((HumanEntity) e).getName() + ":BULE");
    4. Team.teams.remove(((HumanEntity) e).getName() + ":RED");
    5. Class.Class.remove(((HumanEntity) e).getName() + ":BARBARIAN");
    6. Class.Class.remove(((HumanEntity) e).getName() + ":MEDIC");
    7. }


    i moved the getNearbyEntities to a onPlayerJoin, but i can't seem to download terrain, any ideas? nor can my beta tester.

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

    zDylann

    Err I don't understand why you would move getNearbyEntities to onJoin can you explain?
     
  11. Offline

    eleectricman226

    well, if in onEnable, i wouldn't be able to get the player. so playerJoin would be ok, but turns out it doesn't like it. here is the updated code:
    Code:java
    1. @EventHandler
    2. public void onPlayerJoin(PlayerJoinEvent e){
    3. ItemStack item = new ItemStack(Material.NETHER_STAR);
    4. ItemMeta itemM = item.getItemMeta();
    5. itemM.setDisplayName(ChatColor.BLUE + "Choose Your Class!");
    6. item.setItemMeta(itemM);
    7. e.getPlayer().getInventory().addItem(item);
    8. //
    9. ItemStack item2 = new ItemStack(Material.EMERALD);
    10. ItemMeta item2M = item2.getItemMeta();
    11. item2M.setDisplayName(ChatColor.GOLD + "Choose Your Team!");
    12. item2.setItemMeta(item2M);
    13. e.getPlayer().getInventory().addItem(item2);
    14. //Starts the medic healing when joined, and tests multiple times for a medic.
    15. while(true){
    16. for(Entity ent : e.getPlayer().getNearbyEntities(6, 6, 6)){
    17. if(ent instanceof Player){
    18. final Player entP = (Player) ent;
    19. if(Class.getChosenClass(entP).equalsIgnoreCase("MEDIC")){
    20. getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
    21.  
    22. public void run() {
    23. if(entP.getHealth() == 20) return;
    24. else{
    25. entP.setHealth(entP.getHealth() + 1);
    26. entP.sendMessage("Yes You Have Been Healed");
    27. }
    28. }
    29. }, 0L, 10L);
    30. }
    31. }
    32. }
    33. }
    34. }
     
  12. Offline

    zDylann


    You could get a player onEnable. This would be in your repeating task:
    Code:java
    1. for(Entity e: Bukkit.getServer().getWorld("WOLRDNAME").getEntities()){
    2. if(e instanceof Player){
    3. Player p = (Player)e;
    4. //Run healer regen skill
    5. }
    6. }
     
  13. Offline

    eleectricman226

    good point, but it wouldn't be in a 6X6X6 radius, that's the problem
     
  14. Offline

    zDylann

    Why not?
     
  15. Offline

    eleectricman226

    hmmm, if you could sample how that would work it would be good, thanks.
     
  16. Offline

    zDylann


    Every time this block of code is ran it will heal all entities around the medic for 1hp. If you want to make it only players then change the casts and instanceof check to Players only.

    Code:java
    1. for(Entity e: Bukkit.getServer().getWorld("WOLRDNAME").getEntities()){
    2. if(e instanceof Player){
    3. Player p = (Player)e;
    4. String c = Class.getChosenClass(entP);
    5. if(c == null || !(c.equalsIgnoreCase("MEDIC"))){
    6. return;
    7. }
    8. List<Entity> nearby = p.getNearbyEntities(6, 6, 6);
    9. for (int x = 0; x < nearby.size(); x++) {
    10. if ((nearby.get(x) instanceof LivingEntity)) {
    11. LivingEntity entity = (LivingEntity) nearby.get(x);
    12. entity.setHealth(entity.getHealth() + 1.0);
    13. }
    14. }
    15. }
    16. }
     
  17. Offline

    eleectricman226

    I'll try it out, but if you remember, the desc was: Everyone within a 6 block range will heal half-heart/0.5s.''
     
  18. Offline

    zDylann

    Then change the amount healed and change the ticks the repeating task is played. The code I gave you is meant to be put INTO a repeating task on your onENABLE method.
     
  19. Offline

    eleectricman226

    So, this is what I have implemented:
    Code:java
    1. public void onEnable(){
    2. getServer().getPluginManager().registerEvents(new ListenerClass(), this);
    3. getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
    4.  
    5. @Override
    6. public void run() {
    7. for(Entity e: Bukkit.getServer().getWorld("world").getEntities()){
    8. if(e instanceof Player){
    9. Player p = (Player)e;
    10. String c = Class.getChosenClass((Player) e);
    11. if(c == null || !(c.equalsIgnoreCase("MEDIC"))){
    12. return;
    13. }
    14. List<Entity> nearby = p.getNearbyEntities(6, 6, 6);
    15. for (int x = 0; x < nearby.size(); x++) {
    16. if ((nearby.get(x) instanceof LivingEntity)) {
    17. LivingEntity entity = (LivingEntity) nearby.get(x);
    18. entity.setHealth(entity.getHealth() + 1.0);
    19. }
    20. }
    21. }
    22. }
    23.  
    24. }
    25.  
    26.  
    27. }, 0L, 10L);

    Is this correct? i changed a few things around to correct it, but is it?
     
  20. Offline

    zDylann



    Change: String c =Class.getChosenClass((Player) e);
    To: String c =Class.getChosenClass(p);
     
  21. Offline

    eleectricman226

    Changed, basically the same thing though
     
  22. Offline

    zDylann

    Just trying to help you understand java!
     
  23. Offline

    eleectricman226

    Ok, it works nicely, but i will soon implement that medic's won't heal enemies, and it still heals at that rate even if more than 6 block away on the X and Z

    OK, a little bit more look into it, it was regenerating cause of peaceful, not the plugin, so i'm going to try and fix it so if you have any ideas, just reply, Thanks

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

    zDylann

    Add some broadcast checks to see where its goings wrong.
     
Thread Status:
Not open for further replies.

Share This Page