Функции самп павно

Обновлено: 07.07.2024

Сейчас на дворе уже 2018 год и многие скажут, зачем мне работать с файлами, если я могу работать с mySQL (по поводу работы с ним урок также будет )? Не всегда я, например, прибегаю к использованию mySQL. Иногда мне требуется хранить небольшое количество информации и создавать таблицу для этого хлопотно. На мой взгляд, в использовании файлов ничего плохого нет.

Перечисление функций

Для работы с файлами в SA:MP необходимо подключить библиотеку a_samp, а в ней уже подключена file, в которой и содержаться все функции, а именно:

Вот о них мы сейчас и поговорим.

fopen()

Небольшое описание функции:

Позволяет открыть файл для проведения операция над ним.

const name[] - имя файла, который требуется открыть.

mode - режим открытия файла.

io_read : открытие файла в режиме чтения; файл должен существовать.

Внимание! Если файла не существует, то произойдет краш сервера.

io_write : создает новый файл.

io_readwrite : открывает файл в режиме чтения, если существует; создает файл, если он отсутствует.

io_append : открывает файл для дозаписи; если файла не существует, создаст его.

Возвращает хэндл (Handle) созданного или открытого файла.

fclose()

Небольшое описание функции:

Закрывает Handle файла. Рекомендуется использовать после работы с ним.

handle - хэнд файла, который надо закрыть. Хранит обычно переменная, используемая при открытии файла.

ftemp()

Небольшое описание функции:

Создает временный файл в папке tmp или temp, который удаляется после его закрытия функцией fclose().

Рекомендуется создать эти папки в scriptfiles, иначе использовании функции приведет к крашу сервера.

Файл открывается сразу в режиме readwrite - чтениезапись.

Вернет хэндл temp-файла.

fremove()

Небольшое описание функции:

Удаляет существующий файл из папки. Может привести к крашу сервера, если файла не существует.

const name[] - имя файла для удаления.

fread()

Небольшое описание функции:

Читает один символ из файла. Чтобы прочитать весь файл, вам необходим цикл for или while.

handle - хэндл файла, который открыт.

&string - строка, в которую запишется содержимое строки из файла.

size - размер строки (по умолчанию устанавливается размер строки, в которую записывается - sizeof(string))

pack - упаковка строки. По умолчанию false.

Записывает содержимое в строку.

fwrite()

Небольшое описание функции:

Записывает данные в файл.

handle - Хэндл файла, который открыт.

const string[] - строка, которую хотим записать.

fputchar()

Небольшое описание функции:

Записывает один символ в файл.

handle - Хэндл открытого файла.

utf8 - использовать ли УТФ8 (по умолчанию: ДА)

fgetchar()

Небольшое описание функции:

Читает один символ из файла. Начинает с текущего положения "пера" (fseek).

handle - Хэндл открытого файла

value - переменная, для хранения значения

utf8 - читать ли символ в кодировке УТФ8 (по умолчанию: ДА)

fblockwrite()

Небольшое описание функции:

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

handle - Хэгдл открытого файла

buffer[] - данные для записи

size - количество ячеек

fblockread()

Небольшое описание функции:

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

handle - Хэндл открытого файла

buffer[] - буфер (переменная) для сохранения прочитанных данных в бинарном формате

size - размер буферф

fseek()

Небольшое описание функции:

Перемещает "перо" (указатель) в файле. Перемещаться можно с начала файла, с конца и с текущего положения пера.

handle - Хэндл открытого файла

position - перемещение по файлу

whence - откуда начинать. seek_start (по умолчанию) - сначала, seek_current - с текущего положения, seek_end - с конца.

На этой странице представлены все автовызываемые функции для скриптинга SA:MP. Эти функции будут вызываться самим сервером, когда происходит какое-то определенное событие. По названию функции можно точно понять в какой момент, она вызывается. Например, OnPlayerSpawn вызывается в момент спавна любого игрока сервера. Почти все такие функции имеют параметр playerid, который содержит ID игрока, с которым произошло событие. Однако, некоторые события могут и не быть связаны с игроками. Они могут быть связаны с транспортом, объектами..


Важно: Когда вы используете эти функции в фильтрскриптах, убедитесь что в конце вы поставили return 1, чтобы это событие могло быть обработано и другими работающими фильтрскриптами. Если такая функция ничего не возвращает, или возвращает 0, то событие не будет выполнено для других фильтрскриптов, которые были загружены позднее.

Не имеет значения что возвращают функции OnFilterScriptInit и OnFilterScriptExit, т.к. это не влияет на другие фильтрскрипты.

А вот в функции OnPlayerCommandText всё наоборот: return 1 означает, что команда найдена, и остальным фильтрскриптам она уже не будет передана, а при return 0 команда передается на проверку в следующий фильтрскрипт.

Сделать простой deatchmatch на PAWN не может быть проще. Просто откройте Pawno (смотрите Редакторы скриптов) и нажмите "new". Вот он, ваш первый скрипт. Чтобы запустить его сначала сохраните. Большинство людей сохраняют его в "<Директория установки GTA: San Andreas>/gamemodes/src/", но для локального тестирования легче сохранить в "<SA>/gamemodes/"), и затем нажать на кнопку в панели инструментов левее кнопки с изображённой синей стрелкой. Это скомпилирует ваш .pwn файл в .amx в тот же каталог, хотя чтобы игра видела его необходимо чтобы он был в "<SA>/gamemodes/". Теперь, чтобы протестировать ваш скрипт, вам понадобится создать локальный сервер и поменять на ваш режим (наберите "changemode <название вашего режима>" в окне сервера).

Если всё правильно, то когда вы присоединитесь к своему серверу через клиент SA:MP и начнётся игра, вы должны появиться около казино в Лас Вентурасе. К сожалению, вы не сможете увидеть меню выбора персонажей (сейчас всего только один), но мы можем с лёгкостью изменить это потом. Также это не очень интересный deathmatch из-за отсутствия противников.

Классы

Теперь первая вещь, которую вы, наверное, хотели бы добавить это раздачу оружия по классовому принципу. Каждый персонаж называется "классом". У всех могут быть одинаковое или разное оружие или смесь. Вы выставляете параметры для каждого класса отдельно, поэтому чтобы поставить одинаковое оружие для каждого класса, просто скопируйте параметры оружия и вставьте в параметры каждого класса. Это обеспечит сбалансированный deathmatch, но зато будет не так интересно, так что решать вам. В редакторе найдите эту строку:

Это параметры класса, следуют они в таком порядке:

Модель игрока можно взять из файла "peds.ide", "X", "Y" and "Z" - координаты точки возрождения, "направление" - направление куда лицом смотрит персонаж. Номера оружия можно найти ниже, а номера боеприпасов - просто количество боеприпасов на оружие которое вы хотите им давать при возрождении (Количество боеприпасов оружия ближнего боя всегда должно равняться 0).

Теперь скопируйте эту строку:

и поместите её под той, которую вы нашли в скрипте. Теперь вы будете выбирать между СиДжеем с пустыми руками и Балласовцем с бейсбольной битой, пистолетом и Тек9.

Получение координат, направлений и id моделей

Вы наверняка захотите добавить дополнительные точки возрождения, поскольку если все будут появляться в одном и том же месте, то deathmatch будет скучным и кемпинг будет невероятно лёгким. Здесь в игру вступает режим отладки. Запустите "samp_debug.exe", находящийся в корневой директории San Andreas. После того как запустится режим отладки, дойдите до той позиции, где вы хотите сделать точку возрождения и напечатайте "/save" в окне чата (чтобы вызвать окно чата нажмите "t" или тильду (

)). Эта команда сохранит ваше местоположение, направление и id модели игрока в текстовый файл "savedpositions.txt" в корневой директории SA.

Знакомство с функциями и вызываемыми функциями

Before we can continue you will need to be introduced to callbacks. These are the chunks of code already in your gamemode that look something like this:

This is the OnPlayerDisconnect callback, that means this section of code is run by the server whenever a player disconnects, so if you want to show a big message on the screen when a player leaves you would put the code for that here. All the callbacks the game uses (except 2, but they are used by filterscripts, not gamemodes and are not covered here) are in your file, you cannot make up your own. Most of them appear as the one above does, but some (i.e. "OnPlayerCommandText", "OnPlayerRequestClass", "OnGameModeInit" and "main" (which is not strictly a callback and never has more than your game title)) have other bits in already, either to make the game work or to show you what to do there. You may also use other, similar blocks (as we are about to) which look the same but are called functions, these have to be called by you yourself. Here is a function called "IMadeThis" (note the lack of spaces).

You may have also noticed a very quick introduction to comments there, everything on a line after "//" will be ignored, as will anything anywhere between "/*" and "*/". As a function is not called by the game we need to call it ourselves from a callback, this is dead easy as most of the commands you use to code with are infact premade functions (commands are infact different), so if you placed:

in your OnPlayerDisconnect callback (it must be between the "" and ">" and also before the "return 1;" it would run that function and print a message in the server window when you disconnected (remember the othr things in there are ignored). We don't generally want to print things to the server window and all the "print" and "printf" functions already in the file are generally removed by the coder. Only things between the braces are in the function/callback (from now on function refers to callbacks aswell as they are a special case of function), the line above is the name of the function. "public" means the function can be run by any other bit of code, this basically means your code can be run when you call it, we're not worried about private functions as they are not generally used in SA-MP (if at all). The brackets after the function name enclose the parameters list, we haven't covered these yet but you can see an example of their usage in some of the callbacks in your blank file, note that those parameters are automatically passed when the game calls the function, if we are using a custom functions (i.e. not a callback) and we want to use some parameters we will need to pass them ourselves. One tiny other thing which should be mentioned is that all lines apart from lines with braces on (and even them in certain circumstances, but these will be covered later) and lines directly before an open brace (braces may be on the end of that line or, as shown here, on a new line), end with a semicolon to denote the end of a process.

Делаем командный deathmatch

If you want to alter the colors, that's fine, just remember that the last two digits are the alpha and the lower that is the less you can see the color. Defines are purely replacements, now if you ever want to use the number 1 in your script you can use TEAM_GROVE instead, this is not a good idea for normal calculations as it makes them harder to read, but for using to denote teams, which are only denoted by a number, it makes it alot clearer what's going on (and makes it very easy to change the teams around or modify later as you need only change the 1 in the define rather than all the instances of it throughout the code. When the code is compiled, all the "TEAM_GROVE"s will be replaced by 1, it is not like a variable, it is a constant, it doesn't change. Now under those lines add:

This is called a global array. An array is basically lots of variables (places you store data to read and write) clumped together to store lots of data at once. The "MAX_PLAYERS" is a pre-defined constant (done in exactly the same way as we did our defines. MAX_PLAYERS is actually set at 100, so this means that our array can store up to 100 pieces of data. The g on the name means global, but that doesn't make it global (it just makes it easier to tell what variables do what, defining it outside a function means it is global and can be used by all our functions. Any variable defined in a function is local to that function and it cann't have the same name as another variable in the same function or a global variable (which is also why the g is useful), it can however have the same name as another variable in another function. All the "playerid" variables in your blank script are infact all independent variables, each local to a different function, however they are all passed the same data, but just remember that any functions you make won't auomatically have that data. Now we have that set up we can set the teams:

Place that code OUTSIDE a function in your code (as it is a new function) and put these lines as the first things after the open curly braces in your OnPlayerRequestClass callback (notice the way the variables are not global so we are having to pass them to out function too):

This will save the players team to an array through our new function. Data in an array is referenced by a number, so array[0] is the first item of data, array[1] is the second and so on, as we are using gTeam[playerid], depending on which playerid we are passed will define where in the array to store the data, so for player 5 their data will be stored at array position 5 (remember, this is the 6th piece of data). Now copy this function:

And add the following line to OnPlayerSpawn:

We now have our teams, but what have we actually done?

In our first function, we check which class they chose (remember we said that the first class defined in your file was class 0?) "==" means "is equal to", a single equals sign simply sets the variable to the number given (as seen on the next line but one). The curly braces sepparate the functions between them from the rest of the code, bits in there are only executed if the selected class is 0 (cj), if it isn't, the else command comes into play and executes insted (this executes whenever the "if" command is false (i.e. the class isn't 0)), since we only have two classes to choose from this must mean we're Balla:

We don't need a return here as there is no data to return.

The second half set the players' color when they spawn, so you can tell who's on which team. As we saved their team to a global array, we can still access the data even though it is in a separate function.

Hopefully you can see what this is doing now, if the player who just spawned (as referenced by playerid) is in TEAM_GROVE, we set their color to TEAM_GROVEs color.

This next section is a little different, it could easilly have been done like this:

But the way it is done allows you to set their color to TEAM_BALLAs color only if the first part is false (as sorted by the ELSE) AND if they are in TEAM_BALLA, this allows you to add more options by adding more "else if ()" blocks to the end as one will only be executed if all the blocks before it weren't.

Транспорт

Хорошо. Если вы читали предыдущие разделы, то у вас уже должен быть очень простой deathmatch или командный deathmatch с расставленными точками возрождения где вы хотите. Теперь давайте добавим транспорт. Большинство команд на PAWN делают именно то как они называются. Мы же хотим добавить транспорт, так давайте поищем нужные команды:

Если вы нажмёте на одну из них и посмотрите в статус окно (окно внизу редактора), вы увидите их синтаксис (какую информацию\параметры вам требуется дать для их работы):

Они очень похожи друг на друга, но вот здесь важно знать одну вещь: CreateVehicle создает авто ОДИН раз, а AddStaticVehicle создаёт точку возрождения данного авто. Они должны выполняться с начала игры, поэтому их следует поместить в вызываемую функцию "OnGameModeInit()".

Доступные цвета авто

Значения modelid/vehicletype можно найти в файле vehicles.ide, числа с плавающей запятой - просто не целые числа, обычно координаты и направления. Номера цветов можно найти в файле carcols.dat, посмотрите на сноску и выберите цвет, который хотите. Так "black" это "0", "taxi yellow" это "6", "currant blue poly" это "32" и т.д., "-1" означает случайный цвет (из базовых цветов этой машины, которые хранятся в файле carcols.dat). Если вы хотите получить позицию для будущей машины, войдите в debug-режим, выберите машину, войдите в нее и напишите "/save", после этого откройте файл "savedpositions.txt" и копируйте линию. Если вы хотите добавить машину в режиме отладки (debug-mode), напишите "/v <vehicleid>" во время игры и машина появится (id машины берется опять же из vehicles.ide), или напишите "/vsel" для вывода списка машин с их id.

Я получил такие координаты:

Note: These are called floats, 11.0 is a float despite being whole, any whole number being used as a float must have a trailing ".0" to denote it as a float. These numbers are in the english format of using a decimal point ("."), commas are used to separate parameters. Also remember the 4th number is angle, so if we now add the following line to the game mode in OnGameModeInit, recompile and test, we will get a bright pink infernus outside the casio which is the default spawn position for cj. Note: on a car which uses the secondary color (such as a cop car (id 596)) this would be a pink and blue car as that is the secondary color.

Now you can easilly go about saving positions and creating as many cars as you want (up to an engine defined limit of 254 individual cars, 50 different types of car). The spawns saved to the file will have "-1, -1" as the colors by default.

Ограничение игрового мира

А что, если нужно, чтобы игра происходила на определённой территории? В этом случае прибегнем к функции SetPlayerWorldBounds и, для начала, посмотрим её синтаксис:

Где "playerid" - ID игрока, "Float:x_max", "Float:x_min" - максимальные и минимальные x-координаты куда игрок может попасть, а "Float:y_max" и "Float:y_min" - максимальные и минимальные y-координаты куда игрок может попасть.

Пора опробовать эту функцию на деле. Вставим эту функцию в вызываемую функцию OnPlayerSpawn:

И, наконец, скомпилируем функцию. Теперь вы можете прокатиться на велосипеде в пределах парка с рампами в Лос Сантосе.

AddMenuItem(Menu:menuid, column, title[]);

AddMenuItem - Данная функция добавляет новый пункт в уже вызванном меню

Menu:menuid - ID уже созданного меню (CreateMenu), куда нужно добавить новый пункт
column - Столбец уже созданного меню, куда нужно добавить новый пункт
title[] - Название нового столбца в уже созданном меню

Примечания:
- Можно создать максимум 12 пунктов меню
- Можно использовать максимум 2 столбца (0 и 1)
- Можно добавить только 8 цветовых кодов для одного пункта (

. )
- Максимальная длина пункта меню 31 символ

AddPlayerClass(skin, Float:x, Float:y, Float:z, Float:Angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo);

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


skin - ID скина с которым будет спавниться игрок (0 - 311)
Float:x - Точка спавна по оси X
Float:y - Точка спавна по оси Y
Float:z - Точка спавна по оси Z
Float:Angle - Угол поворота игрока
weapon1 - Оружие №1 (0 - 46)
weapon1_ammo - Количество патрон к оружию №1 (1 - 9999)
weapon2 - Оружие №2 (0 - 46)
weapon2_ammo - Количество патрон к оружию №2 (1 - 9999)
weapon3 - Оружие №3 (0 - 46)
weapon3_ammo - Количество патрон к оружию №3 (1 - 9999)

Примечание:
- Максимум 320 классов (0 - 319). Если количество классов будет превышено, то класс ID 319 будет заменяться на последний добавленный

AddPlayerClassEx(teamid, skin, Float:x, Float:y, Float:z, Float:Angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo);

AddPlayerClassEx - Добавляет новый класс к уже имеющимся классам. Классы используются для того, чтобы игроки могли выбрать скин при спавне. В отличии от функции AddPlayerClass, в этой функции теперь можно выставлять ID команды

teamid - ID команды, в которой будет спавниться игрок
skin - ID скина с которым будет спавниться игрок (0 - 311)
Float:x - Точка спавна по оси X
Float:y - Точка спавна по оси Y
Float:z - Точка спавна по оси Z
Float:Angle - Угол поворота игрока
weapon1 - Оружие №1 (0 - 46)
weapon1_ammo - Количество патрон к оружию №1 (1 - 9999)
weapon2 - Оружие №2 (0 - 46)
weapon2_ammo - Количество патрон к оружию №2 (1 - 9999)
weapon3 - Оружие №3 (0 - 46)
weapon3_ammo - Количество патрон к оружию №3 (1 - 9999)

Примечание:
- Максимум 319 классов (0 - 318). Если количество классов будет превышено, то класс ID 318 будет заменяться на последний добавленный

AddStaticPickup(model, type, Float:X, Float:Y, Float:Z, Virtualworld);

AddStaticPickup - Данная функция добавляет в игру "статический" пикап. Такие пикапы используются для выдачи оружия, здоровья, брони и т.д. Они функционируют без добавления функционала. Они срабатывают автоматически (Если пикап здоровья, то вам выдадут здоровье)

model - ID пикапа
type - Тип пикапа
Float:X - Местонахождение пикапа по оси X
Float:Y - Местонахождение пикапа по оси Y
Float:Z - Местонахождение пикапа по оси Z
Virtualworld - ID виртуального мира, в котором будет находится пикап (-1 - для всех виртуальных миров)

AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2);

AddStaticVehicle - Данная функция добавляет в игру "статический" транспорт.

modelid - ID транспорта (400 - 611)
Float:spawn_x - Местоположение транспорта по оси X
Float:spawn_y - Местоположение транспорта по оси Y
Float:spawn_z - Местоположение транспорта по оси Z
Float:angle - Угол поворота транспорта
color1 - ID цвета №1 (0 - 255)
color2 - ID цвета №2 (0 - 255)

AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay, addsiren );

AddStaticVehicleEx - Данная функция добавляет в игру "статический" транспорт, с указанием времени (в секундах) его респавна, если оно пустует.

modelid - ID транспорта (400 - 611)
Float:spawn_x - Местоположение транспорта по оси X
Float:spawn_y - Местоположение транспорта по оси Y
Float:spawn_z - Местоположение транспорта по оси Z
Float:angle - Угол поворота транспорта
color1 - ID цвета №1 (0 - 255)
color2 - ID цвета №2 (0 - 255)
respawn_delay - Время респавна транспорта (в секундах)
addsiren - Параметр добавлен в версии 0.3.7 и в более ранних версиях работать не будет. Параметр, который добавляет транспорту характерный звуковой сигнал (сирена) (По умолчанию 0)

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

vehicleid - ID транспорта
componentid - ID компонента тюнинга (1000 - 1193)

AllowAdminTeleport(allow);

AllowAdminTeleport - Данная функция позволяет установить/снять ограничение на телепорт по метке на карте для RCON администраторов.

allow - Параметр, который позволяет установить/снять ограничение (1 - выключить, 0 - выключить)

AllowInteriorWeapons(allow);

AllowInteriorWeapons - Данная функция позволяет разрешить/запретить носить оружие в стандартных интерьерах GTA SA.

allow - Параметр, который позволяет разрешить/запретить ношение оружия в интерьерах (1 - разрешить, 0 - запретить)

Примечание:
- Данная функция не действительна в текущей версии SA:MP

AllowPlayerTeleport(playerid, allow);

AllowPlayerTeleport - Данная функция позволяет установить/снять ограничение на телепорт по метке на карте для игрока

playerid - ID игрока (0 - 999)
allow - Параметр, который позволяет установить/снять ограничение (1 - выключить, 0 - выключить)

ApplyActorAnimation(actorid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time);

ApplyActorAnimation - Данная функция позволяет проиграть актёру (NPC боту) анимацию

actorid - ID актёра (NPC бота)
animlib[] - Библиотека анимаций
animname[] - Имя анимации из выбранной библиотеки
Float:fDelta - Скорость воспроизведения анимации (Стандарт: 4.1)
loop - Цикл анимации (1 - включить цикл (анимация будет повторяться снова и снова, пока её не отключат), 0 - выключить цикл (анимация проиграется 1 раз))
lockx - Возвращение актёра (NPC бота) обратно по оси X (1 - Актёр (NPC бот) от смещения по оси X возвращаться не будет, 0 - Актёр (NPC бот) от смещения по оси X будет возвращаться)
locky - Возвращение актёра (NPC бота) обратно по оси Y (1 - Актёр (NPC бот) от смещения по оси Y возвращаться не будет, 0 - Актёр (NPC бот) от смещения по оси Y будет возвращаться)
freeze - Включить/выключить заморозку игрока после завершения анимации (1 - включить заморозку после завершения анимации, 0 - выключить заморозку после завершения анимации)
time - Таймер (в миллисекундах) цикла (0 - бесконечный цикл)

ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync);

ApplyAnimation - Данная функция позволяет проиграть анимацию игроку

playerid - ID игрока (0 - 999)
animlib[] - Библиотека анимаций
animname[] - Имя анимации из выбранной библиотеки
Float:fDelta - Скорость воспроизведения анимации (Стандарт: 4.1)
loop - Цикл анимации (1 - включить цикл (анимация будет повторяться снова и снова, пока её не отключат), 0 - выключить цикл (анимация проиграется 1 раз))
lockx - Возвращение игрока обратно по оси X (1 - Игрок от смещения по оси X возвращаться не будет, 0 - Игрок от смещения по оси X будет возвращаться)
locky - Возвращение игрока обратно по оси Y (1 - Игрок от смещения по оси Y возвращаться не будет, 0 - Актёр Игрок от смещения по оси Y будет возвращаться)
freeze - Включить/выключить заморозку игрока после завершения анимации (1 - включить заморозку после завершения анимации, 0 - выключить заморозку после завершения анимации)
time - Таймер (в миллисекундах) цикла (0 - бесконечный цикл)
forcesync - Синхронизация анимации серверf с игроком. (0 - отключает синхронизацию (стандарт), 1 - Синхронизация для всех остальных игроков в зоне прорисовки, 2 - То же самое, что и 1 пункт, но применяет анимацию только для остальных игроков в радиусе прорисовки, а не к указанному игроку)

Attach3DTextLabelToPlayer(Text3D:id, playerid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);

Attach3DTextLabelToPlayer - Данная функция позволяет прикрепить к игроку уже созданный 3D Text, созданный с помощью функции Create3DTextLabel

Text3D:id - ID уже созданного 3D текста
playerid - ID игрока (0 - 999)
Float:OffsetX - Смещение 3D текста по оси X относительно центра игрока (0.0)
Float:OffsetY - Смещение 3D текста по оси Y относительно центра игрока (0.0)
Float:OffsetZ - Смещение 3D текста по оси Z относительно центра игрока (0.0)

Attach3DTextLabelToVehicle(Text3D:id, vehicleid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);

Attach3DTextLabelToVehicle - Данная функция позволяет прикрепить к любому транспорту уже созданный 3D Text, созданный с помощью функции Create3DTextLabel

Text3D:id - ID уже созданного 3D текста
vehicleid - ID транспорта
Float:OffsetX - Смещение 3D текста по оси X относительно центра транспорта (0.0)
Float:OffsetY - Смещение 3D текста по оси Y относительно центра транспорта (0.0)
Float:OffsetZ - Смещение 3D текста по оси Z относительно центра транспорта (0.0)

AttachCameraToObject(playerid, objectid);

AttachCameraToObject - Данная функция позволяет прикрепить камеру игрока к объекту, созданному с помощью функции CreateObject

playerid - ID игрока, камера которого будет прикреплена к объекту (0 - 999)
objectid - ID объекта, к которому нужно прикрепить камеру игрока

AttachCameraToPlayerObject(playerid, playerobjectid);

AttachCameraToPlayerObject - Данная функция прикрепляет камеру игрока к игроку-объекту. Можно перемещать свою камеру в тот момент, как она будет прикреплена к объекту

playerid - ID игрока (0 - 999)
playerobjectid - ID игрока-объекта, к которому будет прикреплена камера игрока

AttachObjectToObject(objectid, attachtoid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:RotX, Float:RotY, Float:RotZ, SyncRotation = 1);

AttachObjectToObject - Данная функция позволяет прикрепить один объект к другому объекту, и этот прикрепленный объект, будет следовать за основным объектом

objectid - ID объекта, который вы хотите прикрепить к главному объекту
attachtoid - ID главного объекта
Float:OffsetX - Смещение по оси X относительно главного объекта
Float:OffsetY - Смещение по оси Y относительно главного объекта
Float:OffsetZ - Смещение по оси Z относительно главного объекта
Float:RotX - Вращение по оси X относительно главного объекта
Float:RotY - Вращение по оси Y относительно главного объекта
Float:RotZ - Вращение по оси Z относительно главного объекта
SyncRotation = 1 - Вращение объектов (1 - включить вращение главного и прикрепленного объекта, 0 - выключить вращение главного и прикрепленного объекта)

AttachObjectToPlayer(objectid, playerid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);

AttachObjectToPlayer - Данная функция позволяет прикрепить объект к игроку

objectid - ID объекта, который вы хотите прикрепить к игроку
playerid - ID игрока (0 - 999)
Float:OffsetX - Смещение объекта по оси X относительно центра игрока (0.0)
Float:OffsetY - Смещение объекта по оси Y относительно центра игрока (0.0)
Float:OffsetZ - Смещение объекта по оси Z относительно центра игрока (0.0)
Float:rX - Угол поворота объекта по оси X относительно центра игрока (0.0)
Float:rY - Угол поворота объекта по оси Y относительно центра игрока (0.0)
Float:rZ - Угол поворота объекта по оси Z относительно центра игрока (0.0)

AttachObjectToVehicle(objectid, vehicleid, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:RotX, Float:RotY, Float:RotZ);

AttachObjectToVehicle - Данная функция позволяет прикрепить объект к транспорту

objectid - ID объекта, который вы хотите прикрепить к транспорту
vehicleid - ID транспорта
Float:OffsetX - Смещение объекта по оси X относительно центра транспорта (0.0)
Float:OffsetY - Смещение объекта по оси Y относительно центра транспорта (0.0)
Float:OffsetZ - Смещение объекта по оси Z относительно центра транспорта (0.0)
Float:RotX - Угол поворота объекта по оси X относительно центра транспорта (0.0)
Float:RotY - Угол поворота объекта по оси Y относительно центра транспорта (0.0)
Float:RotZ - Угол поворота объекта по оси Z относительно центра транспорта (0.0)

AttachPlayerObjectToPlayer(objectplayer, objectid, attachplayer, Float:OffsetX, Float:OffsetY, Float:OffsetZ, Float:rX, Float:rY, Float:rZ);

AttachPlayerObjectToPlayer - Данная функция позволяет прикрепить объект к другому игроку или к этому же игроку

objectplayer - ID игрока, для которого был создан объект (0 - 999)
objectid - ID объекта
attachplayer - ID игрока, которому нужно прикрепить объект
Float:OffsetX - Смещение по оси X относительно центра игрока, которому нужно прикрепить объект (0.0)
Float:OffsetY - Смещение по оси Y относительно центра игрока, которому нужно прикрепить объект (0.0)
Float:OffsetZ - Смещение по оси Z относительно центра игрока, которому нужно прикрепить объект (0.0)
Float:rX - Угол поворота по оси X относительно центра игрока, которому нужно прикрепить объект (0.0)
Float:rY - Угол поворота по оси Y относительно центра игрока, которому нужно прикрепить объект (0.0)
Float:rZ - Угол поворота по оси Z относительно центра игрока, которому нужно прикрепить объект (0.0)

Примечание:
- Данная функция была удалена

AttachPlayerObjectToVehicle(playerid, objectid, vehicleid, Float:fOffsetX, Float:fOffsetY, Float:fOffsetZ, Float:fRotX, Float:fRotY, Float:RotZ);

AttachPlayerObjectToVehicle - Данная функция позволяет прикрепить объект игрока к транспортному средству

playerid - ID игрока, для которого был создан объект (0 - 999)
objectid - ID объекта
vehicleid - ID транспорта
Float:OffsetX - Смещение по оси X относительно центра транспорта, которому нужно прикрепить объект (0.0)
Float:OffsetY - Смещение по оси Y относительно центра транспорта, которому нужно прикрепить объект (0.0)
Float:OffsetZ - Смещение по оси Z относительно центра транспорта, которому нужно прикрепить объект (0.0)
Float:fRotX - Угол поворота по оси X относительно центра транспорта, которому нужно прикрепить объект (0.0)
Float:fRotY - Угол поворота по оси Y относительно центра транспорта, которому нужно прикрепить объект (0.0)
Float:fRotZ - Угол поворота по оси Z относительно центра транспорта, которому нужно прикрепить объект (0.0)

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