05:29
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
        
Подвиcание SA-MP (0)
Max 15.02.2017 18:17
MYSQL Донат (2)
JasonGordon 08.02.2017 10:39
 





Рекомендуем:
Добавить IP: 95.172.59.51:7777





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
Скачать GTA SAMP 0.3.7 - Кл... 20.07.2015
Страница 1 из 11
Модератор форума: Dima-kun 
Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [Урок] Plugin Development
[Урок] Plugin Development
MakeДата: Воскресенье, 22.07.2012, 19:04 | Сообщение # 1
Уверенный в себе
Группа: Пользователи
Сообщений: 229
Награды: 5
Город: Новосибирск
Репутация: 16
Замечания: 40%
Статус:
Введение

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

Часто задаваемые вопросы

[off]Вопрос : Как плагин работает?
Ответ : Плагины выполнены в C /++ с использованием плагина SDK. Этот FAQ подразумевает, что вы знаете C /++ уже, и я уже предоставлю информацию о фактическом SDK позже в этой статье.

Вопрос : Могу ли я создать плагин на языке программирования, кроме C /++?
Ответ: Это возможно в теории. Там были попытки портирования SA-MP SDK плагин для языка программирования D, который поддерживает приложения C двоичный интерфейс. Хотя я никогда не видел полностью рабочий плагин написанный на D, этот пример пролил свет на возможность написания плагинов на языках, которые поддерживает C /++. Там же ведутся разговоры о возможности привязки, но я еще не видят поддержки по этому вопросу.

Вопрос : Как я могу получить свой плагин (доступный на Linux и Windows)?
Ответ : Linux и Windows, это две разные операционные системы, имеют свои различные API и реализации. Получение кода работать на обеих платформах означает, что вы должны использовать независимый от платформы код или своего рода рамки, которая обрабатывает все, что связано с платформами для вас. После того, как вы уверены, что ваш код не полагаться на любой из API, вы просто должны компилировать код в желаемое окружающей среды (опять же, это руководство предполагает, что вы знаете, как это сделать).

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

Вопрос : Какие IDE / компилятора я должен использовать для ______?
Ответ : Это полностью зависит от вас! Лично я буду использовать VC + + 2010 Express, как мои окна IDE и компилятор, и план по использованию g++ для Linux мой компилятор. Просто повозитесь с различными вариантами и выбирите тот, который вам нравится больше всего!

Вопрос : Что представляет собой файл определения модуля (DEF).?
Ответ : Файл определения модуля представляет собой специальный файл в интегрированную среду разработки Visual студия, которая предоставляет компоновщик с информацией о программе, которая будучи связаны между собой. Когда дело доходит до написания плагинов для SA-MP мы только действительно использовать "EXPORTS" заявление, в котором содержится информация о наших экспортируемых функциях.[/off]

Для работы вам понадобится:

Visual C + + 2010 Express : Скачать или SDK (Plain) : Скачать, но я вам буду показывать и рассказывать, как делать на Visual C + + 2010 Express.
Примечание: Если вы решили использовать другой IDE / компилятор, предназначенный для Windows, вам не повезло! Кажется, что единственный способ успешно экспортировать функции, заключается в использовании файла определения модуля (.def).

-Первое, что мы хотим сделать, это создать новый проект. Выберите: Select file->new->project to do just that.

-Выберите проект Win32, введите имя проекта и нажмите кнопку OK, чтобы продолжить.

-После нажатия "ОК", должно появиться такое окно. Жмём "Next".

-После нажатия "Next" вы должны увидеть это всплывающее диалоговое окно. Там просям вас указать тип приложения и настройки. Выбирите для "DLL" (Dynamic-Link Library). Как только вы закончите нажмите на кнопку "Finish" в нижней части.

-Следующее, что мы хотим сделать, это зайти в наш обозреватель решений. Решение исследователь, как правило, на левой стороне IDE. Если Вы случайно отключили его можно включить еще раз, нажав CTRL + ALT + L или в view->other windows->solution explorer. Как только вы найдете решение исследователь щелкните правой кнопкой мыши имя проекта (в данном примере его "Test") и выберите пункт Свойства.

-Как только вы увидите страницу свойств перейдите к конфигурации: properties->Linker->Input на левой стороне. Когда вы там хотите добавить файл модуля определения. Вы можете назвать его как угодно, если он имеет расширение ".def". После того как вы назвали ваш файл, нажмите кнопку ОК.

-Далее выбираем C++ File(.cpp), и жмём "add"

-explorer->add->New Filter

-Следующим шагом будет добавить все файлы SDK для наших текущих проектов. Чтобы добавить существующие файлы в проект, просто щелкните правой кнопкой мыши папку или проект, который вы хотите добавить и выберите select add -> Existing item, чтобы добавить все, что есть в папке SDK в каталоге вашего проекта ( Примечание : Вы можете выбрать несколько файлов, удерживая Ctrl при нажатии файлов для добавления).

Теперь вы должны иметь файл определения модуля и исходный файл открытыми, если вы все сделали правильно, а если нет, вернитесь на несколько шагов назад и следуйте инструкциям. Идите вперед и скопируйте следующую информацию в соответствующие файлы.

Исходный файл (*.cpp):
Code
#include "SDK\amx\amx.h"
#include "SDK\plugincommon.h"

typedef void (*logprintf_t)(char* format, ...);

logprintf_t logprintf;
extern void *pAMXFunctions;

cell AMX_NATIVE_CALL HelloWorld(AMX* amx, cell* params)
{
                       logprintf("This was printed from the Test plugin! Yay!");
                       return 1;
}

PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()                    
{
                       return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}

PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)                    
{
                       pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
                       logprintf = (logprintf_t) ppData[PLUGIN_DATA_LOGPRINTF];

                       logprintf(" * Test plugin was loaded.");
                       return true;
}

PLUGIN_EXPORT void PLUGIN_CALL Unload()
{
                       logprintf(" * Test plugin was unloaded.");
}

AMX_NATIVE_INFO PluginNatives[] =
{
                       {"HelloWorld", HelloWorld},
                       {0, 0}
};

PLUGIN_EXPORT int PLUGIN_CALL AmxLoad( AMX *amx )                    
{
                       return amx_Register(amx, PluginNatives, -1);
}

PLUGIN_EXPORT int PLUGIN_CALL AmxUnload( AMX *amx )                    
{
                       return AMX_ERR_NONE;
}


Модуль определения файла (*.def)
Code
EXPORTS
                    Supports
                    Load
                    Unload
                    AmxLoad
                    AmxUnload


Изучение кода

В этом разделе мы будем смотреть на некоторые определения, структур и функций, которые SA-MP SDK плагин может предложить. Вы должны иметь хорошее понимание С/++, прежде чем продолжить, а я буду просто объяснять SDK информацию.

Файл определения модуля

Прежде чем мы рассмотрим код, мы собираемся проверить файл определения модуля, который мы создали в предыдущем разделе. Прежде всего, что именно представляет собой файл определения модуля? Мы знаем, что его студия визуальных-эксклюзивных функций, но что именно он делает? Файл определения модуля содержит информацию для компоновщика о коде, который в настоящее время связан между собой. Есть много правил и заявлений, которые могут быть использованы в этих файлах, но мы просто будем говорить об одном, EXPORT'e.

Что такое "EXPORT"?

Экспорт является утверждением, что позволяет хорошо экспортировать материал, т.е. наше приложение! Почему мы это делаем? Функции, которые мы экспортируем, являются точками входа в наши "DLL" файлы. Приложения могут только прикоснуться к функции в нашей DLL, которые мы экспортируем, если мы не будем экспортировать их, они остаются закрытыми для DLL файлов.

Экспортируемые функции

Есть в настоящее время 6 функций, которые нужны для экспорта. Мы используем 5 из них внутри нашего проекта, что мы настроили. Не беспокойтесь о PLUGIN_EXPORT и PLUGIN_CALL определениях, которые вы видите на объявлениях функций. Мы будем рассматривать их наряду с другими важными определениями (отмечены зеленым цветом), далее в статье.

[table][tr][td]Supports()[/td][td]Эта функция сообщает серверу, какие возможности нашего плагина будет основано на том, что она возвращается. Как правило, мы используем только 3 поддержки флаги плагинов: SUPPORTS_VERSION, SUPPORTS_AMX_NATIVES и SUPPORTS_PROCESS_TICK.[/td][/tr][tr][td]Load(void**)[/td][td]Загрузка функций является довольно важной. Это называется, когда плагин загружается и передается в массив адресов, что плагин будет использовать, чтобы работать. Два индекса, которые мы обычно используем, PLUGIN_DATA_AMX_EXPORTS и PLUGIN_DATA_LOGPRINTF.[/td][/tr][tr][td]Unload()[/td][td]Выгрузка вызывается когда плагин выгружается (сервер выключается).[/td][/tr][tr][td]AmxLoad(AMX*)[/td][td]Это когда новый экземпляр AMX загружен на сервер. Это будет вызываться для каждого фильтрскрипт / режима игры! Из-за этого он не является хорошей идеей для хранения одного экземпляра AMX за весь плагин, вместо того, чтобы использовать очереди/списки/векторы. В этой функции мы также зарегистрируем наш обычай встроенных функций.[/td][/tr][tr][td]AmxUnload(AMX*)[/td][td]Эта функция вызывается, когда все AMX выгружаются. Если вы храните AMX в случаях, убедитесь, что вы удалили их. В противном случае вам придется смотреть на несуществующий режим игры / filterscripts.[/td][/tr][tr][td]ProcessTick()[/td][td]ProcessTick это функция, которая вызывается на каждой итерации цикла сервера. Люди обычно используют эту функцию в качестве метода управления временем, отслеживая количество потоков, которые прошли. SA-MP сервера, как говорят, время сна 5 мс, так что если 50 потоков идут. У вас есть представление: прошедшее время (5 * 50 = 250 мс). Примечание: Любой, кто использует потоки в своих плагинах и требует взаимодействия PAWN, необходимо использовать эту функцию и смотреть, что-бы она была не занята другой задачей![/td][/tr][/table]

Определения и сооружения

Теперь начинается самое интересное, мы получаем, чтобы взглянуть на код! Вы, вероятно, заметили сразу же, что мы используем тонну определений и структур, через наш маленький пример из предыдущего раздела. Если вы никогда не разрабатывали SA-MP плагин, прежде чем, он может оказаться очень запутанным и даже пугающим. Мы будем проливать некоторый свет на эти определения и структуры в этом разделе.

[table][tr][td]cell[/td][td]"Ячейки (cell)" это определение типа, что просто есть для портативности. PAWN обеспечивает поддержку 16-битных, 32-битные, и 64 числа. Тип .def "cell" всегда будет иметь правильный размер, а "INT" не может быть. Вообще с SA-MP плагинов, этот тип "def" всегда будет 32 бита. Примечание: Существует также «UCell» типа для целых чисел без знака, но это практически не используется.[/td][/tr][tr][td]AMX_NATIVE_CALL[/td][td]Это определяет соглашение о вызове, что наша родная функция будет использовать. На данный момент ничего не определено, поэтому она будет использоваться по умолчанию.[/td][/tr][tr][td]AMX[/td][td]Название этой структуры должно быть ясно, его AMX инстанции. Эта структура имеет массу информации, относящейся к данным сегментам, а также множество других AMX информации. Эта структура должна присутствовать во всех родных декларацях функции вместе с ячейкой указателя на переданные параметры; Без этой информации мы не знаем, что сценарий был принят. (На иные слова: не был скомпилирован без ошибок в коде).[/td][/tr][tr][td]PLUGIN_EXPORT[/td][td]Это определяется как "PLUGIN_EXTERN_C".[/td][/tr][tr][td]PLUGIN_EXTERN_C[/td][td]При использовании C++ компилятор это определяет как "extern "C". Это для совместимости с C. C++ предлагает такие вещи, как функция перегрузки, так и дополнительную информацию, например номер/размер аргументов, сохранявшихся с именем функции.[/td][/tr][tr][td]PLUGIN_CALL[/td][td]Это определяет C/++, что соглашение о вызовах, для использования в наших экспортируемых функцях. Если вы используете компилятор ориентации окон, это определяется как __ STDCALL. В противном случае его определение-как ничего, и по умолчанию используются конвенции.[/td][/tr][tr][td]SUPPORTS_VERSION[/td][td]Это определение будет использоваться в битовую маску, которая возвращается на нашу "Supports()" функцию. Этот флаг используется для проверки на совместимость с сервером.[/td][/tr][tr][td]SUPPORTS_AMX_NATIVES[/td][td]Это еще одно определение, что должно использовать нашу "Supports()" функцию. Любой плагин, который использует AMX функции должны использовать этот флаг! Без этого флага вы получите во время 19 ошибок, связанных с вашими родными фун-ями не регистрирующихся на сервере (amx_Register)[/td][/tr][tr][td]SUPPORTS_PROCESS_TICK[/td][td]Наш последний флаг нашей "Supports()" функции. Если вы собираетесь использовать "ProcessTick()" функцию, вы должны добавить в "Supports()" возвращение битовой маски функции.[/td][/tr][tr][td]PLUGIN_DATA_AMX_EXPORTS[/td][td]Это используется в качестве индекса на многомерный массив, который передается от нагрузки. Данный индекс имеет AMX таблицы функции. Все плагины должны использовать этот индекс, присвоить адрес функции таблицы pAMXFunctions.[/td][/tr][tr][td]PLUGIN_DATA_LOGPRINTF[/td][td]Еще один индекс, который будет использовать многомерный массив, который передается от нагрузки. Этот индекс содержит адрес logprintf функцию, которая выводит информацию и сохраняет указанную информацию в файл журнала сервера. Если ваш плагин использует эту функцию, необходимо использованию этого индекса присвоить адрес logprintf указатель функции.[/td][/tr][tr][td]AMX_NATIVE_INFO[/td][td]Эта структура используется в сочетании с amx_Register. Она содержит строку, которая содержит имя нового файла, и указатель на его адрес.[/td][/tr][/table]

Есть несколько других важных определений, которые относятся к AMX ошибкам функции, но они уже документально внутри AMX заголовка. Таким образом, вместо того чтобы изобретать колесо, я просто хочу, отправить перечисление всех кодов ошибок и соответствующие комментарии. Примечание: Каждая функция AMX, за исключением amx_NativeInfo, возвращается на один из этих кодов ошибок, если проблема встречается.
Code
enum                         
{
                          AMX_ERR_NONE,
                          /* оставляет за собой первые 15 кодов ошибок, для кодов выхода из абстрактной машины */
                          AMX_ERR_EXIT,         /* принудительный выход*/
                          AMX_ERR_ASSERT,       /* утверждение не удалось */
                          AMX_ERR_STACKERR,     /* куча столкновений */
                          AMX_ERR_BOUNDS,       /* индекс вне границ */
                          AMX_ERR_MEMACCESS,    /* недействительный доступ к памяти */
                          AMX_ERR_INVINSTR,     /* недопустимая команда */
                          AMX_ERR_STACKLOW,     /* стек сгущенного */
                          AMX_ERR_HEAPLOW,      /* куча сгущенного */
                          AMX_ERR_CALLBACK,     /* нет обратного вызова, или недействительный обратный вызов */
                          AMX_ERR_NATIVE,       /* сообственная функция не удалась */
                          AMX_ERR_DIVIDE,       /* деление на ноль */
                          AMX_ERR_SLEEP,        /* перейти в спящий режим - код может быть возобновлён */
                          AMX_ERR_INVSTATE,     /* недопустимое состояние для такого доступа */

                          AMX_ERR_MEMORY = 16,  /* из памяти */
                          AMX_ERR_FORMAT,       /* неверный формат файла*/
                          AMX_ERR_VERSION,      /* файл для новой версии AMX */
                          AMX_ERR_NOTFOUND,     /* работа не найдена */
                          AMX_ERR_INDEX,        /* неверный параметр индекса (плохая точка входа) */
                          AMX_ERR_DEBUG,        /* отладчик не может работать */
                          AMX_ERR_INIT,         /* AMX не инициализируется (или дважды инициализируется) */
                          AMX_ERR_USERDATA,     /* не удалось установить пользовательские данные поля (таблицы полностью) */
                          AMX_ERR_INIT_JIT,     /* не может инициализировать JIT */
                          AMX_ERR_PARAMS,       /* параметр ошибки */
                          AMX_ERR_DOMAIN,       /* домен ошибка, результат выражения не укладывается в диапазон */
                          AMX_ERR_GENERAL,      /* общая ошибка (неизвестная ошибка или неспецифическая) */
};


Amx функции
AMX функции очень хорошо документированы в документации руководства PAWN исполнителей.

amx_Allot
Синтаксис:
Code
int amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]cells[/td][td]Кол-во ячеек в резерве[/td][/tr][tr][td]amx_addr[/td][td]Адрес выделенной ячейки, как Pawn программы (которая работает в абстрактной машины) может получить к нему доступ. phys_addr адрес ячейки для C / C++ программ для доступа.[/td][/tr][/table]

Примечание: В более ранних версиях залога, массивы и строки должны были быть переданы в сценарий после явного выделения памяти для AMX стека.
В текущей версии эта функция в значительной степени заменена функциями amx_PushArray и amx_PushString.
Если параметр должен быть принят "по ссылке" в залог
функции, необходимо передать адрес этого параметра amx_Exec.
Кроме того, этот адрес сам по себе должен быть в пределах диапазона адресов абстрактной машины тоже. Дополнительная сложность в том, что абстрактная машина использует адреса, по сравнению с данными раздела. Абстрактная машина, и программа использует адрес по отношению к окружающей среде, что операционная система дает.
amx_Allot выделяет ячейки памяти внутри абстрактной машины и возвращает два адреса. Параметр amx_addr это адрес переменной по отношению к "Данные раздела" абстрактной машины;
Это значение, которое должно пройти до amx_Exec (через amx_Push). Параметр phys_addr содержит адрес относительно принимающих программы адресного пространства. Таким образом, C/C++ программа может использовать этот адрес и написать в выделенной памяти.
После amx_Exec возвращается, вы можете проверить блок памяти (PAWN функция вызывается amx_Exec может написатьcя в ней) и, наконец, освободить его, вызвав amx_Release. См. также: amx_Exec , amx_PushArray , amx_PushString , amx_Release.

amx_ctof
- Меняем “cell” на “float”

Синтаксис:
Code
[float] amx_ctof([cell] c);


Примечание: Этот макрос бросает "cell" в тип "float" без изменения битов. Нормальное приведение типа в C / C++ изменяет память представление выражений, так что его числовое значение в IEEE 754 формат ближе всего к исходному значению числа. Pawn анализатор и абстрактная машина (память в буфере компьютера) - при получении значения с переменной величиной из ячейки, битов, не должны быть изменены. См. также: amx_ftoc

amx_Exec
-Запуск кода

Синтаксис:
Code
int amx Exec(AMX *amx, long *retval, int index);

[table][tr][td]amx[/td][td]Абстрактная машина, для вызова функции.[/td][/tr][tr][td]retval[/td][td]Хранение возвращаемого значения вызываемого после возвращения функции. Этот параметр может быть NULL, если не интересует возвращаемое значение.[/td][/tr][tr][td]index[/td][td]Индекс "общественные функции таблицы", она индификационна функции "выполнять". Смотрите amx_FindPublic для получения дополнительной информации. Используйте AMX_EXEC_MAIN, что-бы начать выполнение в основные функции и AMX_EXEC_CONT.[/td][/tr][/table]

Примечание: Эта функция запускает скрипт, начиная с указанной функции. Она
вызывает функцию обратного вызова для любого родного вызова функции, что код
в AMX. amx_Exec предполагает, что все собственные функции
правильно инициализируются amx_Register. См. также: amx_FindPublic , amx_Register

amx_FindPublic
- возвращает индекс общественной функции

Синтаксис:
Code
int amx FindPublic(AMX *amx, char *funcname, int *index);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]funcname[/td][td]Имя публичной функции для поиска[/td][/tr][tr][td]index[/td][td]По возвращению, этот параметр содержит индекс запрашиваемой общественной функции.[/td][/tr][/table]
См. также: amx_Exec , amx_FindNative , amx_FindPubVar , amx_GetPublic , amx_NumPublics

amx_ftoc
- Меняем "float" на "cell"

Синтаксис:
Code
[cell] amx_ftoc(float] f);


(P.S. Та же картина немного, но сейчас, для "cell" типа.) Примечание: Этот макрос бросает "float" в тип "cell" без изменения битов. Нормальное приведение типа в C/C++ изменяет память представление выражений, так что его числовое значение в целое число формата интеграл. Значение исходного оригинального значения. Pawn анализатор и абстрактная машина (память в буфере компьютера) - при получении значения с переменной величиной из ячейки, битов, не должны быть изменены. См. также: amx_ctof

amx_GetAddr
- Решение AMX адреса

Синтаксис:
Code
int amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]amx_addr[/td][td]Адрес по отношению к абстрактной машине.[/td][/tr][tr][td]phys_addr[/td][td]Указатель на переменную, которая будет содержать адрес памяти указанной ячейки. Если amx_addr параметра не является действительным адресом внутри абстрактной машины, phys_addr будет установлен в NULL.[/td][/tr][/table]
Примечание: Эта функция возвращает адрес памяти в отсутствие
абстрактной машины. Один обычно использует эту функцию в расширение
модуля, так как он позволяет получить доступ к переменным внутри абстрактной
машины.

amx_GetString
- Получение строки из абстрактной машины

Синтаксис:
Code
int amx_GetString(char *dest, cell *source, int use_wchar, size_t size);

[table][tr][td]dest[/td][td]Указатель на массив символов достаточного размера, чтобы удерживать преобразованные строки источника.[/td][/tr][tr][td]source[/td][td]Указатель на исходную строку. Используйте amx_GetAddr строку адреса для конвертирования в AMX к физическому адресу.[/td][/tr][tr][td]use_wchar[/td][td]Ненулевое значение интерпретирует аргумент "НАЗНАЧЕНИЕ" как указатель на “wide characters”, т.е. wchar_t, независимо меньше ее символов типа. Это позволяет функции хранить Unicode строк.[/td][/tr][tr][td]size[/td][td]Максимальное количество символов для хранения в DEST, включая завершающий нулевой байт. Если исходная строка длиннее, строки в DEST будут усечены.[/td][/tr][/table]
Примечание: Эта функция преобразует обе упакованые строки и распаковывает строки из "pawn" формат "С" формата. При получении распаковывание строки с параметром use_wchar равно нулю, функция может обрезать символы из широких символов в 8-битные ASCII / ANSI. См. также: amx_SetString

amx_Push
- Передаёт числовой аргумент “value”

Синтаксис:
Code
int amx_Push(AMX *amx, cell value);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]value[/td][td]Значение перехода к общественной функции.[/td][/tr][/table]
Примечание: Все параметры, общественной функции должны быть переданы на функции перед вызовом amx_Exec. Если общественная функция имеет несколько аргументов, аргументы должны быть выдвинуты в обратном порядке. См. также: amx_Exec , amx_PushArray , amx_PushString

amx_PushArray
- Передаёт аргумент или массив “reference”

Синтаксис:
Code
int amx_PushArray(AMX *amx, cell *amx_addr, cell **phys_addr, const cell array[], int numcells);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]amx_addr[/td][td]Адрес выделенной ячейки, как Pawn программы (которая работает в абстрактной машины) может получить к нему доступ, необходимо освободить блок памяти. Этот параметр может быть NULL.[/td][/tr][tr][td]phys_addr[/td][td]Адрес ячейки для C/C++ программы для доступа. Этот параметр может быть NULL.[/td][/tr][tr][td]array[/td][td]Массив значений для последующей передачи в общественную функцию. Одной ячейки, которой должны быть переданы по ссылке считается одним массивом ячеек.[/td][/tr][tr][td]numcells[/td][td]Количество элементов в массиве.[/td][/tr][/table]
Примечание: Все параметры, что и общественные функции должны быть переданы на функции перед вызовом amx_Exec. Если общественная функция имеет несколько аргументов, то аргументы должны быть выдвинуты в обратном порядке. Функция выделяет память для массива “heap” в абстрактной машине. Эта память должна быть освобождена с amx_Release.
Смотри функцию amx_Allot, для подробной информации о параметрах, и amx_addr
phys_addr. См. также: amx_Exec , amx_Push , amx_PushString , amx_Release

amx_PushString
- Передает строку аргумента

Синтаксис:
Code
int amx PushString(AMX *amx, cell *amx_addr, cell **phys_addr, const char *string, int pack, int use_wchar);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]amx_addr[/td][td]Адрес выделенной ячейки, как Pawn программы (которая работает в абстрактной машины) может получить к нему доступ, необходимо освободить блок памяти. Этот параметр может быть NULL.[/td][/tr][tr][td]phys_addr[/td][td]Адрес ячейки для C/C++ программы для доступа. Этот параметр может быть NULL.[/td][/tr][tr][td]string[/td][td]Строка перехождения к общественной функции.[/td][/tr][tr][td]pack[/td][td]Ненулевые преобразователи исходной строку в переполненную строку в абстрактной машины, нулевые, чтобы преобразовать исходную строку в ячейку строки.[/td][/tr][tr][td]use_wchar[/td][td]Ненулевое значение интерпретирует строку аргумента, как указатель на “wide characters” wchar_t, т. е. независимо от символьного типа. Это позволяет функции принять Unicode строк.[/td][/tr][/table]
Примечание: Все параметры, что и общественные функции должны быть переданы на функции перед вызовом amx_Exec. Если общественная функция имеет несколько аргументов, то аргументы должны быть выдвинуты обратном порядке. Функция выделяет память для массива "heap" в
абстрактной машине. Эта память должна быть освобождена с amx_Release.
Смотри функцию amx_Allot, для подробной информации о параметрах и amx_addr, phys_addr.
Когда вы передаете в Unicode строк и просите упаковать в формате
абстрактной машины (например, как упаковка и use_wchar верны), символы, укорачиваются . 8-бит См. также: amx_Exec , amx_Push , amx_PushArray , amx_Release , amx_SetString

amx_Register
- Сделать родные функции известными

Синтаксис:
Code
int amx Register(AMX *amx, AMX NATIVE INFO *list, int number);

[table][tr][td]amx[/td][td]Абстрактная машина[/td][/tr][tr][td]list[/td][td]Массив структур, где каждая структура содержит указатель на имя собственной функции и указатель на функцию. Список дополнительно прекращается со структурой проведения двух нулевых указателей.[/td][/tr][tr][td]number[/td][td]Количество структур в списке массива, или -1, если список заканчивается структуры проведения двух нулевых указателей.[/td][/tr][/table]
Примечание: В случае успеха, эта функция возвращает 0 (AMX_ERR_NONE). Если эта функция
возвращает AMX_ERR_NOTFOUND код ошибки, одну или несколько родных функций, которые используются Pawn программой не найденом в
предоставленном списке. Вы можете использовав amx_Register снова зарегистрировать дополнительные списки функции.
Чтобы проверить, все ли встроенные функции, используемые в скомпилированном скрипте были зарегистрированы, вызовите amx_Register с параметром списка
значение NULL. Этот призыв не будет регистрировать новые встроенные функции, но еще вернётся в AMX_ERR_NOTFOUND, если собственная функция не зарегистрирована.
См. также: amx_NativeInfo

Продолжение будет ниже



Сообщение отредактировал Make - Вторник, 24.07.2012, 20:17
psychoДата: Понедельник, 23.07.2012, 16:50 | Сообщение # 2
16 | 13
Группа: I'm V.I.P.
Сообщений: 327
Награды: 11
Репутация: 645
Замечания: 20%
Статус:
Google Translate.
А так, юзайте CodeBlocks с компилятором GNU GCC.

Форум SAMP о мультиплеерах для GTA. »   » Wiki-Samp-Rus » [Урок] Plugin Development
Страница 1 из 11
Поиск:





 

По информации: На что рассчитывать "Зениту" в группе С Лиги чемпионов?.

 


 
Хостинг от uCoz SAMP-RUS.COM