Когда-то, в одной из тем обещался выложить написанный собственноручно небольшой класс для работы с данными из скриптов PTS. Как только добавлю в него все что хотел из планируемого.
Но вот что-то все никак руки не доходят дописать его до конца
Так что выкладываю можно сказать промежуточный вариант, но которого вполне достаточно для того чтобы удовлетворить большую часть хотелок по парсу и извлечению нужных данных из скриптов.
Все методы в классе снабжены комментариями, так что думаю...
<?php
require_once "L2Data.php";
$data = L2SData::loadData("npcdata.txt", 2);
$pch = L2SData::loadPch("item_pch.txt");
// ===
function getGroupedList($type, $data)
{
global $dom;
$node = $dom->createElement("rewardlist");
$node->setAttribute("type", $type);
for ($i = 0; $i < $data["count"]; $i++)
{
$gNode = $dom->createElement("group");
$gNode->setAttribute("chance", $data[$i]["chance"]);
for ($j = 0; $j < $data[$i]["count"]; $j++)
{
$rNode = $dom->createElement("reward");
$rNode->setAttribute("id", $data[$i][$j][0]);
$rNode->setAttribute("min", $data[$i][$j][1]);
$rNode->setAttribute("max", $data[$i][$j][2]);
$rNode->setAttribute("chance", $data[$i][$j][3]);
$gNode->appendChild($rNode);
}
$node->appendChild($gNode);
}
return $node;
}
function getNotGroupedList($type, $data)
{
global $dom;
$node = $dom->createElement("rewardlist");
$node->setAttribute("type", $type);
for ($j = 0; $j < $data["count"]; $j++)
{
$rNode = $dom->createElement("reward");
$rNode->setAttribute("id", $data[$j][0]);
$rNode->setAttribute("min", $data[$j][1]);
$rNode->setAttribute("max", $data[$j][2]);
$rNode->setAttribute("chance", $data[$j][3]);
$node->appendChild($rNode);
}
return $node;
}
// ===
$dom = new DOMDocument();
$dom->formatOutput = true;
$node = $dom->appendChild($dom->createElement("list"));
ksort($data);
foreach ($data as $id => $npc)
{
$drop1 = L2SData::parseList(L2SData::getValue($npc, "additional_make_multi_list"), L2_ITEMS_LIST_GROUPED);
$drop2 = L2SData::parseList(L2SData::getValue($npc, "ex_item_drop_list"), L2_ITEMS_LIST_GROUPED);
$drop3 = L2SData::parseList(L2SData::getValue($npc, "additional_make_list"), L2_ITEMS_LIST_NOT_GROUPED);
$spoil = L2SData::parseList(L2SData::getValue($npc, "corpse_make_list"), L2_ITEMS_LIST_NOT_GROUPED);
if (empty($drop1) && empty($drop2) && empty($drop3) && empty($spoil))
continue;
$npcNode = $dom->createElement("npc");
$npcNode->setAttribute("id", $id);
if (!empty($drop1))
{
$drop1 = L2SData::applyPch($drop1, $pch);
$npcNode->appendChild(getGroupedList("RATED_GROUPED", $drop1));
}
if (!empty($drop2))
{
$drop2 = L2SData::applyPch($drop2, $pch);
$npcNode->appendChild(getGroupedList("NOT_RATED_GROUPED", $drop2));
}
if (!empty($drop3))
{
$drop3 = L2SData::applyPch($drop3, $pch);
$npcNode->appendChild(getNotGroupedList("NOT_RATED_NOT_GROUPED", $drop3));
}
if (!empty($spoil))
{
$spoil = L2SData::applyPch($spoil, $pch);
$npcNode->appendChild(getNotGroupedList("SWEEP", $spoil));
}
$node->appendChild($npcNode);
}
file_put_contents("droplist.xml", $dom->saveXML());
?>
Небольшое обновление:
- В класс L2SData добавлена функция saveData, сохраняющая в файл данные, загруженные функцией loadData. Хочу сразу предупредить - даже если загруженные данные, никак не изменяя, обратно сохранить в файл - могут быть расхождения с оригинальным файлом, если там были комментарии на корейском и т.п., т.к. при загрузке файла идет перекодировка из UTF-16 в UTF-8 и часть таких символов может потеряться/исказится.
- Добавлен класс L2CData...
Исправление небольшой ошибки в функции loadMultisell, из-за которой могли некорректно разбираться мультиселлы, в которых ингредиентом задана адена в сокращенном виде, без указания имени самого предмета - для таких мультиселов могло разбирать только первый такой обмен, пропуская остальное.
Вобщем мультиселлы с строками типа таких:
Код:{{{[stormbringer*caliburs];1}};{{[stormbringer];1};{[caliburs];1};{[dualsword_craft_stamp];1};{[crystal_c];183}};{548100}};
Я таки извиняюсь, но это число не адена) Это значение налогооблагаемой базы для начисления налога замка.Gaikotsu обновил(а) ресурс L2Data PHP Class новой записью:
Исправление ошибок
Узнать больше об этом обновлении...
/* 멀티셀 활용 관련 명렁어 정리_이종환_190619
<멀티셀 명령어>
required_npc = {[NPC내부명1];[NPC내부명2]} // 멀티셀을 열기위한 NPC를 지정, 복수 지정 가능, 해당 설정이 있다면 빌더 명령어 //multisell (멀티셀id) 를 통해 강제로 열 수 없음
강제로 멀티셀을 불러와 공급하지 않아야할 아이템을 얻는 행위를 방지하기 위해 설정
is_dutyfree = 0 or 1 // 품목에 대하여 세금 부과를 할 것인가 설정하는 구문, 기획 설정에 따라 활용 (0;세금 부과, 1; 세금 부과하지 않음)
is_show_all = 0 or 1 // 멀티셀 판매 리스트를 모두 표기할 것인가 결정하는 구문 (0;재료가 1개 이상 보유중인 항목만 표시, 1; 모든 항목 표시)
keep_enchanted = 0 or 1 // 재료로 활용되는 장비 아이템의 인챈트 및 속성 강화 수치를 유지해주고자 할 경우 사용 (0; 인챈트, 속성 유지하지 않음, 1; 인챈트, 속성 유지)
keep_enchanted = 1 로 설정되어 있어야 show_variation_item = 1, show_ensoul_item = 1 정상 동작
재료로 활용되는 장비 아이템을 스크립트에서 첫번째 재료로 입력하여야 keep_enchanted, show_variation_item, show_ensoul_item 설정이 정상 작동함
EX. {{{[결과아이템(장비형)];1}};{{[재료아이템1(장비형필수)];1};{[재료아이템2(관계없음)];개수}}}
show_variation_item = 0 or 1 // 아이템의 제련 상태를 표시해주는 옵션 (0; 제련 표시하지 않음, 유지하지 않음 1; 제련 표시, 유지)
keep_enchanted = 1 로 설정되어 있어야 show_variation_item = 1, show_ensoul_item = 1 정상 동작
show_ensoul_item = 0 or 1 // 아이템의 집혼 상태를 표시 및 유지 설정 (0; 집혼 표시하지 않음, 유지하지 않음 1; 집혼 표시, 유지)
keep_enchanted = 1 로 설정되어 있어야 show_variation_item = 1, show_ensoul_item = 1 정상 동작
is_dutyfree = 0 or 1 // 멀티셀의 세금을 설정해주는 구문 (0; 세금 무시, 1; 설정된 성 세율만큼 세금 부과)
특별한 기획 의도가 없다면 is_dutyfree = 0 으로 설정할 것 (BM/이벤트는 is_dutyfree = 1이 기본 설정)
신규 상인 NPC가 추가 될 경우, 시스템 담당자에게 요청하여 성 소속(castledata 추가)을 지정해 줘야 한다. (상인 NPC란 아이템 구입/교환/판매 등의 기능을 가진 NPC)
세금이 설정될 경우, 담당 npc의 소속 영지 세율에 따라 자동으로 계산되어 재료로 아데나를 요구하게 되며 세금의 일부는 소속 영지의 성 세금으로 쌓임.
단, 재료로 아데나를 요구한 수치는 성 세금으로 쌓이지 않음.
* 세금 공식 *
세금 = [교환 리스트에 포함된 모든 아이템(재료,결과물 포함)의 DP 합 * 개수]*성 세율
* 강제 DP 설정 *
멀티셀 항목에 포함되는 아이템들의 DP가 높아서 지나친 세금 부과가 되는 경우, 강제 DP를 설정할 수 있다.
강제 DP를 설정하면 아이템들의 DP를 무시하고 [설정된 강제 DP값 * 성세율]만큼 세금 부과
강제 DP는 재료 아이템 구문 뒤에 ;{강제DP수치} 형태로 입력하여 설정
EX. {{{[결과물];1}};{{[재료];10}};{10000000}} 일때, 세금 = [10000000 * 성세율] // 참고. 멀티셀 ID 2030, 2309
<확률 멀티셀>
확률에 따라 결과물이 달라지는 멀티셀
확률을 표시하는 스크립트가 추가되며 형태는 다음과 같다.
* 확률 멀티셀 구조 *
{{{[아이템 종류 선택에 노출될 아이템 내부명];1;0};{[결과아이템1];결과아이템1개수;확률};{[결과아이템2];결과아이템2개수;확률}};{{[재료아이템1내부명];재료아이템1개수};{[재료아이템2내부명];재료아이템2개수}};{강제DP}} //강제 DP는 생략 가능
* 주의 사항 *
- 아이템 종류 선택에 노출될 아이템은 아이콘 표시를 위한 카테고리 용도이며, 확률을 0으로 지정하여야 한다. (확률을 0으로 지정 시 세금 부과 항목에서 제외됨)
- 전체 확률은 100이 되어야 한다.
- 일반 형태의 멀티셀과 확률 멀티셀을 한 ID에 혼용하여 사용할 경우, 확률형 멀티셀 UI가 출력되지만, 일반 형태의 멀티셀 항목이 정상출력되지 않는다.(교환 가능한 아이템 목록이 출력되지 않는 문제 발생, 확률 멀티셀 형태로 수정해서 쓰거나 분리하여 사용 필요)
*/
Коррекция в отдаваемом функцией парса мультиселлов массиве данных на тему явного указывания, сколько адены участвует в расчете налога от замка (адена, задаваемая в виде {[adena];count} если что в расчете налога не участвует).
Теперь, если такая адена обнаруживается в обмене, то она сохраняется с отдельным ключом в массиве для этого варианта обмена.
Для примера фрагмент данных от мультиселла, в котором есть такие записи с налогооблагаемой аденой, хранящейся в записях с ключами...
Gaikotsu обновил(а) ресурс L2Data PHP Class новой записью:
Корректировка в связи с замечанием об расчете налога от замка :)
Узнать больше об этом обновлении...
/**
* Извлекает из массива значение по позиции в массиве или по названию ключа из строк вида "key=value" в массиве
*
* @param array $data
* @param int|string $idx
* @param boolean $removeBrackets
* @return string
*/
protected static function getValueFromArray($data, $idx, $removeBrackets = false)
{
$value = "";
if (is_int($idx))
{
$value = self::getValueFromString($data[$idx]);
if ($value == "")
$value = $data[$idx];
}
else if (is_string($idx))
$value = self::getValue($data, $idx);
if ($removeBrackets)
$value = str_replace(["[", "]"], "", $value);
return $value;
}
/**
* Извлекает из массива значение по позиции в массиве или по названию ключа из строк вида "key=value" в массиве
*
* @param array $data
* @param int|string $idx
* @param boolean $removeBrackets
* @return string
*/
protected static function getValueFromArray($data, $idx, $removeBrackets = false)
{
$value = "";
if (is_int($idx)) {
if (isset($data[$idx])) {
$value = self::getValueFromString($data[$idx]);
if ($value == "") {
$value = $data[$idx];
}
}
} else if (is_string($idx)) {
$value = self::getValue($data, $idx);
}
if ($removeBrackets) {
$value = str_replace(["[", "]"], "", $value);
}
return $value;
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?