<?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;
}
?>