ServerPlugin Hilfe! Events funktionieren bei mir ned

Dieses Thema im Forum "Programmierung" wurde erstellt von AtomicDev, 7. März 2016.

  1. AtomicDev
    Offline

    AtomicDev

    Registriert seit:
    7. März 2016
    Beiträge:
    2
    Hallo Leute,
    Könnt ihr mir helfen!!
    Wieso funktionieren die Event bei mir nicht????
    Mein Code:
    Code (Text):
    1. package me.plugin.Dev;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.Sound;
    5. import org.bukkit.command.Command;
    6. import org.bukkit.command.CommandSender;
    7. import org.bukkit.entity.Player;
    8. import org.bukkit.event.EventHandler;
    9. import org.bukkit.event.Listener;
    10. import org.bukkit.event.player.PlayerJoinEvent;
    11. import org.bukkit.plugin.java.JavaPlugin;
    12.  
    13. import me.plugin.Dev.Listeners.JoinQuit;
    14.  
    15. public class Core extends JavaPlugin implements Listener {
    16.     public static String prefix = ChatColor.RED + "["+ ChatColor.AQUA + "Gun" + ChatColor.DARK_AQUA + "Game" + ChatColor.RED + "]";
    17.     public void onEnabled(){
    18.     registerEvents();
    19.     System.out.println(prefix + "Enabled");
    20.         getServer().getPluginManager().registerEvents(this, this);
    21.        
    22.     }
    23.      @EventHandler
    24.     public void onJoin(PlayerJoinEvent e){
    25.    
    26.         Player p = e.getPlayer();
    27.         if(p.hasPermission("GunGame.Join")){
    28.         e.setJoinMessage(prefix + p.getName() + " -->");
    29.         p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BASS, 10, 10);
    30.      }
    31.      }
    32.    
    33.     public boolean onCommand(CommandSender sender, Command cmd, String label,String[] args){
    34.     if(cmd.getName().equalsIgnoreCase("GunGame")){
    35.         Player p = (Player) sender;
    36.        
    37.         //Help
    38.         if(p.hasPermission("gungame.help")){
    39.         p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BASS, 5, 5);
    40.         p.sendMessage (ChatColor.GOLD + "---------------- " +  prefix + ChatColor.GOLD +" ----------------");
    41.        
    42.         p.sendMessage (ChatColor.GOLD + "---------------- " +  prefix + ChatColor.GOLD +" ----------------");
    43.        
    44.     }
    45.    
    46.    
    47.      
    48.     }  
    49.        
    50.     return false;
    51.    
    52.    
    53.    
    54.    
    55.    
    56.  
    57. }
    58.     public void registerEvents(){
    59.     new JoinQuit(this);
    60.     }
    61.    
    62.      
    63.        
    64.    
    65.        
    66.     }
    67.    
    68.  
     
    #1
  2. UnityGaming
    Offline

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    89
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Nimm das bitte nicht persönlich, aber das ist 100% Schrott!
    Ein 5 Minuten YouTube Tutorial ist von höherer Qualität als dieses Code-Geschwür.

    Das ganze zu korrigieren wäre eigentlich sinnlos, da es nun mal von vorne bis hinten unbrauchbar ist, ein kleiner Tipp kommt dennoch.
    Eigentlich macht man Listener in Extra Klassen, aber für Beispielzwecke muss das jetzt nicht sein.

    Hier ist mal eine Grundklasse, mit der dürften dann deine EventHandler wenigstens funktionieren:
    Code (Text):
    1.  
    2. package de.beispiel.plugin;
    3.  
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.player.PlayerJoinEvent;
    7. import org.bukkit.event.player.PlayerQuitEvent;
    8. import org.bukkit.plugin.java.JavaPlugin;
    9.  
    10. public class DeinPlugin extends JavaPlugin implements Listener {
    11.  
    12.     private static DeinPlugin instance;
    13.  
    14.  
    15.     @Override
    16.     public void onEnable() {
    17.         instance = this;
    18.         getServer().getPluginManager().registerEvents(this, this);
    19.     }
    20.  
    21.     @Override
    22.     public void onDisable() {
    23.         instance = null;
    24.     }
    25.  
    26.     public static DeinPlugin getInstance() {
    27.         return instance;
    28.     }
    29.  
    30.     // EVENTS //
    31.  
    32.     @EventHandler
    33.     public void onJoin(PlayerJoinEvent e) {
    34.  
    35.     }
    36.  
    37.     @EventHandler
    38.     public void onQuit(PlayerQuitEvent e) {
    39.  
    40.     }
    41.  
    42. }
    43.  
    Aber bitte, schau dir nochmal die Java und Bukkit Basics wenigstens an, bevor du mit sowas rumbastelst.
    Ich weiß, learning by doing ist ne tolle Sache, aber ein wenig zu lesen um es zumindest zum laufen zu kriegen ist wirkliche ne große Hilfe am Anfang!
     
    #2
    jensIO gefällt das.
  3. AtomicDev
    Offline

    AtomicDev

    Registriert seit:
    7. März 2016
    Beiträge:
    2
    Trotzdem geht es nich
     
    #3
  4. UnityGaming
    Offline

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    89
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Du verwendest auch wirklich CraftBukkit / Spigot oder sonst irgendeine Bukkit-API Software?
     
    #4
  5. TheSimufreak
    Offline

    TheSimufreak

    Registriert seit:
    28. Juni 2012
    Beiträge:
    41
    Prinzipiell hast du zwar recht, der Quelltext ist nicht besonders schön und das Auslagern des Listeners in eine separate Kontrollklasse gehört zu einer guten Systemarchitektur dazu, aber deshalb gleich mit solchen Vokabular um dich zu schmeißen macht die Sache auch nicht besser.
    Wir alle haben mal klein Angefangen und herum experimentiert...

    Zum Problem:
    Das Problem liegt nicht bei den Events sondern schlichtweg daran, dass du die onEnable Methode der Superklasse nicht überschreibst, wodurch dann eben nicht die von dir deklarierte Methode ausgeführt wird sondern die der Klasse JavaPlugin.
    Wenn dir das gerade spanisch vorkommt rate ich dir dich über Vererbung schlau zu machen.
    Ich empfehle dir beim überschreiben von Methoden immer die @Override Annotation zu verwenden, dann schleichen sich solche Fehler nicht so schnell ein.
     
    #5
    jensIO gefällt das.
  6. UnityGaming
    Offline

    UnityGaming

    Registriert seit:
    25. Oktober 2015
    Beiträge:
    89
    Ort:
    Hohenfels
    Minecraft:
    FastFelix771
    Ich bin da leider etwas schroff, denn ein paar Minuten lesen und googlen hätten sein Problem schon gelöst.
     
    #6
  7. CoredTV
    Offline

    CoredTV

    Registriert seit:
    13. Oktober 2013
    Beiträge:
    68
    :gusta:
     
    #7
  8. phenomax
    Offline

    phenomax Entwickler

    Registriert seit:
    12. Februar 2016
    Beiträge:
    16
    Ort:
    Deutschland
    Minecraft:
    phenomax
    Im Kern eine ganz nachvollziehbare Aussage. Jedoch sind dir leider zwei Denkfehler unterlaufen.
    Zum einen ruft der AtomicDev eine Methode namens onEnabled() auf, anstatt onEnable(). Folglich wird der Körper dieser Methode auch nie aufgerufen. Zum anderen ist die @Override Annotation hier "nur" eine Java Coding-Konvention. Beim Laden des Plugins wird nämlich gezielt die onEnable Funktion deiner Main-Klasse, die man ja auch in einer plugin.yml angibt, aufgerufen.
    Möchte man jedoch z.B. die toString() Funktion eines Objektes und damit eine native Java-Funktion überschreiben, zeigt die @Override Annotation erst ihre Funktion :)

    Gruß
     
    #8
    jensIO gefällt das.
  9. Im Kern eine derartig falsche Aussage, ich gehe diese einfach mal Punkt für Punkt durch.

    Naja, nicht ganz. Ein normales Plugin erweitert idR. die Klasse JavaPlugin, dadurch werden einige Methoden automatisch implementiert und es wird immer ein neues Objekt dieser Klasse erzeugt. Ein Thema, dass zu komplex ist um es hier genauer darzustellen. Danach ruft der PluginLoader die notwendigen Methoden auf (Sprich "Contracts").

    Ein Ausschnitt aus der besagten Klasse:
    Code (Text):
    1. @Override
    2. public void onLoad() {}
    3. @Override
    4. public void onDisable() {}
    5. @Override
    6. public void onEnable() {}
    (SRC: https://github.com/Bukkit/Bukkit/blob/master/src/main/java/org/bukkit/plugin/java/JavaPlugin.java)

    Ein Kind muss diese nun nicht mehr überschreiben, kann es aber um Funktionen hinzuzufügen (Nennt sich Vererbung!).

    Ach wirklich? @Override ist eine Annotation für den Compiler, also eine Anweisung / Anforderung an die Oberklasse. Diese als lediglich optional zu bezeichnen kann nur von einem schlechten Programmierer kommen. Keine Konvention, sondern nur ein Anfängerfehler.


    Beim Laden des Plugins wird nämlich gezielt die onEnable Funktion deiner Main-Klasse, die man ja auch in einer plugin.yml angibt, aufgerufen.

    Oh zwei Dinge:
    Das ist Bullshit und das ist Bullshit: Weder ist die toString() methode in Java eine native Funktion, noch zeigt diese Annotation erst dort ihre Wirkung.

    Im übrigen Implementiert das open-jdk die Funktion so:

    Code (Text):
    1.  
    2. public String toString() {
    3.            return getClass().getName() + "@" + Integer.toHexString(hashCode());
    4. }
    5.  
     
    #9
  10. Wäre dein Beitrag wirklich richtig und gut formuliert, dann gäbe es absolut keine Grundlage ihn ad absurdum zu führen, weil mein Beitrag die offensichtlichen Fehler auflistet.

    Diese "Vererbung" existiert nicht, weil es keine Elternklasse mit dieser Methode gibt. Zudem funktioniert das einfache implementieren des Plugin interfaces nicht so einfach, wie man erwarten würde, weil es eine
    direkte Bindung zwischen dem JavaPlugin und dem PluginClassLoader gibt.

    Näheres findet man hier: https://github.com/Bukkit/Bukkit/bl...org/bukkit/plugin/java/PluginClassLoader.java

    Nein, es ist eine ganz normale Methode in Java. Die Klasse Objekt mag zwar implizit und überall in jedem JRE vorhanden sein, aber dies macht diese Methode noch lange nicht "native". Eine native Methode wird mit nativem Code (z.B. C) ausgeführt. Java ist eine plattformunabhängige Sprache. Mehr zu nativen Methoden findet man hier.

    Also, das ist auch nicht richtig. Ein primitiver Datentyp hat per Definition (in Java) keine Methoden. Dieser ist kein Objekt. Nur die entsprechenden Wrapperklassen haben Methoden und können folglich Methoden aufrufen.

    Also man kann jede Methode ohne @Override überschreiben, jedoch gibt es dann keine Überprüfung des Compilers, ob eine entsprechende Methode überschrieben wird. Folglich muss diese Methode nicht überschrieben werden können und könnte eine neue Methode darstellen.
     
    #10
    games6471 gefällt das.
  11. phenomax
    Offline

    phenomax Entwickler

    Registriert seit:
    12. Februar 2016
    Beiträge:
    16
    Ort:
    Deutschland
    Minecraft:
    phenomax
    Das ist doch mal hilfreich und vor allem netter formuliert.
    Geht doch, Manf ;)
     
    #11