ServerPlugin Air zu Water Lily

Dieses Thema im Forum "Programmierung" wurde erstellt von DarkPrincess, 20. Januar 2015.

  1. DarkPrincess
    Offline

    DarkPrincess

    Registriert seit:
    31. August 2013
    Beiträge:
    52
    Hallo ,

    ich wollte mal fragen wie ich eine Seerose ( Water Lily ) setzen kann.

    Derzeit prüfe ich ob BlockA Wasser ist und der BlockB ( der Block über BlockA ) ob dieser Luft ist und setze dann den Type von AIR zu WATER_LILY. Allerdings ist da dann keine Seerose.

    Code (Text):
    1.  
    2. Block b = _w.getBlockAt(x, y, z);
    3. Block bt = _w.getBlockAt(x, (y+1), z);
    4. Block btt = _w.getBlockAt(x, (y+2), z);
    5.  
    6. if(!b.getType().equals(Material.AIR) && !b.getType().equals(Material.LAVA) && bt.getType().equals(Material.AIR) && btt.getType().equals(Material.AIR)) {
    7.     if(b.getType().equals(Material.STATIONARY_WATER)) {
    8.         Chunk ch = b.getChunk();
    9.         if(!ch.isLoaded())
    10.             ch.load(true);
    11.                        
    12.         bt.setType(Material.WATER_LILY);
    13.         bt.getState().setType(Material.WATER_LILY);
    14.         bt.getState().update(true);
    15.     }
    16. }
    17.  
     
    #1
  2. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Also bei mir funktioniert
    Code (Text):
    1. Location loc = new Location(world, x, y, z);
    2. Block b = loc.getBlock();
    3. b.setType(Material.WATER_LILY);
    Ich würde vermuten, dass irgendein boolean in deiner if abfrage false ist, solltest am besten einfach mal alle booleans in der Konsole ausgeben.
    Ausserdem verstehe ich nicht warum du erst abfragst ob b NICHT Luft UND NICHT Lava ist wenn du in der nächsten IF Abfrage eh abfragst ob b Wasser ist...
     
    #2
  3. DarkPrincess
    Offline

    DarkPrincess

    Registriert seit:
    31. August 2013
    Beiträge:
    52
    Unter dem Inneren if-Abfrage kommt noch etwas mehr Code. Deshalb ;-)

    Ausgegeben hab ich schon alles, Es wird in die Abfrage gegangen und wohl auch was gemacht ohne Fehlermeldung. Allerdings ist die Seerose weder als Item auf dem Grund des Meeres oder sonstigem noch ist diese auf dem Wasser.

    Das es nur an der Methode liegt wie der Block abgerufen wird , daran glaub ich ja eher weniger.
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Dann poste doch deinen verdammten kompletten Code...
     
    #4
  5. DarkPrincess
    Offline

    DarkPrincess

    Registriert seit:
    31. August 2013
    Beiträge:
    52
    A. Wenn du schlecht geschlafen hast , dann treib dich nicht in Foren herum und schreib Beiträge.
    B. Schon einmal was von Freundlichkeit gehört?
    C. Warum sollte ich? Hab ja gesagt nach dem Schliessen des Inneren If's ( if(b.getType().equals(Material.STATIONARY_WATER)) { ... } )
    kommt noch was, sprich an der Stelle um die es geht , da ist man schon dran vorbei. Genauer Lesen was man schreibt macht sinn. Ansonsten empfehle ich dir "Schreib dich nicht ab, lern Lesen."
     
    #5
  6. LordKaktus
    Offline

    LordKaktus

    Registriert seit:
    31. Dezember 2014
    Beiträge:
    66
    A: wenn du gerade deine tage hast, dann treib dich nicht....

    Feuer mit Feuer zu bekämpfen ist zwar immer wieder für die Mitleser sehr unterhaltsam, allerdings bringt es dich/uns nicht wirklich weiter

    Aus den Zeilen deines coded die du gepostet hast ist kein fehler herauszulesen.
    vielleicht ist die position von b schon falsch?
    Ist der seerosen block vielleicht nicht der über dem Wasser sondern der wasserblock selbst?
    Wo ist denn der Teil in dem du das Ziel definierst?

    lG Kaktus
     
    #6
  7. Asgarioth
    Offline

    Asgarioth

    Registriert seit:
    17. Juli 2014
    Beiträge:
    51
    Ort:
    Hessen
    Minecraft:
    Asgarioth
    Das Problem liegt nach meinem Dafürhalten in der irreführenden Bedeutung von Material.STATIONARY_WATER bzw. Material.WATER. Leider ist es (war es) nicht so, dass STATIONARY_WATER sicher eine Quelle oder WATER zwingend fließendes Wasser ist. Vielmehr scheint es so zu sein, dass sich der Typ aus der Tatsache ergibt, ob für den Block aktuell Berechnungen laufen oder nicht.

    Versuch mal die Bedingung entsprechend zu erweitern, um beide Typen zu berücksichtigen und so erwartungsgemäß in dem Zweig zu landen:

    Code (Text):
    1.  
    2.   if(b.getType().equals(Material.STATIONARY_WATER) || b.getType().equals(Material.WATER))
    3.  
    Getestet habe ich das mit deinem Code-Schnippsel nicht aber ich erinnere mich an ein ähnliches Problem mit Wasser, das ich mal hatte.

    So long,
    ~Asgarioth
     
    #7
  8. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Wenn der Code, der nicht funktioniert in einem Block steht, in dem vorher noch anderer Code ist, kann es auch an dem anderen Code liegen. Gibt es ein Problem dabei, diesen Code hier zu posten? Vielleicht kann man dir dann schnelle helfen. Manchmal ist ein Fehler an einer ganz anderen Stelle, als an der, wo er vermutet wird.

    Um zu testen, ob es sich um eine Wasserquelle handelt, musst du folgenden Code verwenden:
    Code (Text):
    1. if (b.getType() == Material.STATONARY_WATER && b.getData() == 0) {
    2.   // Code
    3. }
     
    #8
  9. DarkPrincess
    Offline

    DarkPrincess

    Registriert seit:
    31. August 2013
    Beiträge:
    52
    Das ganze schaut so aus derzeit und sitzt in deiner Runnable Class
    Code (Text):
    1.  
    2.   int x = Rnd.get(0, 40000)-20000;
    3.   int z = Rnd.get(0, 40000)-20000;
    4.   Chunk ch = _w.getChunkAt(x, z);
    5.   if(!ch.isLoaded())
    6.     ch.load();
    7.   for(int y = 255; y > 0; y--) {
    8.     Entity et = null;
    9.     Block b = _w.getBlockAt(x, y, z);
    10.     Block bt = _w.getBlockAt(x, y+1, z);
    11.     Block btt = _w.getBlockAt(x, y+2, z);
    12.     if(b == null || bt == null || btt == null)
    13.       continue;
    14.    
    15.     CustomCommands.getPlugin().getLogger().log(Level.INFO, "b Type : " + b.getType().name() + " - bt Type : " + bt.getType().name() + " - btt Type : " + btt.getType().name());
    16.  
    17.     if(!b.getType().equals(Material.AIR) && !b.getType().equals(Material.LAVA) && bt.getType().equals(Material.AIR) && btt.getType().equals(Material.AIR)) {
    18.       if(b.getType().equals(Material.STATIONARY_WATER)) {
    19.         if(Rnd.get(0, 1) == 0) {
    20.           CustomCommands.getPlugin().getLogger().log(Level.INFO, "Setze Boot ins Wasser.");
    21.           et = _w.spawnEntity(bt.getLocation(), EntityType.BOAT);
    22.         } else {
    23.           CustomCommands.getPlugin().getLogger().log(Level.INFO, "Setze Seerose.");
    24.           bt.setType(Material.WATER_LILY);
    25.           bt.getState().setType(Material.WATER_LILY);
    26.           bt.getState().update(true);
    27.         }
    28.       }
    29.  
    30.       BukkitTask bTask = Bukkit.getScheduler().runTaskLater(CustomCommands.getPlugin(), new TeleportPlayer(_p, new Location(btt.getWorld(), btt.getX(), btt.getY(), btt.getZ()), et), 100);
    31.       _tasks.put(_p.getName(), bTask);
    32.       _p.sendMessage("§2Du wirst in 5 Sekunden Teleportiert.");
    33.       return;
    34.     }
    35.   }
    36.   if(ch.isLoaded())
    37.     ch.unload();
    38.  
    39.  
    Die Meldungen kommen alle , das Boot wenn es dran ist , ist auch da und man wird auch rein gesetzt. Aber wenn die Seerose dran kommt dann kommt leider keine Seerose aber die Meldung ist vorhanden in der Console. Und ja das ganze läuft Sync, und nicht ASync.
     
    #9
  10. Asgarioth
    Offline

    Asgarioth

    Registriert seit:
    17. Juli 2014
    Beiträge:
    51
    Ort:
    Hessen
    Minecraft:
    Asgarioth
    Da muss ich Dir zustimmen, die Antwort war in dem Kontext Nonsens. Wobei ich nicht sagte, dass ein Block 2 Typen haben kann. ;)
    Sorry für die vorschnelle und unüberlegte Antwort @DarkPrincess
     
    #10
  11. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Das kann weg:
    Code (Text):
    1. bt.getState().setType(Material.WATER_LILY);
    2. bt.getState().update(true);
    // Vorheriger Post editiert.
     
    #11