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

Скрипт L2Data PHP Class 1.1.2

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

Gaikotsu

яжпрограммист
Легенда
Победитель в номинации 2023
Победитель в номинации 2022
Победитель в номинации 2021
Участник Новогоднего Фонда 2021
Эксперт
Знаток
Просветитель
Магистр реакций
Знаток письма
Куратор Данных
Медаль Благодарности
Старожил II степени
Старожил I степени
Победитель в номинации 2020
Победитель в номинации 2019
Клиент разработчик
Преподаватель
За веру и верность форуму
Победитель в номинации 2018
Медаль за активность на Форуме
За заслуги перед форумом
Web разработчик
Разработчик
За знание датапака
За знание ядра
Сообщения
1 815
Розыгрыши
0
Решения
30
Репутация
6 257
Реакции
2 917
Баллы
2 188
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;
    }
 
а где взять эти самые скрипты чтобы посмотреть что это вообще и зачем оно нужно?
 
Назад
Сверху Снизу