1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

1.2.6 (1.3.4) PutRoleBase не хочет работать

Тема в разделе 'PW Вопросник', создана пользователем wsok, 2 дек 2015.

  1. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Для теста нацарапал такую функцию,
    PHP:
        include_once('configure.php');
        include_once(
    'includes/fnc.pocket.php');

    function 
    test($value)
    {
        global 
    $configure;
        
    $data GetRoleBase($value); //получаем данные
    $data['role']['base']['reserved3'] = "1111"//присваиваем переменной новое значение
                
    PutRoleBase($value$data); //сохраняем изменения
    $result GetRoleBase($value); //получаем данные чтоб увидеть результат
                
    return $result['role']['base']['reserved3']; //выводим значение сохраненой переменной
    }
    echo 
    test(32);
    GetRoleBase я уже проверил, она корректно выдает данные, но вот с запросом сохранения непорядок...
    Переменной $data['role']['base']['reserved3'] присваиваю новое значение и пытаюсь сохранить.

    Но на выходе получаю опять значение 0, т.е. пакет записи изменений не отрабатывает. Структуру и опкод вроде использую корректно, но в чем то косяк...
    вот привожу код функции PutRoleBase
    PHP:
    function PutRoleBase($roleid$data)
    {
        global 
    $configure;
        
    $PutRoleData = new WritePacket();
        
    $PutRoleData->WriteUInt32(-1);
        
    $PutRoleData->WriteUInt32($roleid);
        
    $PutRoleData->WriteUByte(1); // overwrite
        
    $GRoleData $data['role'];
     
        
    $PutRoleData->WriteUByte($GRoleData['base']['version']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['id']);
        
    $PutRoleData->WriteUString($GRoleData['base']['name']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['race']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['cls']);
        
    $PutRoleData->WriteUByte($GRoleData['base']['gender']);
        
    $PutRoleData->WriteOctets($GRoleData['base']['custom_data']);
        
    $PutRoleData->WriteOctets($GRoleData['base']['config_data']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['custom_stamp']);
        
    $PutRoleData->WriteUByte($GRoleData['base']['status']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['delete_time']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['create_time']);
        
    $PutRoleData->WriteUInt32($GRoleData['base']['lastlogin_time']);

        if (
    count($GRoleData['base']['forbid']) == && isset($GRoleData['base']['forbid']['type']))
        {
            
    $temp $GRoleData['base']['forbid'];
            unset(
    $GRoleData['base']['forbid']);
            
    $GRoleData['base']['forbid'][0] = $temp;
        }

        
    $PutRoleData->WriteCUInt32(count($GRoleData['base']['forbid']));

        for (
    $i 0$i count($GRoleData['base']['forbid']); $i++)
        {
            
    $PutRoleData->WriteUByte($GRoleData['base']['forbid'][$i]['type']);
            
    $PutRoleData->WriteUInt32($GRoleData['base']['forbid'][$i]['time']);
            
    $PutRoleData->WriteUInt32($GRoleData['base']['forbid'][$i]['createtime']);
            
    $PutRoleData->WriteUString($GRoleData['base']['forbid'][$i]['reason']);
        }

        
    $PutRoleData->WriteOctets($GRoleData['base']['help_states']);
        
    $PutRoleData->WriteUByte($GRoleData['base']['reserved1']);
        
    $PutRoleData->WriteUByte($GRoleData['base']['reserved2']);
        
    $PutRoleData->WriteUByte($GRoleData['base']['reserved3']);
     
            
    $PutRoleData->Pack(0xBC4);
        return 
    $PutRoleData->Send("localhost"$configure['dbgame_port']);
     
    }
    где же собака порылась?
    --- добавлено: 2 дек 2015 в 12:42 ---
    напоминаю, структуру использую 1.3.6 версии
    Последнее редактирование модератором: 10 дек 2015
  2. Гадес ОРБИТАЛЬНЫЙ ПОДЖИГАТЕЛЬ Old school Пользователи Ты здесь Господи? Это я, Дин Винчестер

    Сообщения:
    544
    Лайки:
    354
    Пол:
    Мужской
    Репутация:
    8
    Команда:
    DeBalance Art Team
    Страна:
    Russian Federation Russian Federation
    PHP:

    //custom_vardump.php
    if(!function_exists('_vardump')){
        
    /*
        * Custom vardump
        *
        * @param mixed $var
        * @param string $output ('f' or 'd')
        */
        
    function _vardump($var ''$output 'display'){
            
    $dump print_r($vartrue);

            
    $backtraceInfo debug_backtrace(false);
            
    $source 'File <b>'.$backtraceInfo[0]['file'].'</b> in line <b>'.$backtraceInfo[0]['line'].'</b>';

            switch(
    $output){
                case 
    'f':
                case 
    'file':
                    
    $logPath $_SERVER['DOCUMENT_ROOT'].'/vardump_log.txt';

                    
    $logFile fopen($logPath'a');
                    
    fwrite($logFile"----- " date('d.m.Y H:i:s') . " | " strip_tags($source) . " ------------------------\n" $dump "\n\n");
                    
    fclose($logFile);
                    break;
                default:
                    
    $dump '<div style="margin: 20px; background: #fdf5db; border-radius: 4px; padding: 5px; border: 1px solid #ffe69d; box-shadow: 0 0 10px 0px #ccc; font-family: Arial;"><div style="margin-bottom: 5px; font-size: 11px; color: #848484; overflow:hidden;" title="'.strip_tags($source).'">'.$source.'</div><pre style="display: block; margin: 0; padding: 10px;  background: #fff; border: 1px solid #ccc; max-height: 400px; overflow: scroll; font-size: 13px; color: #000;">'.$dump.'</pre></div>';
                    echo 
    $dump;
                    break;
            }
        }
    PHP:

    //test.php
    include_once('custom_vardump.php');
    include_once(
    'configure.php');
    include_once(
    'includes/fnc.pocket.php');

    function 
    test($value)
    {
       global 
    $configure;
       
    $data GetRoleBase($value); //получаем данные
       
    $data['role']['base']['reserved3'] = "1111"//присваиваем переменной новое значение
       
    $test PutRoleBase($value$data); //сохраняем изменения
    //дебажим
    _vardump($test);
    die();
    //дебажим
       
    $result GetRoleBase($value); //получаем данные чтоб увидеть результат
       
    return $result['role']['base']['reserved3']; //выводим значение сохраненой переменной
    }
    echo 
    test(32);
    }
    PHP:

    include_once('custom_vardump.php');

    function 
    PutRoleBase($roleid$data)
    {
           global 
    $configure;
    //дебажим
    _vardump($roleid);
    _vardump($data);
    //дебажим
           
    $PutRoleData = new WritePacket();
           
    $PutRoleData->WriteUInt32(-1);
           
    $PutRoleData->WriteUInt32($roleid);
           
    $PutRoleData->WriteUByte(1); // overwrite
           
    $GRoleData $data['role'];

           
    $PutRoleData->WriteUByte($GRoleData['base']['version']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['id']);
           
    $PutRoleData->WriteUString($GRoleData['base']['name']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['race']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['cls']);
           
    $PutRoleData->WriteUByte($GRoleData['base']['gender']);
           
    $PutRoleData->WriteOctets($GRoleData['base']['custom_data']);
           
    $PutRoleData->WriteOctets($GRoleData['base']['config_data']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['custom_stamp']);
           
    $PutRoleData->WriteUByte($GRoleData['base']['status']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['delete_time']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['create_time']);
           
    $PutRoleData->WriteUInt32($GRoleData['base']['lastlogin_time']);

           if (
    count($GRoleData['base']['forbid']) == && isset($GRoleData['base']['forbid']['type']))
           {
                  
    $temp $GRoleData['base']['forbid'];
                  unset(
    $GRoleData['base']['forbid']);
                  
    $GRoleData['base']['forbid'][0] = $temp;
           }
           
    $PutRoleData->WriteCUInt32(count($GRoleData['base']['forbid']));

           for (
    $i 0$i count($GRoleData['base']['forbid']); $i++)
           {
                  
    $PutRoleData->WriteUByte($GRoleData['base']['forbid'][$i]['type']);
                  
    $PutRoleData->WriteUInt32($GRoleData['base']['forbid'][$i]['time']);
                  
    $PutRoleData->WriteUInt32($GRoleData['base']['forbid'][$i]['createtime']);
                  
    $PutRoleData->WriteUString($GRoleData['base']['forbid'][$i]['reason']);
           }
           
    $PutRoleData->WriteOctets($GRoleData['base']['help_states']);
           
    $PutRoleData->WriteUByte($GRoleData['base']['reserved1']);
           
    $PutRoleData->WriteUByte($GRoleData['base']['reserved2']);
           
    $PutRoleData->WriteUByte($GRoleData['base']['reserved3']);
           
    $PutRoleData->Pack(0xBC4);

           return 
    $PutRoleData->Send("localhost"$configure['dbgame_port']);
    }
    Последнее редактирование: 2 дек 2015
  3. Joslian AngeliCore Программист Пользователи Open Source Contributor

    Сообщения:
    1.051
    Лайки:
    537
    Пол:
    Мужской
    Репутация:
    2
    Насколько я помню
    PHP:
    $PutRoleData->WriteUByte(1); // overwrite
    это требуется только в GRoleData
    и, ещё, переменная reserved3 - byte, максимальное значение - 255
  4. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    PHP:
    $PutRoleData->WriteUByte(1); // overwrite
    Закомментировал.

    И теперь пытаюсь присвоить значение 11

    но не работает по прежнему.
  5. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Писал уже сто раз: работает только общий пакет PutRoleData. Всякие PutRoleBase и подобные не работают. Если интересно почему — открываем метод PutRoleBase в сервисе и любуемся, что его тело пусто — один ret (китайцы поленились, лапша упала на хард с билдом и обнулила эту область, котэ игрался со студией и удалил код).
    Nanaya нравится это.
  6. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    т.е. возможности сохранять этот и подобные ему пакеты, нет?
  7. JonMagon Программист Пользователи Open Source Contributor

    Сообщения:
    804
    Лайки:
    809
    Пол:
    Мужской
    Репутация:
    5
    Страна:
    Germany Germany
    Нет.
    Тем более я не пойму зачем ты выдрал из PutRoleData часть пакета и прилепил к ней опкод PutRoleBase.
    Я PutRoleData не от балды писал и он прекрасно сохраняет любые данные о персе. Чем он тебе не угодил — хз.
  8. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    в 1.3.6 его просто нет
    --- добавлено: 2 дек 2015 в 16:45 ---
    и ещё, почему то IWEB прекрасно сохраняет данные перса в XML, странно?
    Последнее редактирование модератором: 10 дек 2015
  9. TopicStarter Overlay

    wsok Программист Пользователи

    Сообщения:
    606
    Лайки:
    173
    Пол:
    Мужской
    Репутация:
    3
    Вроде разобрался, не без помощи друзей )
    Немного поменял пакет запроса...
    1. убрал $PutRoleData->WriteUByte(1); // overwrite
    2. так называемые данные reserved читались как ReadUByte, а нужно ReadUInt32. Тоже самое примерно и с записью.

    После сделанных корректировок чтение и сохранение заработало корректно, всем, кто мне помогал спасибо!
Черновик сохранён Черновик удалён
Similar Threads
  1. sanchez1
    Ответов:
    1
    Просмотров:
    841
  2. bradis
    Ответов:
    2
    Просмотров:
    1.788
  3. MaksimkO
    Ответов:
    12
    Просмотров:
    1.681
  4. GoD777
    Ответов:
    0
    Просмотров:
    922
  5. JoLan
    Ответов:
    11
    Просмотров:
    2.120
Загрузка...

Поделиться этой страницей