Как написать свое клео

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

Вам нужно скачать программу по имени «Sanny Builder» ее надо установить.

Запускаем программу. Нажимаем наверху кнопку «Файл» затем — Создать.

Любое клео начинается с строчки {$CLEO .cs}, если вы ее не вводите в начало скрипта то у вас будет крашить.

У нас получается :
{$CLEO .cs}

Затем нам надо перейти к функции добавляем :

gosub @cheat_master

У нас получается :

{$CLEO .cs}
gosub @cheat_master

Пишем
:cheat_master

У нас теперь получается :

{$CLEO .cs}
gosub @cheat_master
:cheat_master

И чтобы нас не крашило когда мы выполняем функцию

Пишем после функции «:cheat_master» :
wait 0

Получается :
{$CLEO .cs}
gosub @cheat_master
:cheat_master
wait 0

Чтобы на нажатии например кнопки минус наш код выполнялся пишем после этих проделанных действие :

if 0AB0: key_pressed 109

Получается :
{$CLEO .cs}
gosub @cheat_master
:cheat_master
wait 0
if 0AB0: key_pressed 109

Потом пишем ( обязательно!!! ) :

jf @cheat_master

Получается :
{$CLEO .cs}
gosub @cheat_master
:cheat_master
wait 0
if 0AB0: key_pressed 109
jf @cheat_master

Сейчас пишем код :
0AF8: «Hello World!» color 0xFFFFFF // 0xFFFFFF — это ваш цвет сообщение //

И у нас получается :
{$CLEO .cs}
gosub @cheat_master
:cheat_master
wait 0
if 0AB0: key_pressed 109
jf @cheat_master
0AF8: «Hello World!» color 0xFFFFFF // 0xFFFFFF — это ваш цвет сообщение //

Все! Чтобы скомпилировать нажимаем F6

Если вы сделали все правильно и Sanny Builder не выдал ни ошибка!
То я вас поздравляю вы сделали свой первый Cleo-Скрипт!

Заходим в игру и нажимаем кнопку «Минус» и у нас в чате высветиться сообщение «Hello World»

Если кому-то я помог выдайте репутацию пожалуйста smile

Содержание урока:

1. Предыстория
2. Программы
3. Находим персонажа
4. Ставим персонажа

1. Предыстория

Все вы наверняка хотите научиться делать CLEO-скрипты. Этот урок поможет вам воплотить мечту в реальность. Но это не очень быстро и легко!

Чтобы научиться делать годные скрипты потребуются месяцы или даже годы…. Но не буду вас расстраивать, у вас всё точно получится! Это первый урок из нескольких.

2. Программы

В этом разделе я познакомлю вас с программами, которые нужны для создания мода.

Нам понадобятся: Sanny Builder 3 (создание скриптов) и Ped Editor (просмотр моделей персонажей).

3. Находим персонажа

Теперь нам предстоит найти название персонажа. Когда вы откроете Ped Editor, у вас появится интерфейс программы.

Уроки CLEO. Урок №1: ставим персонажа на локацию

Теперь пролистайте строку с персонажами вниз и найдите подходящего. В моём случае это HMORI.

Уроки CLEO. Урок №1: ставим персонажа на локацию

Не закрывая программу, открываем Sanny Builder 3, в которой будем создавать уже сам скрипт, который поставит персонажа на локацию.

3. Ставим персонажа

Теперь пришло время самым интересным действиям — созданию CLEO-cкрипта. Когда вы открыли окно, вы увидите лишь пустой экран. Но нажмите вот на этот значок: Уроки CLEO. Урок №1: ставим персонажа на локацию.

Появится уже немного другое окно, выглядит как простой текстовый документ:

Уроки CLEO. Урок №1: ставим персонажа на локацию

В первой строке нам нужно лишь написать:

{$VERSION 3.1.0027}
{$CLEO .cs}

//————-MAIN—————

Уроки CLEO. Урок №1: ставим персонажа на локацию

Это начало скрипта. Потом нужно написать переход и проверку загрузки персонажа:

:NONAME_1
Model.Load(здесь указывается название модели персонажа после символа «#», в моём случае это: #HMORI)
038B: load_requested_models

Уроки CLEO. Урок №1: ставим персонажа на локацию

Далее пишем:

1@ = Actor.Create(CivMale, #HMORI, )
Actor.Angle(1@) =

Это место, куда должен быть поставлен персонаж и угол разворота.

Чтобы узнать эти координаты, нужно зайти в игру. Просто нажмите на Уроки CLEO. Урок №1: ставим персонажа на локацию, и игра запустится без титров, так быстрее.

Далее загружаем игру, выходим на улицу, встаём на нужное место и скрываем игру.

Разворачиваем Sanny Builder 3, ставим курсор после «CivMale, #HMORI,». Потом нажимаем Shift+Ctrl+C. Координаты будут вставлены. В моём случае это вот так выглядит:

{$VERSION 3.1.0027}
{$CLEO .cs}

//————-MAIN—————

:NONAME_1
Model.Load(#HMORI)
038B: load_requested_models
1@ = Actor.Create(CivMale, #HMORI, 2486.9573, -1656.5065, 13.3479)
Actor.Angle(1@) =

А там, где написано «Actor.Angle(1@) =», нужно нажать Shift+Ctrl+E и появится угол разворота игрока. Вот так получится:

{$VERSION 3.1.0027}
{$CLEO .cs}

//————-MAIN—————

:NONAME_1
Model.Load(#HMORI)
038B: load_requested_models
1@ = Actor.Create(CivMale, #HMORI, 2486.9573, -1656.5065, 13.3479)
Actor.Angle(1@) = 178.8208

end_thread

В конце мы также поставили метку окончания скрипта (end_thread)

Всё, теперь скрипт закончен и игра не вылетит! Можно конвертировать скрипт и посмотреть что получилось, для этого нажмите на Уроки CLEO. Урок №1: ставим персонажа на локацию или F6.

Далее назовите свой файл и сохраните. Если вылетела ошибка, значит вы сделали что-то неправильно! Перепроверьте это:

{$VERSION 3.1.0027}
{$CLEO .cs}

//————-MAIN—————

:NONAME_1
Model.Load(#HMORI)
038B: load_requested_models
1@ = Actor.Create(CivMale, #HMORI, 2486.9573, -1656.5065, 13.3479)
Actor.Angle(1@) = 178.8208
end_thread

Уроки CLEO. Урок №1: ставим персонажа на локацию

Всё, заходим в игру.

Выбранный персонаж стоит.

Уроки CLEO. Урок №1: ставим персонажа на локацию

В следующем уроке мы будем назначать персонажу анимацию.

Версия 7.5 дарит возможность генерировать CLEO-скрипты! Принцип написания скриптов и основные возможности не отличаются от основной ветки генератора. Но в этом режиме есть некоторые особенности, о которых стоит рассказать.

Подключение и настройка написана в разделе

Установка и настройка. Компиляция скриптов

. Главное отличие в этой настройке: нам надо подключать библиотеки GTA.III.CLEO, GTA.VC.CLEO или GTA.SA.CLEO. Также здесь нужно указывать папку с игрой, так как метод SetMainSCMFolder недоступен:

static void Main( string[] args ) {

// Куда сохранять FXT-файлы

Generator.SetFXTFolder( @»D:ProgrammGTA_SA Career v2.0modloaderwmysteriocleocleo_text» );

Generator.SetGTAFolder( @»D:ProgrammGTA_SA Career v2.0″ );

Generator.SetSannyBuidlerFolder( @»D:ProgrammSanny Builder 3″ );

//Generator.Start<MAIN>();

Generator.Compile<MAIN>( false );

Между символами < и > указывается тип, который наследует Thread, Mission или MissionCustom. Чтобы создать CLEO-поток, достаточно этого кода:

public class MAIN : Thread {

public override void START( LabelJump label ) {

Мы видим, что никак отличий в коде в сравнении с MAIN.scm потоком не наблюдается. Команда end_thread будет заменена на опкод 0A93: end_custom_thread. Такие же манипуляции будут с другими командами, которые используются только в CLEO.

Обратите внимание на название класса. Генератор будет использовать его как название файла. Особых ограничений на название не накладывается, но рекомендую использовать прописные символы в имени класса.

По умолчанию скрипт компилируется с расширением CS или СМ в папку ИГРАCLEO. Если нужно изменить эти свойства, то здесь используется система атрибутов:

public class MAIN : Thread {

public override void START( LabelJump label ) {

Всего таких атрибутов 3; Вы можете использовать только те, которые нужны, игнорируя остальные. Код выше сохранит скрипт по этому пути: ИГРАCLEONEW_DIRMAIN.H.

Убедитесь, что путь содержит все нужные папки на жестком диске!

Атрибут EnableThreadSaving реализует опкод 0A95, но без его явного вызова. Этот атрибут, как и Extension, не применяется к миссиям и будет игнорироваться.

Компиляция нескольких скриптов

Если есть необходимость компиляции целой пачки скриптов, то нам достаточно несколько раз вызывать метод Compile:

Generator.Compile<SCRIPT1>();

Generator.Compile<SCRIPT2>();

Generator.Compile<SCRIPT3>();

Generator.Compile<SCRIPTN>();

Обратите внимание, что если использовать команду

create_thread<SCRIPT_NAME>();

то поток SCRIPT_NAME будет включен в финальную сборку и скомпилируется самостоятельно вместе с исходным скриптом!

Дарова, [visitor][/visitor]! В этой теме разберем наболевшую тему для новичков — писать код CLEO не на метках.

Вот вы думаете, что освоили технику написания кода на метках и рады этому. Спешу разочаровать! Писать код на низкоуровневых конструкциях удел психопатов; если Вы психопат, то ладно, можете продолжать то, что делаете.

Разберем пару нюансов низкоуровневых конструкций:

  1. Легко понимаем, если кодер впервые узнал, что сфера программирования вообще существует, но знает пару слов на английском (jump, else и пр.);
  2. Неудобно читаем, и в некоторых моментах сами же теряетесь (не правда ли?; не говорим про код в котором меньше 10 меток);

При написании на высокоуровневых конструкциях код так же легко читаем, конечно же при условии того, что Вы понимаете их. Тяп-ляп тоже не надо делать.

Почему же стоит всё таки писать на высокоуровневых конструкциях?
Если всё таки в CLEO это возможно допустить, то в других языках это недопустимо. Если Вы планируете больше не связываться с языками, то хотя бы займитесь саморазвитием на этом чудо-языке.
Я Вас не убедил? — ну и ладно. Можете проваливать!
Что-то зацепило? — неплохо. А выдержите ли Вы следующий этап? Понять эти высокоуровневые конструкции.

P.S. Все примеры для примеров, скомпилировать просто так их не получится: необходимо добавлять директиву {$CLEO}, нулевой оффсет и прочее для правильной компиляции.

Самая простая конструкция. Имеет суфиксы «and» и «or», которые разделены пробелом между if.
В себе может содержать только какое-то условие, которое верно (true) или ложно (false). В if and и if or этих условий может быть несколько (больше одного).

Пример if:

1@ = 1000
if 1@ > 1000
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. 1@ равен 1000, а проверяется строго больше 1000" color 0xFFFFFF
else
    if 1@ == 1000
    then
         0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000" color 0xFFFFFF
    end
end

// Также можно
if 1@ >= 1000
then
    0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000" color 0xFFFFFF
end

1@ = 999
if 1@ >= 1000
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. 1@ меньше и не равен 1000" color 0xFFFFFF
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Пример if and

(из-за особенностей CLEO количество условий не должно превышать 8)

:

1@ = 1000
2@ = 15
if and
    1@ >= 1000
    2@ >= 16
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 15, а условие проверяет больше или равно 16" color 0xFFFFFF 2@
end

if and
    1@ == 1000
    2@ == 15
then
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d равен 1000 и %d равен 15" color 0xFFFFFF 1@ 2@
end

if and
    1@ < 1000
    2@ > 15
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 1000, %d равен 15" color 0xFFFFFF 1@ 2@
    0AF8: samp add_message_to_chat "а условие проверяет: %d строго меньше 1000 и %d строго больше 15 " color 0xFFFFFF 1@ 2@
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Пример if or

(из-за особенностей CLEO количество условий не должно превышать 8)

:

1@ = 1000
2@ = 15
if or
    1@ >= 1000
    2@ >= 16
then
    0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d больше или равен 1000. Этого достаточно для срабатывания условия" color 0xFFFFFF 1@
end

if or
    1@ == 1000
    2@ == 15
then
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. %d равен 1000 ИЛИ %d равен 15" color 0xFFFFFF 1@ 2@
end

if or
    1@ < 1000
    2@ > 15
then
    0AF8: samp add_message_to_chat "Данное условие не выполнится, т.к. %d равен 1000, 2@ равен 15" color 0xFFFFFF 1@
    0AF8: samp add_message_to_chat "а условие проверяет: %d строго меньше 1000 ИЛИ %d строго больше 15" color 0xFFFFFF 1@ 2@
else
    0AF8: samp add_message_to_chat "А ответвление от условия сработает, т.к. ветвь else означает то, что условие не было выполнено" color 0xFFFFFF
end

Обычно используется для перебора чего-либо или ожидания какого-то условия. Цикл, как цикл, но есть несколько типов.

Цикл while, выполняется пока условие верно (true):

while true // выполняется бесконечно
    wait 0
end

1@ = 0
while 1@ < 1000 // выполняется пока 1@ меньше 1000
    1@ += 1
end

1@ = 1000
while 1@ < 1000 // выполняется пока 1@ меньше 1000, т.е. даже не пройдет одну итерацию
    1@ += 1
end

1@ = 0
while true // может выполняться бесконечно, но внутри цикла есть его обрывание
    if 1@ > 1000
    then
        break // обрывание и выход из цикла. На этом моменте 1@ равен 1001.
        // Если изменить условие на 1@ >= 1000, то обрывание произойдет на значении 1@ равном 1000
    end
    1@ += 1
end

1@ = 0
while true // выполняется бесконечно, но тело цикла имеет некоторые особенности
    wait 0
    if 1@ == 1000
    then
        // в данный момент 1@ достигнуло значения 1000
        // но цикл всё ещё продолжает работать и проверяет 1@ на соответствие значения 1000
        continue // цикл начинает новую итерацию, заканчивая данную итерацию не доходя до конца цикла,
        //          т.е. "1@ += 1" не выполнится, пока условие не станет ложным (false)
    end
    1@ += 1
end

Цикл for, выполняет перебирание от a до b с шагом c (с по умолчанию равен 1). Для перебора с возрастанием используется to, для убывания — downto:

for 1@ = 1 to 10 // возрастание - от 1 до 10 (с шагом 1, по умолчанию)
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 1, 1@ = 2, 1@ = 3, ..., 1@ = 10
end

for 1@ = 1 to 10 step 5 // возрастание - от 1 до 10 с шагом 5
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 1, 1@ = 6
end

for 1@ = 10 downto 1 // убывание - от 10 до 1 (с шагом 1, по умолчанию)
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 10, 1@ = 9, 1@ = 8, ..., 1@ = 1
end

for 1@ = 10 downto 1 step 5 // убывание - от 10 до 1 с шагом 5
    // данный цикл будет выводить сообщение в чат с текущей итерацией
    0AF8: samp add_message_to_chat "1@ = %d" color 0xFFFFFF 1@
    // 1@ = 10, 1@ = 5
end

Цикл repeat..until, тот же что и while, но сначала выполняется итерация цикла, а потом только проверка условия (так называемый постусловный цикл). Кстати, чтобы цикл остановился, условие должно вернуть ложь (false), вся суть в примере:

1@ = 1000
repeat
    1@ -= 1
until 1@ == 0 // пока 1@ не равен 0
// после цикла 1@ будет равен 0

1@ = 0
repeat
    1@ -= 1
until 1@ < 0 // пока 1@ строго больше 0
// после цикла 1@ будет равен -1

Кейворд — это некая визуальная замена для опкодов. Каждому кейворду соответствует опкод. Список для CLEO/GTASA хранится в папке Sanny Builderdatasakeywords.txt

Но конечно же не своих придуманных, ну или своих, но с понятными именами, но как показала практика, свои кейворды на показ лучше не выставлять.
К стандартным относятся: wait, goto, jump, else_jump, jf, if, return, gosub

Также в дистрибутиве SAMPFUNCS для разработчиков имеется файл keywords.txt, который имеет несколько полезных:

0ab0=key_down
0ab1=call
0ab2=ret
0ac8=alloc
0ac9=free
0acd=print
0ad1=printf
0ad3=format
0b43=cmdret
0b78=log
059A=return_false
0485=return_true
0AF8=chatmsg
0AF9=say

Все они дают некий процент к скорости написания кода.

Почти тоже, что и кейворды, но имеют более расширенную систему. Никак не относится к классам в ООП.
Более подробно я не буду углубляться, но могу сказать следующее: они существенно сужают поиск нужного опкода с помощью их группировки по отдельным группам.
Структура описания классов хранится в папке Sanny Builderdatasaclasses.db (для игры GTASA соответственно).

Классы имеют следующую структуру — Группа.свойство/метод.
Примеры:
Actor.PutAt($PLAYER_ACTOR, 0.0, 15.0, 50.0) — аналог опкода 00A1: put_actor $PLAYER_ACTOR at 0.0 15.0 50.0
0@ = Car.Health(1@)
— аналог опкода 0227: 0@ = car 1@ health; также данный метод может и устанавливать здоровье машине: Car.Health(1@) = 1000 — аналог 0224: set_car 1@ health_to 1000

Табуляция — Ваш спаситель в чужом коде (ведь свой Вы уже выучили, пока писали его :pardon:).
Обычно табуляция используется для того, чтобы код стал выглядеть по-человечески и хотя бы понятен другому кодеру.
Как

я делаю

табуляцию (4 пробела или 1 нажатие клавиши Tab для одной конструкции, также называют лесенкой):

// данная конструкция не вложена, отступ = 0
while true
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    wait 0
end // конец конструкции (while true), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
for 0@ = 0 to 10
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    // тут что-нибудь, не придумал
end // конец конструкции (for 0@ = 0 to 10), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
if 1@ > 1000
then
    // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 1 (или 4 пробела)
    0AF8: samp add_message_to_chat "Переменная 1@ больше тысячи" color 0xFFFFFF

    // данная конструкция вложена, отступ = предыдущий_отступ = 1 (или 4 пробела)
    if 2@ >= 50
    then
        // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 2 (или 8 пробелов)
        0AF8: samp add_message_to_chat "Переменная 2@ больше/равно пятидесяти" color 0xFFFFFF

        // данная конструкция вложена, отступ = предыдущий_отступ = 2 (или 8 пробелов)
        while true
            // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 3 (или 12 пробелов)
            wait 0
        end // конец конструкции (while true), отступ = оступ_начала_данной_конструкции = 2 (или 8 пробелов)
    end // конец конструкции (if 2@ >= 50), отступ = оступ_начала_данной_конструкции = 1 (или 4 пробела)
end // конец конструкции (if 1@ > 1000), отступ = оступ_начала_данной_конструкции = 0

// данная конструкция не вложена, отступ = 0
if and
    1@ == 1000 // одна из особенностей конструкции, отступ_отд = (предыдущий_отступ + 1 табуляция) = 1 (или 2 пробела)
    2@ == 15 // ..., отступ_отд = (предыдущий_отступ + 1 табуляция) = 1 (или 2 пробела)
    // заметьте что некоторые табуляции не влияют на последующие, как и данная конструкция
then
   // тело конструкции, отступ = (предыдущий_отступ + 1 табуляция) = 2 (или 8 пробелов)
   0AF8: samp add_message_to_chat "Данное условие выполнится, т.к. 1@ равен 1000 и 2@ равен 15" color 0xFFFFFF
end // конец конструкции (if and ...), отступ = оступ_начала_данной_конструкции = 0

Это предложение, скорее всего, заведет Вас в тупик, подумай Всё ещё не поняли как делается табуляция? Очень легко: для каждой конструкции устанавливается количество отступов. Если конструкция вложена в другую, то значит, что для неё будет 1 табуляция; если она вложена дважды, то устанавливается 2 табуляции. Также это касается и для тел конструкций.

Константа — неизменяемое значение. Если в других языках с этим строго, то в CLEO указав значение константы — переменную, Вы сможете менять значение

переменной

(НЕ константы).

Представьте, Вы не знаете что такое RGB, и Вам тяжело сориентироваться в обычных цветах (из примера ниже), то просто тырим инфу из инета и заносим под удобные константы. Пример конечно не очень, но для использования констант сойдет:

const
    WHITE_COLOR = 0xFFFFFF
    RED_COLOR = 0xFF0000
    GREEN_COLOR = 0x00FF00
    MY_COLOR = 0x624206
end

0AF8: samp add_message_to_chat "Красный текст" color RED_COLOR
0AF8: samp add_message_to_chat "Зеленый текст" color GREEN_COLOR
0AF8: samp add_message_to_chat "Синий текст" color 0x0000FF
0AF8: samp add_message_to_chat "Чтобы каждый раз не искать цвет в исходниках, представим его как MY_COLOR" color MY_COLOR

Вам ещё предоставляется возможность посмотреть познавательную видюшечку (от @DarkP1xel):
осторожно, ненормативная лексика :hi:

N1KО

Что такое скриптинг?

От слова script – сценарий, то есть последовательность каких-либо действий. А скриптинг – процесс создания этой последовательности. Для GTA это значит: писать миссии либо более простые вещи (например, давать игроку новые возможности). Тех, кто пишет скрипты, называют скриптерами. Основа любого скрипта – это опкоды (операционные коды), а они сами базируются на переменных, в которые записываются нужные для правильной работы скрипта значения (цифровые, то есть числа целые 1, 2, -1, -2… либо дробные, обязательно с точкой 1.2, -2.3; или аналоговые, то есть люди, авто, объекты). Могут иметь вид 0@, 1@, 2@…33@ или $0, $1, $2… или $»текст на латинице без пробелов и кавычек». Разница между @ и $ такая: первые переменные действуют лишь в рамках одного скрипта (или потока), а вторые можно спокойно использовать на всём протяжении main.scm (наглядный пример: $PLAYER_CHAR).
Как записать значение в переменную?
2@ = 0 // в переменную 2@ записан нуль
00BF: $1 = current_time_hours, $2 = current_time_minutes // в переменные $1, $2 записано текущее игровое время (часы, минуты соответственно).
009A: 2@ = create_actor_pedtype 4 model #MALE01 at 0.0 0.0 0.0 // в переменную 2@ записан актёр
00A5: 0@ = create_car #PONY at 0.0 0.0 0.0 // в переменную 0@ записана машина
Переменную, в которую записывают актёра или авто, принято называть именем. Т.е. в примерах выше 2@ – имя актёра, 0@ – имя транспорта.


Как открыть main.scm?

Самая удобная программа – Sanny Builder. Свежую версию можно найти на sannybuilder.com, и там же на форуме задать интересующий вопрос. Полезные советы: 1) если курсор стоит на модели (она отличается символом # в начале), то в нижней панели слева появляется ID; 2) в современном SB есть много ключевых слов, набрав которые и поставив точку, можно получить список доступных действий, например: Actor, Car, Model; 3) нажатие Сtrl+Alt+1 вызовет Редактор координат, где при запущенной игре будет отображаться текущее положение игрока, а также его можно использовать как телепорт; 4) нажатие Сtrl+Alt+2 вызовет список опкодов; 5) если компиляция скрипта выдала ошибку, не спеши кликать ОК, если не знаешь причину бага, а нажми для начала Помощь; 6) при первом запуске программы нажми F10 или зайди в Сервис > Настройки и выбери себе язык и обязательно укажи папку GTA SA.


 Как писать миссии?

Подробная справка прилагается к SB. Вызвать можно нажатием F12 или Справка > Помощь.


 Как припарковать транспорт и поставить пикап?

Проще через IPL, но некоторым не нравится, что там иногда угол поворота машины бывает не тот, который нужен. И главное: для этих опкодов модель загружать не нужно.
09E2: 0@ = parked_car_generator_w_numberplate #BF400 -1 -1 0 alarm 0 door_lock 0 0 10000 plate «HOMEP_69» at X Y Z angle 0.0 // или…
014B: 0@ = init_parked_car_generator #BF400 -1 -1 1 alarm 0 door_lock 0 0 10000 at X Y Z angle 0.0 // 0@ – имя автогенератора, #BF400 – модель авто (можно писать ID, т.е. в данном случае 581), 2 цифры далее – цвет, X Y Z – координаты, 0.0 – угол; plate – номерной знак (в кавычках, не больше 8 латинских символов)
014C: set_parked_car_generator 0@ cars_to_generate_to 101 // это включает генератор, если вместо 101 написать 0, машина появляться не будет
Для пикапа:
0213: $0 = create_pickup #INFO type 3 at X Y Z // обычный пикап-значок
032B: $0 = create_weapon_pickup #teargas type 15 ammo 15 at X Y Z // оружие
$0 – имя пикапа, #INFO и #teargas – модель (оружие или значок, можно ID); type – тип (3 – одноразовый, 15 – многоразовый); ammo – количество боеприпасов; X Y Z – координаты
Как изменить оружие банд и число гангстеров в определённом районе?
0237: set_gang 0 weapons_to 23 32 1 // 0 – ID банды (0 == Ballas, 1 == Grove Street Families, 2 == Los Santos Vagos, 3 == San Fierro Rifa, 4 == Da Nang Boys, 5 == Mafia, 6 == Mountain Cloud Triad, 7 == Varrio Los Aztecas); 23 32 1 – это оружие (0 – кулaки, 1 – кастет, 2 – клюшка для гольфа, 3 – дубинка для копов, 4 – ножик, 5 – бита, 6 – лопата, 7 – кий, 8 – кaтaнa, 9 – пила, с 10 до 14 – дилдо и цветы, 15 – трость, 16 – гранаты, 17 – слезоточивый газ, 18 – мoлoтoвы, 22 – пистолет, 23 – с глушаком, 24 – Desert Eagle, 25 – дробоган, 26 – обрез, 27 – мощный дробоган, 28 – Mac 10, 29 – MP5, 30 – AK47, 31 – M4, 32 – Tec9, 33 – винтовка, 34 – снайперка, 35 – РПУ, 36 – ракетница с самонаводкой, 37 – огнемёт, 38 – старый добрый Mиниган, 41 – баллончик с краской, 42 – огнетушитель)
076C: set_zone ‘SUN1’ gang 1 density_to 30 // SUN1 – имя района (см. в Справке SB: Документация по SCM > GTA SA > Типы зон); 1 – знакомый ID; 30 – плотность (в процентах от населения этого района)


 Какие есть особые опкоды?

015D: set_gamespeed 0.0 // скорость игры (1.0 – обычная; этот опкод используется в режиме Bullet Time)
01EB: set_traffic_density_multiplier_to 0.0 // отключает движение на дорогах
0110: clear_player $PLAYER_CHAR wanted_level // очистить уровень розыска
01F7: set_player $PLAYER_CHAR ignored_by_cops 1 // копы игнорируют
02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1 // установить иммунитет
0330: set_player $PLAYER_CHAR infinite_run 1 // бесконечный спринт
0331: set_player $PLAYER_CHAR fast_reload 1 // быстрая перезарядка оружия (не у всех видов)
0335: enable_free_respray 1 // халявные перекраски
03BF: set_player $PLAYER_CHAR ignored_by_everyone 1 // все игнорируют
03DE: set_pedestrians_density_multiplier_to 0.0 // отключает людской поток на улицах
055D: make_player $PLAYER_CHAR fireproof 1 // огнеупорность
0572: enable_taxi_nitros 1 // все такси с азотоускорением
0629: change_integer_stat 181 to 4 // можно свободно гулять по SA без звёзд розыска
0631: put_actor 0@ in_group $PLAYER_GROUP // актёр будет следовать за игроком
0632: release_group $PLAYER_GROUP // отпустить актёров из группы
06C8: enable_riot 1 // включает бунт (только в LS)
06D0: enable_emergency_traffic 0 // отключает спецслужбы
07A7: put_jetpack_on_actor $PLAYER_ACTOR // джетпак
0879: enable_gang_wars 1 // включает войну за территории
08C6: set_actor $PLAYER_ACTOR stay_on_bike 1 // игрок не падает с байка
08FD: enable_heat_visuals 1 // включение (0 – выключение) эффекта «жарка» при высокой температуре окружающей среды
09C7: change_player $PLAYER_CHAR model_to #MODEL // замена своей модели (сначала надо загрузить новую)
09E6: set_burglary_houses_accessible 1 // доступ в жилые дома
09E9: car 3@ add_single_nitro // одноразовый нитроазот
0A24: enable_military_zones_wanted_level 1 // отключение охраны на военных зонах
0A3D: enable_prostitutes_pay_you 1 // шлюхи платят тебе


 Как убрать эффект NFS MW в моде Night Crimes?

1) открыть в SB файл data/script/main.scm
2) найти строку create_thread @Noname_9 (Сtrl+F)
3) удалить либо закомментировать (Сtrl+Q), чтобы игра игнорировала поток Noname_9
4) компилировать (F6) и запустить игру (F8)
P.S. Для проверки, тот ли это поток, найди Noname_9, там должно быть написано
02E3: 12@ = car $11883 speed
if
12@ >= 30.0
else_jump @Noname_9


 Как изменить количество денег?

0109: player $PLAYER_CHAR money += X // X – положительное или отрицательное целое число, в зависимости от которого денег прибавят или отнимут


 Как сделать, чтобы актёр или автомобиль шёл по определённому пути?

05D6: clear_scmpath
05D7: add_point_to_scmpath X Y Z // X Y Z – координаты добавляемой точки в маршруте
05D8: AS_assign_scmpath to_actor $PLAYER_ACTOR flags 4 0 // для актёра: 4 – скорость (до 7)
06BB: set_actor -1 drive_car 1@ speed 10.0 along_SCM_path // для машины: 10.0 – скорость


 Как выбрать случайного пешехода?

:Noname
wait 0
if and
06FF: any_ped_near_actor $PLAYER_ACTOR in_range 20.0 // радиус
Player.Defined($PLAYER_CHAR)
else_jump @Noname
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to -1 closest_ped_to 1@
if
not 1@ == -1
else_jump @Noname


 Как сделать чтобы банды не приставали?

0746: set_acquaintance 1 of_actors_pedtype 7 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 8 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 9 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 10 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 11 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 12 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 13 to_actors_pedtype 0
0746: set_acquaintance 1 of_actors_pedtype 14 to_actors_pedtype


 Как сделать актёра другом или врагом?

077A: set_actor $Actor acquaintance 4 to_actors_pedtype 0 // acquaintance бывают такие: 1 – уважение, 2 – симпатия, 3 – неприязнь, 4 – вражда


Что такое CLEO?

Библиотека CLEO шагнула в новое измерение, и перед нами четвертая версия этого проекта. Теперь библиотека CLEO поддерживает игры GTA III и GTA VC, что это открывает новые возможности для разработчиков скриптов на данных платформах.

Возможности

Новые опкоды
CLEO 4 имеет в наличии 100 полезных опкодов, которые позволяют работать с внешними файлами, изменять данные в памяти игры, вызывать игровые функции со своими параметрами, а также многое другое. В четвертой версии появились новые опкоды для работы со звуками, форматирования текста, была добавлена возможность выводить на экран тексты без использования внешних текстовых файлов (.gxt, .fxt). Чтобы оценить новые достижения и использовать их в ваших скриптах, установите последнюю версию библиотеки CLEO 4.

Плагины

CLEO-плагины — это обычные DLL-файлы, но имеющие расширение .CLEO. При запуске библиотека CLEO ищет в папке <игра>CLEO файлы с данным расширением и пытается загрузить их. В случае удачной загрузки плагин начинает работать и выполнять те функции, для которых он написан.

CLEO 4 позволяет создавать новые опкоды, используя исходные коды CLEO SDK. В стартовом комплекте библиотеки можно найти три примера таких плагинов:
IniFiles.cleo — работа с INI файлами;
FileSystemOperations.cleo — работа с файлами и папками.
IntOperations.cleo — битовые операции над целыми

Процедура установки плагина очень проста: просто скопируйте файл в папку <игра>CLEO. Чтобы прекратить пользование плагином — удалите файл или измените его расширение. Список доступных плагинов можно найти на этой странице.

Добавление скриптов
Начиная с CLEO 3, в игру можно добавлять новые скрипты, написанные в редакторе Sanny Builder, без необходимости начала новой игры. Все, что требуется для добавления такого скрипта в игру — это поместить его в папку <игра>CLEO. После запуска новой или сохраненной игры скрипт начнет работу. Для удаления скрипта из игры — удалите соответствующий файл.

CLEO 4 разрабатывалась для трех версий exe: 1.0 us, 1.0 eu и 1.01 eu. Таким образом, существует 8 разных exe, с которыми совместима библиотека: 

Оригинальное имя
Описание
Версия игры
Размер

gta_sa.exe
оригинальный 1.0 us
1.0
14 405 632 байт

gta_sa.exe
публичный no-dvd 1.0 us
1.0
14 383 616 байт

gta_sa_compact.exe
listener’s exe
1.0
5 189 632 байт

gta_sa.exe
оригинальный 1.01 eu
1.01
14 405 632 байт

gta_sa.exe
публичный no-dvd 1.01 eu
1.01
15 806 464 байт

gta_sa.exe
версия от 1С
1.01
15 806 464 байт

gta_sa.exe
оригинальный 1.0 eu
1.0
неизвестно

gta_sa.exe
публичный no-dvd 1.0 eu 
1.0
14 386 176 байт


Установка

СLEO 4 распространяется в виде автоматического инсталлятора. Для установки библиотеки запустите инсталлятор и следуйте его инструкциям.

CLEO 4 использует 3 файла в работе: vorbisFile.dll, vorbishooked.dll, cleo.asi.

CLEO 4 для San Andreas для проигрывания звуковых файлов требует установленной библиотеки BASS.dll версии 2.4, которую можно скачать с официального сайта Un4seen Developments Ltd. Устанавливается BASS.dll очень просто — нужно просто скопировать файл bass.dll в корневую директорию игры GTA San Andreas.


Распространение библиотеки CLEO

Если вы написали скрипт, использующий библиотеку CLEO и (или) ее плагины, вы можете также распространять вместе с ним необходимые файлы. Вы можете указать ссылку на данную страницу, чтобы пояснить, как необходимо пользоваться библиотекой и сопутствующими файлами.

Эйоу, здарова гитта тащер.
Сегодня мы будем учиться делать cleo скрипты.
С помощью cleo можно сделать: Миссию и обычный скрипт.
Хорош воду гнать, го учиться.

Подготовка:
-ПК(консолька не подойдет 🙁 )
-ЖТА:СА на твой ПэКа
-Android
-ЖТА:СА на твой Android
-Cleo библиотека на твою ЖТА:СА на Android(Сам ищи)
-Cleo библиотека на твою ЖТА:СА на пк(https://www.cleo.li)
-Sanny Builder(SannyBuilder.com)
-Руки из правильного места и чучуть мозгов(вроде-бы у всех есть)
И так подготовка закончена.

Теперь ставишь ЖТА, cleo и Билдер, после чего открываешь санный билдер, БЕАЧ
Указываешь в настройках место где у тебя стоит ЖТА.
И все ты готов.

Теория(можно не читать):
*.cs — Custom Script — основной вид скриптовтов для ПК версии ГТА
*.cm — Custom Mission — основной вид внешних миссий для ПК версии ГТА
*scm — Хз как расшивровать, но тут сам игровой скрипт, но мы не будем им пользоваться(все внутрении миссии, пикапы и прочее)
*.csa — Custom Script Android — Автозагружаемый вид скриптов для Android версии ГТА
*.csi — Custom Script I(что на i) — Вызываемый(через cleo menu) вид скриптов для Android версии ГТА
Теория кончилась.

Практика:

Открываешь SB.
Жмакаешь Contol+N.
Тут типа надо скрипт писать, кекъ
Ну пишешь значит:
{$Cleo .формат} форматы читай выше,scm не используй
Эта строчка позволяет компилятору узнать, что ему копмилировать и в каком формате.
Дальше
0000:
«0000» — это операционный код(опкод), «:» — это отделение опкода от аргументов. У данного опкода нету аргументов, посему мы ничего не пишим.
Этот опкод нужен, что бы избежать ошибки при прыжке на первую метку.
Но лучше его писать всегда.
thread «MyFirstScritp»
Это можно и не писать, но лучше написать, потом объясню зачем это нужно
И в конец end_thread.
Это что бы когда скрипт закончит свою работу игра не вылетала
Все, первый скрипт готов, но он не сохранен.
Жмем F6 и указываем путь. У меня это «C:Program Files (x86)Advance RolePlaySan Andreas Multiplayercleo»
И название не забудь. Желательно, что бы название совпадало с тем, что написано в thread
Все, скрипт готов, но он ни чего не делает:(. НАДО ИСПРАВИТЬ!
Можно например написать(между thread и end_thread):
Player.Money($PLAYER_CHAR) += 228
или
0109: player $PLAYER_CHAR money += 100
Это одно и тоже. У некоторых опкодов есть более человеко-понятный вид
Теперь разберем:
0109 — опкод.
: — разделение опкода и аргументов.
player — это часть описания опкода, что бы сделать его понятнее, можно не писать(это не аргумент)
$Player_Char — глобальная переменная отвечающая за данные игрока. (это аргумент)
money — это часть описания опкода, что бы сделать его понятнее, можно не писать(это не аргумент)
+= — это действие которое неободимо совершить. (это необходимо писать)
100 — это операнд, количество денег.
И разберем первый вариант:
Player — это сложно объяснить, но это нужно.
Money — это то, что мы будем изменять
$Player_Char — глобальная переменная отвечающая за данные игрока. (это аргумент)
+= — это действие которое неободимо совершить. (это необходимо писать)
228 — это операнд, количество денег.
Итог:
-У нас есть программы для скриптинга
-У нас есть небольшой, но рабочий скрипт.
-Мы знаем уже два опкода.

Урок по cleo №1

Первое, что должно быть у скриптера, это программа для компиляции/декомпиляции файла MAIN.SCM. Желательно пользоваться очищенным мейном, т.к. под оригинальный практически любой новый код рано или поздно вызовет ошибку.
Да и “читать” оригинальный мейн даже опытному скриптеру тяжело, поэтому берите чистый main.txt из этого архива.
Сразу советую скриптить в Sanny Builder (далее SB). На данный момент это самая лучшая (по моему мнению) программа с постоянными обновлениями.

ПОТОКИ (thread’s)
каждый поток начинается с двоеточия, например :MAIN_100
В каждом потоке c проверками должна быть задержка, например:
:MAIN_100
wait 100 ms
если пауза будет отсутствовать, то игра зависнет.

В конце каждого кода должна стоять команда end_thread, также, начиная новый поток, вы должны прописать ему название, например thread “MAIN”. Координаты узнаются с помощью позиции игрока. То есть если вы хотите, чтобы тачка стояла у дома CJ, то встаньте рядом с домом CJ и в SB нажмите Insert+CTRL+C и компилятор выдаст вам координаты :)

АКТЁРЫ (actor)
Под актёрами подразумеваются всё, от обычных пешеходов до игрока (player).
В игре их огромное количество, их ID начинается с 7 до 288.
Для создания требуется загрузить модель, также требуется проверка.

Набор команд:
Model.Load(30) //загрузка
Model.Available(30) //проверка
$10950 = Actor.Create(CivMale, 30, 0.0, 0.0, 0.0) //создание

Спец. Актёры (special actor)
По сути те же актёры, но для их создания используются специальные опкоды (команды). В остальном команды одинаковы.

Набор команд:
023C: load_special_actor 1 ‘RYDER2’ //загрузка. Внимание, мы загружаем Райдера как спец. Актёра под номером “1”
023D: special_actor 1 loaded //проверка
$10950 = Actor.Create(CivMale, 290, 0.0, 0.0, 0.0) //создание
0296: unload_special_actor 1 //выгружаем из памяти актёра под номером “1”

ТРАНСПОРТ (car)
Под словом “car” подразумевается байк, лодка, тачка, самолёт и тд.
По сути, команды с байком и тачкой одинаковы, хотя бывают исключения.
Соответственно, для загрузки моделей используются одни и те же команды

Набор команд:
Model.Load(#ADMIRAL) //загрузка
Model.Available(#ADMIRAL) //проверка
0@ = Car.Create(#ADMIRAL, 0.0, 0.0, 0.0) //Создание

ИГРОК (player)
Как было сказано выше, большинство команд как для актёра, так и для игрока одинаковы. Однако есть специальные команды, созданные специально для Игрока
Перечислю самые часто используемые:
01B4: set_player $PLAYER_CHAR frozen_state 0 //замораживаем/размораж. игрока, обычно используется для заставок.

Player.Defined($PLAYER_CHAR) //проверка, существует ли игрок.
Player.Money($PLAYER_CHAR) += 200 //прибавляем денег игроку.
Player.ClearWantedLevel($PLAYER_CHAR) //очищаем уровень розыска.

ПРОВЕРКИ (оператор if)
Проверки-очень полезная вещь в скриптинге. И очень много опкодов, проверяющих различные параметры.
Например, если игрок находится вне миссии и у него меньше половины жизней, то пополняем ему здоровье,
Осуществляется это таким скриптом:

:MYLABEL_1
wait 100
thread «HEALTH»

:MYLABEL_2
wait 100
if AND

Player.Defined($PLAYER_CHAR) //существует ли игрок
$ONMISSION == 0 //не запущена ли миссия
8184: NOT actor $PLAYER_ACTOR health >= 50 //жизней меньше 50-и
jf @MYLABEL_2 //если эти условия неверны, то переходим в начало потока, если всё верно, то этот переход игнорируется.
055E: set_player $PLAYER_CHAR max_health += 500
0223: set_actor $PLAYER_ACTOR health_to 500
end_thread

ОБЪЕКТЫ (objects)
Через мейн можно создать любой объект, прописанный в IDE. Но сначала его нужно загрузить.
Вот основные команды для работы с ними:
Model.Load(#CIGAR) //загрузка
Model.Available(#CIGAR) //Проверка
// Обратите внимание, что для загрузкипроверки транспорта, объектов и подобного используются одинаковые //команды.
60@ = Object.Create(#CIGAR, 0.0, 0.0, 0.0) //Создание
Object.Destroy(60@) //Удаление

ПИКАПЫ (pickups)
В GTA существует множество различных пикапов, сейчас мы перечислим основные типы:
Это опкод создания пикапа:
0213: $669 = create_pickup #INFO type 3 at 0.0 0.0 0.0

Часть команды ‘Type’ означает время обновления пикапа:

1 – пикап для бронежилета.
2 – Полицейская Звездочка.
3 – Пикап появляется один раз.
4- Адреналин.
5 – Пикап сохранения.
15 – Пикап появляется через 6 часов после использования.

ПИКАПЫ ОРУЖИЯ (weapon pickups)

Если вы хотите создать пикап оружия, то команду следует оформить иным образом.
Для создания пикапа оружия ближнего боя следует использовать такую команду:
0213: $1 = create_pickup 341 type 15 at 0.0 0.0 0.0
Где ‘341’, это ID оружия (в данном случае бензопила).
Заметьте, при создании пикапа оружия загружать модель не надо (в отличие от того случая, если вам надо непосредственно дать оружие актёру).

Теперь перейдем к огнестрельному оружию:
Обратите внимание, тут используется уже другой опкод.
032B: $1 = create_weapon_pickup 366 15 ammo 999 at 0.0 0.0 0.0
‘366’ – ID оружия, параметр ‘ammo’, в данном случае 999, указывает кол-во патронов в оружии.

ОРУЖИЕ (weapons)
Чтобы дать определенному актеру оружие, следует использовать определенный опкод:
01B2: give_actor 2@ weapon 28 ammo 60 // Даём актёру 2@ оружие с ID 28 с амуницией 60
Обратите внимание, что прежде чем дать оружие актёру, его следует загрузить, более того, ID оружия при загрузке и ‘выдаче’ актёру разный, но weapons ID загрузки и создания можно узнать в help’e SB, но для удобства выкладываю их тут:

gift type weapons
10 321 #gun_dildo1
11 322 #gun_dildo2
12 323 #gun_vibe1
13 324 #gun_vibe2
14 325 #flowera
15 326 #gun_cane
melee weapons
1 331 #brassknuckle
2 333 #golfclub
3 334 #nitestick
4 335 #knifecur
5 336 #bat
6 337 #shovel
7 338 #poolcue
8 339 #katana
9 341 #chnsaw
projectiles
16 342 #grenade
17 343 #teargas
18 344 #molotov
handguns
22 346 #colt45
23 347 #silenced
24 348 #desert_eagle
shotguns
25 349 #chromegun
26 350 #sawnoff
27 351 #shotgspa
sub-machineguns
28 352 #micro_uzi
29 353 #mp5lng
machineguns
30 355 #ak47
31 356 #m4
32 372 #tec9
rifles
33 357 #cuntgun
34 358 #sniper
specials
35 359 #rocketla
36 360 #heatseek
37 361 #flame
38 362 #minigun
39 363 #satchel
41 365 #spraycan
42 366 #fire_ex
43 367 #camera
44 368 #nvgoggles
45 369 #irgoggles
46 371 #gun_para
Other
370 #jetpack

И так, вот пример загрузки и выдачи оружия актёру:

:LABEL
Model.Load(348)
:LABEL_2
if AND
Model.Available(348)
jf @LABEL_2
01B2: give_actor $PLAYER_ACTOR weapon 24 ammo 60
end_thread

Тут мы дали игроку Дезерт Игл с 60 патронов.

Понравилась статья? Поделить с друзьями:
  • Как написать свое исключение java
  • Как написать свое имя цифрами
  • Как написать свое имя на экране блокировки
  • Как написать свое имя на часах аль харамейн
  • Как написать свое имя на тайском