Jeder halbwegs erfahrene Softwareentwickler wird dir davon abraten,
die eierlegende Wollmilchsau zu programmieren. Wer schon einmal sowas gebaut hat, weiß auch ganz genau warum. Wer nicht, sollte einfach mal 10 Minuten logisch darüber nachdenken, wie sinnvoll sowas ist bzw. wo die Nachteile liegen. Ich helfe da gerne auf die Sprünge:
- Das Plugin wird früher oder später Abhängigkeiten haben und jeder, der an dem Plugin arbeiten oder es nutzen will, muss dann ebenfalls alle Abhängigkeiten korrekt installieren (z. B. muss man ein Economy-Plugin installieren, bloß um eine Broadcast-Funktion zu testen)
- Um das obige Problem zu umgehen, fängt man damit an, bestimmte Funktionen an- und abschaltbar zu machen. Vielleicht kommt man sogar auf die grandiose Idee, das Plugin modular aufzubauen. Spätestens jetzt fällt auf, dass man diesen Ansatz von Anfang hätte verfolgen sollen, aber jetzt ist es zu spät, also arbeitet man mit dem Misthaufen weiter
- In Minecraft äußert sich das obige Problem vor allem dann, wenn es mehrere Welten/Server gibt, auf denen nicht zwangsläufig dieselben Module aktiv sind. Dann ist überall dasselbe Plugin drauf, aber mal ist die Hälfte aktiviert, mal ist sie deaktiviert usw. Irgendwann fängt man dann automatisch an, das zu tun, was man von Anfang an hätte tun sollen
- Niemand kann an dem Systems arbeiten, ohne Zugriff auf alles zu bekommen
- Eine Fehlfunktion des Plugins kann dazu führen, dass auch alle anderen Module nicht mehr funktionieren
- Irgendwann wird das Projekt zwangsläufig unübersichtlich und unkontrollierbar. Keiner traut sich mehr, irgendwas anzupassen, weil man nicht weiß, was da womöglich noch alles dran hängt. Von der Idee, irgendwas davon mal neu zu entwickeln, kann man sich natürlich auch verabschieden, weil alles fest verdrahtet ist. Wäre es das nicht, hätten wir einen modularen Aufbau und sind wieder bei (2)
- ...
Ok, bevor ich damit weiter mache, kann man sich jetzt natürlich fragen, was das denn für Vorteile hätte?
- Man spart sich das Anlegen neuer Projekte (also 1-2 Minuten)
- Modularität erfordert ggf. mehr Code (der sich erst später auszahlt)
- Modulare Softwareentwicklung erfordert Erfahrung (die bei den meisten nicht gegeben ist)
Aber um das mal abzukürzen hier meine Empfehlung: Für jedes
Feature des Servers, das als eigenständiges System betrachtet werden kann, sollte es ein Plugin geben, das nur mit den Systemen verbunden ist, die es zwingend braucht (z. B. Homes, Warps, Votes, Geld, Chat, Grundstücke, ...). Um ein Wirrwarr an Abhängigkeiten zu vermeiden, kann man APIs entwickeln, die dann von den einzelnen Systemen genutzt werden. Kleinere Befehle kann man in einem Plugin sammeln, allerdings nur solange, wie diese nicht irgendwelche neuen Abhängigkeiten ins Spiel bringen.
Jedes Plugin bzw. jedes System sollte auf jeden Fall die Events eigenständig behandeln, denn sonst zerstört man alle Vorteile, die Events bieten, allen voran die Modularität. Was glaubst du, wofür es Prioritäten gibt und warum Events als abgebrochen markiert werden können? Auf gar keinen Fall sollte ein EventHandler für verschiedene Systeme genutzt werden, weil es im Normalfall nur Nachteile bringt. Wenn man an den vorhandenen Schnittstellen vorbei programmiert, macht man sich das Leben in Zukunft nur schwerer.
Performance ist übrigens nur eine von vielen Anforderungen an ein Softwaresystem. Programmieranfänger hängen sich gerne daran auf (weiß ich selbst sehr gut), auch wenn der potenzielle Gewinn so gering ist, dass er wahrscheinlich niemals zum Tragen kommt (gerade in Bukkit/Spigot entstehen Performance-Probleme ganz woanders). Die Hardware kann man skalieren und die wird ohnehin von selber besser, aber die Steine, die man sich durch unverständliche und schlecht wartbare Software ans Bein gebunden hat, wird man nicht so einfach wieder los.