• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Данные из карт клиентов разных хроник 2022-01-01

Нет прав для скачивания

Gaikotsu

яжпрограммист
Легенда
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Эксперт
Знаток
Просветитель
Магистр реакций
Знаток письма
Куратор Данных
Медаль Благодарности
Старожил II степени
Старожил I степени
Победитель в номинации 2020
Победитель в номинации 2019
Клиент разработчик
Преподаватель
За веру и верность форуму
Победитель в номинации 2018
Медаль за активность на Форуме
За заслуги перед форумом
Web разработчик
Разработчик
За знание датапака
За знание ядра
Сообщения
1 478
Розыгрыши
0
Решения
24
Репутация
5 922
Реакции
2 475
Баллы
2 188
Пользователь Gaikotsu разместил новый ресурс:

Данные из карт клиентов High Five/Lindvior/Ertheia/Infinite Odyssey - Данные из карт в текстовом виде.

Собственно говоря раскуроченные unr-файлы из клиентов High Five/Lindvior/Ertheia/Infinite Odyssey.
Могут пригодиться к примеру для выяснения координат дверей в секторе карты (искать по Tag=Mover) или к примеру идентификаторы используемых в секторе эвент-триггеров и в каком месте сектора этот триггер показывается (искать по EventID) и т.д.

Узнать больше об этом ресурсе...
 

    ツsmile10ツ

    Баллов: 9
    Спасибо за в клад в развитие форума

    volond1

    Баллов: 11
    Спасибо за в клад в развитие форума

    kick

    Баллов: 33
    Спасибо за в клад в развитие форума

Перевыложил все варианты одной раздачей, залив в OneDrive.
 
  • Мне нравится
Реакции: kick

    kick

    Баллов: 33
    Спасибо за в клад в развитие форума
Добавил данные карт из Helios и Grand Crusade.
 
Gaikotsu обновил(а) ресурс Данные из карт клиентов High Five/Lindvior/Ertheia/Infinite Odyssey/Helios/Grand Crusade новой записью:

Данные из Master Class

Добавлены данные из карт Master Class в двух вариантах:
  • архив со всеми данными из карт;
  • архив только с данными имеющими тэг Mover, т.е. с дверями.

Узнать больше об этом обновлении...
 
Ну и бонусом простенький скрипт, накорябанный буквально за полчасика :)
Парсит эти данные на тему данных о дверях и записывает найденное в отдельные файлы, в формате для PTS и в формате для серверов на базе овера

Работа с ним проста:
  • кладем скрипт куда нибудь где его можно запустить
  • создаем в папке с ним подпапки in и out
  • в in кладем файлы с данными карт
  • запускаем скрипт
  • получаем в out файлы с данными о дверях
PHP:
<?php
// рекомендуется перед запуском скрипта проверить значение "memory_limit" в php.ini и выставить его значение хотя бы в 32 мб или выше
// т.к. при работе скрипта идет загрузка файлов данных полностью в память для дальнейшей обработки

set_time_limit(0);

$files = glob("in/*.txt");

foreach ($files as $file)
{
    // такие странные действия вместо простого использования parse_ini_file для того,
    // чтобы не затерлось при парсинге значение параметра RangeDelta, по причине того
    // что дальше идут параметры RangeDelta[1] и т.д., в результате чего ini-парсер
    // заменяет массивом с ключом RangeDelta заранее внесенную строку с тем же ключом
    $data = file_get_contents($file);
    $data = str_replace("RangeDelta=", "RangeDelta[0]=", $data);
    $data = parse_ini_string($data, true, INI_SCANNER_RAW);

    $doors = [];

    foreach ($data as $d)
    {
        if ($d["Tag"] != "Mover")
            continue;

        $doorId = (int) $d["L2ServerObjectRealID"];
        $doors[$doorId]["height"] = (int) $d["RangeHeight"];
        $doors[$doorId]["loc"] = getCoords($d["Location"]);

        for ($i = 0; $i < 4; $i++)
            $doors[$doorId][$i] = getCoords($d["RangeDelta"][$i]);
    }

    if (!empty($doors))
    {
        ksort($doors);

        // запись данных о дверях в формате для PTS

        $fH = fopen("out/".basename($file), "w+");

        foreach ($doors as $doorId => $door)
        {
            $s = "door_begin\t[door_{$doorId}]\ttype=normal_type\teditor_id={$doorId}\topen_method=by_npc\t";

            if ($height > 0)
                $s .= "height={$door['height']}\t";

            $s .= "hp=126600\tphysical_defence=644\tmagical_defence=518\t";
            $s .= "pos={".implode(";", $door["loc"])."}\t";

            $t = [];
            $x = $door["loc"][0];
            $y = $door["loc"][1];
            $z = $door["loc"][2];

            for ($i = 0; $i < 4; $i++)
                $t[$i] = "{".($x + $door[$i][0]).";".($y + $door[$i][1]).";".($z + $door[$i][2])."}";

            $s .= "range={".implode(";", $t)."}\t";
            $s .= "\tdoor_end\n";
            fwrite($fH, $s);
        }

        fclose($fH);

        // запись данных о дверях в формате для сервера на базе OverWorld

        $fH = fopen("out/".str_replace(".txt", ".xml", basename($file)), "w+");

        fwrite($fH, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
        fwrite($fH, "<!DOCTYPE list SYSTEM \"doors.dtd\">\n");
        fwrite($fH, "<list>\n");

        foreach ($doors as $doorId => $door)
        {
            $s = "\t<door id=\"{$doorId}\" name=\"door_{$doorId}\" hp=\"126600\" pdef=\"644\" mdef=\"518\">\n";
            $s .= "\t\t<pos x=\"{$door['loc'][0]}\" y=\"{$door['loc'][1]}\" z=\"{$door['loc'][2]}\" />\n";

            $x = $door["loc"][0];
            $y = $door["loc"][1];
            $z = $door["loc"][2];

            $s .= "\t\t<shape";
            $s .= " ax=\"".($x + $door[0][0])."\" ay=\"".($y + $door[0][1])."\"";
            $s .= " bx=\"".($x + $door[1][0])."\" by=\"".($y + $door[1][1])."\"";
            $s .= " cx=\"".($x + $door[2][0])."\" cy=\"".($y + $door[2][1])."\"";
            $s .= " dx=\"".($x + $door[3][0])."\" dy=\"".($y + $door[3][1])."\"";
            $s .= " minz=\"".($z + $door[0][2])."\" maxz=\"".($z + $door[0][2])."\"";
            $s .= " />\n";
            $s .= "\t</door>\n";

            fwrite($fH, $s);
        }

        fwrite($fH, "</list>");
        fclose($fH);
    }

    unset($data, $doors);
}

function getCoords($s)
{
    $coords = str_replace(["[", "]", " "], "", $s);
    $coords = explode(",", $coords);
    $result = [];

    foreach ($coords as $coord)
    {
        $coord = explode("=", $coord);
        $result[] = (int) $coord[1];
    }

    return $result;
}
?>
 
Последнее редактирование:
// рекомендуется перед запуском скрипта проверить значение "memory_limit" в php.ini и выставить его значение хотя бы в 32 мб или выше // т.к. при работе скрипта идет загрузка файлов данных полностью в память для дальнейшей обработки
Можно и не так делать, а простым телодвижением установкой значения в скрипте ini_set('memory_limit', '2048M');
Для xml я конечно понимаю накалякано быстро, но можно было воспользоваться xmlwriter или
 
Ну я и написал что по быстрому накорябал скрипт, без излишеств, а так да - можно было и через SimpleXML извратиться при генерации хмлок.
 
Последнее редактирование:
  • Мне нравится
Реакции: kick
Назад
Сверху Снизу