Урок №02 – Функции public и stock Функции в Pawn начинаются со слова public. Стандартные или встроенные функции, они же автовызываемые, выполняются при каком-либо игровом событии. Они так и называются, в зависимости от того, при каком условии они выполнятся. Сама функция это программный блок, который может выполниться многократно в любом месте скрипта. Каждая функция обычно возвращает какое-либо значение. Функция может возвращать только целочисленное или логическое значение и строку. Вещественное значение функция возвратить не может. Но если, функция не требует возвращать какое-либо иное значение, то она должна возвращать логическое значение: «истина» (true) – эквивалентно 1 или «ложь» (false) эквивалентно 0. Функция состоит из имени функции, круглых скобок и фигурных скобок. Имя функции не чувствительно к регистру, как и у переменных. В круглых скобках указываются через запятую параметры функции. Число параметров функции может быть разное и может быть даже совсем без параметров. Return отвечает за возврат значения функции. Пример стандартной функции приведен ниже:
Обычная функция, как например, на вышеуказанном примере, если выполнила свои задачи правильно и до конца, должна возвратить true «истина». Обратите внимание, что SetGameModeText то же функция и с параметром, указанным в скобках. Эта функция передает параметр, то есть текст, указанный в скобках в клиент сервера. Если вы запустите сервер, а затем клиент. В окне клиента, если там добавлен ваш сервер, вы увидите в колонке «mode» вашего сервера, этот текст.
Также можно создать свою функцию. Функция в таком случае будет называться пользовательской функцией. Создадим простейшую функцию, но перед тем как ее создать, ее сначала нужно объявить следующим образом. Пишем forward, затем через пробел имя функции и в круглых скобках параметры функции, если они не нужны, ничего не пишем, оставляем пустые скобки. Объявление нашей простейшей функции будет выглядеть следующим образом
forward SayHello();
Объявление функции должно быть обязательно перед самой функцией. Теперь можно приступать к созданию функции.
Print – отображает текст в консоли сервера. Это функция не будет работать, до тех пор, пока ее не вызовешь. Чтобы ее вызвать, нужно написать имя функции и в скобках ее параметры.
SayHelle();
Давайте проверим наш пример в действии. Вызовем функцию из функции OnGameModeInit. Для этого вышеуказанный код помещаем в тело данной функции как показано на примере ниже:
Теперь скомпилируем мод и запустим сервер. И в консоли мы увидим текст «Hello, world». Итак, переделаем наш пример и создадим функцию Say с параметром. Назовем этот параметр string. Мы будем передавать в функцию строку. Строка – это массив, поэтому к имени параметра приписываем справа пустые квадратные скобки, как показано на примере ниже:
Теперь, чтобы вызвать функцию, и передать тот же текст в консоль, пишем следующее:
SayHello("Hello, World");
Так как тело функции состоит из одной строки, эту функцию можно уместить в одну строку, как показано на примере ниже. Но, если функция будет состоять более чем из 1 строки, то фигурные скобки придется вернуть.
public Say(string[])return print(string);
Если мы хотим передать какое-либо число в функцию, мы пишем просто имя параметра, если вещественное число, то приписываем к имени параметра, впереди приставку Float:, если логическое, то приставка bool:, в общем, все как у переменных:
STOCK
Создавать функцию через stock гораздо удобнее, так как это аналогичная функция, за исключением того, что ее не нужно объявлять через forward и ее желательно использовать, если за функцией не закреплен таймер. Ну и напоследок, функции создаются для того, чтобы не повторять часто используемые фрагменты кода при выполнении скрипта в разных местах. Гораздо удобнее поместить код в функцию и вызывать из любого места. А если этот код нужно переделать, тогда это существенный плюс функции, так как не приходится переделывать код в разных местах, когда он есть уже в функции.
И напоследок, наверняка просматривая стандартные функции в инклуде a_player.inc вы увидели такую в некоторых функциях перед именем параметра стоит символ – «&». Если мы передаем в функцию переменную, то передается не сама функция, а ее копия. По выполнению задачи функция не изменяет значение переменной, которую мы передали в функцию. Рассмотрим отличие такого способа передачи параметров.
У нас есть простейшая функция и у нас есть переменная, давайте вызовем ее в функции OnGameModeInit, чтобы посмотреть результат в консоли сервера. Но сначала, скопируйте строку 5 вышеуказанного примера после строки с вызовом функции, но измените второй параметр val на имя созданной переменной, чтоб видеть как изменится ее значение.
И вот что мы увидим. Две цифры в столбик: 1480 и 1234. Из этого видно, что результат функции мы увидели 1234+246=1480, а вот из второй цифры видно, что значение созданной переменной не изменелось, так как без знака & мы передаем в фунцию, только копию данной переменной, а не саму переменную. Вот в итоге мы и получаем такой результат. Давайте теперь подставим данный символ перед именем параметра, чтобы было так:
В результате увидим две цифры: 1480 и 1480, что значит, что наша переменная изменила значение. Также можно поступить и с переменными вещественного и логического типа. Если вы передаете строку, то здесь символ & не требуется, поскольку передается именно строка а не ее копия.
На этом 2 урок окончен!