ServerPlugin Hilfe! Zuviele Touchs

Dieses Thema im Forum "Programmierung" wurde erstellt von Muchacho LP, 27. April 2013.

  1. Muchacho LP
    Offline

    Muchacho LP

    Registriert seit:
    12. März 2013
    Beiträge:
    378
    Ort:
    ALT + F4
    Minecraft:
    ikrumi
    Hallo liebe Community.


    Habe wieder eine sehr wichtige Frage:

    Bei meinem Plugin passiert einiges, sobald ich einen blauen Block berühre.
    Das klappt auch alles schön und gut, aber wenn ich einmal drüberlaufe, denkt Bukkit, bzw. mein Plugin, dass ich fünfmal drüber laufe (iwas mit Intervall?!).

    Kennt jemand ne Lösung?


    Vielen Dank im Vorraus

    Grüße Muchacho LP
     
    #1
  2. herberti
    Online

    herberti

    Wie wärs mit näheren Infos (wie z.b. Code) ?
    Ein moveevent wird bei jeder bewegung des spielers aufgerufen, daher kann das Event öfters aufgerufen werden als es soll.
     
    #2
  3. Muchacho LP
    Offline

    Muchacho LP

    Registriert seit:
    12. März 2013
    Beiträge:
    378
    Ort:
    ALT + F4
    Minecraft:
    ikrumi
    Code (Text):
    1. @EventHandler
    2. public void onPlayerMove(PlayerMoveEvent event){   
    3.         Player p = event.getPlayer();
    4.         final Location loc = event.getTo();
    5.         final Location loc2 = event.getFrom();
    6.         loc.setY(loc.getY() - 1);
    7.         loc2.setY(loc2.getY() - 1);
    8.     final World w = loc.getWorld();
    9.     final Block b = w.getBlockAt(loc);
    10.         if(b.getType() == Material.WOOL){
    11.         Wool wool = new Wool(b.getType(), b.getData());
    12.         if(wool.getColor() == DyeColor.BLUE){
    Rest nebensächlich.
    Wie kann ich das verhindern?

    Weiss jemand eine Antwort???
     
    #3
  4. delta242
    Offline

    delta242

    Registriert seit:
    28. Mai 2012
    Beiträge:
    90
    Du machst ne ArrayList in die du einspeicherst, wer schon drüber gelaufen ist, dann ne Überprüfung ob der Spieler schon drin steht, wenn nicht, dann trägst du ihn ein. So was in der Art kannst du nutzen.
     
    #4
  5. ChunkNorris
    Online

    ChunkNorris

    Du kannst auch mit Reflection nen Block ändern, der hat nämlich ne Methode die aufgerufen wird wenn der Spieler den Block berührt. So macht Soulsand zB. langsamer.
     
    #5
  6. Muchacho LP
    Offline

    Muchacho LP

    Registriert seit:
    12. März 2013
    Beiträge:
    378
    Ort:
    ALT + F4
    Minecraft:
    ikrumi
    Also das mit der ArrayList klappt, aber dann kann ich den Block insgesamt auch nur einmal benutzen.
    Denn wenn ich am Ende den Spieler aus der ArrayList remove, wird er wieder zu oft berührt!

    EDIT:
    Habs geschafft.
    Danke an alle.
     
    #6
  7. Lingo
    Offline

    Lingo

    Registriert seit:
    18. Februar 2012
    Beiträge:
    23
    Ort:
    Graben (bei Karlsruhe)
    das lässt sich auch ganz einfach anders lösen:

    Code (Text):
    1. @EventHandler
    2. public void onPlayerMove(PlayerMoveEvent event){   
    3.         Player p = event.getPlayer();
    4.         final Location loc = event.getTo();
    5.         final Location loc2 = event.getFrom();
    6.         loc.setY(loc.getY() - 1);
    7.         loc2.setY(loc2.getY() - 1);
    8.         [COLOR="#FFA500"]if(loc.getBlock().equals(loc2.getBlock()))
    9.             return;[/COLOR]
    10.     final World w = loc.getWorld();
    11.     final Block b = w.getBlockAt(loc);
    12.         if(b.getType() == Material.WOOL){
    13.         Wool wool = new Wool(b.getType(), b.getData());
    14.         if(wool.getColor() == DyeColor.BLUE){
    Code ungetestet, kleinere Fehler möglich...


    damit frägst du ab, dass es während er auf dem block ist nochmal ausgelöst wird...


    Gruß
     
    #7
  8. Muchacho LP
    Offline

    Muchacho LP

    Registriert seit:
    12. März 2013
    Beiträge:
    378
    Ort:
    ALT + F4
    Minecraft:
    ikrumi
    Ist schon längst gelöst^^
     
    #8