Multi Module Project - Command Interface

Registriere dich, um den vollen Funktionsumfang des Forums ausnutzen zu können.
  • Hey,

    ich taste mich momentan ein wenig an die Programmierung mit Maven in verschiedenen Modulen heran. Genauer gesagt programmiere ich ein Spigot und BungeeCord Permission System.
    Hierzu habe ich mir gedacht, dass ich Gemeinsamkeiten der beiden Plugins einfach in ein Core Modul verschieben kann, von dem dann die Plugin-Module erben können.

    Nun habe ich ein Interface "Command" erstellt, welches in verschiedenen Klassen im Core implementiert werden soll. Problematisch ist jetzt nur, dass im Spigot sowie BungeeCord verschiedene "CommandSender" Klassen existieren und ich vor habe Nachrichten über die Implementierungen des Interfaces Command an den Spieler zu senden.

    Es würde mich freuen, wenn ihr eure Ideen dazu mit mir teilen würdet.

    lg. Paul

  • Hey,


    ich würde so vor gehen:


    1. Eine Art "Provider" Klasse im Core.

    2. Wrapper Interfaces für in deinem Beispiel den CommandSender / Player -> "WrappedPlayer" (enthält sendMessage, etc.).

    3. Functions im Provider definieren, die jeweils implementiert werden müssen. In der Provider Class z.B eine Function<Object, WrappedPlayer>, die jeweils in onLoad / onEnable überschrieben werden muss.


    Nun kannst du in deinem Command Interface mit WrappedPlayer arbeiten. Um ein Spigot / Bungeecord Player umzuwandeln, benötigst du nun lediglich die Function. (z.B. Provider.getPlayerFunction().apply(Player / CommandSender)).



    Um nochmal genauer auf die Functions einzugehen, so könnte ein Beispiel aussehen:

    Code
    1. Function<Object, WrappedPlayer> function = input -> {
    2. if ( !( input instanceof Player ) )
    3. return null;
    4. return new WrappedPlayer() {
    5. public void sendMessage( String message ) {
    6. ( (Player) input ).sendMessage( message );
    7. }
    8. };
    9. };




    Gruß

    Paskal

  • Hey,


    ja, zum Beispiel. Das mit Instanzen zu implementieren ist allerdings Teils recht umständlich, da du an vielen Stellen die Instanz bzw. Methode brauchst. Daher würde ich dir raten, Getter wie Setter der Function static zu machen. So ersparst du dir Arbeit. Du kannst z.B. in der Bungee onLoad hingehen und sagen Provider.setPlayerFunction(new Func....). Sowie du auch an anderen Stellen einfach Provider.getPlayerFunction().apply.... machen kannst.


    Gruß

    Paskal

  • Hey,


    in der Praxis ist Function da und funktioniert auch. Eine NullPointerException bzw. eine ClassCastException wird lediglich gethrowed, wenn BungeeCord / Spigot / einen Fehler haben bzw. dein Plugin falsch initialisiert wurde. Wenn du unbedingt willst, kannst du den Getter in z.B. einen Optional packen.



    Gruß

    Paskal