• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Mein Soup plugin geht nicht

SängerTV

Minecrafter
Registriert
27 August 2020
Beiträge
3
Diamanten
300
Ich hab gestern mein erstes Minecraft Plugin gecoded ein Soup plugin aber es geht irgenwie nicht

Main Klasse:
public class main extends JavaPlugin {

public void onEnable() {
setEnabled(isEnabled());
}
}

Soup Klasse:

public class soup extends Listener {
@EventHandler
public void onInterac(PlayerInteractEvent e) {
try {
Player p=e.getPlayer();

if (e.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_AIR || e.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) {
if (e.getItem().getType() == Material.MUSHROOM_SOUP) {
ItemStack i=new ItemStack(Material.BOWL);
double g=p.getHealth();
if (g!=20) {
if(g>11)
p.setHealth(20);

p.setItemInHand(i);
}
else {
p.setHealth(g+8);
p.setItemInHand(i);
}


}
}
}catch (Exception ei) {

}
}
}

Wer echt nett wen mir wer helfen könnte
 

Chojo-chan

Teammaid
Social Media
Moderator
Administrator
Registriert
24 März 2013
Beiträge
293
Alter
5
Diamanten
645
Minecraft
Hadde
Okay mehrere Sachen.
1. setEnabled wird wie gesagt selber von Bukkit ausgeführt.
2. Du registrierst deinen Listener nicht. Diesen musst du beim PluginManager registrieren über PluginManager#registerEvents()
3. NIEMALS also wirklich NIEMALS willst du einen try catch um deinen code machen und die Exception schlucken. Du willst auch niemals eine Exception oder RuntimeException catchen. Das ist in 99% der Fälle falsch. Warum? Wenn du jetzt einen Fehler machst, merkst du das nicht. Fehler sollten behandelt werden und nicht geschluckt. Die haben immer einen Sinn.
4. Verwende Code blöcke wenn du code postest. Damit erleichterst du uns das leben extrem.
5. Klassennamen schreibt man immer groß und man nennt seine Klasse nicht Main. Du brauchst indiviuelle Einsteigpunkte in Plugins. Wenn du das so machst, kann niemand zwei Plugins gleichzeitig von dir benutzen. Nenn deine Main Klasse lieber wie dein Plugin also Soup oder SoupPlugin.
6. Das solltest du vielleicht selber schon gemerkt haben. Java Basics. So wichtig.

Der untere Code ist dein Code. Bitte schau dir genau an was ich verändert habe.

Java:
// Klasse richtig benannt
public class SoupPlugin extends JavaPlugin {

    public void onEnable() {
        // Listener müssen registriert werden. Woher soll Bukkit sonst wissen, das sie existieren.
        Bukkit.getPluginManager().registerEvents(new SoupListener(), this);
    }
}

// Klassenname groß. Listener sollten idr im namen enthalten, dass sie ein Listener sind.
public class SoupListener implements Listener {
    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();

        // statt org.bukkit.event.block.Action.RIGHT_CLICK_AIR einfach Action.RIGHT_CLICK_AIR. Nutze imports. sonst wird dein code unlesbar
        // benutze return um nesting zu vermeiden wenn möglich. macht es lesbarer und ist weniger verwirrend
        if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == RIGHT_CLICK_BLOCK) return;
   
        if (e.getItem().getType() == Material.MUSHROOM_SOUP) {
            // Kein unnötiges if. Einfach math min. entweder 20 oder kleiner. Spart ne menge platz.
            // Außerdem können wir die gesundheit direkt aus dem spieler holen
            p.setHealth(Math.min(p.getHealth() + 8, 20));
            // selbes spiel hier. einfach nur noch einmal die methode aufrufen und wir sparen platz und machen es lesbarer
            p.setItemInHand(new ItemStack(Material.BOWL));
        }
   
    }
}
 
Zuletzt bearbeitet:

Malfrador

Threadripper
Registriert
16 Juni 2013
Beiträge
1.473
Diamanten
396
Minecraft
Malfrador
"Geht nicht" ist absolut nicht hilfreich. "Geht nicht" kann von Stromausfall über Server explodiert zu NullPointerException alles sein.
Wenn etwas nicht geht gibt es in 99% der Fälle eine Fehlermeldung im Log. Diese solltest du dir ansehen und überlegen was sie bedeuten könnte. Die meisten Fehlermeldungen sind relativ aussagekräftig und sagen auf jeden Fall, wo etwas schief läuft und in den meisten Fällen auch ziemlich genau was. Wenn du mit dieser Fehlermeldung nichts anfangen kannst, solltest du wenn du um Hilfe fragst statt "Geht nicht" die Fehlermeldung posten.

Ohne Fehlermeldung kann man nur raten, aber: Ist es möglich das deine Klasse "Soup" nicht Listener implementiert? Wenn alles korrekt wäre, wäre kein Cast zu Listener nötig. Ein weiterer ganz klassischer Fehler, der jedem mal passiert, ist @EventHandler zu vergessen.
Desweiteren solltest du getServer().getPluginManager(). statt Bukkit. nutzen.
Zusätzlich würde ich dir empfehlen, deine Klassen vernünftig zu benennen. Damit sollte man früh anfangen, sonst gewöhnt man sich das falsch an. "Soup" ist wenig aussagekräftig. Ich gehe davon aus, das es sich um deine Listener-Klasse handelt. Also sollte sie auch entsprechend heißen, z.B. PlayerListener oder SoupListener - das hilft bei der Übersicht ungemein.
 

Chojo-chan

Teammaid
Social Media
Moderator
Administrator
Registriert
24 März 2013
Beiträge
293
Alter
5
Diamanten
645
Minecraft
Hadde
Oh Gott ok das hab ich übersehen.

Aus irgendeinem grund benutzt du extends Listener statt implements Listener, was korrekt wäre. Außerdem solltest du gucken, dass du die richtige Listener Klasse benutzt. Es gibt nicht nur eine Klasse mit dem Namen.

Ob du Bukkit.getPluginManager() benutzt oder getServer().getPluginManager() ist am Ende egal. Beide greifen auf die selbe Server Instanz zu. Es sind zwei unterschiedliche Wege mit Identischem Ausgang.

In dem Moment, wo du etwas casten musst bei solchen Sachen machst du idr etwas falsch.

Eine gescheite IDE hätte dir an dieser Stelle übrigens gesagt, dass du das Listener Interface nicht extenden kannst. Ansonsten solltest du aber auch an dieser Stelle einen Compiler Error bekommen.

Ich habe mein Code Snipped oben dahingehend angepasst
 
Zuletzt bearbeitet:
Oben