ТОП ЧаВо + полезные решения по кодингу

Тема в разделе "CLEO", создана пользователем Владислав, 7 июл 2014.

  1. Владислав

    Владислав Member Основатель

    Регистрация:
    29 май 2014
    Сообщения:
    109
    Симпатии:
    0
    Рассмотрим самые распространенные вопросы.

    Полезные плагины для создания крутых CLEO скриптов


    Обратите внимание! Прежде чем пытаться реализовывать какую-либо идею, подстройте среду разработки под себя - установите нужные плагины и опкоды для работы с GTA SA:MP в Sanny Builder!
    Вопросы/Ответы
    Решение: Почему выдает ошибку? "Неизвестный опкод" - один из вид защит кода скрипта от чужих глаз, очень легкий и обход его давно уже в паблике.

    Для чего скрывают код? - на это есть ряд причин: скрыть код от нубов, которые могут переделать копирайты под себя и выдавать себя за автора скрипта; от админов, которые могут понять принцип работы того или иного бота и пофиксить его на следующий день.

    Обход защиты. Открываем пустой Sanny Builder, активируем параметр "IGNORE_UNKNOWN" (игнорировать неизвестные).

    [​IMG]

    Затем открываем скрипт через SB и как видим - он декомпилируется и код нам доступен.

    * Если при открытии скрипта SB зависает, то скорее всего на скрипте стоит более хорошая защита, обхода которой нет в публичном доступе... Ну по-крайней мере я не видел.

    Для того чтобы написать что-то в чат, нужен: 1) Плагин sampfuncs ; 2) Опкоды sampfuncs должны быть установлены в директории SB. - ищите свежую версия на сайте разработчика.

    Для того чтобы писать в чат используется опкод:

    0AF8: samp add_message_to_chat "Gonwik, verni bablo!" color 0xFF61BB 4 6 10

    "Gonwik, verni bablo!" - текст, то что мы пишем в чат.
    0xFF61BB - цвет текста.
    4, 6, 10 - параметры для форматирования.


    Код цвета в шестнадцатиричном формате можно найти здесь
    Решение: В Sanny Builder сверху в меню ищем: сервис -> настройки -> сверху "форматирование" -> в правом нижнем углу Регистр букв, выбираешь "Как есть", сохраняешь и компилируешь скрипт!
    Тут все легко. Нам нужен исходник скрипта или декомпилированный код (только в более-менее божественном виде, без всяких hex - end!)

    Ищем (ctrl+F) в коде участки кода, где есть опкод "0ab0: key_pressed Клавиша" или просто "0ab0: key_number"

    Нашли? Теперь изменяем на нужную нам клавишу. Чтобы вы не мучились и не искали коды клавиш, не запускали всякие программы для узнавания номера клавиши, я подготовил (точнее у меня были) специальные константы. По ним легче ориентироваться.

    Вставьте это в любой участок кода (лучше в начало).
    Код:
    const
    // Мышь
    VK_LBUTTON = 0x01   // Левая кнопка мыши
    VK_RBUTTON = 0x02   // Правая кнопка мыши
    VK_MBUTTON = 0x04   // Средняя кнопка мыши
    VK_XBUTTON1 = 0x05  // X1 кнопка мыши
    VK_XBUTTON2 = 0x06  // X2 кнопка мыши
    
    VK_BACKSPACE = 0x08
    VK_TAB = 0x09
    VK_ENTER = 0x0D
    VK_SHIFT = 0x10
    VK_CTRL = 0x11
    VK_CONTROL = 0x11
    VK_ALT = 0x12
    VK_PAUSE = 0x13     // PAUSE BREAK
    VK_CAPSLOCK = 0x14
    VK_ESC = 0x1B
    VK_ESCAPE = 0x1B
    VK_SPACE = 0x20
    VK_SPACEBAR = 0x20
    
    VK_PAGEUP = 0x21
    VK_PAGEDOWN = 0x22
    VK_END = 0x23
    VK_HOME = 0x24
    
    // Стрелки
    VK_LEFT = 0x25
    VK_UP = 0x26
    VK_RIGHT = 0x27
    VK_DOWN = 0x28
    VK_PRINTSCREEN = 0x2C
    VK_INSERT = 0x2D
    VK_DELETE = 0x2E
    
    // Цифры
    VK_0 = 0x30
    VK_1 = 0x31
    VK_2 = 0x32
    VK_3 = 0x33
    VK_4 = 0x34
    VK_5 = 0x35
    VK_6 = 0x36
    VK_7 = 0x37
    VK_8 = 0x38
    VK_9 = 0x39
    
    // Буквы
    VK_A = 0x41
    VK_B = 0x42
    VK_C = 0x43
    VK_D = 0x44
    VK_E = 0x45
    VK_F = 0x46
    VK_G = 0x47
    VK_H = 0x48
    VK_I = 0x49
    VK_J = 0x4A
    VK_K = 0x4B
    VK_L = 0x4C
    VK_M = 0x4D
    VK_N = 0x4E
    VK_O = 0x4F
    VK_P = 0x50
    VK_Q = 0x51
    VK_R = 0x52
    VK_S = 0x53
    VK_T = 0x54
    VK_U = 0x55
    VK_V = 0x56
    VK_W = 0x57
    VK_X = 0x58
    VK_Y = 0x59
    VK_Z = 0x5A
    
    VK_LWIN = 0x5B
    VK_RWIN = 0x5C
    
    // NumPad
    VK_NUMLOCK = 0x90
    VK_NP0 = 0x60
    VK_NP1 = 0x61
    VK_NP2 = 0x62
    VK_NP3 = 0x63
    VK_NP4 = 0x64
    VK_NP5 = 0x65
    VK_NP6 = 0x66
    VK_NP7 = 0x67
    VK_NP8 = 0x68
    VK_NP9 = 0x69
    VK_NP_STAR = 0x6A   // *
    VK_NP_PLUS = 0x6B   // +
    VK_NP_MINUS = 0x6D  // -
    VK_NP_SLASH = 0x6F  // /
    
    VK_F1 = 0x70
    VK_F2 = 0x71
    VK_F3 = 0x72
    VK_F4 = 0x73
    VK_F5 = 0x74
    VK_F6 = 0x75
    VK_F7 = 0x76
    VK_F8 = 0x77
    VK_F9 = 0x78
    VK_F10 = 0x79
    VK_F11 = 0x7A
    VK_F12 = 0x7B
    
    VK_LSHIFT = 0xA0
    VK_RSHIFT = 0xA1
    VK_LCONTROL = 0xA2
    VK_LCTRL = 0xA2
    VK_RCONTROL = 0xA3
    VK_RCTRL = 0xA3
    VK_SEMICOLON = 0xBA         // ;:
    VK_PLUS = 0xBB              // +
    VK_COMMA = 0xBC             // ,
    VK_MINUS = 0xBD             // -
    VK_PERIOD = 0xBE            // .
    VK_SLASH = 0xBF             // /?
    VK_TILDA = 0xC0             // `~
    VK_LSQUARE_BRACKET = 0xDB   // [{
    VK_BACKSLASH = 0xDC         // \|
    VK_RSQUARE_BRACKET = 0xDD   // ]}
    VK_QUOTE = 0xDE             // '"
    end
    Теперь, с этими константами, вместо кода клавиши просто ставьте VK_H (Кнопка H), VK_CTRL (Кнопка CTRL), VK_LSHIFT (Левый шифт) и так далее!

    Как сделать активацию на несколько клавиш?

    Для того чтобы скрипт активировался на несколько клавиш, например комбинацией, используем условие IF AND.
    Код:
    if and
    0ab0: нажата_клавиша VK_CTRL
    0ab0: нажата_клавиша VK_L
    JF @метка
    Для того чтобы сделать активацию на определенную клавишу на выбор из нескольких, используем условие IF OR.
    Код:
    if or
    0ab0: нажата_клавиша VK_R
    0ab0: нажата_клавиша VK_O
    JF @метка
    Опять же, для этой операции используем опкод sampfuncs.

    0B2B: samp 0@ = get_player_id_by_actor_handle $PLAYER_ACTOR

    0@ - В эту переменную записывается ID самп-игрока
    $PLAYER_ACTOR - хендл игрока, который мы имеем или получили каким-либо способом. В данном случае это наш чувак, то есть сам игрок, которым мы играем.
    Все аналагично как в пункте 5, только используется опкод:

    0B20: samp 4@ = actor_handle_from_samp_playerid 5

    4@ - хендл игрока, полученный нами.
    5 - самп-айди игрока.
    Решение[NEW]: SCM функция, написанная скриптером Toplivo.
    В конец скрипта:
    Код:
    :coordmaster
    0acd: "CoordMaster ON" 500
    0087: 15@ = 0@
    0087: 16@ = 1@
    while true
             wait 0
             if 12@ == 12
             then
                 12@ = 0
                 break
             end
             0087: 0@ = 15@
             0087: 1@ = 16@
             actor.StorePos($PLAYER_ACTOR,9@,10@,11@)
             0509: 6@ = distance_between_XY 0@ 1@ and_XY 9@ 10@
             if 6@ <= 120.0
             then
                 02CE: 11@ = ground_z_at 0@ 1@ 999.0
                 09bc: $PLAYER_ACTOR 0@ 1@ 11@
                 if actor.Driving($PLAYER_ACTOR)
                 then
                     5@ = actor.CurrentCar($PLAYER_ACTOR)
                     car.LockInCurrentPosition(5@,0)
                 else
                     actor.LockInCurrentPosition($PLAYER_ACTOR,0)
                 end
                 break
             else
                 0061: 0@ -= 9@
                 0061: 1@ -= 10@
                 0604: get_Z_angle_for_point 0@ 1@ store_to 6@
                 if actor.Driving($PLAYER_ACTOR)
                 then
                     5@ = actor.CurrentCar($PLAYER_ACTOR)
                     car.LockInCurrentPosition(5@,1)
                     car.Angle(5@) = 6@
                 else
                     actor.LockInCurrentPosition($PLAYER_ACTOR,1)
                     actor.Angle($PLAYER_ACTOR) = 6@
                 end
                 04C4: store_coords_to 8@ 9@ 10@ from_actor $PLAYER_ACTOR with_offset 0.0 2@ 0.0 // 70.0 - расстояние прыжка
                 09bc: $PLAYER_ACTOR 8@ 9@ 3@
                 32@ = 0
                 while 0025:   4@ > 32@
                     wait 0
                     if 0adc: "OFF" // Дезактивация
                     then
                         0acd: "CoordMaster OFF" 500
                         actor.StorePos($PLAYER_ACTOR,8@,9@,10@)
                         02CE: 11@ = ground_z_at 8@ 9@ 999.0
                         11@ += 1.0
                         00a1: $PLAYER_ACTOR 8@ 9@ 11@
                         if actor.Driving($PLAYER_ACTOR)
                         then
                             5@ = actor.CurrentCar($PLAYER_ACTOR)
                             car.LockInCurrentPosition(5@,0)
                         else
                             actor.LockInCurrentPosition($PLAYER_ACTOR,0)
                         end
                         12@ = 12
                         break
                     end
                 end
             end
    end
    0ab2: ret 0 
    Вызов функции:
    Код:
    0ab1: call @coordmaster 5 X 34.1 Y 26.3 Length 70.0 Depth -80.0 Delay 1100 // 34.1 - координаты по оси X, 26.3 - координаты по оси Y, 70.0 - длинна прыжка, -80.0 - глубина(под землей), 1100 - задержка между ТП
    Пример:
    Код:
    while true
            wait 0
            if and
                0ab0: 53
                0ab0: 54
            then
                0ab1: call @coordmaster 5 X 34.1 Y 26.3 Length 70.0 Depth -80.0 Delay 1100
                while true
                    wait 0
                    if or
                        8ab0: 53
                        8ab0: 54
                    then break
                end
            end
    end
    
    :coordmaster
    0acd: "CoordMaster ON" 500
    0087: 15@ = 0@
    0087: 16@ = 1@
    while true
             wait 0
             if 12@ == 12
             then
                 12@ = 0
                 break
             end
             0087: 0@ = 15@
             0087: 1@ = 16@
             actor.StorePos($PLAYER_ACTOR,9@,10@,11@)
             0509: 6@ = distance_between_XY 0@ 1@ and_XY 9@ 10@
             if 6@ <= 120.0
             then
                 02CE: 11@ = ground_z_at 0@ 1@ 999.0
                 09bc: $PLAYER_ACTOR 0@ 1@ 11@
                 if actor.Driving($PLAYER_ACTOR)
                 then
                     5@ = actor.CurrentCar($PLAYER_ACTOR)
                     car.LockInCurrentPosition(5@,0)
                 else
                     actor.LockInCurrentPosition($PLAYER_ACTOR,0)
                 end
                 break
             else
                 0061: 0@ -= 9@
                 0061: 1@ -= 10@
                 0604: get_Z_angle_for_point 0@ 1@ store_to 6@
                 if actor.Driving($PLAYER_ACTOR)
                 then
                     5@ = actor.CurrentCar($PLAYER_ACTOR)
                     car.LockInCurrentPosition(5@,1)
                     car.Angle(5@) = 6@
                 else
                     actor.LockInCurrentPosition($PLAYER_ACTOR,1)
                     actor.Angle($PLAYER_ACTOR) = 6@
                 end
                 04C4: store_coords_to 8@ 9@ 10@ from_actor $PLAYER_ACTOR with_offset 0.0 2@ 0.0
                 09bc: $PLAYER_ACTOR 8@ 9@ 3@
                 32@ = 0
                 while 0025:   4@ > 32@
                     wait 0
                     if 0adc: "OFF" // Дезактивация
                     then
                         0acd: "CoordMaster OFF" 500
                         actor.StorePos($PLAYER_ACTOR,8@,9@,10@)
                         02CE: 11@ = ground_z_at 8@ 9@ 999.0
                         11@ += 1.0
                         00a1: $PLAYER_ACTOR 8@ 9@ 11@
                         if actor.Driving($PLAYER_ACTOR)
                         then
                             5@ = actor.CurrentCar($PLAYER_ACTOR)
                             car.LockInCurrentPosition(5@,0)
                         else
                             actor.LockInCurrentPosition($PLAYER_ACTOR,0)
                         end
                         12@ = 12
                         break
                     end
                 end
             end
    end
    0ab2: ret 0 
    Дезактивация:
    Код:
    0adc: "OFF" //OFF не в чат
    Многие новички сталкиваются с проблемой, когда начинают писать свои первые скрипты, которая заключается в использовании опкодов, их поиске и понимания, какой опкод за что отвечает.

    Каждый опкод - это по сути просто код (номер) какой-либо операции. Просто в шестнадцатиричном варианте:0AB0 , 0ADC , 0ACD и так далее... Опкодов изначально заложено в Sanny Builder, начиная с версии CLEO 3 и дальше, очень и очень много. Используется большинство для написания модов/миссий и так далее, но любой также может пригодиться нам для реализации какого-нибудь бота или обхода античита в самп.

    Как грамотно искать опкоды и узнавать какой за что отвечает?


    1 вариант. Для начинающих и не только. Поиск опкодов с подробным описанием.

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

    Заходим на сайт GTAG :: Opcode Database - это довольно-таки известный ресурс моддинга ГТА и здесь мы видим раздел "База опкодов CLEO". Всего опкодов за тысячу, поэтому все они распределены на группы "Без категории", "Опкоды для совершения действия с актором(персонажем)", "Опкоды для работы с анимациями", "Опкоды для работы с моделями" и так далее...

    Предположим, нам нужно реализовать, чтобы перестал отображаться худ (радар, кулак и тд). Сразу вводим в строку ключевые слова: "Hud" (худ), "Display" (показывать).

    Нашли наиболее подходящий судя по описанию опкод 0826

    Заходим на страничку подробного описания опкода и видим.

    Я перевел то, как обычно примерно описывается опкод на этом ресурсе.

    Description: Sets whether the HUD displays. // Описание: Устанавливает, должен ли отображаться худ.
    Parameters: 1) Boolean (1 or 0) // Параметры - булевы (1 - показывать или 0 - не показывать)
    Games: sa // игры, в которых поддерживается - сан андреас
    Category Common, GUI // категория: используемые
    Command Name (IV) DISPLAY_HUD // Название команды (я так понимаю для cleo 4 и выше если не ошибаюсь)

    // далее для каждой из игр (в данном случае только сан андреас), сам опкод (для вставки в sascm.ini, если вдруг не установлен) и образец. Образец и используется нами в скрипте.
    San Andreas

    sascm.ini: 0826=1,display_hud %1h%

    Example: 0826: display_hud 1 // Образец. Копируем именно это

    Command Name: DISPLAY_HUD

    Итак. Примерно в таком виде вы можете найти описание любого опкода SB и подробно узнать, какой параметр за что отвечает. Главное запомнить: берем example в качестве правильного образца для использования опкода и читаем, какой параметр за что отвечат!!

    2 вариант. Быстрый поиск опкодов, прям в Sanny Builder.

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

    В Sanny Builder поиск опкодов открывается комбинацией CTRL + ALT + 2 затем просто вводите ключевое слово в поисковую строку и копируете опкод.

    Минус данного способа заключается в том, что не описано, какой параметр опкода за что отвечает. Поэтому я чаще использую первый способ и ищу на сайте gtag.
     
    #1

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