- Сообщения
- 120
Есть огромная карта 40000 на 40000. Хочу удалить все сундуки, печки, бочки и тд. на этой карте. Как это можно сделать и реально ли это за обозримое время?
Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: This feature may not be available in some browsers.
Ну вообще, вроде как, с миром нельзя взаимодействовать в асинхронном потоке.запускай асинк таск, в котором будет три цикла for()
Далее достаешь блок по кордам и если он является сундуком, печкой или еще чем-то, то удаляй его.
Но учти, 40k * 40k * 256 = 409 млрд блоков.
Разве Paper не предоставляет такой возможности? Они вроде когда-то трогали палит контейнеры.Ну вообще, вроде как, с миром нельзя взаимодействовать в асинхронном потоке.
Можно из асинхронного потока вызывать обычный BukkitTask, который будет выполняться синхронно.Ну вообще, вроде как, с миром нельзя взаимодействовать в асинхронном потоке.
public class NBTCleaner {
private File worldFolder;
private final List<File> files = new ArrayList<>();
private final List<String> replaceList;
private int filesReplaced = 0;
private int tilesReplaced = 0;
public NBTCleaner(File worldFolder, List<String> replaceList) {
this.worldFolder = worldFolder;
this.replaceList = replaceList;
File regionFolder = new File(worldFolder, "region");
for (File file : regionFolder.listFiles()) {
if (file.getPath().endsWith(".mca")) {
files.add(file);
}
}
}
public void start() throws IOException {
for (File rawFile : files) {
try {
MCAFile file = MCAUtil.read(rawFile);
Chunk[] chunks = (Chunk[]) FieldUtils.readField(file, "chunks", true);
for (Chunk chunk : chunks) {
if (chunk == null) {
continue;
}
replaceBlocksInChunk(chunk);
}
saveFile(file);
Bukkit.getLogger().info(String.format("Region file %s/%s has been replaced and saved - %s",
filesReplaced, files.size(), rawFile.getName()));
} catch (IllegalAccessException e) {
System.out.println("Cannot get chunks from file");
}
}
Bukkit.getLogger().info("World cleaner done.");
Bukkit.getLogger().info("Total tiles replaced: " + tilesReplaced);
}
public void saveFile(MCAFile file) throws IllegalAccessException, IOException {
Files.createDirectories(Paths.get("region"));
int regionX = (int) FieldUtils.readField(file, "regionX", true);
int regionZ = (int) FieldUtils.readField(file, "regionZ", true);
File regionSaveFolder = new File(JavaPlugin.getPlugin(WorldIterator.class).getDataFolder(), String.format("worlds/%s/region", worldFolder.getName()));
if (!regionSaveFolder.exists()) {
regionSaveFolder.mkdirs();
}
File fileToSave = new File(regionSaveFolder, String.format("r.%s.%s.mca", regionX, regionZ));
MCAUtil.write(file, fileToSave);
filesReplaced ++;
}
private void replaceBlocksInChunk(Chunk chunk) throws IllegalAccessException {
for (CompoundTag tileEntity : chunk.getTileEntities()) {
String id = tileEntity.get("id").valueToString();
int x = Integer.parseInt(tileEntity.get("x").valueToString());
int y = Integer.parseInt(tileEntity.get("y").valueToString());
int z = Integer.parseInt(tileEntity.get("z").valueToString());
id = id.replaceAll("\"", "");
if ((!replaceList.isEmpty()) &&(!replaceList.contains(id))) {
continue;
}
CompoundTag air = new CompoundTag();
air.putString("Name", "minecraft:air");
chunk.setBlockStateAt(x, y, z, air, false);
tilesReplaced ++;
}
}
}
replace_list:
- 'minecraft:juke_box'
- 'minecraft:chest'
- 'minecraft:ender_chest'
- 'minecraft:anvil'
- 'minecraft:chipped_anvil'
- 'minecraft:damaged_anvil'
- 'minecraft:shulker_box'
- 'minecraft:barrel'
- 'minecraft:furnace'
Мы используем основные cookies для обеспечения работы этого сайта, а также дополнительные cookies для обеспечения максимального удобства пользователя.
Посмотрите дополнительную информацию и настройте свои предпочтения