Сохранение чанков

Версия Minecraft
1.8.9
API
Forge
173
6
24
мне нужно сохранять содержимое чанков(только блоки) в файлы... написал маленький мод который прекрасно выполняет эту задачу, но когда я пытаюсь сохранить чанки не с одиночной игры, а с сервера то он перестаёт работать..... нашёл в чём проблема, но почему она возникает мне не ясно

(сразу скажу что использовать просто 3 цикла и world.getBlock(x,y,z) нельзя т.к. это триггерит античит(проверено)


Java:
@SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void onChunkLoad(ChunkEvent.Load event) {
        int chunkX = event.getChunk().xPosition;
        int chunkZ = event.getChunk().zPosition;

        // Убедитесь, что чанк находится в нужных пределах координат X и Z
        if (chunkX >= 0 && chunkX <= 32 && chunkZ >= -32 && chunkZ <= 0) {
            // Проверьте, не содержится ли чанк уже в списке(это что бы не сохранять одно и тоже)
            boolean contains = false;
            for (int i = 0; i < map.size(); i++) {
                ChunkCoordIntPair mapCords = map.get(i).getChunkCoordIntPair();
                if (mapCords.equals(event.getChunk().getChunkCoordIntPair())) {
                    contains = true;
                    break;
                }
            }
            if (!contains) {
                // Добавьте чанк в список
                map.add(event.getChunk());

                //порылся в методе World.isAirBlock() и повторил его логику
                ExtendedBlockStorage[] ebsl = null;

                ebsl = ReflectionHelper.getPrivateValue(Chunk.class, event.getChunk(), "field_76652_q");
                if (ebsl != null) {
                    for (int i = 0; i < ebsl.length; i++) {
                        if (mc.thePlayer != null)
                        mc.thePlayer.addChatMessage(new ChatComponentText("LOAD EBS "+i));
                        if (ebsl[i] != null) {
                            if (mc.thePlayer != null)
                            mc.thePlayer.addChatMessage(new ChatComponentText("LOAD!!!"));
                            File dir = new File(mc.mcDataDir, "terraMCB/chunk_" + event.getChunk().getChunkCoordIntPair().toString() + "/");
                            File file = new File(dir, "ebs" + i + ".bin");
                            if (!dir.exists())
                                dir.mkdirs();
                            try (FileOutputStream stream = new FileOutputStream(file)) {
                                byte[] bytes = new byte[4096];
                                int iter = 0;
                                System.out.println("ebs check");
                                System.out.println(ebsl[i]);
                                for (char c : ebsl[i].getData()) {
                                    bytes[iter] = (byte) c;
                                    iter++;
                                }
                                System.out.println("WRITED BYTES: " + iter);
                                if (mc.thePlayer != null)
                                mc.thePlayer.addChatMessage(new ChatComponentText("File - "+file.getAbsolutePath()));
                                stream.write(bytes);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } else {
                            if (mc.thePlayer != null)
                            mc.thePlayer.addChatMessage(new ChatComponentText("EBS "+i+" IS NULL"));
                        }
                    }
                } else {
                    if (mc.thePlayer != null)
                    mc.thePlayer.addChatMessage(new ChatComponentText("EBSL IS NULL!!!!!!!!!!!!!!!!!!!!!!!!!!!"));
                }

                if (mc.thePlayer != null)
                    mc.thePlayer.addChatMessage(new ChatComponentText("Loaded... " + map.size() + "/1089"));
            }
        }
    }


P.s. использую это для карты ландшафта в моей проге
 
1,371
112
241
массив ebsl содержит только null
ReflectionHelper.getPrivateValue(Chunk.class, event.getChunk(), "field_76652_q");
Т.е. идея о том, что на сервере могут быть другие маппинги, у ядра может не быть этого метода и т.д. и т.п., тебя даже не посещала?
Рефлексия - штука очень тонкая. Небольшое изменение версии forge может привести к ошибке. Что уж говорить о ядрах серверов.
Поищи другой способ.
 
173
6
24
другие маппинги
тут думаю всё правильно, потому что случайно оставил там "storageArrays" и получил краш, поставил значение из маппингов и краша нет
ядра может не быть этого метода и т.д. и т.п
разве это имеет значение? мод ведь клиентский
может тогда использовать не имя поля, а его номер?
 
1,371
112
241
Мне кажется, что проблема либо в рефлексии, либо в полученных чанках. Судя по тому, что на клиенте всё ок, то второе отметается. Можешь попробовать запустить локальный сервер в своей IDE и попробовать мод там. Результат, скорее всего, будет тот же, что и на клиенте.
Остаётся первое - рефлексия.
 
434
41
110
проблема возникает на этапе

массив ebsl содержит только null
Я практически уверен, что это дело в том, что событие на клиенте ,,брошено слишком рано,,
Обьясняю. И на сервере и на клиенте это событие бросается тогда, когда ,,чанк добавлен в провайдер,,
На стороне сервера данные уже заполнены (из файла)

На клиенте - изначально они пустые, но они ,,до-зополняются,, по мере того, как сервер отправляет пакеты с ,,вертикальными частями,, чанков. (Если конечно я правильно понял суть кода, пока копался)
Естественно оно все будет null, тк данные еще не пришли с сервера
 
Сверху