Solved help with /msg and /reply

Discussion in 'Plugin Development' started by vtg_the_kid, Dec 5, 2013.

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

    vtg_the_kid

    hi i am trying to code messaging and replying to the last person who messaged you
    code:
    Code:java
    1. if (cmd.getName().equalsIgnoreCase("message")
    2. || cmd.getName().equalsIgnoreCase("msg")
    3. || cmd.getName().equalsIgnoreCase("tell")
    4. || cmd.getName().equalsIgnoreCase("whisper")
    5. || cmd.getName().equalsIgnoreCase("w")){
    6. Player player1 = (Player) sender;
    7. if (args.length > 1){
    8. Player player2 = Bukkit.getPlayer(args[0]);
    9. if (player2 == null){
    10. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    11. }
    12. else{
    13. StringBuilder str = new StringBuilder();
    14. for (int i = 1; i < args.length; i++){
    15. str.append(args[i]).append(" ");
    16. }
    17. String message = str.toString();
    18. player1.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    19. player2.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    20. map.put(player2.getName(), player1.getName());
    21. }
    22. }
    23. else{
    24. player1.sendMessage(ChatColor.DARK_RED + "Usage: /msg <playername> <message>");
    25. }
    26. }
    27. if (cmd.getName().equalsIgnoreCase("reply") ||
    28. cmd.getName().equalsIgnoreCase("r")){
    29. Player player1 = (Player) sender;
    30. if (args.length > 1){
    31. Player player2 = Bukkit.getPlayer(map.get(player1.getName()));
    32. if(player2 == null || !player2.isOnline()){
    33. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    34. }
    35. else{
    36. StringBuilder str = new StringBuilder();
    37. for (int i = 1; i < args.length; i++){
    38. str.append(args[i]).append(" ");
    39. }
    40. String message = str.toString();
    41. player1.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    42. player2.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    43. map.remove(player2.getName());
    44. map.remove(player1.getName());
    45. map.put(player2.getName(), player1.getName());
    46. }
    47. }
    48. else{
    49. player1.sendMessage(ChatColor.DARK_RED + "Usage: /msg <playername> <message>");
    50. }
    51. }[/i][/i]

    the problem is when someone messages another guy and the other guy does /r <the message>
    it sends both of the players a blank message, and if the message is more than one word long it says there is an internal error...
    how can i fix this?


    can anyone help

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

    felixfritz

    Just two minor thing I noticed, in line 32, if the player is offling, he will be null. That means that calling the "isOnline"-method would cause a NullPointerException.
    And if the message starts from the first character on, in line 37, you have to start from the FIRST (or "zeroth") argument - for(int i = 0; ...)

    What does the stacktrace say, when you get an internal error?
     
    vtg_the_kid likes this.
  3. Offline

    kreashenz

    I have a method for this, it's fairly simple.
    Code:java
    1. /*
    2.   * @param sender - The person who sent the message
    3.   *
    4.   * @param receiver - The person who receives the message
    5.   *
    6.   * @param msg - The arguments
    7.   *
    8.   * @param reply - If the command is /reply or not.
    9.   */
    10. protected void message(CommandSender sender, CommandSender receiver, String[] msg, boolean reply){
    11. String m = "";
    12. for (int i = (reply ? 0 : 1); i < msg.length; i++) {
    13. m = m + msg[i] + ' ';
    14. if(sender.hasPermission("mcrp.chat.color"))m = ChatColor.translateAlternateColorCodes('&', m);
    15. }
    16. sender.sendMessage("§6[§a" + sender.getName() + " -> §7" + receiver.getName() + "§6] §7" + m);
    17. receiver.sendMessage("§6[§7" + sender.getName() + "§a -> " + receiver.getName() + "§6] §7" + m);
    18. }[/i]

    Example usage in a /message command
    Code:java
    1. // Command stuff
    2. // target != null
    3. message(sender, target, args, false);

    Example usage in a /reply command
    Code:java
    1. // Same stuff
    2. message(sender, target, args, true);
     
  4. Offline

    vtg_the_kid

    felixfritz
    oh. i'm stupid.

    vtg_the_kid
    I did what you said, and the message shows up, but I still have another problem. When p1 messages p2, and p2 replies to p1, it works, but then if p3 messages p2, and p2 does /reply it makes p2 reply to p1. How can I fix this?
    Code:
    Code:java
    1. if (cmd.getName().equalsIgnoreCase("message")
    2. || cmd.getName().equalsIgnoreCase("msg")
    3. || cmd.getName().equalsIgnoreCase("tell")
    4. || cmd.getName().equalsIgnoreCase("whisper")
    5. || cmd.getName().equalsIgnoreCase("w")){
    6. Player player1 = (Player) sender;
    7. if (args.length > 1){
    8. Player player2 = Bukkit.getPlayer(args[0]);
    9. if (player2 == null){
    10. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    11. }
    12. else{
    13. StringBuilder str = new StringBuilder();
    14. for (int i = 1; i < args.length; i++){
    15. str.append(args[i]).append(" ");
    16. }
    17. String message = str.toString();
    18. player1.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    19. player2.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    20. map.put(player2.getName(), player1.getName());
    21. }
    22. }
    23. else{
    24. player1.sendMessage(ChatColor.DARK_RED + "Usage: /msg <playername> <message>");
    25. }
    26. }
    27. if (cmd.getName().equalsIgnoreCase("reply") ||
    28. cmd.getName().equalsIgnoreCase("r")){
    29. Player player1 = (Player) sender;
    30. if (args.length > 0){
    31. Player player2 = Bukkit.getPlayer(map.get(player1.getName()));
    32. if(player2 == null || !player2.isOnline()){
    33. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    34. }
    35. else{
    36. StringBuilder str = new StringBuilder();
    37. for (int i = 0; i < args.length; i++){
    38. str.append(args[i]).append(" ");
    39. }
    40. String message = str.toString();
    41. player1.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    42. player2.sendMessage(ChatColor.GRAY + player1.getName() + " --> " + player2.getName() + ": " + message);
    43. map.remove(player2.getName());
    44. map.remove(player1.getName());
    45. map.put(player2.getName(), player1.getName());
    46. }
    47. }
    48. else{
    49. player1.sendMessage(ChatColor.DARK_RED + "Usage: /r <message>");
    50. }
    51. }[/i][/i]


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

    felixfritz

    Haven't tested it, but it might work if add the lines 43 and 44 as well before line 20. Also, I don't know, if I was clear enough before, but checking for !player2.isOnline() is going to cause a NullPointerException since Bukkit.getPlayer is going to return null, if player hasn't been found (line 32). In line 9, you did it correctly for some reason ;)
     
  6. Offline

    vtg_the_kid

    felixfritz
    oh that's because in line 32 i was checking if the player left before the guy /reply him, but I realized checking for null does that
    i'm testing the stuff you said right now

    it works sort of, but it stills says there is an internal error when i try to do /r when nobody has messaged me
    current code:
    Code:java
    1. if (cmd.getName().equalsIgnoreCase("message")
    2. || cmd.getName().equalsIgnoreCase("msg")
    3. || cmd.getName().equalsIgnoreCase("tell")
    4. || cmd.getName().equalsIgnoreCase("whisper")
    5. || cmd.getName().equalsIgnoreCase("w")){
    6. Player player1 = (Player) sender;
    7. if (args.length > 1){
    8. Player player2 = Bukkit.getPlayer(args[0]);
    9. if (player2 == null){
    10. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    11. }
    12. else{
    13. StringBuilder str = new StringBuilder();
    14. for (int i = 1; i < args.length; i++){
    15. str.append(args[i]).append(" ");
    16. }
    17. String message = str.toString();
    18. player1.sendMessage(ChatColor.GRAY + "<" + player1.getName() + " -> "
    19. + player2.getName() + "> " + message);
    20. player2.sendMessage(ChatColor.GRAY + "<" + player1.getName() + " -> "
    21. + player2.getName() + "> " + message);
    22. map.remove(player2.getName());
    23. map.remove(player1.getName());
    24. map.put(player2.getName(), player1.getName());
    25. }
    26. }
    27. else{
    28. player1.sendMessage(ChatColor.DARK_RED + "Usage: /msg <playername> <message>");
    29. }
    30. }
    31. if (cmd.getName().equalsIgnoreCase("reply") ||
    32. cmd.getName().equalsIgnoreCase("r")){
    33. Player player1 = (Player) sender;
    34. if (args.length > 0){
    35. Player player2 = Bukkit.getPlayer(map.get(player1.getName()));
    36. if(player2 == null){
    37. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    38. }
    39. else{
    40. StringBuilder str = new StringBuilder();
    41. for (int i = 0; i < args.length; i++){
    42. str.append(args[i]).append(" ");
    43. }
    44. String message = str.toString();
    45. player1.sendMessage(ChatColor.GRAY + "<" + player1.getName() + " -> "
    46. + player2.getName() + "> " + message);
    47. player2.sendMessage(ChatColor.GRAY + "<" + player1.getName() + " -> "
    48. + player2.getName() + "> " + message);
    49. map.remove(player2.getName());
    50. map.remove(player1.getName());
    51. map.put(player2.getName(), player1.getName());
    52. }
    53. }
    54. else{
    55. player1.sendMessage(ChatColor.DARK_RED + "Usage: /r <message>");
    56. }
    57. }[/i][/i]


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

    Wolfey

    Code:java
    1.  
    2. Player player2 = Bukkit.getPlayer(map.get(player1.getName()));
    3. if(player2 == null){
    4. player1.sendMessage(ChatColor.GRAY + "Player not found.");
    5. }
    6.  

    I think it might be because player1 is null in the map, doesn't exist, so check if the player1 is even in the hashmap.
     
  8. Offline

    felixfritz

    Yeah, check first if the map contains the name of the player.
    Code:java
    1. if(!map.containsKey(player1.getName())) {
    2. player1.sendMessage(ChatColor.RED + "No one to reply to.");
    3. return;
    4. }
     
  9. Offline

    vtg_the_kid

    Wolfey felixfritz k thanks
    now everything works except
    when you msg someone, and you do /reply, it doesn't reply to them
    /reply only works if someone else messages you
    how do i make it so it works even if you message someone else
     
  10. Offline

    Wolfey

    Try putting this in your /msg code:
    Code:java
    1.  
    2. map.put(player1.getName(), player2.getName());
    3.  
     
    vtg_the_kid likes this.
  11. Offline

    vtg_the_kid

    Wolfey
    oh lol i'm so bad at this
    thanks dude
     
    Wolfey likes this.
  12. Offline

    Wolfey

    No problem!
     
Thread Status:
Not open for further replies.

Share This Page