Sign in to follow this
Followers
0

6 posts in this topic
Your content will need to be approved by a moderator
Sign in to follow this
Followers
0
-
Recently Browsing 0 members
No registered users viewing this page.
-
Similar Content
-
By odosenok
1. Описание макроса.
Данный макрос возвращает модуль указанного числа.
2. Исходный код макроса.
#if defined abs #undef abs #endif #define abs(%0)\ (%0 < 0) ? (-(%0)) : (%0) 3. Пример использования макроса.
new a = random(100)-90; // значение переменной может быть отрицательным и положительным printf("Исходное число: %d. Модуль числа: %d.", a, abs(a));
-
By Guest
Константы
Константа - величина, не меняющаяся в процессе выполнения скрипта. В Pawn константы объявляются почти так же, как и переменные, однако каждое объявление начинается со слова const:
const <тип>:<имя> = <значение>;
Для примера объявим число Пи:
const Float:M_PI = 3.141593;
Теперь объявим целочисленную константу (как и в new, для целых чисел указание типа не потребуется):
const MAX_BYTE = 255;
Внимание! В отличие от переменных (new), в константах нужно обязательно указывать значение.
Правила задания имён у констант те же, что и у переменных, за исключением одного необязательного:
Имя константы должно записываться в верхнем регистре (все буквы большие), чтобы было легче отличить его от имён переменных и функций. Примеры имён констант: MAX_PLAYERS, MAX_VEHICLES, MAX_PLAYER_NAME.
-
By Guest
Код на языке Pawn состоит из двух частей:
Операторы описания Исполняемые операторы Комментарии
Оператор описания описывает данные, над которыми выполняются действия.
Исполняемый оператор задаёт действия, выполняемые над данными. Пример: сложение двух чисел, запись числа в память, вывод на экран.
Для удобства операторы описания называют описаниями, а исполняемые операторы - просто операторами.
Все исходные тексты на Pawn пишутся при помощи алфавита языка, который состоит из:
Прописных и строчных букв латинского алфавита Цифр от "0" до "9" Спец. символов: "_", "@", "&", "+", "*", "%" и т.д.
Комментарии - пояснения к исходному коду, служащие для его документирования. Компилятор их игнорирует, поэтому на скомпилированный скрипт (.amx) они никак не влияют.
В Pawn существуют два вида комментариев: однострочный и многострочный.
Однострочный комментарий начинается с символов "//" и продолжается до конца строки.
Пример:
// это комментарий
Многострочный комментарий начинается с символов "/*" и заканчивается символами "*/".
Пример:
/* это многострочный комментарий */
Скрипты на языке Pawn имеют 2 расширения: .pwn и .amx.
.pwn - файлы с исходным кодом на понятном человеку языке программирования.
.amx - файлы с машинным кодом, которые выполняются интерпретатором (в нашем случае - сервером SA:MP).
Машинный код (байт-код AMX) получается из файлов исходного кода (.pwn) путём компиляции. Компиляцией в Pawn занимается (внимание!) компилятор (pawncc).
-
By odosenok
1. Введение. Суть перехватов.
В данном уроке я постараюсь рассказать про то, что такое перехваты. Мы разберем некоторые примеры перехватов функций, покажем пример, где эти перехваты могут пригодиться.
Что такое перехваты? Зачастую возникает ситуация, когда нам необходимо как-то изменить действия, происходящие в функции. Но редактирование уже имеющейся функции (как правило, это стандартные функции) не есть лучший вариант. Почему? Если мы хотим внести какие-то дополнительные действия в нужную нам функцию, придется открывать файл, в котором содержится данная функция, ее редактировать. А если выйдет новая версия файла a_samp? Все наши действия придется повторить сначала, теперь уже в новом файле.
Для того собственно и придуман перехват. Так, мы перехватываем заранее объявленную функцию, вследствие чего меняется порядок вызова функций:
перехваченная_функция_1 -> перехваченная_функция_2 -> перехваченная функция_3 -> основная_функция_которую_перехватывали Обратите внимание: в цепочке перехватов присутствуют несколько перехваченных функций. Отсюда можно сделать вывод, что число перехватов не ограничено никем и ничем. Более того, перехваты функций - это лишь смена названий каждой последующей функции препроцессором (перед началом компиляции), каждая из которых вызывается впоследствии системой.
Для перехвата функций нам потребуются некоторые директивы (#define, #if defined, #endif), а также сами функции, которые мы внедряем в перехваты.
2. Построение перехватов.
Давайте попробуем немного проанализировать перехват функций, не имея пока что представления о том, как их правильно перехватывать.
У нас есть функция A. Мы хотим, чтобы в ней происходил вывод текста "Hello world" в логи сервера. Как говорили ранее, внедрять этот текст в код функции A мы не будем (потому, что если выйдет обновление версии файла, в котором содержится эта функция, мы утратим свои корректировки в данной функции). Значит, нам нужно сделать так, чтобы это изменение могли внести без изменения кода файла.
Рассмотрим следующий вариант:
#define InterceptFunctionA()\ printf("Hello world");A(); В данном варианте мы создали макрос. Так, при использовании "InterceptFunctionA()" сначала в логи сервера будет вноситься наш текст, а затем вызываться сама функция. Но в данном методе есть два нюанса: во-первых, у нас теперь новое название функции (а мы не хотим поправлять его во всем моде), во-вторых, данный метод нам не подойдет, если вместе с данной функцией мы хотим выполнить еще с десяток других действий.
Так я постарался дать понять Вам, что на самом деле перехваты не создают визуальных неудобств: функция будет называться так, как называлась, свой код в макросы вы не вписываете.
В общем и целом метод перехватов, которому мы сейчас обучаемся, выглядит следующим образом:
<перехватчик 1> <выполняем действия перехватчика 1> <вызываем следующий перехватчик> <конец перехватчика> <перехватчик 2> <выполняем действия перехватчика 2> <вызываем следующий перехватчик> <конец перехватчика> <перехватчик 3> <выполняем действия перехватчика 3> <вызываем перехватываемую функцию> <конец перехватчика> Каждый перехватчик есть ни что иное как отдельная функция. И, соответственно, в ходе перехватов мы поочередно вызываем функции, в которых прописаны Ваши действия перехватчика.
Перехваты нативных функций и функций, вызывающихся автоматически, несколько отличаются. Поэтому урок мы немного разделим.
Как правило, перехваты применяются тогда, когда одну и ту же функцию необходимо использовать по-разному в разных файлах. С помощью перехватов мы можем в каждом файле перехватывать отдельные функции и вносить корректировки в их работу.
3. Перехваты функций: за и против.
В каждой ситуации есть сторонники какой-либо идеи и ее противники. Сейчас я постараюсь рассказать основные аспекты использования перехвата функций. А использовать их или нет - решать Вам.
1. Вы можете манипулировать одной и той же функцией по-разному в разных файлах. Это значит, что Вам не придется каждый раз добавлять различные проверки на то, подключен ли какой-либо файл, чтобы внести код "под него". Так, Вам достаточно лишь подключить нужный файл, чтобы вся цепочка вызовов работала как следует. Соответственно, при отключении файла проблем также не возникнет.
2. Перехват функций есть ни что иное как последовательные вызовы функций. Несомненно, на вызов функций уходит какая-то часть времени, но это время ничтожно для того, чтобы Ваш сервер действительно стал подтормаживать.
3. Если перехватываемую функцию использовать до того, как она перехвачена, функционировать она не будет (как Вы хотите). При этом про проблему в перехвате подумаете далеко не сразу. И главное - компилятор Вам не даст понять, что у Вас это не сработает, ведь со стороны его логики все сделано правильно. Поэтому перехватам вводят альтернативу: создают новую функцию с постфиксом "Ex", в которую уже помещают код перехвата и вызов самой функции:
stock ПерехватываемаяФункцияEx(аргументы функции) { // ваш код return ПерехватываемаяФункция(аргументы функции); } Нюанс данной реализации в том, что теперь Вам придется использовать только ПерехватываемаяФункцияEx, о чем Вы можете забыть и вызвать не данную функцию, а ее оригинал.
4. Авторское право.
Автор данной статьи: @odosenok
Отдельное спасибо за разъяснения: Daniel_Cortez
-
By DEST
Эта тема создана автоматически для возможности комментирования статьи Операции с текстом и данными в PAWN Автор статьи: @DEST
Статья опубликована: 05.01.2018 17:52
Просмотреть полную запись
-