Discord

  • 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!

Voting

SchnellfeuerXD

Minecrafter
Mitglied seit
8 Februar 2020
Beiträge
21
Hey, ich will ein StartKick Plugin Progarmmieren und bin jetzt an dem Punkt wo ich das /Ja und /Nein einbauen muss.
Ich wollt fragen wie man das angehen soll? Muss ich 2 Commands erstellen und dann eine neue Klasse mit while?
Ich habe ein Custom event für /startkick <Spieler> ersellt.
 

SirYwell

Braumeister
Osterei Experte
Mitglied seit
30 Juni 2017
Beiträge
301
Alter
20
Minecraft
SirYwell
Ich konnte jetzt auf die Schnelle nicht mal rausfinden, was ein StartKick Plugin genau sein soll. Es wäre sinnvoll, dein Vorhaben unabhängig von sowas möglichst konkret zu beschreiben, dann kann dir auch jemand weiterhelfen, ohne sich selbst erst in Recherchen stürzen zu müssen.
Wenn du zwei Befehle /ja und /nein einbauen willst, kannst du die Auftrennung an unterschiedlichen Stellen vornehmen, das ist hauptsächlich davon abhängig, wie viel dahinter an Logik dahintersteckt. Theoretisch kannst du nur einen Befehl in der plugin.yml definieren mit dem anderen als Alias und in einem CommandExecutor dann anhand des genutzten Labels entscheiden, was passieren soll. Oder du legst zwei Befehle in der plugin.yml an und weist beiden den gleichen Executor zu. Oder du nutzt zwei verschiedene CommandExecutor-Implementierungen für jeweils einen Befehl. Das wäre vermutlich das Sauberste.

Worauf möchtest du mit einer while-Schleife hinaus? Und warum hast du ein Event für einen Befehl erstellt?
 

SchnellfeuerXD

Minecrafter
Mitglied seit
8 Februar 2020
Beiträge
21
Ich konnte jetzt auf die Schnelle nicht mal rausfinden, was ein StartKick Plugin genau sein soll. Es wäre sinnvoll, dein Vorhaben unabhängig von sowas möglichst konkret zu beschreiben, dann kann dir auch jemand weiterhelfen, ohne sich selbst erst in Recherchen stürzen zu müssen.
Wenn du zwei Befehle /ja und /nein einbauen willst, kannst du die Auftrennung an unterschiedlichen Stellen vornehmen, das ist hauptsächlich davon abhängig, wie viel dahinter an Logik dahintersteckt. Theoretisch kannst du nur einen Befehl in der plugin.yml definieren mit dem anderen als Alias und in einem CommandExecutor dann anhand des genutzten Labels entscheiden, was passieren soll. Oder du legst zwei Befehle in der plugin.yml an und weist beiden den gleichen Executor zu. Oder du nutzt zwei verschiedene CommandExecutor-Implementierungen für jeweils einen Befehl. Das wäre vermutlich das Sauberste.

Worauf möchtest du mit einer while-Schleife hinaus? Und warum hast du ein Event für einen Befehl erstellt?
es kommt eine brodcast nachricht in der steht soll der Spieler "..." gekickt werden? Dann können die Spieler/ja oder /nein stimmen wenn das /ja überwiegt dann wird derjenige gekicket
 

❤️可愛いちゃん️❤️

Threadripper
Osterei Experte
Mitglied seit
19 Mai 2014
Beiträge
1.333
Alter
3
Das größte Problem für Anfanger ist oft den Kontrollfluss zu verstehen. Bukkit arbeitet, wie die meisten Systeme mit einem eigenen Event Loop. Das heißt, dass dein Code als Reaktion auf bestimmte Events aufgerufen wird und nach Beendigung die Kontrolle wieder an Bukkit abgibt.

Wenn du irgendwo in einem Event Listener die Ausführung blockierst, dann blockierst du den kompletten Server und es kommt zu massenhaften Timeouts und ggf. sogar einem Watchdogtot. Das heißt du musst den Zustand deines Plugins selbst speichern, damit du bei jedem Event genau weißt, was du tun musst. Das Konzept ist essentiell für jedes Stück Code, dass mehr als ein paar triviale Dinge tut. Aus irgendeinem Grund scheitern hier die meisten Anfänger. Solltest du den Punkt jedoch irgendwann überwunden haben:

Für eine Abstimmung brauchst du:
  1. Zustandsspeicher für alle aktiven Abstimmungen (inklusive Gegenstand der Abstimmung, eingegangene Votes)
  2. Eventlistener um auf Abstimmungen zu reagieren
  3. Einen separaten Timer (bei Bukkit kann dies der Scheduler übernehmen), der das Ende der Abstimmung festlegt
 

SchnellfeuerXD

Minecrafter
Mitglied seit
8 Februar 2020
Beiträge
21
Das größte Problem für Anfanger ist oft den Kontrollfluss zu verstehen. Bukkit arbeitet, wie die meisten Systeme mit einem eigenen Event Loop. Das heißt, dass dein Code als Reaktion auf bestimmte Events aufgerufen wird und nach Beendigung die Kontrolle wieder an Bukkit abgibt.

Wenn du irgendwo in einem Event Listener die Ausführung blockierst, dann blockierst du den kompletten Server und es kommt zu massenhaften Timeouts und ggf. sogar einem Watchdogtot. Das heißt du musst den Zustand deines Plugins selbst speichern, damit du bei jedem Event genau weißt, was du tun musst. Das Konzept ist essentiell für jedes Stück Code, dass mehr als ein paar triviale Dinge tut. Aus irgendeinem Grund scheitern hier die meisten Anfänger. Solltest du den Punkt jedoch irgendwann überwunden haben:

Für eine Abstimmung brauchst du:
  1. Zustandsspeicher für alle aktiven Abstimmungen (inklusive Gegenstand der Abstimmung, eingegangene Votes)
  2. Eventlistener um auf Abstimmungen zu reagieren
  3. Einen separaten Timer (bei Bukkit kann dies der Scheduler übernehmen), der das Ende der Abstimmung festlegt
das wären meine klassen die denke ich wichtig sind.
ich will es so machen dass immer bloß eine abstimmungzu gleichen zeit sein kann.
Kann man da irgendwelche tutorial oder seiten finden wo z.B. der schelduler erklärt wird?
und bracue ich einen neuen listener oder muss ich es in diesen schreiben?
 

Anhänge

LapisMC

Miner
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
186
Alter
21
Minecraft
LapisMC
@SchnellfeuerXD
Wieso hast du denn ein eigenes "StartKickEvent" definiert? Dieses Event wird ja nur an einer Stelle aufgerufen und der Listener beinhaltet weitere Befehlslogik. Es macht überhaupt keinen Sinn, das so umzusetzen, denn alles was der Listener macht könnte auch in der onCommand()-Methode von StartKickCommand stehen.

Events ermöglichen die Registrierung beliebig vieler Listener, die auf das entsprechende Ereignis reagieren können. Ein eigenes Event wäre insbesondere dann sinnvoll, wenn andere Plugins eine solche Möglichkeit haben sollen. Das ist hier jedoch nicht der Fall. Das Event wird an einer Stelle ausgelöst und auch nur von einem Listener verarbeitet, damit ist diese Umsetzung unnötig kompliziert.

ich will es so machen dass immer bloß eine abstimmungzu gleichen zeit sein kann.
Es wurde ja schon erwähnt, dass dein Plugin Zustände speichern können muss. Das wäre einer davon. An irgendeiner Stelle muss der momentane Status gespeichert werden (Abstimmung läuft/läuft nicht), die Stimmen der Spieler und der zu kickende Spieler. Bei Befehlsausführung wird der Status dann überprüft.

Kann man da irgendwelche tutorial oder seiten finden wo z.B. der schelduler erklärt wird?
Alle Bestandteile der Bukkit-API, so auch der Scheduler, sind im Javadoc von Spigot dokumentiert: https://hub.spigotmc.org/javadocs/spigot/index.html?overview-summary.html
Die relevanten Scheduler-Methoden sind hier aufgelistet: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/scheduler/BukkitScheduler.html
Eine Instanz von BukkitScheduler erhältst du mit Bukkit.getScheduler().

und bracue ich einen neuen listener oder muss ich es in diesen schreiben?
Eben nicht. Keine Ahnung, wo du das her hast, aber bitte höre auf alles in irgendwelche Listener und separaten Events zu schreiben. Das sorgt im Endeffekt nur für Performanceeinbußen und unnötig komplexen Code. Im Endeffekt brauchst du nur deine Befehle, die Main-Klasse des Plugins, eine Klasse die den Zustand der Abstimmung enthält (und dessen Veränderung erlaubt) und eine Implementation von Runnable, die der Scheduler zumindest zum Ende der Abstimmungszeit ausführt um diese zu beenden.
Damit wären die Zuständigkeiten bereits sinnvoll aufgeteilt.
 

SchnellfeuerXD

Minecrafter
Mitglied seit
8 Februar 2020
Beiträge
21
@SchnellfeuerXD
Wieso hast du denn ein eigenes "StartKickEvent" definiert? Dieses Event wird ja nur an einer Stelle aufgerufen und der Listener beinhaltet weitere Befehlslogik. Es macht überhaupt keinen Sinn, das so umzusetzen, denn alles was der Listener macht könnte auch in der onCommand()-Methode von StartKickCommand stehen.

Events ermöglichen die Registrierung beliebig vieler Listener, die auf das entsprechende Ereignis reagieren können. Ein eigenes Event wäre insbesondere dann sinnvoll, wenn andere Plugins eine solche Möglichkeit haben sollen. Das ist hier jedoch nicht der Fall. Das Event wird an einer Stelle ausgelöst und auch nur von einem Listener verarbeitet, damit ist diese Umsetzung unnötig kompliziert.


Es wurde ja schon erwähnt, dass dein Plugin Zustände speichern können muss. Das wäre einer davon. An irgendeiner Stelle muss der momentane Status gespeichert werden (Abstimmung läuft/läuft nicht), die Stimmen der Spieler und der zu kickende Spieler. Bei Befehlsausführung wird der Status dann überprüft.


Alle Bestandteile der Bukkit-API, so auch der Scheduler, sind im Javadoc von Spigot dokumentiert: https://hub.spigotmc.org/javadocs/spigot/index.html?overview-summary.html
Die relevanten Scheduler-Methoden sind hier aufgelistet: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/scheduler/BukkitScheduler.html
Eine Instanz von BukkitScheduler erhältst du mit Bukkit.getScheduler().


Eben nicht. Keine Ahnung, wo du das her hast, aber bitte höre auf alles in irgendwelche Listener und separaten Events zu schreiben. Das sorgt im Endeffekt nur für Performanceeinbußen und unnötig komplexen Code. Im Endeffekt brauchst du nur deine Befehle, die Main-Klasse des Plugins, eine Klasse die den Zustand der Abstimmung enthält (und dessen Veränderung erlaubt) und eine Implementation von Runnable, die der Scheduler zumindest zum Ende der Abstimmungszeit ausführt um diese zu beenden.
Damit wären die Zuständigkeiten bereits sinnvoll aufgeteilt.
Also soll ich komplett neu anfangen? Hab halt dann keine Ahnung wie ich das angehen soll?
Vielleicht solle ich es auch komplett mit den Plugins lassen anscheindend hab ich nicht das Zeug dazu :(
 

BloodEko

Schafhirte
Showcase Teilnehmer
Mitglied seit
9 September 2012
Beiträge
105
public UUID player;
public int voteYes;
public int voteNo;
public HashSet<UUID> voted;

Erstelle diese 4 Variablen in deiner Main Klasse.
Außerdem musst du 3 Commands erstellen: /votekick <name> /ja /nein

/votekick setzt die player Variable und startet BukkitScheduler#scheduleSyncDelayedTask welches später das Ergebnis auswertet, sowie alle Variablen zurücksetzt. Der Rest ist selbsterklärend?
 
Zuletzt bearbeitet:

LapisMC

Miner
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
186
Alter
21
Minecraft
LapisMC
Also soll ich komplett neu anfangen? Hab halt dann keine Ahnung wie ich das angehen soll?
Wer sagt, dass du neu anfangen musst? Du hast ja scheinbar schon einen der Befehle und das Grundgerüst, das funktioniert ja soweit auch. Nur das StartKickEvent und der zugehörige Listener sind überflüssig.

Ich weiß auch nicht, was jetzt noch so schwer sein soll. Einen Großteil des Entwurfs haben ja schon diverse User für dich übernommen, darunter auch ich in meinem letzten Post.

Vielleicht solle ich es auch komplett mit den Plugins lassen anscheindend hab ich nicht das Zeug dazu
Es ist halt keine gute Idee, mit Bukkit-Plugins anzufangen, wenn man eigentlich (noch) nicht wirklich programmieren kann. Dass dir da grundlegendes Wissen fehlt, ist klar - du hast es ja nie gelernt. Würdest du dich erstmal so weit mit Java beschäftigen, dass du die Grundprinzipien der Programmiersprache (und der Programmierung im Allgemeinen) verstehst, und dich erst dann wieder den Bukkit-Plugins zuwenden, wäre dieses Plugin eine Sache von wenigen Minuten.

public UUID player;
public int voteYes;
public int voteNo;
public HashSet<UUID> voted;

Erstelle diese 4 Variablen in deiner Main Klasse.
Das funktioniert zwar, ist aber ein eher schlechter Programmierstil. Da du sowieso lernst, solltest du dir so etwas garnicht erst angewöhnen. Problematisch daran sind:
  1. Keine Kapselung; man sollte nicht einfach public für diese Variablen benutzen, sondern den Zugriff mit private einschränken und Methoden für Zugriff und Änderung nutzen.
  2. Die Main-Klasse hat auf diese Weise mehrere Aufgaben, da darin bereits die Aktivierung/Deaktivierung des Plugins geregelt wird, mit allem was dazugehört. Der Zustand der Startkick-Abstimmung gehört in seine eigene Klasse.
Ich würde auch noch vorschlagen, die jeweilige Stimme für jeden Spieler zu speichern (z.B. in einer assoziativen Datenstruktur mit UUID und einem boolean-Wert). Dann kann sich ein Spieler auch während der Abstimmung noch umentscheiden und es lassen sich (falls nötig) die Teilnehmer der Abstimmung mit ihren jeweiligen Stimmen auflisten.
 
Oben