ServerPlugin Player Chat

Dieses Thema im Forum "Programmierung" wurde erstellt von Basti07711, 3. April 2014.

  1. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Hi Leute,
    ich habe noch eine Frage zu Java.
    Ich sitze grade an einem Plugin, bei dem ich verschiedenen Commandos erstelle, die über ein Inventory ausgeführt werden.
    Nun aber zum Problem:
    Ich wollte einen Teleport-Button in das Inventory legen, doch um jemanden teleportieren zu können benötigt es eine Location, indiesem Fall wollte ich die Location eines anderen Players nutzen. Deshalb sollte man nach dem Drücken des Knopfes einfach den anderen Spielernamen in den Chat schreiben und dieser soll dann als Location genutzt werden. Wie mach ich das, dass ich Texte aus dem Chat ziehe, ich schaff es einfach nicht.

    Ich hoffe mir kann jemand helfen.

    MfG,
    Basti07711
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Code (Text):
    1. public void onChat(AsyncPlayerChatevent e){
    2.         String msg = e.getMessage();
    3. }
    Dann mit dem String nen Onlineplayer suchen, dessen location holen und den player porten.
     
    #2
  3. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Gut habe ich gemacht, doch nun wird mir das onChat Rot angestrichen :(

    Hier mal mein Code:
    Code (Text):
    1.     @EventHandler
    2.     public void Inventory(InventoryClickEvent event){
    3.         Player p = (Player) event.getWhoClicked();
    4.    
    5.         if(event.getInventory().getName().equalsIgnoreCase("User-Befehelsliste")){
    6.             event.setCancelled(true);
    7.             if(event.getCurrentItem().getType() == (Material.ENDER_PEARL)){
    8.                
    9.                 p.sendMessage("Bitte gebe den Usernamen in den Chat ein, zu dem du Teleportiert werden willst. Achte auf groß und kleinschreibung!");    
    10.                
    11.                 public void onChat(AsyncPlayerChatEvent e){
    12.                    
    13.                     String msg = e.getMessage();
    14.                     Player target = Bukkit.getServer().getPlayer(msg);
    15.                     double x = target.getLocation().getX();
    16.                     double y = target.getLocation().getY();
    17.                     double z = target.getLocation().getZ();
    18.                     World world = target.getWorld();
    19.                     Location taretlocation = new Location(world, x, y, z);
    20.                    
    21.                     p.teleport(taretlocation);        
    22.                 }
    23.                 event.getView().close();
    24.             }
    25.         }        
    26.     }
    27. }
    Weisst du wo der Fehler liegt?
     
    #3
    1 Person gefällt das.
  4. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Du darfst nicht einfach so einen EventHandler in einen anderen machen, das musst du schon getrennt machen :)

    Und bei dem Player musst du den suchen, und darfst nicht einfach sagen: "Das eingegebene ist aufjedenfall ein richtiger Spielername", das haut dir schnell eine Exception rein.
     
    #4
  5. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Ok, danke, wusste es noch nicht :) Könntest du mir sagen, wie ich diese suche mache/bzw, wie ich es richtig mache?
     
    #5
  6. games6471
    Online

    games6471

    Ich finde die Conversation API von Bukkit sehr praktisch. Ich persönlich habe sie schon einige male verwendet. Sieht zwar anfangs nach viel Arbeit aus, ist aber ein richtiges gutes Feature für einfach und Bug freien Code. Meiner Meinung nach viel besser als dies über Events zu handhaben, da du bei dieser Funktion eine besser Übersicht hast. Es muss hier nicht wirklich überprüft werden, in welche Frage der Spieler steckt oder ob er überhaupt in einer Frage ist. Zudem gibt es auch vordefinierte Conversation, die nach einer gewissen Zeit oder einer bestimmten Antwort abbrechen (z. B. /cancel oder der Spieler beantwortet die Frage nicht und spielt wie gewohnt weiter).

    Schau dir einfach mal diesen Thread. Für den Einstieg fand ich diesen und JavaDoc Dokumentation ziemlich hilfreich.
    Link
     
    #6
  7. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Auf das bin ich auch schon gestoßen, doch da ich erst 4 tage lang java aktiv lerne und übe, habe ich mich noch nicht damit auseinander gesetzt. Werde es mal versuchen. Deshalb versuche ich es auch über die ganzen Events. Doof ist dabei wie gesagt nur, dass ich keinen Schimmer hab, wie ich eine Online-Abfrage erstelle.
     
    #7
  8. games6471
    Online

    games6471

    Bukkit.getPlayerExact(String name);

    Returns:
    a player object if one was found, null otherwise​

    Also gibt es keinen Spieler, der mit diesem Namen auf dem Server ist, wird null zurückgegeben.
     
    #8
  9. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Danke, danke, danke! Dank euerer Hilfe klappt es endlich. Vielen Danke!
     
    #9
  10. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Es geht jetzt zwar, doch mir ist grade ein fataler Fehler meinerseits aufgefallen. Das Event bricht nicht ab, also der Chat wird immer überprüft und spuckt sofort eine Exception aus.
    Weiss jemand wie ich es stoppe?
    Hier noch einmal mein vollständiger Code:
    Code (Text):
    1. package ItemCommands;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.Location;
    5. import org.bukkit.Material;
    6. import org.bukkit.World;
    7. import org.bukkit.entity.Player;
    8. import org.bukkit.event.EventHandler;
    9. import org.bukkit.event.Listener;
    10. import org.bukkit.event.inventory.InventoryClickEvent;
    11. import org.bukkit.event.player.AsyncPlayerChatEvent;
    12.  
    13. public class Commands implements Listener {
    14.    
    15.     @EventHandler
    16.     public void onClick(InventoryClickEvent e){
    17.        
    18.         Player p = (Player) e.getWhoClicked();
    19.    
    20.         if(e.getInventory().getName().equalsIgnoreCase("User-Befehelsliste")){
    21.             e.setCancelled(true);
    22.             if(e.getCurrentItem().getType() == (Material.ENDER_PEARL)){
    23.                
    24.                 p.sendMessage("Bitte gebe den Usernamen in den Chat ein, zu dem du Teleportiert werden willst. Achte auf groß und kleinschreibung!");
    25.                 }
    26.                 e.getView().close();
    27.         }
    28.     }
    29.        
    30.     @EventHandler
    31.     public void onChat(AsyncPlayerChatEvent chat, String [] args){
    32.         Player p = (Player) chat.getPlayer();
    33.         if(p.isOnline()){
    34.             if(args.length == 1){
    35.                 chat.setCancelled(true);
    36.                 String msg = chat.getMessage();
    37.                 Player target = Bukkit.getPlayerExact(msg);
    38.                 double x = target.getLocation().getX();
    39.                 double y = target.getLocation().getY();
    40.                 double z = target.getLocation().getZ();
    41.                 World world = target.getWorld();
    42.                 Location targetlocation = new Location(world, x, y, z);
    43.                
    44.                 p.teleport(targetlocation);
    45.             }
    46.         }
    47.     }
    48. }
     
    #10