Не могу прочитать mca через jnbt

amorphine

Новичок
Баллы
16
Пишу плагин для очистки без вайпов. Научился сохранять регионы в schematic-файле, однако не получается сохранять tileEntities через сторонние api, было решено брать их из mca-файлов. Однако столкнулся с проблемой: вылетает исключение при чтении файла

Код:
[20:44:49 WARN]: java.io.IOException: [JNBT] TAG_End found without a TAG_Compound/TAG_List tag preceding it.
[20:44:49 WARN]:     at org.jnbt.NBTInputStream.readTagPayload(NBTInputStream.java:169)
[20:44:49 WARN]:     at org.jnbt.NBTInputStream.readTag(NBTInputStream.java:145)
[20:44:49 WARN]:     at org.jnbt.NBTInputStream.readTag(NBTInputStream.java:119)
[20:44:49 WARN]:     at ru.amorphine.smartclean.lib.NtbChunk.loadNbt(NtbChunk.java:40)
[20:44:49 WARN]:     at ru.fallus.modifire.SchematicMaster.saveSchematic(SchematicMaster.java:115)
[20:44:49 WARN]:     at ru.amorphine.smartclean.RegionController.saveRegion(RegionController.java:32)
[20:44:49 WARN]:     at ru.amorphine.smartclean.SmartClean.onCommand(SmartClean.java:49)
[20:44:49 WARN]:     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[20:44:49 WARN]:     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181)
[20:44:49 WARN]:     at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:717)
[20:44:49 WARN]:     at net.minecraft.network.NetHandlerPlayServer.func_147361_d(NetHandlerPlayServer.java:1317)
[20:44:49 WARN]:     at net.minecraft.network.NetHandlerPlayServer.func_147354_a(NetHandlerPlayServer.java:1099)
[20:44:49 WARN]:     at net.minecraft.network.play.client.C01PacketChatMessage.func_148833_a(C01PacketChatMessage.java:38)
[20:44:49 WARN]:     at net.minecraft.network.play.client.C01PacketChatMessage.func_148833_a(C01PacketChatMessage.java:53)
[20:44:49 WARN]:     at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:245)
[20:44:49 WARN]:     at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:173)
[20:44:49 WARN]:     at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:991)
[20:44:49 WARN]:     at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:431)
[20:44:49 WARN]:     at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:809)
[20:44:49 WARN]:     at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:669)
[20:44:49 WARN]:     at java.lang.Thread.run(Thread.java:745)

Код следующий (тестовый)
Код:
public class NtbChunk {
private int chunk_x; 
private int chunk_z; 
private int region_x;
 private int region_z; 
private File file; 
private org.jnbt.CompoundTag tag; 
public NtbChunk(Location location) {
Block block = location.getBlock(); 
this.chunk_x = block.getChunk().getX(); this.chunk_z = block.getChunk().getZ(); 
this.region_x = (int)floor(chunk_x / 32.0); 
this.region_z = (int)floor(region_z / 32.0);/
/ TODO fix paths to regions dirthis.file = new File("/home/amorphine/eclipse/server/world/region/" +
"r." + region_x + "." + region_z + ".mca");
}
public void loadNbt() throws IOException {
NBTInputStream stream = new NBTInputStream(new FileInputStream(file), false);
CompoundTag root = (CompoundTag) stream.readTag();stream.close(); 
Map chunks_map = root.getValue();
Set<String> set = chunks_map.keySet(); 
for(String chunk_name: set) {
Bukkit.getLogger().info(chunk_name);}
}
}

NBTExplorer нормально читает файл регионов.
 
Последнее редактирование:
we api уже не вариант? Для модов ставь аддон we-forge.
 
Потому что .mca это не нбт. Иди читай wiki.vg, там есть формат. Ты и файл то неправильный получаешь.
Но в любом случае читать эти файлы во время работы сервера не самая здравая мысль, данные туда могут быть ещё не записаны.
 
Потому что .mca это не нбт. Иди читай wiki.vg, там есть формат. Ты и файл то неправильный получаешь.
Но в любом случае читать эти файлы во время работы сервера не самая здравая мысль, данные туда могут быть ещё не записаны.
Как раз по ссылке mca - чистый NBT http://wiki.vg/Map_Format#.5Bregion.5D.mca

Кто-нибудь может дать ссылку, где наглядно показано, как использовать WE API? Я сделал тестовый код, но он неправильно копирует блоки. Точнее, копирует, но без TileEntities


Код:
public class RegionController {
    private LocalWorld world;
    private Logger logger;
    private WorldEditPlugin worldEdit;
    private EditSession ed_session;
    private Player player;

    public RegionController(World world, Player player) {
        this.worldEdit = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
        this.logger = worldEdit.getLogger();
        this.ed_session = worldEdit.createEditSession(player);
        this.world = BukkitUtil.getLocalWorld(world);
        this.player = player;
    }
    public void saveRegion(SchematicMaster master, Vector pt1, Vector pt2, String filename) {
        try {        
LocalSession session = worldEdit.getSession(player);
Selection selection = new CuboidSelection(player.getWorld(), pt1, pt2);
Region region = selection.getRegionSelector().getRegion();
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
clipboard.setOrigin(pt1);
ForwardExtentCopy copy = new ForwardExtentCopy(ed_session, region, clipboard, region.getMinimumPoint());
Operations.completeLegacy(copy);
session.setClipboard(new ClipboardHolder(clipboard, ed_session.getWorld().getWorldData()));
logger.info(region.getArea() + " block(s) were copied.");
        } catch (Exception e) {
            logger.info("Ошибка");
        }
    }
}

В самом коде булево выражение, касающееся tileEntities вообще не используется, хотя как-то работает
3dd57da12dcd4928dd39ee6e520f0b84.png
 
Последнее редактирование:
Назад
Верх