Иконка ресурса

Скрипт L2Data PHP Class 1.1.2

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

Gaikotsu

яжпрограммист
Легенда
Часть системы
Знаток Lineage2
Орден Почета
Суровый спец
Наставник
Мыслитель
Арбитр
Авторитет форума
Оратор
Уважаемый собеседник
Легенда Истоков
Победитель в номинации 2024
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Эксперт
Знаток
Просветитель
Опора сообщества
Хранитель Пера
Куратор Данных
Медаль Благодарности
Старожил II степени
Старожил I степени
Победитель в номинации 2020
Победитель в номинации 2019
Клиент разработчик
Преподаватель
За веру и верность форуму
Победитель в номинации 2018
Медаль за активность на Форуме
За заслуги перед форумом
Web разработчик
Разработчик
За знание датапака
За знание ядра
Сообщения
2 174
Розыгрыши
0
Решения
38
Репутация
6 401
Реакции
3 364
Баллы
2 363
Gaikotsu добавил(а) новый ресурс:

L2Data PHP Class - Простой PHP-скрипт для работы с данными из скриптов PTS

Когда-то, в одной из тем обещался выложить написанный собственноручно небольшой класс для работы с данными из скриптов PTS. Как только добавлю в него все что хотел из планируемого.
Но вот что-то все никак руки не доходят дописать его до конца :)

Так что выкладываю можно сказать промежуточный вариант, но которого вполне достаточно для того чтобы удовлетворить большую часть хотелок по парсу и извлечению нужных данных из скриптов.

Все методы в классе снабжены комментариями, так что думаю...

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

Пример использования класса в виде скрипта для генерации хмл с дропом/спойлом.
Да, саму генерацию хмл можно написать проще, в виде просто конкатенации обычных строк и записи их в файл, но я тут заоднем еще страдал экспериментами с DOMDocument :)

PHP:
<?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());
?>
 
inffff a lots, i was searching some like that to update a new database, i used old c4 pts, y want to upgrade template like h5 database
 
Gaikotsu обновил(а) ресурс L2Data PHP Class новой записью:

Обновление 1.1

Небольшое обновление:
  • В класс L2SData добавлена функция saveData, сохраняющая в файл данные, загруженные функцией loadData. Хочу сразу предупредить - даже если загруженные данные, никак не изменяя, обратно сохранить в файл - могут быть расхождения с оригинальным файлом, если там были комментарии на корейском и т.п., т.к. при загрузке файла идет перекодировка из UTF-16 в UTF-8 и часть таких символов может потеряться/исказится.
  • Добавлен класс L2CData...

Узнать больше об этом обновлении...
 
Если у кого не работает, то проверьте - включено ли у вас в php.ini расширение mbstring - функции из него используются для перекодировок UTF-16 <--> UTF-8
 
Thanks for shared but how to run data to parsed pts files?
 
Gaikotsu обновил(а) ресурс L2Data PHP Class новой записью:

Исправление ошибок

Исправление небольшой ошибки в функции loadMultisell, из-за которой могли некорректно разбираться мультиселлы, в которых ингредиентом задана адена в сокращенном виде, без указания имени самого предмета - для таких мультиселов могло разбирать только первый такой обмен, пропуская остальное.
Вобщем мультиселлы с строками типа таких:
Код:
{{{[stormbringer*caliburs];1}};{{[stormbringer];1};{[caliburs];1};{[dualsword_craft_stamp];1};{[crystal_c];183}};{548100}};

Узнать больше об этом обновлении...
 
  • Мне нравится
Реакции: kick
Я таки извиняюсь, но это число не адена) Это значение налогооблагаемой базы для начисления налога замка.


Код:
/* 멀티셀 활용 관련 명렁어 정리_이종환_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가 출력되지만, 일반 형태의 멀티셀 항목이 정상출력되지 않는다.(교환 가능한 아이템 목록이 출력되지 않는 문제 발생, 확률 멀티셀 형태로 수정해서 쓰거나 분리하여 사용 필요)
*/
 
Ну в любом случае это как бы количество адены для расчета налога :)
 
Gaikotsu обновил(а) ресурс L2Data PHP Class новой записью:

Корректировка в связи с замечанием об расчете налога от замка :)

Коррекция в отдаваемом функцией парса мультиселлов массиве данных на тему явного указывания, сколько адены участвует в расчете налога от замка (адена, задаваемая в виде {[adena];count} если что в расчете налога не участвует).
Теперь, если такая адена обнаруживается в обмене, то она сохраняется с отдельным ключом в массиве для этого варианта обмена.
Для примера фрагмент данных от мультиселла, в котором есть такие записи с налогооблагаемой аденой, хранящейся в записях с ключами...

Узнать больше об этом обновлении...
 

Warning: Undefined array key 2 in C:\xampp\htdocs\L2Data.php on line 228

Warning: Undefined array key 2 in C:\xampp\htdocs\L2Data.php on line 231

PHP:
    /**
     * Извлекает из массива значение по позиции в массиве или по названию ключа из строк вида "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;
    }
 
@blowcito,
PHP:
/**
     * Извлекает из массива значение по позиции в массиве или по названию ключа из строк вида "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;
    }
 
Назад
Сверху Снизу