Hilfe beim kleinen Wetter Plugin. | Anfänger

  • German
  • Hilfe beim kleinen Wetter Plugin. | Anfänger

    So, nachdem ich seit Oktober 2016 die Flinte ins Korn geworfen habe versuche ich es heute noch mal. :S
    Als erstes möchte ich anmerken das ich keinen Plan habe was ich hier eigentlich mache, deswegen versucht bei einer Antwort so einfach wie möglich zu schreiben. :/

    Ich möchte ein kleines Plugin machen, nix besonderes, ist ja nur zum üben.
    Und zwar soll ein "normaler" Spieler, also kein Admin, per einfachen Chatbefehl /wetter das Wetter auf clear stellen können,
    Grund dafür ist das es manchmal so neblig ist das man selbst im Haus nix mehr sieht und ein Admin nicht immer da ist. :D

    Dies habe ich bis jetzt:

    Java Source Code

    1. package de.tutmeistensnix.java;
    2. import net.risingworld.api.Plugin;
    3. import net.risingworld.api.events.EventMethod;
    4. import net.risingworld.api.events.Listener;
    5. import net.risingworld.api.objects.Player;
    6. import net.risingworld.api.events.player.PlayerCommandEvent;
    7. import net.risingworld.api.events.world.WeatherChangeEvent;
    8. public class Wetter extends Plugin implements Listener{
    9. @Override
    10. public void onDisable() {
    11. // TODO Auto-generated method stub
    12. }
    13. @Override
    14. public void onEnable() {
    15. registerEventListener(this);
    16. }
    17. @EventMethod
    18. public void onCommand(PlayerCommandEvent event){
    19. Player player = event.getPlayer();
    20. String command = event.getCommand();
    21. String[] cmd = command.split(" ");
    22. if(cmd[0].equals("/wetter")){
    23. player.sendTextMessage("[#FFFFFF]Das Wetter wird geändert");
    24. }
    25. }
    26. }
    Display All
    Und ich denke mal ich muss HIER auf setNextWeather(Weather weather) zugreifen.
    Aber wie mache ich das?


    Danke für die Hilfe.

    Gruß TutMeistensNix
  • Das WeatherChangeEvent ist hierfür leider nicht ganz geeignet, denn Events sind generell nur "Ereignisse", die aktuell stattfinden, unabhängig von deinem Plugin. D.h. dieses Event wird dann aufgerufen, wenn das Wetter geändert wird (entweder via Command, oder zufällig). Du kannst dann zwar das Event abfangen und hier ein neues Wetter festlegen, aber dann müsstest du solange warten, bis sich überhaupt mal das Wetter ändert (damit das Event entsprechend aufgerufen wird).

    Wenn du "aktiv" ins Geschehen eingreifen möchtest, sind die Server und World Klassen von Relevanz. Diese bieten alle möglichen Funktionen, um irgendwas in der Welt oder an den Servereinstellungen zu ändern. Um zB das Wetter zu ändern, gibt es in der Server-Klasse die Funktion setWeather(). Um Zugriff auf den "Server" zu bekommen (wovon es nur 1 Instanz gibt), musst du in deinem Plugin die Funktion getServer() aufrufen (du kannst den Rückgabewert entweder irgendwo in einer Variable speichern und dann immer wieder verwenden, oder du rufst jedes Mal getServer() auf). Um also das Wetter zu ändern, könnte der Code so aussehen:

    Java Source Code

    1. Server server = getServer();
    2. server.setWeather(Weather.Rain, false);
  • Kann mal bitte jemand über meinen Code schauen?
    Es läuft, gibt, so weit ich das sehe, keine Fehler aus.

    Habe ich das so weit richtig gemacht oder würdet ihr sagen mach es lieber so oder so?
    Mir geht es jetzt hier um die Sache mit dem Wetter.
    Über Sinn oder Unsinn brauchen wir nicht sprechen, es geht nur um Übungsaufgaben für mich. :whistling:

    Java Source Code: TutMeistensNix.java

    1. package de.tutmeistensnix.rw;
    2. import net.risingworld.api.Plugin;
    3. import net.risingworld.api.Server;
    4. import net.risingworld.api.events.EventMethod;
    5. import net.risingworld.api.events.Listener;
    6. import net.risingworld.api.events.player.PlayerCommandEvent;
    7. import net.risingworld.api.objects.Player;
    8. public class TutMeistensNix extends Plugin implements Listener {
    9. @Override
    10. public void onEnable() {
    11. registerEventListener(this);
    12. }
    13. @Override
    14. public void onDisable() {
    15. }
    16. @EventMethod
    17. public void onCommand(PlayerCommandEvent event) {
    18. Server server = getServer();
    19. Player player = event.getPlayer();
    20. String command = event.getCommand();
    21. String[] cmd = command.split(" ");
    22. Wetter wetter = new Wetter();
    23. Essen essen = new Essen();
    24. Gesundheit gesundheit = new Gesundheit();
    25. // ########## Wetter verändern ##########
    26. if(cmd[0].equals("/wetter")) {
    27. if(cmd.length >= 2) {
    28. String art = cmd[1];
    29. wetter.neuesWetter(server, player, art);
    30. } else {
    31. player.sendTextMessage("[#FFFF00]Du musst clear, regen, nebel oder sturm schreiben. \n[#FFFF00]Beispiel: /wetter clear");
    32. }
    33. } else if(cmd[0].equals("/essen")) { // ########## Hunger und Durst stillen ##########
    34. essen.wollenEssen(player);
    35. } else if(cmd[0].equals("/heilen")) { // ########## Wie ist meine Gesundheit ##########
    36. gesundheit.meineGesundheit(player);
    37. } else if(cmd[0].equals("/ungesund")) { // ########## Mach mich krank ##########
    38. if(cmd.length >= 2) {
    39. if(cmd[1].equals("knochenbruch")) {
    40. gesundheit.brechMirDieKnochen(player, true);
    41. } else if(cmd[1].equals("bluten")) {
    42. gesundheit.ichBlute(player, true);
    43. } else {
    44. int krank = Integer.parseInt(cmd[1]); // ########## String in Int umwandeln #########
    45. gesundheit.machMichKrank(player, krank);
    46. }
    47. }else {
    48. player.sendTextMessage("[#FFFF00]Du musst knochenbruch, bluten oder eine Zahl zwischen 1 - 100 angeben. \n[#FFFF00]Beispiel: /ungesund 50 oder /ungesund knochenbruch");
    49. }
    50. }
    51. }
    52. }
    Display All


    Java Source Code: Wetter.java

    1. package de.tutmeistensnix.rw;
    2. import net.risingworld.api.Server;
    3. import net.risingworld.api.objects.Player;
    4. import net.risingworld.api.objects.Weather;
    5. public class Wetter {
    6. public void neuesWetter(Server server, Player player, String art){
    7. switch(art){
    8. case "clear": {
    9. server.setWeather(Weather.Clear, true);
    10. server.broadcastTextMessage("[#FFFF00]Das Wetter wurde von " + player.getName() + " geändert.");
    11. break;
    12. }
    13. case "regen": {
    14. server.setWeather(Weather.Rain, true);
    15. server.broadcastTextMessage("[#FFFF00]Das Wetter wurde von " + player.getName() + " geändert.");
    16. break;
    17. }
    18. case "nebel": {
    19. server.setWeather(Weather.Fog, true);
    20. server.broadcastTextMessage("[#FFFF00]Das Wetter wurde von " + player.getName() + " geändert.");
    21. break;
    22. }
    23. case "sturm": {
    24. server.setWeather(Weather.Storm, true);
    25. server.broadcastTextMessage("[#FFFF00]Das Wetter wurde von " + player.getName() + " geändert.");
    26. break;
    27. }
    28. default: {
    29. player.sendTextMessage("[#FFFF00]Du musst clear, regen, nebel oder sturm schreiben. \n[#FFFF00]Beispiel: /wetter clear");
    30. break;
    31. }
    32. }
    33. }
    34. }
    Display All
    Vielen Dank fürs anschauen.

    TutMeistensNix
  • Ich würde sagen, dass es als Übung so passt, aber wenn du mal größere Plugins schreibst, würde ich den Aufbau etwas ändern. z.B. Eigene Classe für Events; Server, Wetter, Essen und Gesundheit zu einer globalen Variable machen und in der onEnable initialisieren, damit sie überall erreichbar sind und es 1. Weniger Schreibarbeit und 2. weniger Null-Fehler kommen.

    Aber für diese Übung sollte es reichen. :thumbup:

    Wichtig: Prüfe in der Praxis immer alles durch, damit du Leichtsinnsfehler findest. ;)
    ADMIN von: Sandboxgamer ;)
    UNSER SERVER IST ONLINE! :thumbsup:
    Aber zurzeit Passwortgeschützt :(

    Unsere Homepage (im Umbau + NEU: SSL):
    sandboxgamer.de/


    Steam: steamcommunity.com/id/patrickbronke
  • Danke für deine Antwort, ich habe ja schon Wetter, Essen und Gesundheit in je eine extra Klasse gepackt.
    Um es übersichtlicher, für mich, zu machen.


    Vielmehr kann ich doch nicht auseinander nehmen da die Sachen doch in die onCommand() müssen, oder habe ich da einfach ein Denkfehler?
    zb meine Gesundheit Klasse.

    Java Source Code: Gesundheit.java

    1. package de.tutmeistensnix.rw;
    2. import net.risingworld.api.objects.Player;
    3. public class Gesundheit {
    4. public void meineGesundheit(Player player) {
    5. int meineWerte = player.getHealth();
    6. boolean knochen = player.hasBrokenBones();
    7. boolean bluten = player.isBleeding();
    8. if(meineWerte < 90) {
    9. player.setHealth(100);
    10. player.sendTextMessage("[#FFFF00]Du wurdest geheilt");
    11. } else if(meineWerte > 90 && meineWerte < 99) {
    12. player.sendTextMessage("[#FFFF00]So krank bist du noch nicht, eine Zitrone sollte da reichen!");
    13. } else {
    14. player.sendTextMessage("[#FFFF00]Du bist volkommen gesund.");
    15. }
    16. if(knochen) {
    17. player.setBrokenBones(false);
    18. player.sendTextMessage("[#FFFF00]Dein Knochenbruch wurde geheilt, ich hoffe die Schmerzen waren erträglich.");
    19. } else {
    20. player.sendTextMessage("[#FFFF00]Zum Glück hast du dir nix gebrochen.");
    21. }
    22. if(bluten) {
    23. player.setBleeding(false);
    24. player.sendTextMessage("[#FFFF00]Deine Blutung wurde gestillt.");
    25. } else {
    26. player.sendTextMessage("[#FFFF00]Wie es aussieht hast du keine Blutung.");
    27. }
    28. }
    29. public void machMichKrank(Player player, int krank) {
    30. if(krank >= 1 && krank <= 100) {
    31. player.setHealth(krank);
    32. int binKrank = player.getHealth();
    33. player.sendTextMessage("[#FFFF00]Ich glaube dir geht es gar nicht gut, du hast ja nur noch " + binKrank + " % Gesundheit.");
    34. } else {
    35. player.sendTextMessage("[#FFFF00]Bitte nur eine Zahl zwischen 1 - 100 angeben.");
    36. }
    37. }
    38. public void brechMirDieKnochen(Player player, boolean knochenBruch) {
    39. player.setBrokenBones(knochenBruch);
    40. player.sendTextMessage("[#FFFF00]KNACK! Aua, ich glaube du hast dir gerade einen Knochen gebrochen!");
    41. }
    42. public void ichBlute(Player player, Boolean bluten) {
    43. player.setBleeding(true);
    44. player.sendTextMessage("[#FFFF00]Ich glaube du hast dich geschnitten, du blutest ja!");
    45. }
    46. }
    Display All
  • Mit deiner Gesundheit ist alles ok.
    Ich meine Folgendes:

    Java Source Code: TutMeistensNix.java

    1. public class TutMeistensNix extends Plugin /*implements Listener*/ {
    2. Wetter wetter;
    3. Server server;
    4. Essen essen;
    5. Gesundheit gesundheit;
    6. // Kann nun überall verwendet werden
    7. //(Beispiel: Von Fremde class: "plugin.wetter" oder "plugin.essen");
    8. //Beispiel dieser class: wetter.neuesWetter(server, player, art); ALSO GANZ NORMAL
    9. @Override
    10. public void onEnable() {
    11. System.out.println("[TutMeistensNix] Enabled"); //<<< Damit erkennst du, ob das Plugin gestartet wird! (Konsole)
    12. //-------------------------------------------
    13. server = getServer();
    14. gesundheit = new Gesundheit(); // Initalisieren der Variablen!
    15. wetter = new Wetter(); // Muss nicht mehr neu initalisiert werden!
    16. essen = new Essen();
    17. //-------------------------------------------
    18. registerEventListener(new pluginListener(this); //<<< So kannst du die Events in eine andere Class tun;
    19. }
    20. @Override
    21. public void onDisable() {
    22. System.out.println("[TutMeistensNix] Desabled");
    23. }
    24. //@EventMethod
    25. /*public void onCommand(PlayerCommandEvent event) { // >>>>>Das würde ich alles in pluginListener tun <<<<
    26. Server server = getServer(); <<< Kann auch in die onEnabled! Muss nicht ständig neu initalisiert werden!
    27. Player player = event.getPlayer();
    28. String command = event.getCommand();
    29. String[] cmd = command.split(" ");
    30. //Wetter wetter = new Wetter(); <<<<< Nicht hier!
    31. //Essen essen = new Essen(); <<<<< Nicht hier!
    32. //Gesundheit gesundheit = new Gesundheit(); <<<<< Nicht hier!
    33. // ########## Wetter verändern ##########
    34. if(cmd[0].equals("/wetter")) {
    35. if(cmd.length >= 2) {
    36. String art = cmd[1];
    37. wetter.neuesWetter(server, player, art);
    38. } else {
    39. player.sendTextMessage("[#FFFF00]Du musst clear, regen, nebel oder sturm schreiben. \n[#FFFF00]Beispiel: /wetter clear");
    40. }
    41. } else if(cmd[0].equals("/essen")) { // ########## Hunger und Durst stillen ##########
    42. essen.wollenEssen(player);
    43. } else if(cmd[0].equals("/heilen")) { // ########## Wie ist meine Gesundheit ##########
    44. gesundheit.meineGesundheit(player);
    45. } else if(cmd[0].equals("/ungesund")) { // ########## Mach mich krank ##########
    46. if(cmd.length >= 2) {
    47. if(cmd[1].equals("knochenbruch")) {
    48. gesundheit.brechMirDieKnochen(player, true);
    49. } else if(cmd[1].equals("bluten")) {
    50. gesundheit.ichBlute(player, true);
    51. } else {
    52. int krank = Integer.parseInt(cmd[1]); // ########## String in Int umwandeln #########
    53. gesundheit.machMichKrank(player, krank);
    54. }
    55. }else {
    56. player.sendTextMessage("[#FFFF00]Du musst knochenbruch, bluten oder eine Zahl zwischen 1 - 100 angeben. \n[#FFFF00]Beispiel: /ungesund 50 oder /ungesund knochenbruch");
    57. }
    58. }
    59. }*/
    60. }
    Display All


    Das Event würde dann hier laufen:

    Java Source Code: pluginListener.java

    1. public class pluginListener implements Listener{
    2. private final TutMeistensNix plugin;
    3. public pluginListener(TutMeistensNix plugin){
    4. this.plugin = plugin;
    5. }
    6. @EventMethod
    7. public void onCommand(PlayerCommandEvent event) {
    8. //Server server = getServer(); <<<<< Ist jetzt plugin.server
    9. Player player = event.getPlayer();
    10. String command = event.getCommand();
    11. String[] cmd = command.split(" ");
    12. //Wetter wetter = new Wetter(); <<< Das kann z.B. jetzt mit plugin.wetter aufgerufen werden
    13. //Essen essen = new Essen();
    14. //Gesundheit gesundheit = new Gesundheit();
    15. // ########## Wetter verändern ##########
    16. if(cmd[0].equals("/wetter")) {
    17. if(cmd.length >= 2) {
    18. String art = cmd[1];
    19. plugin.wetter.neuesWetter(server, player, art);
    20. } else {
    21. player.sendTextMessage("[#FFFF00]Du musst clear, regen, nebel oder sturm schreiben. \n[#FFFF00]Beispiel: /wetter clear");
    22. }
    23. } else if(cmd[0].equals("/essen")) { // ########## Hunger und Durst stillen ##########
    24. /*Beispiel >>>*/plugin.essen.wollenEssen(player);
    25. } else if(cmd[0].equals("/heilen")) { // ########## Wie ist meine Gesundheit ##########
    26. plugin.gesundheit.meineGesundheit(player);
    27. } else if(cmd[0].equals("/ungesund")) { // ########## Mach mich krank ##########
    28. if(cmd.length >= 2) {
    29. if(cmd[1].equals("knochenbruch")) {
    30. plugin.gesundheit.brechMirDieKnochen(player, true);
    31. } else if(cmd[1].equals("bluten")) {
    32. plugin.gesundheit.ichBlute(player, true);
    33. } else {
    34. int krank = Integer.parseInt(cmd[1]); // ########## String in Int umwandeln #########
    35. plugin.gesundheit.machMichKrank(player, krank);
    36. }
    37. }else {
    38. player.sendTextMessage("[#FFFF00]Du musst knochenbruch, bluten oder eine Zahl zwischen 1 - 100 angeben. \n[#FFFF00]Beispiel: /ungesund 50 oder /ungesund knochenbruch");
    39. }
    40. }
    41. }
    42. }
    Display All
    ADMIN von: Sandboxgamer ;)
    UNSER SERVER IST ONLINE! :thumbsup:
    Aber zurzeit Passwortgeschützt :(

    Unsere Homepage (im Umbau + NEU: SSL):
    sandboxgamer.de/


    Steam: steamcommunity.com/id/patrickbronke
  • Ich lerne ja noch, durch lesen oder Videos gucken.
    Nun hätte dich da mal eine Frage zu deinem Code.


    Java Source Code

    1. public class TutMeistensNix extends Plugin /*implements Listener*/ {
    2. Wetter wetter;
    3. Server server;
    4. Essen essen;
    5. Gesundheit gesundheit;
    6. // Kann nun überall verwendet werden
    7. //(Beispiel: Von Fremde class: "plugin.wetter" oder "plugin.essen");
    8. //Beispiel dieser class: wetter.neuesWetter(server, player, art); ALSO GANZ NORMAL
    9. @Override
    10. public void onEnable() {
    11. System.out.println("[TutMeistensNix] Enabled"); //<<< Damit erkennst du, ob das Plugin gestartet wird! (Konsole)
    12. //-------------------------------------------
    13. server = getServer();
    14. gesundheit = new Gesundheit(); // Initalisieren der Variablen!
    15. wetter = new Wetter(); // Muss nicht mehr neu initalisiert werden!
    16. essen = new Essen();
    17. //-------------------------------------------
    18. registerEventListener(new pluginListener(this); //<<< So kannst du die Events in eine andere Class tun;
    19. }
    20. .
    21. .
    22. .
    Display All
    Lerne ich nicht die ganze Zeit das bei Java immer der Typ einer Variable angegeben werden muss damit Java weiß was da auf ihn zu kommt?

    Muss man das hier nicht machen?
    Ich frage nur um es zu verstehen, habe ja keine Ahnung. :huh:
  • Hat er doch, das hier ist die deklaration:

    Source Code

    1. // TYP variabelName
    2. Wetter wetter;
    3. Server server;
    4. Essen essen;
    5. Gesundheit gesundheit;

    Und dann hier die Zuweisungen:


    Source Code

    1. server = getServer();
    2. gesundheit = new Gesundheit(); // Initalisieren der Variablen!
    3. wetter = new Wetter(); // Muss nicht mehr neu initalisiert werden!
    4. essen = new Essen();
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Devidian wrote:

    Hat er doch, das hier ist die deklaration:

    Source Code

    1. // TYP variabelName
    2. Wetter wetter;
    3. Server server;
    4. Essen essen;
    5. Gesundheit gesundheit;
    Und dann hier die Zuweisungen:


    Source Code

    1. server = getServer();
    2. gesundheit = new Gesundheit(); // Initalisieren der Variablen!
    3. wetter = new Wetter(); // Muss nicht mehr neu initalisiert werden!
    4. essen = new Essen();
    :thumbup:
    ADMIN von: Sandboxgamer ;)
    UNSER SERVER IST ONLINE! :thumbsup:
    Aber zurzeit Passwortgeschützt :(

    Unsere Homepage (im Umbau + NEU: SSL):
    sandboxgamer.de/


    Steam: steamcommunity.com/id/patrickbronke
  • String Int etc. sind Basistypen. Wenn du selber Klassen definierst also


    Java Source Code

    1. public class Wetter {
    2. ...
    3. }
    dann kannst du ja Wetter meinWetter = new Wetter(); machen. hier ist der Typ dann Wetter weil du ein Objekt der Klasse Wetter erzeugst indem du den Konstruktor aufrufst.
    Gamer aus Leidenschaft
    (Web) Entwickler aus Leidenschaft
    <3 Vater aus Leidenschaft <3
    (prio in aufsteigender Sortierung ;) )

    ~~~~~~~~~~~~~~~~~
    1. Entweder man macht etwas richtig oder lässt es bleiben!
    2. Egal wie lange etwas dauert, Hauptsache es wird fertig (irgendwann)
    ------------------------
    Discord: Devidian#1334
  • Users Online 1

    1 Guest