Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем amorphine, 13 июн 2016.

  1. Автор темы
    amorphine

    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 нормально читает файл регионов.
     
    Последнее редактирование: 14 июн 2016
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    we api уже не вариант? Для модов ставь аддон we-forge.
     
  4. Автор темы
    amorphine

    amorphine Новичок

    Баллы:
    16
    не осилил.
    Точнее, копирнуть, сохранить могу, но теряю tileEntities, которые крайне важны
     
  5. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Потому что .mca это не нбт. Иди читай wiki.vg, там есть формат. Ты и файл то неправильный получаешь.
    Но в любом случае читать эти файлы во время работы сервера не самая здравая мысль, данные туда могут быть ещё не записаны.
     
  6. Автор темы
    amorphine

    amorphine Новичок

    Баллы:
    16
    Как раз по ссылке 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 вообще не используется, хотя как-то работает
    [​IMG]
     
    Последнее редактирование: 14 июн 2016

Поделиться этой страницей