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

Bestimmte Biome einer Welt erhalten

HardSoul

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
2 August 2012
Beiträge
759
Diamanten
251
Minecraft
HardS0ul
Hallo Leute,
ich arbeite derzeit an einem Plugin zur Verteilung von Loot. Der Code für das erstellen der Kisten und das befüllen klappt, aber jetzt muss ich das ganze auf bestimmte Biome anwenden. Hierbei mein Problem: Die Welt ist 5000x5000 groß, jeden Block darin zu untersuchen, welches Biome er hat macht Spigot nicht mit. Habt ihr somit eine Idee, wie ich jedes Biome Plains in dieser Welt mit einer Koordinate erhalte (muss nicht die Mitte sein)?

Ich scheitere dran und Google gibt mir auch keine Lösung.

Ich bedanke mich schon mal im Voraus.

MfG,
Basti07711
 
V

Victini151

Guest
Ich denke der schmiert dir ab, weil das ganze aktiv und blockend läuft. Wie wäre es, pro Tick nur eine kleine Anzahl von Y-Säulen zu prüfen? Dann würde das zwar länger brauchen, aber nicht abstürzen. Oder ist es essentiell, dass es atomar vonstatten läuft?
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Würde es theoretisch nicht auch reichen einfach Chunk für chunk zu testen? Ich meine so kleine Biome gibt es ja auch nicht. und wäre wahrscheinlich immernoch besser als 25mio blöcke zu testen.
(nur ca 695k testläufte)
 

HardSoul

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
2 August 2012
Beiträge
759
Diamanten
251
Minecraft
HardS0ul
Also im Prinzip so:

Javascript:
    public static List<Chunk> getLocation(World w){
       
        List<Chunk> cl = new ArrayList<Chunk>();
       
        Location zloc = new Location(w, 0, 0, 0);
       
        cl.add(zloc.getChunk());
       
        for(int x1 = 0; x1 < 313; x1++){
           
            zloc.setX(zloc.getX()+16);
           
            for(int z1 = 0; z1 < 313; z1++){
               
                zloc.setZ(zloc.getZ()+16);
               
                Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
               
                cl.add(c);
               
            }
           
            zloc.setZ(0);
           
            for(int z1 = 0; z1 < 313; z1++){
               
                zloc.setZ(zloc.getZ()-16);
               
                Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
               
                cl.add(c);
               
            }
           
        }
       
        zloc = new Location(w, 0, 0, 0);
       
        for(int x1 = 0; x1 < 313; x1++){
           
            zloc.setX(zloc.getX()-16);
           
            for(int z1 = 0; z1 < 313; z1++){
               
                zloc.setZ(zloc.getZ()+16);
               
                Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
               
                cl.add(c);
               
            }
           
            zloc.setZ(0);
           
            for(int z1 = 0; z1 < 313; z1++){
               
                zloc.setZ(zloc.getZ()-16);
               
                Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
               
                cl.add(c);
               
            }
           
        }
       
       
       
       
       
        List<Chunk> f = new ArrayList<Chunk>();
       
        for(Chunk fc : cl){
           
            if(w.getBiome(fc.getX(), fc.getZ()) == Biome.PLAINS){
               
                f.add(fc);
               
            }
        }
       
        return f;
    }
 

HardSoul

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
2 August 2012
Beiträge
759
Diamanten
251
Minecraft
HardS0ul
So, habe es jetzt wie folgt:
Wenn ein User den Chunk wechselt, wird überprüft, ob der Chunk bereits mit Kisten ausgestattet ist, wenn nicht, soll er die Kisten generieren. Nun aber das große Problem: Es klappt absolut nicht, weil die Location des Chunks völlig falsch sind....

Hier mal der Code;
Javascript:
    public static List<Location> cl = new ArrayList<Location>();
   
    @EventHandler
    public void onMove(PlayerMoveEvent e){
       
        if(!CitizensAPI.getNPCRegistry().isNPC(e.getPlayer())){
            if(e.getPlayer().getWorld().getName().equalsIgnoreCase("City")){
                Chunk c2 = e.getTo().getChunk();
                Location l1 = new Location(e.getPlayer().getWorld(), c2.getX(), 0, c2.getZ());
                if(l1.getWorld().getBiome(c2.getX(), c2.getZ()) == Biome.PLAINS){
                    if(!cl.contains(l1)){
                       
                        LootManager.genloot(l1);
                       
                        cl.add(l1);
                    }
                }
               
            }
        }
    }

Als Beispiel mal so:

Ich befinde mich bei x: 116, z: 304; der Chunk soll laut Bukkit die Koordianten x:7, z:19

Was mache ich falsch?
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Du weißt aber, dass Chunks nur 16x16 Blöcke groß sind und man da Problemlos in die nächsten Chunks gucken kann? Du willst nicht ernsthaft erst dann Kisten spawnen wenn der User innerhalb dieses 16x16 Chunks steht oder? Inzwischen hast du alle erdenklichen Möglichkeiten diesem Thread gehört, such dir halt eine aus...
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Also wenn ich es richtig verstehe, willst du ja nur wissen, wo die Kiste geplact wird, welches Biome dort ist, also frage doch direkt ab Location.getBiome(), weiss es zwar nicht ganz genau, aber sollte hier gehen

Wenn du keine Ahnung hast bitte einfach Ruhe geben. Die Location (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Location.html) hat diese Methode nicht. Ich denke mal du beziehst dich auf Block#getBiome() (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/block/Block.html)
 

Yellowphoenix18

Vorarbeiter
Registriert
26 März 2013
Beiträge
287
Alter
26
Diamanten
300
Minecraft
YellowPhoenix18

HardSoul

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
2 August 2012
Beiträge
759
Diamanten
251
Minecraft
HardS0ul
Ich setze es derzeit wie folgt um:
Ich starte an einer Ecke der Welt. Von der wird in x-Richtung Stück für Stück jede Minute eine bestimmte Anzahl abgearbeitet. Zu jeder x-Koordinate werden dann alle z-Koordinaten abgearbeitet. All diese Blöcke werden auf ihr Biome getestet. Wenn dieses passt, kommen sie in eine Liste. Aus dieser Liste suche ich mir zufällig Koordinaten raus, berechne eine zufällige y-koordinate, schaue, ob sie logisch ist (nicht in der Luft schwebend, etc.) und platziere und registriere dann die Kiste.
 
Oben