Что такое main самп

Обновлено: 19.05.2024

1. Pawn - язык программирования. Приспособлен для создание модов и скриптов в SA-MP.
2. Чтобы использовать данный язык, нужна программа Pawno.

Неплохо знать английский язык, т.к. именно на нём записаны все функции и колбеки.

Если вы делаете мод, то сначала стоит записать данные строки:

a_samp.inc - это файл, содержащий в себе все функции и паблики sa-mp.

Паблики (public), иногда их называют калбеки (callbacks).
Callback, переводится как "функция, вызываемая автоматически".
Это процедуы, которые определяют, что будет
выполняться при данном действии, будь то игрока написал что то в чате,
или запустился мод. Каждый калбек имеет определённое название и определённые параметры.
Пример паблика:

public OnPlayerDeath ( playerid , killerid , reason ) //Строка определяет, что это за паблик, его параметры.
< //Начало действия.

> //Конец действи

Данный паблик паблик отвечает за то, что будет, когда игрок сдохнет.

playerid - ИД того , кто погиб
killerid - ИД того , кто убил игрока
reason - причина ( в смысле , каким оружием )

public OnPlayerDeath ( playerid , killerid , reason ) //Игрок умер.
//здесь описывается то, что будет, если игрок умер
>

В конце каждого паблика должен стоять return.
Если паблик находится в моде, то вводим return 1;
Если паблик находится в скрипте, то вводим return 0;
Если установить return 1; в скрипте, то выйдет такая ситуация:
паблик в скрипте работать не будет!

OnGameModeInit() - события, когда загружается мод

OnGameModeExit() - события, когда выгружается мод

OnPlayerConnect(playerid) - события, когда игрок подключается к серверу

OnPlayerDisconnect(playerid,reason) - события, когда игроку отключается от сервера. reason - причина отключения.

OnPlayerDeath(playerid, killerid, reason) - события, когда игрок погибает. reason - причина гибели.

OnPlayerRequestClass(playerid, classid) - события, когда игрок выбирает скина. classid - какой скин выбран на данный
момент.

OnPlayerCommandText(playerid,cmdtext[]) - события, когда игрок ввёл команду. cmdtext - команда, используется в strcmp.

OnPlayerPickUpPickup(playerid, pickupid) - события, когда игрок поднял пикап. pickupid - ID пикапа

OnPlayerText(playerid,text[]) - события, когда игрок ввёл текст в чат.
Типы return-ов. Если return1; - текст игрока отображается в чате,
если return 0; - текст игрока не отображается в чате.

OnPlayerSpawn ( playerid ) - события , когда игрок отправился на спавн .

OnFilterScriptInit () - события , когда скрипт загружается на сервер

OnFilterScriptExit () - события , когда скрипт выгружается из памяти сервера

public OnPlayerDeath ( playerid , killerid , reason ) //Игрок умер.
//некий код
return 1 ; //т.к. стоит в моде
>

Функции - они и в Африке функции. Каждая функция, как и паблик,
имеет определённые параметры. Синтаксис нативной функции:

Данная функция даёт игроку playerid деньги money.

Может быть функция с одним параметром, например:

Данная функция определяет число денег у игрока playerid. Cама по себе бесполезна,
используется для других фукнций.

SetPlayerHealth ( playerid , health ); - установить игроку playerid здоровье health

SetPlayerArmour ( playerid , armour ); - установить игроку playerid уровень брони armour

GivePlayerMoney ( playerid , money ); - дать игроку playerid деньги money

ResetPlayerMoney ( playerid ); - все деньги игроку обнуляются

ResetPlayerWeapons ( playerid ); - игрок лишается всего оружие

GivePlayerWeapon ( playerid , weaponid , var1 ); - игроку playerid даётся оружие weaponid с патронами var1

CreatePickup(model,type,Float:X,Float:Y,Float:Z); - создаёт пикап (разбросанное оружие) с ид model, с типом пикапа type
и с координатами X,Y,Z
Если пикап будет перерождаться, то ставим type 2. Если создаётся только один раз - type 3.

AddStaticPickup(model,type,Float:X,Float:Y,Float:Z); - создаётся пикап model с типом type и координатами X,Y,Z

CreateVehicle(modelid, Float:x, Float:y,Float:z, Float:angle, color1, color2, respawn_delay); - создаётся автомобиль modelid,
x,y,z - координаты, angle - угол поворота, color1, color2 - цвета, respawn_delay - время в секундах, через которое
автомобиль будет респавниться после того, как оно было покинуто водителем.

AddStaticVehicle ( modelid , Float : spawn_x , Float : spawn_y , Float : spawn_z , Float : angle , color1 , color2 ); - создаётся автомобиль
modelid ,
spawn_x , spawn_y , spawn_z - координаты , angle - угол поворота , color1 , color2 - цвета авто . Используется только в
OnGameModeInit ().

SendClientMessage ( playerid , 0xDEEE20FF , "Hello." ); - отправляет текст в чат игроку playerid с определённом цветом , и с
текстом
"Hello."

SendClientMessageToAll ( 0xDEEE20FF , "Hello." ); - аналогично , только тот же текст отправляется всем игрокам в общий чат .

public OnPlayerDeath ( playerid , killerid , reason ) //Игрок умер.
//Начало действия паблика
GivePlayerMoney ( killerid , GetPlayerMoney ( playerid )); //Игроку killerid (тот кто убил) даются все деньги playerid (тот, кто умер).
//Конец действия
>

Строго говоря это адреса памяти, имеющие определённое значение.
Говоря проще, это некое слово, имеющие числовое значение

Существуют несколько видов переменных:
1. серверные переменные,
2. переменные игроков,
3. текстовые переменные.

1. Серверные переменные.

Так будем называть общие переменные.

Создана перменная server_players со значением 0.

Переменной server_players присвоено значение 5.

Функция прибавление к значению опред. числа:

Функция отнятия из значения опред. числа:

К переменной можно присвоить значение функции.

server_players = GetPlayerMoney ( playerid ); //переменной server_players присвоено значение денег игрока playerid

Также к переменной можно присвоить ИД, например, транспорта.

new vehicle ; //Создаётся переменная.
vehicle = CreateVehicle ( 522 , 1683 , 785 , 0 , 0 , 6 , 9 ,- 1 ); //Переменной 'vehicle' присвоено значение ИД транспорта.

DestroyVehicle ( vehicle ); //Транспорт уничтожается.

public OnPlayerDeath ( playerid , killerid , reason ) //Паблик
< //Начало выполнения
server_players ++; //+ 1 к значению server_players
> //Конец выполнения

2. Переменные игроков.

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

Создана переменная player со значением 0.

На данном этапе каждый игрок имеет значение 0.

Переменной player одного игрока playerid присваивается значение 5.

Также с данной переменной совершаются все действия серверной переменной.

3. Текстовые переменные.

Текстовые переменные - переменные, значением которых может быть только текст.

Такая переменная в основном используется для создания форматированного текста.

format ( string , 256 , " Ваши деньги: %d" , GetPlayerMoney ( playerid ));

%d - некое числовое значение
%s - некое текстовое значение

Переменной string присвоено текстовое значение, указанное в кавычках.

Есть ещё переменная, используемая для имени:

Cоздана переменная name.

Проверка - функция, проверящая, выполняется ли данная функция. Если выполняется функция,
то и выполняется определённый код.

if( некая_функция )
// код, который должен выполняться, при выполнение некая_функция
>

В качестве проверки может использоваться:
1. сравнению переменных, либо значений функций,
2. выполняеться ли некая функция.

1. Сравнение переменных.

if( GetPlayerMoney ( playerid ) >= money )
выполнение_кода ;
>

В данной проверка произведено сравнение:
ЕСЛИ деньги_игрока >= (больше или равно) money
ТО выполнение_кода

Есть разных виды сравнений:

!= - не равно
>= - больше или равно
<= - меньше или равно
> - больше
< - меньше
== - равно

2. Выполнение определённой фукнции.

Проверяет, выполняеться ли данная функция.

if( IsPlayerConnected ( playerid ))

>

Выполняется проверка, подключён ли игрок к серверу.

Конечно, есть функия, использующаяся при невыполнениии проверки.

Называется else. Используется так.

Новый паблик создаётся так:

forward SetPlayerMoney ( playerid , money );

Создаётся он для того, чтобы вызвать некоторые функции одновременно.

Например, функция установки денег.

forward SetPlayerMoney ( playerid , money ); //Создан паблик

public SetPlayerMoney ( playerid , money )
ResetPlayerMoney ( playerid ); //Все деньги у игрока отбираются.
GivePlayerMoney ( playerid , money ); //Игрок получат деньги.
>

Таймер - функция, вызвающая определённый паблик в определённое время.
Функция может вызваться единожды, либо повторяться через
заданные промежутки времени.

Для того, чтобы повесить таймер на определённый паблик,
создаётся такая фукнция.

SetTimer ( "NewPublic" , 1000 , 1 );

В 1 секунде - 1000 миллисекунд.

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

Примечание: не стоит ставить значение таймера < 100, это может вызвать нагрузку на процессор.

public OnGameModeInit ()
SetTimer ( "AllMessage" , 120000 , 1 ); //Cоздан таймер, поставленный на паблик NewPublic.
//Таймер запускается каждые 2 минуты
>

forward AllMessage ();

public AllMessage ()
SendClientMessageToAll ( 0xAFDAFD00 , " >> Серверу требуются модераторы." );
//Cообщение. Отправляется всем игрокам каждые 2 минуты.

Цикл - функция, которая перебирает все значения определённой
переменной, в указанных рамках.

for( new i = 0 ; i < 50 ; i ++) //Цикл
< //Начало действия цикла

GivePlayerMoney ( i , 1000 ); //Даются деньги
GameTextForPlayer ( i , "

Данная функция используется довольно редко. Позволяет на одно слово "поставить" другое.

Слово COLOR_ZEL теперь понимается компилятором как определённый код цвета.

enum - это вещь, позволяющая создавать большее количество адресов одной переменной.

Здесь у адреса PVar создаются подразделы PHealth, PArmour.

Теперь игрок может на одну переменную игрока ставить несколько адресов.
Под PVar подразумевается PHealth, либо PArmour.

Разумеется, enum можно юзать и в общей (серверной) переменной.

dcmd - командный процессор, с помощью которого можно более просто (обходя strtok) создавать команды с переменными.

Вообще сама функция dcmd создаётся при помощи define. Код:

Перед созданием самой команды надо обозначить её в OnPlayerCommandText(playerid,cmdtext[])

healplayer - название команды, 10 - кол-во символов в команде.

Сама команда создаётся так:

strtok - функция, аналогичная dcmd. Позволяет создать команды с переменными.

Сама функция strtok .


Переходим к паблику OnPlayerCommandText. Сначала пишем там код:

Создаём саму команду:

//Далее код переменной в команде. splayer можно заменить любой другой подходящей переменной

Содержание

Редактирование main.scm. Потоки и опкоды (Часть 1)

В этом уроке мы ознакомимся с базовыми понятиями скриптов: потоками, командами, метками, прыжками и задержкой. Будет введено понятие опкода.

Теперь открываем Санни Билдер. И нажимаем "Файл->Открыть" и указываем "main.scm" ( не забывайте в скобках указать формат "SCM", иначе нужного файла не найти ). Открыли? Хорошо. Видите сколько строк? Дух захватывает правда? А представьте, что это всё напечатали вы! Если у Вас будет упорство и терпение, то всё вполне реально, хотя как правило обходится всё меньшим количеством кода. Но раз мы хотим что то сделать самим, то давайте выделим всё и нажмем кнопку DEL . Чистый лист! Какое облегчение! Теперь можно делать что то своё! Но для минимальной работы скрипта, нужно указать некоторую необходимую информацию. Скопируйте эти строки:

Затем нажмите кнопку F7 . Запустите игру ( F8 ), обязательно нажимаем "НОВАЯ ИГРА"! Посмотрите что изменилось. Думаю большинство заметило, что нету вступительного ролика и прочего. Такой мейн называется "Чистым".

× ВАЖНО: При редактировании потоков начинать новую игру обязательно.

Начнем с потоков думаю. Я не буду выражаться какими то сложными выражениями. Скажу только несколько слов о них. Я назову это отдельным блоком, в котором делаются некоторые действия. Каждый поток имеет свое имя, как и каждый человек. Нельзя создать два потоки с одинаковыми именами и длиной больше 15 символов. Рекомендую брать пример с оригинального "main.scm", где длина потока составляет не больше 7 символов. Лучше делать так, как это делали разработчики игры.

× Примечание: Названия потоков должно состоять только с латинких символов, чисел и символа _

Как же создать поток? Для начала изучим правила написания потока. Каждый поток начинается командой:

и заканчивается командой ( команда завершения или деактивации ):

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

Что такое метка? На этот вопрос я очень легко могу ответить, и этот ответ станет основой скриптинга, поэтому запоминайте.

Как узнать метку и её создать? Создание метки очень просто. Нужно написать сначала символ : а затем ввести имя метки. Вот пример:

Узнать метку можно за правилами написания, о котором я написал выше. Принято писать метки с теми именами, что и поток, далее уже после имени потока добавляют несколько чисел или букв.

С техничекой точки зрения метка - это смещение в файле "main.scm" и представляет собой обычное число. В прочем, для нас это не важно, так как Sanny Builder все эти смещения высчитывает самостоятельно, основываясь на наших метках.

Пример написания потока и и его меткок:

Весь скриптинг основан на построчном считывании информации. То есть одна команда - одна строка. В примере показано, что сначала будет выполняться команды от метки ":POTOK_1", затем ":POTOK_2" и вконце ":POTOK_3". Естественно можно изменить порядок выполнения меток, не изменяя их положения. Для этого служит команда jump. Если перевести дословно, то это значит прыжок. Далее мы будем использовать именно это выражение. Что же, давайте напишем пример, где используются прыжки:

Сложновато, правда? Далее будет ещё сложнее. Особенно если вы решили увидеть чужой скрипт. :) Но не будем о грустном! Разобраться не так уже и сложно. Давайте представим маленький шарик. Представили? Назовём его "Указатель". Нет, пусть будет просто "Шарик" :) Этому шарику предстоит пройти определенный путь. Начинает путь наш шарик с имени потока, то есть с команды "thread", и начинает идти вниз. Используя прыжки ( jump ) можно нарисовать путь прохождения шарика. Я уже нарисовал путь. Вот по примеру должно примерно так получится:


Итак, вы увидели шарика. Оранжевым указано куда именно я направлял шарика. Я специально загрузил этот рисунок, что бы вам легче было представить себе принцип работы скриптов. Если шарик достиг места финиша, то он автоматично отправляется на заслуженную пенсию и больше использоваться в потоке не будет, пока его не вызовут опять на службу. :)

Как запустить поток и что нужно для его правильной работы? Хороший вопрос. Особенно интересно слово "правильной"! Что же, думаю самое время познакомиться с опкодами! Это наши верные помощники! Так и будем называть их, потому что они помогают выполнить кое-какие действия. Для правильной работы нам нужно запомнить помощника по имени 0001:, то есть опкод:

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

С новой версией СБ и Клео, в целях удобства, ему присвоили статус команды ( так званный кейворд ), и мы можем писать просто

Технически разницы между опкодами и командами нету - команда имеет упрощённый синтаксис, но в процессе преобразования заменяется на опкод. Опкод - это операционная код ( команда ).

Что бы запустить наш поток, то есть призвать нашего шарика на старт, используется такая команда:

Она, собственно, делает поток активным. Таким образом, пишем правильный запуск потока:

Конечно, толку от нашего примера никакого, но, думаю, вы приобрели необходимый опыт в написании потоков.

× ВАЖНО: Команду запуска потока нужно давать в активном потоке, иначе поток не запустится!

В нашем случае, поток вызывается с активного потока ( "MAIN" ), а когда поток запущен командой "thread", то вызванный поток сам стает активным, так сказать вызывается тогда, когда шарик при деле :) Первый поток называется ГЛАВНЫМ, или MAIN.

Что такое main самп

Игровые скрипты заключены в файле main.scm. Данный файл представляет собой нетипизированный бинарный файл с определенной структурой. При декомпиляции получается исходный файл, строение которого выстроено в точности по данной структуре.

Что такое main самп

Diamond mods [GTASanAndreas]

Если вас спрашивают: "Что такое ДМ?" без (( )), то вы отвечаете то, что могут сокращать эти буквы т.е. : " Дядя Миша; Дом Медведя" и т.д. , а если вас спрашивают с присутствием в чате скобок, т.е. : (( Что такое ДМ? )) , то вы в ответ в скобках пишете (( ДМ- убийство без причины.)).

Запомните. Всё что пишется в скобках " (( )) " - нонРП чат, т.е. в него говорят всё то, что относится к реальному миру, и почти не касается виртуального.

Общая структура

Нас будет интересовать прежде всего строение текстового исходника, поскольку работа с бинарным, скомпилированным файлом прерогатива декомпилятора. Итак, какое строение должен иметь типичный исходник, чтобы быть успешно скомпилированным в рабочий main.scm.

Файл main.scm состоит из следующих частей:

Заголовок

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

Первой частью заголовка является сегмент (или блок) моделей. Он начинается со строки

Слово DEFINE указывает на то, что эта строка – часть заголовка. OBJECTS указывает на то, что мы определяем размер сегмента объектов, а точнее – число объектов, чьи названия будут указаны ниже. 389 – число этих объектов (число может отличаться в разных исходниках). Допустимые значения – положительные числа и ноль. Смотрите также Лимиты объектов.

После этой строки перечисляются имена объектов.

Слово OBJECT указывает компилятору, что данная строка содержит имя импортируемой модели. Особенностью данных моделей является то, что они не требуют загрузки при использовании, а обращение к ним в скрипте происходит не по их реальному ID, а по порядковому номеру, который указан в комментарии (-1). Например,

[color=brown]INFO[/color] – имя DFF-модели из gta3.img или другого архива.


Самая первая модель в списке не используется игрой.

Обратите внимание, что данный сегмент заголовка опционален и не обязателен к указыванию. Если вы не укажете какие модели следует компилировать как импортируемые, компилятор сделает это за вас, когда будет обнаруживать использование имен моделей в скрипте, чьи имена не содержатся в IDE-файлах (модели из IDE-файлов можно использовать по их ID, не требуется указывать их в заголовке). См. также: Объекты (SA).

Второй частью заголовка является сегмент миссий. Он начинается со строки

Здесь указывается, какое число миссий будет присутствовать в данном исходнике. Компилятор будет искать именно заданное число миссий и если их будет меньше или больше возникнет ошибка.

После указания общего числа миссий следует перечисление миссий:

Разберем данную строку. После слова DEFINE стоит слово MISSION, указывающее что здесь определяется начало миссии. После него стоит порядковый номер миссии. Этот номер используется в опкоде start_mission. После слова AT вы должны указать метку миссии, с которой она начнется.

На этой строке может также стоять комментарий с названием миссии из оригинального main.scm. Вы можете отключить показ оригинальных имен миссий в опциях программы. См. также Создание миссии в SA.

Указанные выше части заголовка являются общими для всех игр, поддерживаемых Sanny Builder’ом. Следующие части заголовка указываются только для игры San Andreas.

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

Обратите внимание, что внешние скрипты имеют в своем составе особый скрипт с названием AAA. Содержимое этого скрипта заполняется компилятором и делается это исключительно с целью максимального соответствия оригинальным файлам игры. Если вы указываете число EXTERNAL_SCRIPTS как 0, скрипт AAA тем не менее будет скомпилирован. Для того чтобы не делать этого, укажите в качестве значения число -1. Тогда script.img вообще не будет создаваться.

Версия 3.0 позволяет также перезаписать скрипт AAA. Для этого создайте свой собственный скрипт и назовите его этим именем.

Определение внешнего скрипта происходит в строке

Здесь PLAYER_PARACHUTE – имя скрипта в файле script.img. [color=green]@PLCHUTE[/color] – имя метки с которой начинает тело скрипта.

В комментарии указан порядковый номер скрипта, который используется в опкодах, например:

После сегмента внешних скриптов идут еще два блока, назначение которых неизвестно. Скорее всего игра не использует эти значения.

Если вы пользуетесь урезанным скриптом (stripped.txt) без миссий и скриптов, вы можете не указывать заголовок совсем.

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

Главная часть

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

Майн состоит из набора отдельных потоков. Самым первым потоком, который автоматически запускает игра, является поток MAIN (начинается с опкода 03A4: name_thread 'MAIN'). Все остальные потоки активируются уже из данного потока опкодами 004F или 00D7 (обратите внимание, эти опкоды по сути одинаковы, только 004F еще дополнительно может передавать в создаваемый поток параметры). Замечание по поводу создания потоков из MAIN верно только для новой игры. При загрузке сейва игра уже сама восстанавливает ранее созданные потоки.

Потоки состоят из опкодов, выражений и меток. Также при компиляции в скрипте могут встречаться конструкции (VAR..END, CONST..END, FOR..END и т.д.) и директивы, которые служат исключительно для удобства работы с кодом (cм. Кодинг в Sanny Builder 3). После компиляции эти конструкции так или иначе преобразуются в опкоды, выражения или метки.

Опкод

Опкод – (OpCode - Operation Code - код операции) - число, обозначающее одну из инструкций для парсера скриптов игры и указывающее на определенную последовательность действий, которые необходимо выполнить с учетом переданных параметров.

Например, 0001 это код операции wait, которое указывает машине, что нужно приостановить выполнение потока на число миллисекунд, переданных как параметр этого опкода. Все опкоды хранятся в INI-файле.

Выражение

Выражение – это опкод с математической или логической операцией. Например,

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

Метка

Сами по себе метки бесполезны, если их не используют. Под использованием метки понимается переход на нее в одном из специальных опкодов. Существуют два вида перехода на метку: условное и безусловное. Безусловный переход осуществляется опкодами jump, gosub.

Обратите внимание, что имя метки для перехода обозначается символом [color=green]@[/color] в начале. При включении автоматического списка, редактор будет выводить список используемых меток в коде.

Когда игра достигнет этого опкода, она сразу перейдет на то место в скрипте, где стоит метка (

Отличительной особенностью команды gosub является то, что после перехода на метку игра может (и должна) вернуться обратно после того, как встретит команду return.

Когда игра достигнет команды gosub, она сразу перейдет по указанной метке на команду . После выполнения этой команды, она перейдет на команду return. Смысл ее заключается в «вернуться-на-то-место-где-был-последний-gosub». В нашем примере это будет команда . Команды jump (или goto), gosub и return являются базовыми понятиями в любом языке программирования.

Условный переход в отличие от безусловного осуществляется только при определенном условии. Для этого используется опкод jump_if_false (jf). Он является составной частью любого условия в скриптах.

В данном примере сначала проверяется загружен ли в память внешний скрипт 75. После опкода 08AB: состояние условия будет либо правдивым (True) либо ложным (False), в зависимости от того, загружен скрипт или нет. Состояние условия определяет два различных поведения игры после проверки условия. Если условие было правдивым (т.е. скрипт был загружен) игра пропустит опкод jump_if_false. Следующим шагом, таким образом, станет опкод 0913.

Если условие было ложным (т.е. скрипт не был загружен) игра выполнит опкод jump_if_false и перейдет на метку

Собственно из перевода слов jump_if_false видно, что это переход, если ложь.

Майн заканчивается там, где начинаются миссии.

Миссии

Блок миссий начинается с метки нулевой миссии из заголовка (в оригинале [color=green]:INITIAL[/color]). Обычно там стоит комментарий

Особенностью миссий является то, что в игре может одновременно быть запущена только одна миссия. После команды start_mission игра полностью загружает тело миссии в отдельную область памяти, после чего начинает работать с ним как с обычным потоком из майна. Все сказанное по поводу опкодов, выражений и меток в майне действительно и для миссий. Миссия как и обычный поток заканчивается командой end_thread.

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

Внешние скрипты

В San Andreas’е часть игровых скриптов вынесена в отдельный файл script.img. Он состоит из набора небольших scm-файлов. Их отличие от главного main.scm заключается в отсутствии заголовка.

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

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

Читайте также: