- 173
- 6
- 24
мне нужно сохранять содержимое чанков(только блоки) в файлы... написал маленький мод который прекрасно выполняет эту задачу, но когда я пытаюсь сохранить чанки не с одиночной игры, а с сервера то он перестаёт работать..... нашёл в чём проблема, но почему она возникает мне не ясно
(сразу скажу что использовать просто 3 цикла и world.getBlock(x,y,z) нельзя т.к. это триггерит античит(проверено)
P.s. использую это для карты ландшафта в моей проге
(сразу скажу что использовать просто 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. использую это для карты ландшафта в моей проге