Tutorial: Events

Dieses Thema im Forum "Tutorials" wurde erstellt von Blindhero, 16. März 2014.

  1. Blindhero
    Offline

    Blindhero

    Registriert seit:
    23. Januar 2014
    Beiträge:
    24
    Ort:
    Deutschland
    Minecraft:
    BlinderHeld
    Hallo liebe Minecraft Community! Heute möchte ich euch ein Tutorial (mein erstes :p) vorstellen. Es geht um das Thema Events. Sie sind der Grundbestandteil eines Plugins! Also kommen wir doch zum ersten Punkt:

    Was ist ein Event?
    Ein Event ist eine Java-Methode die ausgeführt wird, wenn eine bestimmte Aktion ausgeführt wird. Da könnt ihr euch alles mögliche drunter vorstellen: zum Beispiel: Wenn ein Spieler Fallschaden bekommt, Wenn ein Spieler stirbt, wenn ein Spieler ein Schild rechtsklickt, etc...
    Events können alle so ziemlich alle Anwendungsbereiche decken. Alle Events findet ihr hier: http://jd.bukkit.org/dev/doxygen/df/d08/namespaceorg_1_1bukkit_1_1event.html

    Wie wird ein Event aufgebaut?
    Bevor wir uns dieser Frage stellen, müssen wir erstmal die Events registrieren. Das heißt sobald der Server gestartet wird, muss der Server wissen, dass das Plugin Events ausführen will. Das tun wir dann in der onEnable() Methode. Dort fügt ihr folgende Zeile ein:
    Code (Text):
    1. getServer().getPluginManager().registerEvents(this, this);
    So. Nun kommen wir zum eigentlichen Event. Ich nehme hier mal ein Beispiel aber erkläre das dann allgemein:
    Damit ein Event als solches erkannt wird, muss vor die Methode ein EventHandler geschrieben werden. Dazu kommt optional direkt dahinter
    die Event Priorität. Wenn mehrere Plugins ein Event nutzen, wird entschieden welches zuerst ausgeführt wird. (http://jd.bukkit.org/dev/doxygen/da/dad/enumorg_1_1bukkit_1_1event_1_1EventPriority.html)
    Die nächte Zeile enthält dann den Methoden Namen und in Klammern das Event.
    Also das public void initiert die Methode, onDamage ist ein Name den ihr selbst wählen könnt :p. und schließlich
    (EntityDamagebyEntityEvent e) beschreibt den wichtigen Eventnamen den ihr importieren müsst und die Event Variable.
    Das ganze sieht dann so aus:
    Code (Text):
    1.  
    2. @EventHandler (priority = EventPriority.NORMAL)
    3. public void onDamage(EntityDamageByEntityEvent e)
    4.  
    Wenn ihr ein anderes Event haben wollt ersetzt ihr einfach den Eventnamen durch zB PlayerDeathEvent. Die Methode an sich müsst ihr dann auch umbennen zum Beispiel nach onPlayerDeath.
    So, jetzt wird euer Event jedes Mal ausgeführt wenn ein Entity durch ein Entity Schaden bekommt.
    (kleine Info am Rande: Entities sind sozusagen bewegbare Einheiten im Spiel, d.h.: Spieler, NPC, Pfeile, und und und)
    Aber es passiert ja noch gar nix? Da kommen wir gleich zum nächsten Schritt.

    Was soll passieren?
    In diesem Beispiel simuliere ich das Kit Switcher (für alle die mal PvP gespielt haben).
    Ein Event hat immer noch Eigenschaften die ihr abfragen oder verändern könnt. Unsere Eventvariable lautet ja e also sieht das wie folgt aus: e.getEntity() oder zum Beispiel e.getDamager() etc.
    So. Nachdem wir das Event eingeleitet haben folgt in geschweiften Klammern unser Code:
    Code (Text):
    1.  
    2. if(e.getEntity() instanceof LivingEntity) {
    3.     LivingEntity victim = (LivingEntity) e.getEntity();
    4.  
    Hier frage ich ab, ob das Entity das Schaden bekommt ein LivingEntity ist, sprich alle lebenden Einheiten, da Pfeile ja nich Leben :p
    Direkt danach deklariere ich eine Variable victim(also der, der Schaden erleidet).

    Code (Text):
    1.  
    2. if(e.getDamager() instanceof Snowball) {
    3.     Snowball snow = (Snowball) e.getDamager();         
    4.     if(snow.getShooter() instanceof Player) {
    5.                 Player damager = (Player) snow.getShooter();
    6.  
    Als nächstes frage ich ab, wer Schaden verteilt, wenn es ein Schneeball war, so frage ich den Shooter (also den Werfer) ab. Wenn dieser wiederum ein Spieler ist, folgt der nächste Teil.

    Code (Text):
    1.  
    2. Location damagerLoc = damager.getLocation();
    3. Location victimLoc = ((Entity) victim).getLocation();
    4.  
    Hier deklariere ich die Variable Location (also der aktuelle Ort, des Werfers und des Gegners)

    Code (Text):
    1.  
    2. damager.teleport(victimLoc);
    3. ((Entity) victim).teleport(damagerLoc);
    4.  
    Und zu guterletzt werden die Orte der beiden vertauscht! :)

    Hier nochmal der ganze Code:
    Code (Text):
    1.  
    2. @EventHandler (priority = EventPriority.NORMAL)
    3. public void onDamage(EntityDamageByEntityEvent e)
    4. {
    5. if(e.getEntity() instanceof LivingEntity) {
    6.     LivingEntity victim = (LivingEntity) e.getEntity();
    7.     if(e.getDamager() instanceof Snowball) {
    8.         Snowball snow = (Snowball) e.getDamager();         
    9.             if(snow.getShooter() instanceof Player) {
    10.                 Player damager = (Player) snow.getShooter();
    11.                 Location damagerLoc = damager.getLocation();
    12.                 Location victimLoc = ((Entity) victim).getLocation();
    13.                 damager.teleport(victimLoc);
    14.                 ((Entity) victim).teleport(damagerLoc);
    15.             }
    16.         }
    17.     }
    18. }
    19.  
    Ich hoffe euch hat mein erstes Tutorial gefallen :) Falls nicht, oder vllt auch doch... egal. Schreibt einfach irgendwas drunter! ;)
     
    #1
    1 Person gefällt das.
  2. ImpactCP
    Offline

    ImpactCP

    Registriert seit:
    21. Oktober 2012
    Beiträge:
    23
    Minecraft:
    ImpactCP
    Anmerkend:
    • Bei events die Cancellable sind -> vorher prüfen mit isCancelled.
    • Du könntest EventPriority genauer erklären.
    • Folgendes würde ich ändern:
      Code (Text):
      1. if(snow.getShooter() instanceof Player) {
      besser:
      Code (Text):
      1. if(snow != null && snow.getShooter() instanceof Player) {
    • Für Teil 2: Wie baut man eigene Events?

    sonst ne nette idee :)
     
    #2