Всем привет, в последнее время да и вообще часто посещаю тему Вопрос - Ответ и постоянно вижу одни и те же вопросы. Многие новички не хотят изучать CLEO досконально, читать документацию и т.д, а просто хотят что-то исправить, подделать в скрипте под себя. Из-за этого, сталкиваются с однотипными проблемами.
Рассмотрим самые распространенные вопросы.
Полезные плагины для создания крутых CLEO скриптов
Обратите внимание! Прежде чем пытаться реализовывать какую-либо идею, подстройте среду разработки под себя - установите нужные плагины и опкоды для работы с GTA SA:MP в Sanny Builder!
Прочие плагины и обновления к ним будут заливаться на сайт и, в частности, в эту тему со временем!
1. Не могу открыть скрипт, выдает ошибку о "неизвестном опкоде".
Решение: Почему выдает ошибку? "Неизвестный опкод" - один из вид защит кода скрипта от чужих глаз, очень легкий и обход его давно уже в паблике.
Для чего скрывают код? - на это есть ряд причин: скрыть код от нубов, которые могут переделать копирайты под себя и выдавать себя за автора скрипта; от админов, которые могут понять принцип работы того или иного бота и пофиксить его на следующий день.
Затем открываем скрипт через SB и как видим - он декомпилируется и код нам доступен.
В этой темке есть примеры разных несложных защит скрипта. Всем советую прочитать.
* Если при открытии скрипта SB зависает, то скорее всего на скрипте стоит более хорошая защита, обхода которой нет в публичном доступе... Ну по-крайней мере я не видел.
2. Как писать в чат с помощью плагина sampfuncs? Где взять цвета для текста?
Для того чтобы написать что-то в чат, нужен: 1) Плагин sampfuncs ; 2) Опкоды sampfuncs должны быть установлены в директории SB. - ищите свежую версия на сайте разработчика.
"Gonwik, verni bablo!" - текст, то что мы пишем в чат. 0xFF61BB - цвет текста. 4, 6, 10 - параметры для форматирования.
Код цвета в шестнадцатиричном формате можно найти здесь
3. Пишет в чат только ЗАГЛАВНЫМИ буквами, что делать?
Решение: В Sanny Builder сверху в меню ищем: сервис -> настройки -> сверху "форматирование" -> в правом нижнем углу Регистр букв, выбираешь "Как есть", сохраняешь и компилируешь скрипт!
4. Как изменить активацию скрипта на нужную мне клавишу? Или на несколько клавиш, или на определенную клавишу на выбор.
Тут все легко. Нам нужен исходник скрипта или декомпилированный код (только в более-менее божественном виде, без всяких hex - end!)
Ищем (ctrl+F) в коде участки кода, где есть опкод "0ab0: key_pressed Клавиша" или просто "0ab0: key_number"
Нашли? Теперь изменяем на нужную нам клавишу. Чтобы вы не мучились и не искали коды клавиш, не запускали всякие программы для узнавания номера клавиши, я подготовил (точнее у меня были) специальные константы. По ним легче ориентироваться.
Вставьте это в любой участок кода (лучше в начало).
0@ - В эту переменную записывается ID самп-игрока $PLAYER_ACTOR - хендл игрока, который мы имеем или получили каким-либо способом. В данном случае это наш чувак, то есть сам игрок, которым мы играем.
6. Как получить хендл игрока по его ID?
Все аналагично как в пункте 5, только используется опкод:
: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 не в чат
10. Где искать нужные для реализации скрипта опкоды?
Многие новички сталкиваются с проблемой, когда начинают писать свои первые скрипты, которая заключается в использовании опкодов, их поиске и понимания, какой опкод за что отвечает.
Каждый опкод - это по сути просто код (номер) какой-либо операции. Просто в шестнадцатиричном варианте: 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.
Тема будет пополняться по мере появления все новых вопросов...
Строго не судите, FAQ рассчитан на совсем-совсем новичков, которым порою очень трудно среди всех тем найти ответ на нужный им вопрос.
А птьфу... Проверка на версию скрипта и закачка с сайта/сервера. Я понял. Не, такого пока не знаю где взять. И вообще, единственное где видел, чтобы это реализовано было - в плагине sampfuncs обновы.
Добавлено (27.11.2013, 15:56) --------------------------------------------- Update. Добавил кое-что по мелочи. Спасибо RAKSHA1337 за помощь.
Как сделать бота который бегал бы с одной точки на другую?
Код
while true wait 0 actor.storepos($player_actor, 1@ 2@ 3@) 05D3: AS_actor $PLAYER_ACTOR goto_point 681.804 -474.3 15.3 mode 4 time 3000 ms if 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 681.804 -474.3 15.3 radius 0.0 0.0 0.0 then 05D3: AS_actor $PLAYER_ACTOR goto_point 1@ 2@ 3@ mode 4 time 3000 ms end end
Как сделать бота который бегал бы с одной точки на другую?
Код while true wait 0 actor.storepos($player_actor, 1@ 2@ 3@) 05D3: AS_actor $PLAYER_ACTOR goto_point 681.804 -474.3 15.3 mode 4 time 3000 ms if 00FE: actor $PLAYER_ACTOR sphere 0 in_sphere 681.804 -474.3 15.3 radius 0.0 0.0 0.0 then 05D3: AS_actor $PLAYER_ACTOR goto_point 1@ 2@ 3@ mode 4 time 3000 ms end end
Я и попросил помочь... Чтобы мне сделать надо уметь для начала, а кто меня научит если не "знаток" я вот стараюсь сделать
Изучи азы cleo программирование,на см их хватает,так же на других ресурсах ищи,декомпилируй простые скрипты и в скоре ты поймешь. Прошу администраторов\модераторовпочистить тему от оффтопа.