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

Air zu Water Lily

DarkPrincess

Kuhfänger
Registriert
31 August 2013
Beiträge
52
Diamanten
0
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:
Block b = _w.getBlockAt(x, y, z);
Block bt = _w.getBlockAt(x, (y+1), z);
Block btt = _w.getBlockAt(x, (y+2), z);

if(!b.getType().equals(Material.AIR) && !b.getType().equals(Material.LAVA) && bt.getType().equals(Material.AIR) && btt.getType().equals(Material.AIR)) {
    if(b.getType().equals(Material.STATIONARY_WATER)) {
        Chunk ch = b.getChunk();
        if(!ch.isLoaded())
            ch.load(true);
                       
        bt.setType(Material.WATER_LILY);
        bt.getState().setType(Material.WATER_LILY);
        bt.getState().update(true);
    }
}
 

GPSforLEGENDS

Vorarbeiter
Registriert
21 März 2014
Beiträge
289
Alter
85
Diamanten
300
Minecraft
GPSforLEGENDS
Also bei mir funktioniert
Code:
Location loc = new Location(world, x, y, z);
Block b = loc.getBlock();
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...
 

DarkPrincess

Kuhfänger
Registriert
31 August 2013
Beiträge
52
Diamanten
0
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.
 

DarkPrincess

Kuhfänger
Registriert
31 August 2013
Beiträge
52
Diamanten
0
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."
 

LordKaktus

Kuhfänger
Registriert
31 Dezember 2014
Beiträge
66
Diamanten
0
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
 

Asgarioth

Kuhfänger
Registriert
17 Juli 2014
Beiträge
50
Diamanten
250
Minecraft
Asgarioth
Code:
Block b = _w.getBlockAt(x, y, z);
Block bt = _w.getBlockAt(x, (y+1), z);
Block btt = _w.getBlockAt(x, (y+2), z);

if(!b.getType().equals(Material.AIR) && !b.getType().equals(Material.LAVA) && bt.getType().equals(Material.AIR) && btt.getType().equals(Material.AIR)) {
    if(b.getType().equals(Material.STATIONARY_WATER)) {
        Chunk ch = b.getChunk();
        if(!ch.isLoaded())
            ch.load(true);
                      
        bt.setType(Material.WATER_LILY);
        bt.getState().setType(Material.WATER_LILY);
        bt.getState().update(true);
    }
}

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:
  if(b.getType().equals(Material.STATIONARY_WATER) || b.getType().equals(Material.WATER))

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
 

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
Unter dem Inneren if-Abfrage kommt noch etwas mehr Code. Deshalb ;-)
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:
if (b.getType() == Material.STATONARY_WATER && b.getData() == 0) {
  // Code
}
 
Zuletzt bearbeitet:

DarkPrincess

Kuhfänger
Registriert
31 August 2013
Beiträge
52
Diamanten
0
Das ganze schaut so aus derzeit und sitzt in deiner Runnable Class
Code:
  int x = Rnd.get(0, 40000)-20000;
  int z = Rnd.get(0, 40000)-20000;
  Chunk ch = _w.getChunkAt(x, z);
  if(!ch.isLoaded())
    ch.load();
  for(int y = 255; y > 0; y--) {
    Entity et = null;
    Block b = _w.getBlockAt(x, y, z);
    Block bt = _w.getBlockAt(x, y+1, z);
    Block btt = _w.getBlockAt(x, y+2, z);
    if(b == null || bt == null || btt == null)
      continue;
    
    CustomCommands.getPlugin().getLogger().log(Level.INFO, "b Type : " + b.getType().name() + " - bt Type : " + bt.getType().name() + " - btt Type : " + btt.getType().name());

    if(!b.getType().equals(Material.AIR) && !b.getType().equals(Material.LAVA) && bt.getType().equals(Material.AIR) && btt.getType().equals(Material.AIR)) {
      if(b.getType().equals(Material.STATIONARY_WATER)) {
        if(Rnd.get(0, 1) == 0) {
          CustomCommands.getPlugin().getLogger().log(Level.INFO, "Setze Boot ins Wasser.");
          et = _w.spawnEntity(bt.getLocation(), EntityType.BOAT);
        } else {
          CustomCommands.getPlugin().getLogger().log(Level.INFO, "Setze Seerose.");
          bt.setType(Material.WATER_LILY); 
          bt.getState().setType(Material.WATER_LILY);
          bt.getState().update(true);
        }
      }

      BukkitTask bTask = Bukkit.getScheduler().runTaskLater(CustomCommands.getPlugin(), new TeleportPlayer(_p, new Location(btt.getWorld(), btt.getX(), btt.getY(), btt.getZ()), et), 100);
      _tasks.put(_p.getName(), bTask);
      _p.sendMessage("§2Du wirst in 5 Sekunden Teleportiert.");
      return;
    }
  }
  if(ch.isLoaded())
    ch.unload();
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.
 

Asgarioth

Kuhfänger
Registriert
17 Juli 2014
Beiträge
50
Diamanten
250
Minecraft
Asgarioth
@Asgarioth, auf fließendem Wasser bzw. Material.WATER kann man keine Seerosen platzieren, weshalb es auch reicht, wenn man prüft, ob es sich um Material.STATIONARY_WATER handelt. Siehe hier.

Ein Block kann nur den Typ WATER oder STATIONARY_WATER besitzen, nicht beide.
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
 
Oben