ServerPlugin Bestimmte Biome einer Welt erhalten

Dieses Thema im Forum "Programmierung" wurde erstellt von Basti07711, 14. November 2015.

  1. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    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
     
    #1
  2. Victini151
    Online

    Victini151

    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?
     
    #2
  3. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Nein, es muss nicht alles gleichzeitig sein. Nur habe ich selber noch keine gute Lösung dafür gehabt, es Stück für Stück zu machen.
     
    #3
  4. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    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)
     
    #4
  5. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    Eine Möglichkeit wäre auch erst leere Kisten zu spawnen und sie erst zu befüllen wenn ein Spieler sie zum ersten mal öffnet. Dabei kannst du auch gleich das biome überprüfen.
     
    #5
    Verschraubt gefällt das.
  6. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Also im Prinzip so:

    Code (Javascript):
    1.     public static List<Chunk> getLocation(World w){
    2.        
    3.         List<Chunk> cl = new ArrayList<Chunk>();
    4.        
    5.         Location zloc = new Location(w, 0, 0, 0);
    6.        
    7.         cl.add(zloc.getChunk());
    8.        
    9.         for(int x1 = 0; x1 < 313; x1++){
    10.            
    11.             zloc.setX(zloc.getX()+16);
    12.            
    13.             for(int z1 = 0; z1 < 313; z1++){
    14.                
    15.                 zloc.setZ(zloc.getZ()+16);
    16.                
    17.                 Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
    18.                
    19.                 cl.add(c);
    20.                
    21.             }
    22.            
    23.             zloc.setZ(0);
    24.            
    25.             for(int z1 = 0; z1 < 313; z1++){
    26.                
    27.                 zloc.setZ(zloc.getZ()-16);
    28.                
    29.                 Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
    30.                
    31.                 cl.add(c);
    32.                
    33.             }
    34.            
    35.         }
    36.        
    37.         zloc = new Location(w, 0, 0, 0);
    38.        
    39.         for(int x1 = 0; x1 < 313; x1++){
    40.            
    41.             zloc.setX(zloc.getX()-16);
    42.            
    43.             for(int z1 = 0; z1 < 313; z1++){
    44.                
    45.                 zloc.setZ(zloc.getZ()+16);
    46.                
    47.                 Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
    48.                
    49.                 cl.add(c);
    50.                
    51.             }
    52.            
    53.             zloc.setZ(0);
    54.            
    55.             for(int z1 = 0; z1 < 313; z1++){
    56.                
    57.                 zloc.setZ(zloc.getZ()-16);
    58.                
    59.                 Chunk c = w.getChunkAt(zloc.getBlockX(), zloc.getBlockZ());
    60.                
    61.                 cl.add(c);
    62.                
    63.             }
    64.            
    65.         }
    66.        
    67.        
    68.        
    69.        
    70.        
    71.         List<Chunk> f = new ArrayList<Chunk>();
    72.        
    73.         for(Chunk fc : cl){
    74.            
    75.             if(w.getBiome(fc.getX(), fc.getZ()) == Biome.PLAINS){
    76.                
    77.                 f.add(fc);
    78.                
    79.             }
    80.         }
    81.        
    82.         return f;
    83.     }
     
    #6
  7. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    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;
    Code (Javascript):
    1.     public static List<Location> cl = new ArrayList<Location>();
    2.    
    3.     @EventHandler
    4.     public void onMove(PlayerMoveEvent e){
    5.        
    6.         if(!CitizensAPI.getNPCRegistry().isNPC(e.getPlayer())){
    7.             if(e.getPlayer().getWorld().getName().equalsIgnoreCase("City")){
    8.                 Chunk c2 = e.getTo().getChunk();
    9.                 Location l1 = new Location(e.getPlayer().getWorld(), c2.getX(), 0, c2.getZ());
    10.                 if(l1.getWorld().getBiome(c2.getX(), c2.getZ()) == Biome.PLAINS){
    11.                     if(!cl.contains(l1)){
    12.                        
    13.                         LootManager.genloot(l1);
    14.                        
    15.                         cl.add(l1);
    16.                     }
    17.                 }
    18.                
    19.             }
    20.         }
    21.     }

    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?
     
    #7
  8. Victini151
    Online

    Victini151

    Multiplizier die Chunkkoordinaten doch mit 16 ;)

    Das sind die Offsets auf einer Chunkbasierten Karte
     
    #8
  9. GPSforLEGENDS
    Offline

    GPSforLEGENDS

    Registriert seit:
    21. März 2014
    Beiträge:
    295
    Ort:
    Bürostuhl
    Minecraft:
    GPSforLEGENDS
    ChunkLoadEvent wäre angebrachter.
     
    #9
  10. 可愛い
    Offline

    可愛い

    Registriert seit:
    19. Mai 2014
    Beiträge:
    655
    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...
     
    #10
  11. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    Ja hab ich ja schon, läuft auch einwandfrei, danke ^^
     
    #11
  12. KootekPL112
    Offline

    KootekPL112

    Registriert seit:
    9. Februar 2015
    Beiträge:
    20
    Was ist nun die Lösung :c?
     
    #12
  13. Yellowphoenix18
    Offline

    Yellowphoenix18

    Registriert seit:
    26. März 2013
    Beiträge:
    267
    Ort:
    Niedersachsen
    Minecraft:
    YellowPhoenix18
    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
     
    #13
  14. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    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)
     
    #14
  15. Yellowphoenix18
    Offline

    Yellowphoenix18

    Registriert seit:
    26. März 2013
    Beiträge:
    267
    Ort:
    Niedersachsen
    Minecraft:
    YellowPhoenix18
    #15
  16. Basti07711
    Offline

    Basti07711 Ehem. Teammitglied

    Registriert seit:
    2. August 2012
    Beiträge:
    714
    Ort:
    Hinter dir
    Minecraft:
    Basti07711
    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.
     
    #16