Schilder Funktion und Prüfung

Dieses Thema im Forum "Programmierung" wurde erstellt von Pappi, 6. Juni 2013.

  1. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Hallo Community,

    ich hoffe ich bin hier richtig gelandet.

    Ich wollte gerne ein kleines Plugin Schreiben welches dem Spieler an besonderen Tagen ( definiert in der Config ) , eines aus mehreren möglichen Items gibt, dies ist 1 mal pro Tag möglich.

    Soweit ist der Grund schon fertig. Allerdings fehlen mir 2 kleine sachen bzw 1 Fehlt und die andere klappt nicht wie sie es sollte ( meiner ansicht nach )

    1. Meine Funktion onSignChange(SignChangeEvent event) scheint nicht so zu funktionieren wie ich dachte das diese es tun wird.
    Wie stelle ich es nun an das dass Sign welches ich erstelle mit [EinText] erkannt wird und zB Zeilen beim setzten hinzugefügt werden wenn man die rechte hat? Derzeit schaut es bei mir so aus :
    Code (Text):
    1.  
    2.     @EventHandler
    3.     public void onSignChange(SignChangeEvent event)
    4.     {
    5.         Player player = event.getPlayer();
    6.         if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]") && player.isOp())
    7.         {
    8.             event.setLine(1, "Hol dir dein");
    9.             event.setLine(2, "heutiges");
    10.             event.setLine(3, "Geschenk");
    11.             player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt.");
    12.         } else {
    13.             event.setLine(1, "Erstellt von");
    14.             event.setLine(2, player.getName());
    15.             event.setLine(3, "ist kein Admin.");
    16.         }  
    17.     }
    Doch das funktioniert leider nicht. Fehlt was oder brauch ich eine andere Funktion?

    2. Wie kann ich das Schild immer um 0:00 Uhr neu prüfen lassen und ggf dann anpassen?


    Wäre schön wenn dort jemand eine Ahnung hat und weiter helfen könnte.

    Mit freundlichem Gruß
    PapaHarni
     
    #1
  2. games6471
    Online

    games6471

    Also zu Punkt eins kann ich dir schon einmal sagen, dass das else immer ausgeführt wird, wenn nur eins von den beiden Überprüfungen false ist. Also auch wenn man etwas anderes in die erste Zeile schreibt.

    EDIT: equalsIgnoreCase ist doch vollkommen in Ordnung.
     
    #2
  3. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni

    Entweder verstehe ich dich falsch oder ich muss dir widersprechen.

    Die IF Abfrage :
    Code (Text):
    1. if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]") && player.isOp()) {
    besagt "ist in Zeile 1 des Schildes [GeschenkBox] oder auch [geschenkbox] oder wie auch immer von der Gross- und Kleinschreibung und ist der Spieler Operator dann machen dies. Wenn beides nicht zustimmt dann mach else

    Man könnte nun zur sicherheit noch es so machen :
    Code (Text):
    1. if(event.getLine(0).trim().equalsIgnoreCase("[GeschenkBox]") && player.isOp()) {
    Damit Leerzeichen herausgenommen werden falls welche drin versteckt sind.
     
    #3
  4. Problem hierbei ist, wenn besagter Spieler zum Beispiel in die erste Zeile "Hallo" schreibt -> Der else teil wird aufgerufen und damit die anderen Zeilen editiert.
     
    #4
  5. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Ahh stimmt ^^ So könnte keiner mehr Schilder erstellen. Also ganze ohne else machen sondern lieber mit else if equals("[GeschenkBox]") && !player.isOp()) {

    Thx.

    Edit:
    Lücke geschlossen.
    Code (Text):
    1.     @EventHandler
    2.     public void onSignChange(SignChangeEvent event)
    3.     {
    4.         if(event.getLine(0).trim().equalsIgnoreCase("[GeschenkBox]")) {
    5.             Player player = event.getPlayer();
    6.             if(player.isOp()) {
    7.                 event.setLine(1, "Hol dir dein");
    8.                 event.setLine(2, "heutiges");
    9.                 event.setLine(3, "Geschenk");
    10.                 player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt.");
    11.             } else {
    12.                 event.setLine(1, "Erstellt von");
    13.                 event.setLine(2, player.getName());
    14.                 event.setLine(3, "ist kein Admin.");
    15.             }
    16.         }
    17.     }

    Neues problem :
    Nun bekomme ich ganz komischerweise eine NullPointerException aus Zeile 77 welche folgende ist :


    Hier die ganze Funktion wo es sich abspielt:
    Code (Text):
    1. db.updatePlayer(player);
    Code (Text):
    1.     @EventHandler
    2.     public void onPlayerInteract(PlayerInteractEvent event)
    3.     {
    4.         final Player player = event.getPlayer();
    5.         final Block block = event.getClickedBlock();
    6.         if (block == null)
    7.         {
    8.             return;
    9.         }
    10.         if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
    11.         {
    12.             if (block.getType().equals(Material.WALL_SIGN) || block.getType().equals(Material.SIGN_POST))
    13.             {
    14.                 Sign sign = (Sign)block.getState();
    15.                 if (sign.getLine(0).trim().equalsIgnoreCase("[GeschenkBox]") && sign.getLine(1).trim().equalsIgnoreCase("Hol dir dein") && sign.getLine(2).trim().equalsIgnoreCase("heutiges") && sign.getLine(3).trim().equalsIgnoreCase("Geschenk"))
    16.                 {
    17.                     event.setCancelled(true);
    18.                     if(!BirthdayGift._playerUsed.containsKey(player) || canPlayerUse(player)) {
    19.                         ItemStack item = getReward();
    20.                         if(item != null) {
    21.                             long[] itemMinMax = getMinMax(item);
    22.                             int itemCount = (int)Rnd.get(itemMinMax[0], itemMinMax[1]);
    23.                             for(int i = 0;i < itemCount;i++) {
    24.                                 player.getInventory().addItem(item);
    25.                             }
    26.                             player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GREEN + "Birthday" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Herzlichen Glückwunsch. Du hast heute erhalten : " + String.valueOf(itemCount) + " x " + item.getType().name());
    27.                             player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GREEN + "Birthday" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Wir hoffen du kannst was mit deinem Geschenk von heute etwas anfangen.");
    28.                             db.updatePlayer(player);
    29.                             BirthdayGift.setPlayersLastUse(player);
    30.                         }
    31.                     } else {
    32.                         player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GREEN + "Birthday" + ChatColor.GRAY + "]" + ChatColor.RED + " Du hast dein heutiges Geschenk schon abgeholt. Bitte komme morgen wieder.");
    33.                     }
    34.                 }
    35.             }
    36.         }
    37.     }
    Und hier die Funktion wo sich das db.updatePlayer(player); abspielt , wo die NullPointerException herkommen soll:
    Code (Text):
    1.     public void updatePlayer(Player player)
    2.     {
    3.         Connection con = null;
    4.         try
    5.         {
    6.             con = getConnect();
    7.             PreparedStatement statement = con.prepareStatement("INSERT INTO `" + getTable() + "` (`playername`,`lastuse`) VALUES (?,NOW()) ON DUPLICATE KEY UPDATE lastuse=NOW()");
    8.             statement.setString(1, player.getName());
    9.             statement.execute();
    10.             statement.close();
    11.         } catch(Exception e) {
    12.             BirthdayGift.log("Fehler beim Hinzufügen/Updatenden eines Spielers : " + e);
    13.         }
    14.         finally
    15.     {
    16.             this.close();
    17.         }
    18.     }
    Ich weiss beim besten willen nicht wo diese her kommt.

    Fehler :
    Code (Text):
    1. [SEVERE] Could not pass event PlayerInteractEvent to BirthdayGift v0.1
    2. org.bukkit.event.EventException
    3.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
    4.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    5.         at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
    6.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
    7.         at org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:178)
    8.         at net.minecraft.server.v1_4_R1.PlayerInteractManager.interact(PlayerInteractManager.java:376)
    9.         at net.minecraft.server.v1_4_R1.PlayerConnection.a(PlayerConnection.java:657)
    10.         at net.minecraft.server.v1_4_R1.Packet15Place.handle(SourceFile:58)
    11.         at net.minecraft.server.v1_4_R1.NetworkManager.b(NetworkManager.java:290)
    12.         at net.minecraft.server.v1_4_R1.PlayerConnection.d(PlayerConnection.java:113)
    13.         at net.minecraft.server.v1_4_R1.ServerConnection.b(SourceFile:39)
    14.         at net.minecraft.server.v1_4_R1.DedicatedServerConnection.b(SourceFile:30)
    15.         at net.minecraft.server.v1_4_R1.MinecraftServer.r(MinecraftServer.java:598)
    16.         at net.minecraft.server.v1_4_R1.DedicatedServer.r(DedicatedServer.java:224)
    17.         at net.minecraft.server.v1_4_R1.MinecraftServer.q(MinecraftServer.java:494)
    18.         at net.minecraft.server.v1_4_R1.MinecraftServer.run(MinecraftServer.java:427)
    19.         at net.minecraft.server.v1_4_R1.ThreadServerApplication.run(SourceFile:849)
    20. Caused by: java.lang.NullPointerException
    21.         at de.papaharni.birthdaygift.HandleListener.onPlayerInteract(HandleListener.java:77)
    22.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    23.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    24.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    25.         at java.lang.reflect.Method.invoke(Unknown Source)
    26.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
    27.         ... 16 more
     
    #5
  6. Code (Text):
    1.  
    2.     @EventHandler
    3.     public void onSignChange(SignChangeEvent event) {
    4.         Player player = event.getPlayer();
    5.         if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]")) {
    6.             if(player.isOp()) {
    7.                 event.setLine(1, "Hol dir dein");
    8.                 event.setLine(2, "heutiges");
    9.                 event.setLine(3, "Geschenk");
    10.                 player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt.");
    11.             } else {
    12.                 event.setLine(1, "Erstellt von");
    13.                 event.setLine(2, player.getName());
    14.                 event.setLine(3, "ist kein Admin.");
    15.             }  
    16.         }
    17.     }
    18.  
    So würde ich es machen, anstatt 2 mal auf den Prefix zu überprüfen.
     
    #6
  7. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni

    Naja hab das "Player player = event.getPlayer();" erst nach der erste Abfrage gemacht damit es nicht unnötig abgefragt wird wenn es nicht das passende Schild ist bzw der passende Text :)
     
    #7
  8. Galliar12
    Offline

    Galliar12

    Registriert seit:
    16. Juli 2011
    Beiträge:
    85
    Minecraft:
    Galliar12
    Zum NP: Du definierst con mit null, sicher dass er eine Verbindung aufbaut und einen neuen Wert bekommt? ;)
     
    #8
  9. games6471
    Online

    games6471

    Auch das "con = getConnect();" gesehen?

    @pappi

    Deine db Variable ist vermutlich nicht definiert?
     
    #9
  10. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Wird beim starten aufgerufen die Verbindung

    Code (Text):
    1.     public Database(String host, short port, String user, String pass, String name, String table)
    2.     {
    3.         try
    4.         {
    5.             Class.forName("com.mysql.jdbc.Driver");
    6.         }
    7.         catch (Throwable t)
    8.         {
    9.             BirthdayGift.log("Konnte den MySQL Treiber nicht finden :" + t);
    10.         }
    11.         this.host = host;
    12.         this.port = port;
    13.         this.user = user;
    14.         this.pass = pass;
    15.         this.name = name;
    16.         this.table = table;
    17.         try
    18.         {
    19.             this.connection = DriverManager.getConnection("jdbc:mysql://" + this.host + ":" + String.valueOf(this.port) + "/" + this.name, this.user, this.pass);
    20.         }
    21.         catch (SQLException e)
    22.         {
    23.             BirthdayGift.log("Fehler beim Verbinden zum MySQL Server :" + e);
    24.         }
    25.         this.setupStructure();
    26.     }
    Hier wird connection belegt welche auch durch getConnect() ebenfalls mit aufgerufen werden kann.
    Code (Text):
    1.     public Connection getConnect()
    2.     {
    3.         return this.connection;
    4.     }
    con wird im Try belegt und wenn da ein fehler wäre müsste ja das Exception dort anschlagen. Dies ist aber nicht der Fall.



    ----------------------------------------


    Doch hier :
    Code (Text):
    1.      private final BirthdayGift plugin;
    2.     private final Config config;
    3.     private final Database db;
    4.    
    5.     public HandleListener(BirthdayGift plugin)
    6.     {
    7.         this.plugin = plugin;
    8.         this.config = plugin.getConfiguration();
    9.         this.db = plugin.getDB();
    10.     }

    GetDB() kommt hier her :
    Code (Text):
    1.     public Database getDB()
    2.     {
    3.         return database;
    4.     }
    und Database kommt hier her :
    Code (Text):
    1.         database = new Database(config.database_host,
    2.             config.database_port,
    3.             config.database_user,
    4.             config.database_pass,
    5.             config.database_name,
    6.                 config.database_table);
    Und das wird schon zu beginn benötigt um die SPieler aus der DB zu laden welches ja auch ohne probleme klappt.
     
    #10