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

Fehler an Plugin

H

herberti

Guest
Ich finde den Fehler bei deisem Code nicht:

http://pastebin.com/0Hr6jJp1

Ich bekomme pausenlos Test ausgegeben obwohl es nur alle 60 Sekunden ausgegeben werden sollte.
Meine vermutung ist, dass etwas an diesem Teil nicht stimmt.
Code:
Calendar aktuellezeit = Calendar.getInstance(Locale.GERMANY);
    long difference = aktuellezeit.getTimeInMillis() - hmap.get(event.getPlayer()).getTimeInMillis();
    int seconds = (int)(difference / 1000 % 60);
    if(seconds <= 60)
 
Zuletzt bearbeitet von einem Moderator:

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
45
Diamanten
300
Minecraft
Calenria
http://pastebin.com/5DaD0pdh

du gibst auch test aus wenn der Player nicht in der HashMap ist und übrigens sollte man keine Player Objekte in ner HashMap speichern.

Edit: Warum speicherst du das Calendar Objekt auch in der HashMap du brauchst doch eh nur den Timestamp da reicht ein System.currentTimeMillis().

Schau mal ob das besser funktioniert, nicht getestet.
Code:
public class Reward extends JavaPlugin implements Listener {    
    public HashMap<String, Long> hasw = new HashMap<String, Long>();


    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }


    @EventHandler
    public void onPlayerMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
        if (hasw.containsKey(player.getName())) {
            long difference = System.currentTimeMillis() - hasw.get(player.getName());
            int seconds = (int) (difference / 1000 % 60);
            if (seconds <= 60) {
                if (loc.getBlock().getTypeId() == 9) {
                    player.sendMessage("Test 1");
                }
            }
        } else {
            hasw.put(player.getName(), System.currentTimeMillis());
            if (loc.getBlock().getTypeId() == 9) {
                player.sendMessage("Test 2");
            }
        }
    }
}
 
Zuletzt bearbeitet:

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
45
Diamanten
300
Minecraft
Calenria
Code:
public class Reward extends JavaPlugin implements Listener {
    public HashMap<String, Long> hasw = new HashMap<String, Long>();


    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }


    @EventHandler
    public void onPlayerMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
        if (hasw.containsKey(player.getName())) {
            long difference = System.currentTimeMillis() - hasw.get(player.getName());
            long seconds = (difference / 1000 % 60);
            if (loc.getBlock().getTypeId() != 9) {
                hasw.remove(player.getName());
                player.sendMessage("Spieler hat Wasser verlassen");
                return;
            } else {
                if (seconds == 59) {
                    player.sendMessage("Spieler 60 Sekunden im Wasser");
                    hasw.remove(player.getName());
                }
            }


        } else {
            if (loc.getBlock().getTypeId() == 9) {
                hasw.put(player.getName(), System.currentTimeMillis());
                player.sendMessage("Spieler im Wasser");
            }
        }
    }
}
 

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
45
Diamanten
300
Minecraft
Calenria
Läuft bei mir, ich hab mal die Sekunden ausgeben lassen, klappt soweit alles.
Code:
public class Reward extends JavaPlugin implements Listener {
    public HashMap<String, Long> hasw = new HashMap<String, Long>();


    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }


    @EventHandler
    public void onPlayerMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
        if (hasw.containsKey(player.getName())) {
            long difference = System.currentTimeMillis() - hasw.get(player.getName());
            long seconds = (difference / 1000 % 60);
            System.out.println(seconds);
            if (seconds == 59) {
                if (loc.getBlock().getTypeId() == 9) {
                    player.sendMessage("Spieler 60 Sekunden im Wasser");
                    hasw.remove(player.getName());
                }
            }
        } else {
            if (loc.getBlock().getTypeId() == 9) {
                hasw.put(player.getName(), System.currentTimeMillis());
                player.sendMessage("Spieler im Wasser");
            }
        }
    }
}
 
Zuletzt bearbeitet:

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
45
Diamanten
300
Minecraft
Calenria
Hab den EventHandler nochmal angepasst:

WAhCq2R.png



Grad noch mal ein wenig überlegt, im Grunde müsstest du das ganze andersherum aufziehen und jedesmal die Sekunden hochzählen wenn ein Spieler auf dem gewünschten Block läuft. Also bei jedem PlayerMoveEvent wo der Spieler auf dem Block ist 2 Ticks hochzählen. Soweit ich weiß kommt das Event nur alle Zwei Ticks beim Plugin an.
 
Zuletzt bearbeitet:

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
45
Diamanten
300
Minecraft
Calenria
Mal andersherum, hoffe das wars dan nu :p

Code:
public class Reward extends JavaPlugin implements Listener {
    public HashMap<String, Long> hasw   = new HashMap<String, Long>();
    final private static long    MINUTE = 1200L;


    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
    }


    @EventHandler
    public void onPlayerMove(PlayerMoveEvent event) {
        Player player = event.getPlayer();
        Block block = player.getLocation().getBlock().getRelative(BlockFace.DOWN);
        if (hasw.containsKey(player.getName())) {
            if (block.getTypeId() == 9) {
                long currTicks = hasw.get(player.getName()) + 1L;
                hasw.put(player.getName(), currTicks);
                if (currTicks >= MINUTE) {
                    player.sendMessage("Spieler 60 Sekunden im Wasser");
                    hasw.remove(player.getName());
                }
            }
        } else {
            if (block.getTypeId() == 9) {
                hasw.put(player.getName(), 0L);
            }
        }
    }
}
 
Zuletzt bearbeitet:
Oben