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

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

Discussion in 'Разработка плагинов для новичков' started by amorphine, Jun 13, 2016.

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

    amorphine Новичок

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

    Code:
    [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)
    
    Код следующий (тестовый)
    Code:
    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 нормально читает файл регионов.
     
    Last edited: Jun 14, 2016
  2. Хостинг MineCraft
    <
  3. alexandrage

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

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

    amorphine Новичок

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

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

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

    amorphine Новичок

    Trophy Points:
    16
    Как раз по ссылке mca - чистый NBT http://wiki.vg/Map_Format#.5Bregion.5D.mca

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


    Code:
    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]
     
    Last edited: Jun 14, 2016

Share This Page