1. Внимание!
    Объявились мошенники, которые представляются администрацией форума и обманывают покупателей. У них есть своя группа ВКонтакте, копирующая нашу, и несколько аккаунтов, маскирующихся под аккаунты администраторов и гарантов форума.
    При проведении любых сделок с администраторами, гарантами и пользователями BlastHack настойчиво требуйте у них написать вам личное сообщение на форуме и ни в коем случае не продолжайте сделку при отказе выполнять это требование или если сообщение не было получено.

Гайд Использование функции sscanf

Тема в разделе "CLEO", создана пользователем legend2360, 19 фев 2015.

Статус темы:
Закрыта.
  1. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Итак. Опкод 0AD4 не может сканировать строки, если они больше 14-16 символов(используются строковые переменные(@v, @s)), это мы и решим.

    GTA:SA загружает все стандартные библиотеки, в том числе и ту, которая содержит функцию sscanf.
    Её адрес(в процессе игры) - 0x8220AD.
    И судя по данной статейке(уроку): http://blasthack.net/threads/10/ можно сказать, что данная функция является __cdecl => все параметры передаются справа налево.

    В итоге, для того, чтобы использовать функцию sscanf в CLEO можно использовать следующий алгоритм:
    Пишем что-то типа в этом роде(для того, чтобы потом было легче записывать параметры в обратном порядке):
    Общий вид функции(С++): int sscanf ( const char * s, const char * format, ...);
    Переделываем под себя: sscanf(0@, "%s [%d]", 1@, 2@v) (легче будет определиться, как записывать)
    Пишем в CLEO: 0AA5: call 0x8220AD num_params 4 pop 4 params 2@v 1@ "%s [%d]" 0@
    (также можно использовать опкод 0AA7, чтобы узнать кол-во прочитанных параметров)
    • 0@ - строка, которая содержит, к примеру, следующее: Egor [512];
    • 1@ - указатель на выделенную память(0AC8);
    • 2@v - указатель на значение переменной 2@(логично же, да? :ok:), либо вместо 2@v можем использовать 0AC7: 3@ = var 2@ offset, теперь вместо 2@v будем использовать 3@.

      Также можно использовать альтернативу: 0AC7: 3@ = var 2@ offset и вместо 2@v пишем 3@
    • "%s [%d]" - формат строки(для чтения);
    • num_params 4 - кол-во передаваемых параметров(в нашем случае 4);
    • pop указываем столько же, сколько и параметров(зависит от типа соглашения, в нашем случае - __cdecl).
    Сам ид будет храниться уже в 2@, а не в 2@v.

    Итак. Полный пример:
    Код (CLEO):
    Выделить всё двойным кликом
    {$CLEO}

    0001: wait 0 ms

    while not SAMP.Available()
        wait 400
    end

    wait 2000

    0AC8: 0@ = allocate_memory_size 256
    0AD3: 0@ = format "Egor [512]"

    0AC8: 1@ = allocate_memory_size 24 // Используется под хранения никнейма

    0AA5: call 0x8220AD num_params 4 pop 4 params 2@v 1@ "%s [%d]" 0@ // sscanf(0@, "%s [%d]", 1@, 2@v)
    // 2@ - id
    // 1@ - nick
    // 0@ - string
    0AF8: samp add_message_to_chat "Привет, %s" color -1 1@
    0AF9: samp say_msg "/hi %d" 2@

    // Завершаем скрипт и очищаем ранее выделенную память
    0AC9: free_allocated_memory 0@
    0AC9: free_allocated_memory 1@

    0A93: end_custom_thread
    Вот такой легкий метод можно применить.
    TY.
     
    Последние данные очков репутации:
    Perojek)0: 1 Очко (Спасибо тебе:)) 9 мар 2016
    mgmoldova: 2 Очки (Доступно, понятно, красиво.) 7 июн 2016
    #1
    Последнее редактирование: 5 дек 2016
    mgmoldova и Enjoy нравится это.
  2. Logan4ik

    Logan4ik Известный пользователь

    Регистрация:
    28.09.14
    Сообщения:
    141
    Лайки:
    329
    Репутация:
    19
    Можно использовать на условия?
     
    #2
  3. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Используй 0AA7
     
    #3
  4. Logan4ik

    Logan4ik Известный пользователь

    Регистрация:
    28.09.14
    Сообщения:
    141
    Лайки:
    329
    Репутация:
    19
    Будет время проверю
    call function?
     
    #4
  5. Dark_Knight

    Dark_Knight РКН Тян на страже твоей анальной девственности.
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.242
    Лайки:
    633
    Репутация:
    191
    Да
     
    #5
  6. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Почитай документацию по функции sscanf в гугле(только именно к C++).
    Там найдется что к чему.
     
    #6
    next23012 нравится это.
  7. Perojek)0

    Perojek)0 Известный пользователь

    Регистрация:
    12.01.16
    Сообщения:
    188
    Лайки:
    2
    Репутация:
    1
    Почему, если строку записать через форматирование, то сканирует правильно, а если её получить через хук, то у меня ничего не робит..
    В чём может быть проблема?
     
    #7
  8. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Какой хук?
     
    #8
  9. Perojek)0

    Perojek)0 Известный пользователь

    Регистрация:
    12.01.16
    Сообщения:
    188
    Лайки:
    2
    Репутация:
    1
    RPC_SCRCLIENTMESSAGE
     
    #9
  10. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Ну там цвета ещё могут быть.
    {FFFFFF} типа
     
    #10
  11. Perojek)0

    Perojek)0 Известный пользователь

    Регистрация:
    12.01.16
    Сообщения:
    188
    Лайки:
    2
    Репутация:
    1
    А как это можно исправить или обойти?
     
    #11
  12. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Ну попробовать их тоже учитывать, либо удалять.
     
    #12
  13. Perojek)0

    Perojek)0 Известный пользователь

    Регистрация:
    12.01.16
    Сообщения:
    188
    Лайки:
    2
    Репутация:
    1
    Хорошо, спасибо :)

    Код (CLEO):
    Выделить всё двойным кликом
    {$CLEO}
    {$INCLUDE SF}

    0001: wait 0 ms

    while not SAMP.Available()
        wait 12000
    end

    0BE3: raknet setup_incoming_rpc_hook @1

    0BDE: pause_thread 0


    :1
    0BE5: raknet 0@ = get_hook_param PARAM_PACKETID
    if
        0@ == RPC_SCRCLIENTMESSAGE
    then
    0BE5: raknet 1@ = get_hook_param PARAM_BITSTREAM
    0AC8: 4@ = allocate_memory_size 228
    0BE7: raknet 2@ = bit_stream_read 1@ type BS_TYPE_INT
    0BE7: raknet 3@ = bit_stream_read 1@ type BS_TYPE_INT
    0BE8: raknet bit_stream 1@ read_array 4@ size 3@
    0C1E: array 4@ element 3@ el_size 1 = 0
    0AC8: 6@ = allocate_memory_size 512
    if
    0C25: strncmp string1 4@ string2 "{FF8C00}SMS:" size 12
    then
    0AA5: call 0x8220AD num_params 5 pop 5 params 5@v 6@ 7@ "{FF8C00}SMS: {FFFF00}%s {FF8C00}| {FFFF00}Отправитель: %s (тел. %d)" 4@
    end
    0AC9: free_allocated_memory 6@
    end
    0BE0: raknet hook_ret true
     
    Когда мне пишут SMS, меня крашит.
    В чём ошибка?
     
    #13
    Последнее редактирование модератором: 18 мар 2016
  14. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Не выделил память 7@
     
    #14
    Perojek)0 нравится это.
  15. Perojek)0

    Perojek)0 Известный пользователь

    Регистрация:
    12.01.16
    Сообщения:
    188
    Лайки:
    2
    Репутация:
    1
    Такая проблема возникла, если у меня стоит %s, а там несколько слов, то в переменную сохраняет только первое, как это можно исправить?
     
    #15
  16. RedBoxWhite

    RedBoxWhite Известный пользователь

    Регистрация:
    06.03.16
    Сообщения:
    283
    Лайки:
    12
    Репутация:
    5
    Возможно глупый вопрос, но... Как узнать количество параметров в скрипте?
     
    #16
  17. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    483
    Лайки:
    115
    Репутация:
    56
    Сколько значений после param - столько и параметров.
     
    #17
  18. zikekazil

    zikekazil Пользователь

    Регистрация:
    17.03.16
    Сообщения:
    7
    Лайки:
    0
    Репутация:
    0
    если есть к примеру такая строка на входе "Ник: test123123 Lvl: 17 Skin: 294". Мне же нужно выделить только лвл и скин, если учесть, что данные могут быть совершенно иными. Как поступить?
     
    #18
  19. Trashmas

    Trashmas Активный пользователь

    Регистрация:
    25.02.16
    Сообщения:
    37
    Лайки:
    0
    Репутация:
    0
    Код (Text):
    Выделить всё двойным кликом
    0B75: samp get_chat_string 99 text_to 4@ prefix_to 5@ color_to 6@ prefix_color_to 7@
    Как сделать проверку цвета в переменной 6@. К примеру проверка если там цвет 0xFF00FF
     
    #19
  20. san0

    san0 Hasta la victoria siempre!
    Проверенный

    Регистрация:
    15.12.13
    Сообщения:
    304
    Лайки:
    131
    Репутация:
    53
    6@ == 0x {ALPHA} RGB
    наверна
     
    #20
  21. Clopster

    Clopster Известный пользователь

    Регистрация:
    09.07.14
    Сообщения:
    100
    Лайки:
    40
    Репутация:
    16
    Как быть, если в строке несколько слов и они, и их количество, меняются?
     
    #21
  22. legend2360

    legend2360 Лятим в космос
    Всефорумный модератор

    Регистрация:
    23.03.13
    Сообщения:
    2.162
    Лайки:
    750
    Репутация:
    445
    Дай пример.
     
    #22
  23. Clopster

    Clopster Известный пользователь

    Регистрация:
    09.07.14
    Сообщения:
    100
    Лайки:
    40
    Репутация:
    16
    В текстовом варианте нету уже строки, скрин нашел. Мне из этой строки нужен только ник и телефон.
    upload_2016-10-30_17-36-35.png
     
    #23
  24. Dark_Knight

    Dark_Knight РКН Тян на страже твоей анальной девственности.
    Друг

    Регистрация:
    18.03.13
    Сообщения:
    2.242
    Лайки:
    633
    Репутация:
    191
    Регулярные выражения помогут, но они в клео не поддерживаются.
     
    #24
  25. Clopster

    Clopster Известный пользователь

    Регистрация:
    09.07.14
    Сообщения:
    100
    Лайки:
    40
    Репутация:
    16
    а можно как-нибудь обрезать строку и использовать тот кусок, который всегда одинаковый?
     
    #25
  26. BlackKnigga

    Проверенный

    Регистрация:
    10.01.16
    Сообщения:
    483
    Лайки:
    115
    Репутация:
    56
    strstr. Ищешь кусок "| Отправил", он тебе вернет указатель на начало этого куска и до конца. Его и сканируй.
     
    #26
  27. Clopster

    Clopster Известный пользователь

    Регистрация:
    09.07.14
    Сообщения:
    100
    Лайки:
    40
    Репутация:
    16
    спасибо
     
    #27
Статус темы:
Закрыта.