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

Schilder Funktion und Prüfung

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
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:
    @EventHandler
    public void onSignChange(SignChangeEvent event)
    {
        Player player = event.getPlayer();
        if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]") && player.isOp())
        {
            event.setLine(1, "Hol dir dein");
            event.setLine(2, "heutiges");
            event.setLine(3, "Geschenk");
            player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt."); 
        } else {
            event.setLine(1, "Erstellt von");
            event.setLine(2, player.getName());
            event.setLine(3, "ist kein Admin.");
        }  
    }
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
 
G

games6471

Guest
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.
 
Zuletzt bearbeitet von einem Moderator:

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
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.

Zugleich überprüfst die komplette Zeile, ob diese komplett mit deinem String übereinstimmt. Hier sollte am besten contains oder ähnliches hin.


Entweder verstehe ich dich falsch oder ich muss dir widersprechen.

Die IF Abfrage :
Code:
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:
if(event.getLine(0).trim().equalsIgnoreCase("[GeschenkBox]") && player.isOp()) {

Damit Leerzeichen herausgenommen werden falls welche drin versteckt sind.
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
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.

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:
    @EventHandler
    public void onSignChange(SignChangeEvent event)
    {
        if(event.getLine(0).trim().equalsIgnoreCase("[GeschenkBox]")) {
            Player player = event.getPlayer();
            if(player.isOp()) {
                event.setLine(1, "Hol dir dein");
                event.setLine(2, "heutiges");
                event.setLine(3, "Geschenk");
                player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt."); 
            } else {
                event.setLine(1, "Erstellt von");
                event.setLine(2, player.getName());
                event.setLine(3, "ist kein Admin.");
            }
        }
    }


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


Hier die ganze Funktion wo es sich abspielt:
Code:
db.updatePlayer(player);

Code:
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event)
    {
        final Player player = event.getPlayer();
        final Block block = event.getClickedBlock();
        if (block == null)
        {
            return;
        }
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
        {
            if (block.getType().equals(Material.WALL_SIGN) || block.getType().equals(Material.SIGN_POST))
            {
                Sign sign = (Sign)block.getState();
                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"))
                {
                    event.setCancelled(true);
                    if(!BirthdayGift._playerUsed.containsKey(player) || canPlayerUse(player)) {
                        ItemStack item = getReward();
                        if(item != null) {
                            long[] itemMinMax = getMinMax(item);
                            int itemCount = (int)Rnd.get(itemMinMax[0], itemMinMax[1]);
                            for(int i = 0;i < itemCount;i++) {
                                player.getInventory().addItem(item);
                            }
                            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());
                            player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GREEN + "Birthday" + ChatColor.GRAY + "]" + ChatColor.GREEN + " Wir hoffen du kannst was mit deinem Geschenk von heute etwas anfangen.");
                            db.updatePlayer(player);
                            BirthdayGift.setPlayersLastUse(player);
                        }
                    } else {
                        player.sendMessage(ChatColor.GRAY + "[" + ChatColor.GREEN + "Birthday" + ChatColor.GRAY + "]" + ChatColor.RED + " Du hast dein heutiges Geschenk schon abgeholt. Bitte komme morgen wieder.");
                    }
                }
            }
        }
    }

Und hier die Funktion wo sich das db.updatePlayer(player); abspielt , wo die NullPointerException herkommen soll:
Code:
    public void updatePlayer(Player player)
    {
        Connection con = null;
        try
        {
            con = getConnect();
            PreparedStatement statement = con.prepareStatement("INSERT INTO `" + getTable() + "` (`playername`,`lastuse`) VALUES (?,NOW()) ON DUPLICATE KEY UPDATE lastuse=NOW()");
            statement.setString(1, player.getName());
            statement.execute();
            statement.close();
        } catch(Exception e) {
            BirthdayGift.log("Fehler beim Hinzufügen/Updatenden eines Spielers : " + e);
        }
        finally
	{
            this.close();
        }
    }

Ich weiss beim besten willen nicht wo diese her kommt.

Fehler :
Code:
[SEVERE] Could not pass event PlayerInteractEvent to BirthdayGift v0.1
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
        at org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:178)
        at net.minecraft.server.v1_4_R1.PlayerInteractManager.interact(PlayerInteractManager.java:376)
        at net.minecraft.server.v1_4_R1.PlayerConnection.a(PlayerConnection.java:657)
        at net.minecraft.server.v1_4_R1.Packet15Place.handle(SourceFile:58)
        at net.minecraft.server.v1_4_R1.NetworkManager.b(NetworkManager.java:290)
        at net.minecraft.server.v1_4_R1.PlayerConnection.d(PlayerConnection.java:113)
        at net.minecraft.server.v1_4_R1.ServerConnection.b(SourceFile:39)
        at net.minecraft.server.v1_4_R1.DedicatedServerConnection.b(SourceFile:30)
        at net.minecraft.server.v1_4_R1.MinecraftServer.r(MinecraftServer.java:598)
        at net.minecraft.server.v1_4_R1.DedicatedServer.r(DedicatedServer.java:224)
        at net.minecraft.server.v1_4_R1.MinecraftServer.q(MinecraftServer.java:494)
        at net.minecraft.server.v1_4_R1.MinecraftServer.run(MinecraftServer.java:427)
        at net.minecraft.server.v1_4_R1.ThreadServerApplication.run(SourceFile:849)
Caused by: java.lang.NullPointerException
        at de.papaharni.birthdaygift.HandleListener.onPlayerInteract(HandleListener.java:77)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
        ... 16 more
 
Zuletzt bearbeitet:
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
Code:
    @EventHandler
    public void onSignChange(SignChangeEvent event) {
        Player player = event.getPlayer();
        if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]")) {
            if(player.isOp()) {
                event.setLine(1, "Hol dir dein");
                event.setLine(2, "heutiges");
                event.setLine(3, "Geschenk");
                player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt."); 
            } else {
                event.setLine(1, "Erstellt von");
                event.setLine(2, player.getName());
                event.setLine(3, "ist kein Admin.");
            }  
        }
    }

So würde ich es machen, anstatt 2 mal auf den Prefix zu überprüfen.
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
Code:
    @EventHandler
    public void onSignChange(SignChangeEvent event) {
        Player player = event.getPlayer();
        if(event.getLine(0).equalsIgnoreCase("[GeschenkBox]")) {
            if(player.isOp()) {
                event.setLine(1, "Hol dir dein");
                event.setLine(2, "heutiges");
                event.setLine(3, "Geschenk");
                player.sendMessage("BirthdayGift Sign wurde erfolgreich erstellt."); 
            } else {
                event.setLine(1, "Erstellt von");
                event.setLine(2, player.getName());
                event.setLine(3, "ist kein Admin.");
            }  
        }
    }

So würde ich es machen, anstatt 2 mal auf den Prefix zu überprüfen.


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 :)
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
Wird beim starten aufgerufen die Verbindung

Code:
    public Database(String host, short port, String user, String pass, String name, String table)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (Throwable t)
        {
            BirthdayGift.log("Konnte den MySQL Treiber nicht finden :" + t);
        }
        this.host = host;
        this.port = port;
        this.user = user;
        this.pass = pass;
        this.name = name;
        this.table = table;
        try
        {
            this.connection = DriverManager.getConnection("jdbc:mysql://" + this.host + ":" + String.valueOf(this.port) + "/" + this.name, this.user, this.pass);
        }
        catch (SQLException e)
        {
            BirthdayGift.log("Fehler beim Verbinden zum MySQL Server :" + e);
        }
        this.setupStructure();
    }

Hier wird connection belegt welche auch durch getConnect() ebenfalls mit aufgerufen werden kann.
Code:
    public Connection getConnect()
    {
        return this.connection;
    }

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.



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

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

@pappi

Deine db Variable ist vermutlich nicht definiert?


Doch hier :
Code:
     private final BirthdayGift plugin;
    private final Config config;
    private final Database db;
    
    public HandleListener(BirthdayGift plugin)
    {
        this.plugin = plugin;
        this.config = plugin.getConfiguration();
        this.db = plugin.getDB();
    }


GetDB() kommt hier her :
Code:
    public Database getDB()
    {
        return database;
    }

und Database kommt hier her :
Code:
        database = new Database(config.database_host,
            config.database_port,
            config.database_user,
            config.database_pass,
            config.database_name,
                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.
 
Zuletzt bearbeitet:
Oben