ServerPlugin Fehler an Plugin

Dieses Thema im Forum "Programmierung" wurde erstellt von herberti, 27. Januar 2013.

  1. herberti
    Online

    herberti

    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 (Text):
    1. Calendar aktuellezeit = Calendar.getInstance(Locale.GERMANY);
    2.     long difference = aktuellezeit.getTimeInMillis() - hmap.get(event.getPlayer()).getTimeInMillis();
    3.     int seconds = (int)(difference / 1000 % 60);
    4.     if(seconds <= 60)
    5.  
     
    #1
  2. ChunkNorris
    Online

    ChunkNorris

    lade das mal bei pastebin oder so hoch, das kann ja kein schwein lesen.
     
    #2
  3. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    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 (Text):
    1. public class Reward extends JavaPlugin implements Listener {    
    2.     public HashMap<String, Long> hasw = new HashMap<String, Long>();
    3.  
    4.  
    5.     @Override
    6.     public void onEnable() {
    7.         this.getServer().getPluginManager().registerEvents(this, this);
    8.     }
    9.  
    10.  
    11.     @EventHandler
    12.     public void onPlayerMove(PlayerMoveEvent event) {
    13.         Player player = event.getPlayer();
    14.         Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
    15.         if (hasw.containsKey(player.getName())) {
    16.             long difference = System.currentTimeMillis() - hasw.get(player.getName());
    17.             int seconds = (int) (difference / 1000 % 60);
    18.             if (seconds <= 60) {
    19.                 if (loc.getBlock().getTypeId() == 9) {
    20.                     player.sendMessage("Test 1");
    21.                 }
    22.             }
    23.         } else {
    24.             hasw.put(player.getName(), System.currentTimeMillis());
    25.             if (loc.getBlock().getTypeId() == 9) {
    26.                 player.sendMessage("Test 2");
    27.             }
    28.         }
    29.     }
    30. }
     
    #3
  4. herberti
    Online

    herberti

    Jetzt wird garnichts mehr ausgegeben und der Spieler kommt auch nicht in die Hashmap.
    Test soll auch ausgegeben werden wenn der Spieler noch nicht in der Hashmap ist, danach ist er es ja.
     
    #4
  5. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Kommt davon wen man es nicht Testet, hab es geändert :)
     
    #5
  6. herberti
    Online

    herberti

    Jetzt wird allerdings bei jeder bewegung Test 1 ausgegeben. :D
     
    #6
  7. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    klar weil die Sekunden ja kleiner als 60 sind. Was soll das den überhaupt werden?
     
    #7
  8. herberti
    Online

    herberti

    Wenn man Wasser betritt soll alle 60 Sekunden was ausgegeben werden.
    Aber nur wenn man auf Wasser steht und nur alle 60 Sekunden.
     
    #8
  9. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Code (Text):
    1.  
    2. public class Reward extends JavaPlugin implements Listener {
    3.     public HashMap<String, Long> hasw = new HashMap<String, Long>();
    4.  
    5.  
    6.     @Override
    7.     public void onEnable() {
    8.         this.getServer().getPluginManager().registerEvents(this, this);
    9.     }
    10.  
    11.  
    12.     @EventHandler
    13.     public void onPlayerMove(PlayerMoveEvent event) {
    14.         Player player = event.getPlayer();
    15.         Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
    16.         if (hasw.containsKey(player.getName())) {
    17.             long difference = System.currentTimeMillis() - hasw.get(player.getName());
    18.             long seconds = (difference / 1000 % 60);
    19.             if (loc.getBlock().getTypeId() != 9) {
    20.                 hasw.remove(player.getName());
    21.                 player.sendMessage("Spieler hat Wasser verlassen");
    22.                 return;
    23.             } else {
    24.                 if (seconds == 59) {
    25.                     player.sendMessage("Spieler 60 Sekunden im Wasser");
    26.                     hasw.remove(player.getName());
    27.                 }
    28.             }
    29.  
    30.  
    31.         } else {
    32.             if (loc.getBlock().getTypeId() == 9) {
    33.                 hasw.put(player.getName(), System.currentTimeMillis());
    34.                 player.sendMessage("Spieler im Wasser");
    35.             }
    36.         }
    37.     }
    38. }
     
    #9
  10. herberti
    Online

    herberti

    Ich hab mich etwas schlecht ausgedrückt.
    Einfach gesagt: Wenn man über z.B. Stone läuft bekommt man ein Item das aber nur alle 60 Sekunden
     
    #10
  11. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Also ohne reset wenn er das Wasser verlässt?
     
    #11
  12. herberti
    Online

    herberti

    Ja allerdings klappt das mit dem 60 Sekunden im Wasser nicht.
     
    #12
  13. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Läuft bei mir, ich hab mal die Sekunden ausgeben lassen, klappt soweit alles.
    Code (Text):
    1. public class Reward extends JavaPlugin implements Listener {
    2.     public HashMap<String, Long> hasw = new HashMap<String, Long>();
    3.  
    4.  
    5.     @Override
    6.     public void onEnable() {
    7.         this.getServer().getPluginManager().registerEvents(this, this);
    8.     }
    9.  
    10.  
    11.     @EventHandler
    12.     public void onPlayerMove(PlayerMoveEvent event) {
    13.         Player player = event.getPlayer();
    14.         Location loc = player.getLocation().add(0.0D, -1.0D, 0.0D);
    15.         if (hasw.containsKey(player.getName())) {
    16.             long difference = System.currentTimeMillis() - hasw.get(player.getName());
    17.             long seconds = (difference / 1000 % 60);
    18.             System.out.println(seconds);
    19.             if (seconds == 59) {
    20.                 if (loc.getBlock().getTypeId() == 9) {
    21.                     player.sendMessage("Spieler 60 Sekunden im Wasser");
    22.                     hasw.remove(player.getName());
    23.                 }
    24.             }
    25.         } else {
    26.             if (loc.getBlock().getTypeId() == 9) {
    27.                 hasw.put(player.getName(), System.currentTimeMillis());
    28.                 player.sendMessage("Spieler im Wasser");
    29.             }
    30.         }
    31.     }
    32. }
     
    #13
  14. herberti
    Online

    herberti

    Ja die Sekunden werden gezählt soweit geht es auch, aber es kommt nach den 59 Sekunden nie Spieler 60 Sekunden im Wasser und wenn man danach das Wasser wieder betritt Spieler im Wasser.
     
    #14
  15. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Hab den EventHandler nochmal angepasst:

    [​IMG]


    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.
     
    #15
  16. herberti
    Online

    herberti

    Bei mir fängt es erneut zum zählen an und gibt kein 60 Sek im Wasser aus.
    wasser.JPG
     
    #16
  17. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Mal andersherum, hoffe das wars dan nu :p

    Code (Text):
    1. public class Reward extends JavaPlugin implements Listener {
    2.     public HashMap<String, Long> hasw   = new HashMap<String, Long>();
    3.     final private static long    MINUTE = 1200L;
    4.  
    5.  
    6.     @Override
    7.     public void onEnable() {
    8.         this.getServer().getPluginManager().registerEvents(this, this);
    9.     }
    10.  
    11.  
    12.     @EventHandler
    13.     public void onPlayerMove(PlayerMoveEvent event) {
    14.         Player player = event.getPlayer();
    15.         Block block = player.getLocation().getBlock().getRelative(BlockFace.DOWN);
    16.         if (hasw.containsKey(player.getName())) {
    17.             if (block.getTypeId() == 9) {
    18.                 long currTicks = hasw.get(player.getName()) + 1L;
    19.                 hasw.put(player.getName(), currTicks);
    20.                 if (currTicks >= MINUTE) {
    21.                     player.sendMessage("Spieler 60 Sekunden im Wasser");
    22.                     hasw.remove(player.getName());
    23.                 }
    24.             }
    25.         } else {
    26.             if (block.getTypeId() == 9) {
    27.                 hasw.put(player.getName(), 0L);
    28.             }
    29.         }
    30.     }
    31. }
     
    #17
  18. herberti
    Online

    herberti

    Nein, leider noch immer das selbe wie vorhin.
     
    #18
  19. Calenria
    Offline

    Calenria

    Registriert seit:
    28. Juli 2012
    Beiträge:
    387
    Minecraft:
    Calenria
    Bei klappt es nun einwandfrei, es zählt auf nur wenn das Wasser mindestens 2 Blöcke tief ist und man schwimmt.
     
    #19
  20. herberti
    Online

    herberti

    Bei mir nicht:eek:
    Sobald ich ins Wasser gehe steht da Spieler im Wasser.
    Aber es kommt nie 60 Sekunden im Wasser auch wenn es wieder von 0 zu zählen beginnt.
     
    #20