|
|
|
|
Канал X4: Foundations: «[SOFT] X4 Launcher and X4SaveAutoBackup» |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
В таком исполнении ?
|
Ага. Потом, в ExtractPlayerInfo сплитишь строки по "\n" и обрабатываешь что есть что..
добавлено спустя 19 минут:
| alexalsp : |
|
Но это если сев всегда построчный , если что то случится и он где то или весь станет в одну строку
|
Сейв - это обычный файл XML, и подчиняется общеизвестным правилам, в т.ч. обычно выглядит "правильно".
Узел info небольшой, поэтому мы можем его распарсить через обычные строки. Если XML-файл вдруг станет в одну строку - ридер просто захлебнется от ее прочтения (~0,5 Гб! ).
В этом случае парсить XML проще XML-движком (XDocument, XElement и пр.).
добавлено спустя 1 минуту:
Иначе придется парсить строку посимвольно, а это такой гемор вычленять из нее нужное и найти точку останова...
Последний раз редактировалось: igorVL (20:36 04-06-2026), всего редактировалось 2 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Перестрахойня )) посимвольная, лучше перебздеть чем не добздеть, то что обычно всегда получается неприлично ))) , тем более читает совсем ничего.
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
[04.06.2026 20:49:28.102] КОНФИГ СОХРАНЕН! Размер: 692 байт
[04.06.2026 20:49:28.263] КОНФИГ СОХРАНЕН! Размер: 692 байт
[04.06.2026 20:49:31.549] [ExtractSaveInfo] Начато чтение: quicksave.xml
[04.06.2026 20:49:31.549] [ExtractSaveInfo] Тип файла: Обычный XML
[04.06.2026 20:49:31.550] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:49:31.550] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:49:32.779] [ExtractSaveInfo] Начато чтение: save_002.xml.gz
[04.06.2026 20:49:32.779] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:49:32.780] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1442
[04.06.2026 20:49:32.780] [ExtractSaveInfo] Успешно извлечено 1442 символов XML.
[04.06.2026 20:50:11.677] [ExtractSaveInfo] Начато чтение: quicksave.xml.gz
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:50:14.214] [ExtractSaveInfo] Начато чтение: quicksave.xml
[04.06.2026 20:50:14.215] [ExtractSaveInfo] Тип файла: Обычный XML
[04.06.2026 20:50:14.215] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:50:14.216] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:50:16.600] [ExtractSaveInfo] Начато чтение: save_003.xml.gz
[04.06.2026 20:50:16.600] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:50:16.601] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1442
[04.06.2026 20:50:16.601] [ExtractSaveInfo] Успешно извлечено 1442 символов XML.
|
| Код: |
private void ExtractSaveInfo(string filePath)
{
WriteLog($"[ExtractSaveInfo] Начато чтение: {Path.GetFileName(filePath)}");
try
{
var sb = new StringBuilder();
string endTag = "</info>";
string buffer = "";
bool isGzip = filePath.EndsWith(".gz", StringComparison.OrdinalIgnoreCase);
WriteLog($"[ExtractSaveInfo] Тип файла: {(isGzip ? "GZip (сжатый)" : "Обычный XML")}");
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream stream = isGzip ? new GZipStream(fileStream, CompressionMode.Decompress) : (Stream)fileStream)
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
int charCode;
int totalChars = 0;
// Посимвольное чтение для максимальной гибкости
while ((charCode = reader.Read()) != -1)
{
char c = (char)charCode;
sb.Append(c);
buffer += c;
totalChars++;
// Поддерживаем размер буфера равным длине тега
if (buffer.Length > endTag.Length)
buffer = buffer.Substring(1);
// Если нашли тег — прерываем чтение, чтобы не читать весь файл
if (buffer == endTag)
{
WriteLog($"[ExtractSaveInfo] Тег {endTag} найден. Прочитано символов: {totalChars}");
break;
}
}
}
string result = sb.ToString();
WriteLog($"[ExtractSaveInfo] Успешно извлечено {result.Length} символов XML.");
// Передаем данные дальше
ExtractPlayerInfo(result, filePath);
}
catch (Exception ex)
{
WriteLog($"[ExtractSaveInfo] КРИТИЧЕСКАЯ ОШИБКА: {ex.Message}");
ClearAllInfo(true);
lblPlayerName.Text = $"Ошибка чтения: {ex.Message}";
lblPlayerName.ForeColor = Color.Red;
}
}
|
|
добавлено спустя 5 минут:
| igorVL : |
|
Если XML-файл вдруг станет в одну строку - ридер просто захлебнется от ее прочтения
|
Не захлебнется, если читать блоками/посимвольно до </info>.
добавлено спустя 11 минут:
А если он поврежден и нет блока инфо или поломан то что так , что так будет читать все
опять же перестрахй
добавить предохранитель
| Код: |
var sb = new StringBuilder();
string endTag = "</info>";
string buffer = "";
const int MAX_SAFE_SIZE = 100000; // 100 КБ - запас |
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (21:25 04-06-2026), всего редактировалось 3 раз(а) |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
Не захлебнется, если читать блоками/посимвольно до </info>
|
В коде ты читаешь строку целиком (ReadLine())... Прикинь строку размером с пол Гига!
Попробуй читать посимвольно и по ходу парсить что прочитал и понять - когда остановится. Это будет хохма
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
| igorVL : |
|
отом, в ExtractPlayerInfo сплитишь строки по "\n" и обрабатываешь что есть что..
|
| Код: |
var nameMatch = Regex.Match(xmlContent, @"<player name=""([^""]+)""");
var moneyMatch = Regex.Match(xmlContent, @"money=""([0-9]+)""");
var timeMatch = Regex.Match(xmlContent, @"time=""([0-9.]+)""");
// и т.д. |
Спасибо! Я посимвольным чтением собираю только блок <info> (~1.5 КБ), а внутри ExtractPlayerInfo паршу Regex'ом - так кода меньше и от переносов строк не зависит. XML-движок для таких объемов памяти не потянет, а 100 КБ лимита хватит даже на битый файл.
Или я опять не понял из за своей отсталости
добавлено спустя 2 минуты:
| igorVL : |
|
В коде ты читаешь строку целиком (ReadLine())... Прикинь строку размером с пол Гига!
|
Спасибо, за внмательность
Но в финальной версии я не использую ReadLine(). Я читаю посимвольно через reader.Read() со скользящим буфером.
Вот код:
| Код: |
csharp
int charCode;
while ((charCode = reader.Read()) != -1)
{
char c = (char)charCode;
buffer += c;
if (buffer.EndsWith("</info>")) break;
} |
ReadLine() остался только в первых черновиках. В финале от него отказался именно чтобы не зависеть от переносов строк. Так что XML хоть в одну строку, хоть с переносами — работает одинаково.
добавлено спустя 25 минут:
даже если взять
const int MAX_SAFE_SIZE = 1048576; // 1 МБ - перестраховка, так что бы вообще не париться если там прописано 1000 модорв в хистори и патче тегах что бы добраться до конца INFO, 1 секунда , а если битый файл, каким то образом, и потерялся тег /INFO, то дальше 1 метра не пойдет .
а это секунда времени прочитать метр посимвольно.
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (22:02 04-06-2026), всего редактировалось 4 раз(а) |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
внутри ExtractPlayerInfo паршу Regex'ом - так кода меньше
|
Так кода больше
| alexalsp : |
|
XML-движок для таких объемов памяти не потянет
|
Чегой??
XML-Document вытянет все файлы игры вместе взятые. Особенно если читать их через Stream, а не из файлов на диске.
Брось эти заблуждения ).
| alexalsp : |
|
прочитать метр посимвольно
|
Если файл "битый", т.е. вдруг там нет какого-л. закрывающего тега, XML-парсер это обнаружит на раз-два. Просто надо уметь его "готовить" .
Здесь у тебя фора: небольшой объем данных (info), да и еще находится почти в самом начале. А если бы этот узел был где-то в середине или в конце? Эти ReadLine() и Read() можно было бы выбросить на помойку..
добавлено спустя 6 минут:
XML парсер вычленит все узлы из корневого за доли секунды.
В этих узлах найдет нужный по атрибуту еще быстрее.
Две строчки кода и результат получен.
Без Regex'ов, без чтения и без разбора строк..
Последний раз редактировалось: igorVL (22:19 04-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
| igorVL : |
|
Эти ReadLine() и Read() можно было бы выбросить на помойку..
|
Поэтому и взял, потому что в начале. Иначе бы думалось что то другое.
Возможно и XML-Document, но он в текущем месте не шибко и нужен
Это X4 savegame - структура фиксированная:
| Код: |
| <savegame><info>...</info><universe>...</universe></savegame>. |
Info всегда в начале. Я пишу под конкретную игру, а не универсальный XML-парсер.
| igorVL : |
XML-Document вытянет все файлы игры вместе взятые. Особенно если читать их через Stream, а не из файлов на диске.
Брось эти заблуждения ).
|
Ну я не сильно разбирался с этим, не по задаче.
Покажи эти две строчки, которые прочитают 2 ГБ файл без OutOfMemoryException:
| igorVL : |
Две строчки кода и результат получен.
Без Regex'ов, без чтения и без разбора строк..
|
Как я и сказал, с профи не поспоришь, а я так , любитель на балалайке
В любом случае, даже при таких нюансах все работает...
На медне почитаю об остальном, если голова не лопнет ))
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (22:33 04-06-2026), всего редактировалось 1 раз |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Для вычитки <info> построчного чтения достаточно. Тут точно XML-движок не нужен, даже больше - он будет медленнее, т.к. ему сперва придется загрузить в себя всю савку (пол гига). И это только ради одного узла Info.
Поэтому примененный подход с чтением - самое то.
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
| igorVL : |
|
Для вычитки <info> построчного чтения достаточно. Тут точно XML-движок не нужен, даже больше
|
Мы пришли к одному и тому же выводу
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите.... |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Я не приходил, я это знал изначально .
А вот для других делов, если что из савки нужно еще достать - ридер тут уже будет не помощник..
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
X4SaveAutoBackup
1.0.12
- Переход с построчного чтения (ReadLine) на посимвольное (Read) — теперь
метод работает с любым форматированием XML (хоть с переносами строк, хоть без).
(Спасибо пилоту - igorVL, за замечание)
- Замена конкатенации строк на StringBuilder - ускорение работы и снижение
нагрузку на память.
- Добавлена защита от битых файлов - если в файле нет закрывающего тега </info>,
метод не будет читать гигабайты, а остановится через 1 МБ и выдаст ошибку.
- Добавлено логирование - чтения данных сева в лог файл.
Примечание: По ошибке был залит файл старой версии 1.0.10 вместо 1.0.11
добавлено спустя 2 минуты:
| igorVL : |
Я не приходил, я это знал изначально .
А вот для других делов, если что из савки нужно еще достать - ридер тут уже будет не помощник..
|
Согласен, ридер только для инфо в начале файла. Для других задач - другие подходы. Но мне пока только инфо и нужно, так что метод свою задачу решает отлично.
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (23:02 04-06-2026), всего редактировалось 2 раз(а) |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Как-то ранее я заикался про тулзу, которая будет находить все ничейные объекты в космосе (особенно ничейные кораблики).
Информация об таких объектах как раз находится в SAVE-файле. А он большой.
Т.е. его действительно придется весь "всасывать" в XDocument, искать все узлы с атрибутом "owner="ownerless"", среди них вычленять все по атрибуту "class="ship_s(m/l)"...
Пока поверхностный анализ таких узлов не дает понимания - где находится информация про их местоположение, хотя бы название сектора..
В свою очередь, такие ничейные объекты находятся внутри узлов зон ("<zone>"), а они, в свою очередь - в секторах (по идее).
Но я пока не нашел конкретной ссылки на местоположение этих зон и названий секторов..
На этом фронте еще поле не паханное, можно сказать. Если есть время и желание - подключайся к вопросу
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Если данные в конце файла то можно тупо читать с конца файла (Reverse read)
Если данные размазаны по всему файлу - не поможет.
XML Reader (потоковый)
Плюс: Не грузит весь файл
Минус: Всё равно читает файл последовательно до нужного места
Индексация
При первом сканировании сейва сохранять позиции ключевых узлов:
Но я не знаю как похватать быстро без напряга с разных мест много разной инфы
Но мне это , я надеюсь, и не надо будет
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите.... |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
Если данные в конце файла то можно тупо читать с конца файла (Reverse read)
|
Ну, скажем так, такие ситуации, когда что-то находится на "краях" файла - довольно редки. Поэтому всегда надо быть готовым к сложностям..
Например, как в файле языков (описания 09.dat) - в узле могут быть ссылки на другие узлы.. И так вот прыгаешь туда-сюда. Тут никакой последовательный ридер не спасет.
|
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Софтина X4SaveAutoBackup и ее тестирование в частности, выработали у меня навыки частого сохранения (quicksave по "F5") после каждого значимого действия в игре.
А после серии таких сохранений и особенно перед выходом из игры - сохранение уже в слот (save_xxx).
Таким образом, программа X4SaveAutoBackup свое дело сделала; теперь можно ей не пользоваться..
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
1.1.0
Исправления Навигатора Сохранений
1. Исправлено: словари названий для X4 и X Rebirth были общие
- Теперь у каждой игры свои словари
2. Исправлено: поиск .cat файлов
- X4 ищет в своей папке
- X Rebirth ищет в своей папке
3. Исправлено: определение игры при открытии сохранения
- Программа видит X4 или X Rebirth и показывает нужные названия
4. Исправлено: восстановление файлов
- Файл восстанавливается в свой аккаунт в папку save
- Не лезет в чужие аккаунты
5. Исправлено: сообщения при восстановлении
- Показывают куда восстанавливается
- Показывают имя резервной копии
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (02:22 07-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
1.1.1
Что удалено:
- Отслеживание запуска/закрытия игр через WMI
- Уведомления в трее при запуске/закрытии игр
- Автоматический бэкап при закрытии игры
- Отображение статуса процессов в интерфейсе
- Галочка "Мониторить процесс игры"
- Галочка "Бэкап только при запущенной игре"
- labelWmiStatus (индикатор WMI)
Как теперь работает:
Бэкапы создаются строго по расписанию (или вручную), независимо от того, запущены игры или нет.
Программа проверяет хеш папки save и делает бэкап только если файлы изменились. Этого достаточно для 99% пользователей.
Свобода Марсу.... минус 1340 строк кода....
https://www.elite-games.ru/conference/viewtopic.php?p=3768260#3768260
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (02:42 12-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
X4SaveAutoBackup
1.1.2
- Добавлены настройки резервного копирования:
Стандартная — сохранение в директорию по умолчанию: "Мои документы\Egosoft".
Выборочная — возможность указать собственный путь для хранения резервных копий.
- Оптимизация интерфейса: некоторые подсказки перенесены из элементов ListBox в
заголовки GroupBox, чтобы они не перекрывали рабочее пространство при
взаимодействии со списками.
- Навигатор сохранений:
Переработан механизм работы с директориями: теперь можно задать путь к корневой
папке бэкапов. В ней должны находиться папки аккаунтов, содержащие ZIP-архивы
или подпапки "backup_", созданные программой по умолчанию.
Все найденные сохранения добавляются в дерево и автоматически сортируются по
времени (от старых к новым). Добавлена проверка на дубликаты: программа
исключает повторное добавление файлов с идентичными параметрами (имя, дата, время).
- В списке кастомных папок чек бокс работает как выключатель бэкапов:
Отмечен - бэкапы добавились в дерево , снят - удаляются с дерева.
Удаление путей только выделенных. Можно выделять по КОНТРАЛУ несколько ,
ШИФТ+А все и через кнопку Удалить удалять не нужные пути.
|
Cкрытый текст (кликните здесь для просмотра)
|
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (03:59 14-06-2026), всего редактировалось 1 раз |
|
|
|
Shadowman
265 EGP
   Рейтинг канала: 5(205) Репутация: 42 Сообщения: 1409 Откуда: Альфа Центавра Зарегистрирован: 03.12.2003
 |
|
День добрый!
| alexalsp : |
|
Я пока отзывы и предложения слышал от тебя и вот появился Shadowman
|
Раз уж меня упомянули, дополню скриншоты выше.
|
Cкрытый текст (кликните здесь для просмотра)
|
Мне интересно настроить как раз эти две штуки (выделил красным).
А тут - облом. Вероятно, кнопочки вверх-вниз работают, но никак этого не видно и нельзя понять результат их нажатия.
Понимаю, что увеличение шрифтов не всегда гладко проходит
|
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 302 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| Shadowman : |
|
А тут - облом.
|
Интересный эффект
У тебя какая-то нестандартная тема Windows стоит? Она и меняет вид окна на такой ))
Шрифты на скриншоте не оригинальные, да еще и полу-жирным (Demi Bold). Вот и съехало все ).
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Странно, у меня с текстом все нормально
|
Cкрытый текст (кликните здесь для просмотра)
|
Какое разрешение экрана ?
добавлено спустя 4 минуты:
Конечно под всякие не стандартные темы наст подстраиваться не вариант , с интерфейсом можно повозиться и дать возможность его раздвигать и состояние записывать, что бы каждый раз не ерзать его, но ты же понимаешь ....
проверь на стандартной теме винды, я смотрю у тебя весь текст съехал, даже не уверен или получится что то накрутить что бы тема работало на проге нормально.
По ходу дела уменьшила окно а шрифт остался, либо у тебя шрифт увеличен , что навряд ли, я и так делал для слепых размер шрифта, как для себя )))
добавлено спустя 12 минут:
Я поставил в винде шрифт 150% и форма программы ни как не съехала и не изменилась, только заголовок увеличился.
Все дело в вашей теме. которая вредит своему хозяину
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (13:10 14-06-2026), всего редактировалось 2 раз(а) |
|
|
|
|
|
|
|
|
Канал X4: Foundations: «[SOFT] X4 Launcher and X4SaveAutoBackup» |
|
|