Bonjour à tous,
J'ai cherché une méthode efficace pour vider les chunks en version 1.21.5. Après avoir testé des plugins comme FAWE, j’ai réalisé que je ne voulais pas dépendre d’un outil externe qui pourrait limiter la mise à jour de mon serveur à ma convenance. J’ai donc réfléchi à une approche optimisée : bien que la modification d’un bloc doive se faire dans le thread principal, la lecture des données et le changement de biome peuvent s’effectuer en dehors de celui-ci.
J’ai expérimenté sur mon serveur One Block avec une zone de 5x5 chunks, comprenant 8 chunks vides et 1 plein, couvrant les couches de -64 à 250. Résultat : chaque chunk, vide ou rempli, est traité en une seconde, sans engendrer de ralentissement du serveur.
Je un peu modifier mon code pour qu'il soit utilisable, à savoir que List<Double> contient 4 valeurs : la valeur minimal du chunk x, maximal x, minimal z et maximal z.
Comme dans le deuxième code il y à les variables directement à créer vous même ou à remplacer par une List<Double> comme le premier code.
Exemple en image mon premier chunk en 0,0 sera de -2 x à 2 x et de -2 z à 2 z
Exemple en image
En espérant que ça aide et si vous avez des optis hésitez pas je prend
J'ai cherché une méthode efficace pour vider les chunks en version 1.21.5. Après avoir testé des plugins comme FAWE, j’ai réalisé que je ne voulais pas dépendre d’un outil externe qui pourrait limiter la mise à jour de mon serveur à ma convenance. J’ai donc réfléchi à une approche optimisée : bien que la modification d’un bloc doive se faire dans le thread principal, la lecture des données et le changement de biome peuvent s’effectuer en dehors de celui-ci.
J’ai expérimenté sur mon serveur One Block avec une zone de 5x5 chunks, comprenant 8 chunks vides et 1 plein, couvrant les couches de -64 à 250. Résultat : chaque chunk, vide ou rempli, est traité en une seconde, sans engendrer de ralentissement du serveur.
Je un peu modifier mon code pour qu'il soit utilisable, à savoir que List<Double> contient 4 valeurs : la valeur minimal du chunk x, maximal x, minimal z et maximal z.
Comme dans le deuxième code il y à les variables directement à créer vous même ou à remplacer par une List<Double> comme le premier code.
Exemple en image mon premier chunk en 0,0 sera de -2 x à 2 x et de -2 z à 2 z
Exemple en image
Java:
public static void changerBiomeChunks(String biome, List<Double> ile) {
Bukkit.getScheduler().runTaskAsynchronously(General.main, () -> {
World world = Bukkit.getWorld(General.one_block.getName());
Biome targetBiome = Biome.valueOf(biome.toUpperCase());
for (int x = ile.get(0).intValue(); x <= ile.get(1).intValue(); x++) {
for (int z = ile.get(2).intValue(); z <= ile.get(3).intValue(); z++) {
if (!world.isChunkGenerated(x, z)) continue; // Ignore les chunks non générés
Chunk chunk = world.getChunkAt(x, z);
for (int cx = 0; cx < 16; cx++) {
for (int cz = 0; cz < 16; cz++) {
for (int cy = world.getMinHeight(); cy < world.getMaxHeight(); cy++) {
chunk.getBlock(cx, cy, cz).setBiome(targetBiome);
}
}
}
}
}
});
}
Java:
public void supprimerChunk() {
Bukkit.getScheduler().runTaskAsynchronously(General.main, () -> {
World world = Bukkit.getWorld(General.one_block.getName());
for (int x = chunk_min_x.intValue(); x <= chunk_max_x.intValue(); x++) {
for (int z = chunk_min_z.intValue(); z <= chunk_max_z.intValue(); z++) {
Chunk chunk = world.getChunkAt(x, z);
if (!world.isChunkGenerated(x, z)) continue; // Ignore les chunks non générés
List<Block> blocksToRemove = new ArrayList<>();
for (int bx = 0; bx < 16; bx++) {
for (int by = world.getMinHeight(); by < world.getMaxHeight(); by++) {
for (int bz = 0; bz < 16; bz++) {
Block block = chunk.getBlock(bx, by, bz);
if (block.getType() != Material.AIR) {
blocksToRemove.add(block); // Stocker les blocs à modifier
}
}
}
}
// Modifier les blocs sur le thread principal
Bukkit.getScheduler().runTask(General.main, () -> {
for (Block block : blocksToRemove) {
block.setType(Material.AIR);
}
});
}
}
});
}
En espérant que ça aide et si vous avez des optis hésitez pas je prend
