Определение Stock:
Stock - Маркер компилятора, указывающий компилятору на исключение кода функции из конечного amx файла, если функция не используется в коде скрипта.
Иными словами код функции или переменные, созданные с использованием маркера "stock", не будут включены в скомпилированную версию мода, если они не будут использованы в моде.
Если же создать функцию/переменную с использованием других маркеров, компилятор включит их в финальную версию, сигнализирует о их бесполезности и AMX машина (сервер) выделит для них память
Способы применения Stock:
1. Переменные:
new
Целочисленный тип
Вещественный тип
Строка
Одномерный массив
Двумерный массив
stock
Целочисленный тип
Вещественный тип
Строка
Одномерный массив
Двумерный массив
Использование переменных в stock точно такое же, как и использование переменных в new. В чём же различие, спросите Вы?
А различие именно в том, что stock не регистрируется в памяти сервера. То есть, если переменная объявлена через stock, но в коде она нигде не используется, компилятор автоматически удалит её при компиляции (имеется ввиду то, что в .amx варианте вашего кода этой переменной не будет). Следовательно лишней памяти сервер не будет выделять для этой переменной. Данное правило распространяется и на функции, так что запоминаем сразу (ниже упоминаний об этом не будет).
Но стоит помнить, что Вы никак не узнаете, используется переменная или нет, без ручного поиска кода, в котором используется эта переменная. Ибо, в случае с stock, при компилировании данная ошибка отображаться не будет:
warning 204: symbol is assigned a value that is never used: "%s"
2. Функции:
С помощью stock Вы можете единственный раз написать определённый код и после вызывать его всего лишь написав код вызова stock. Но и не только. С помощью stock Вы можете сильно облегчить свою жизнь при написании различных сложных функций :) И ниже я попробую привести несколько примеров кода для того, чтобы Вы поняли о чём я говорю.
Создание stock:
Новый stock создаётся вне других функций (public/stock). То есть, точно так же, как и public, но без forward.
Пример создания stock:
Где:
StockName - название нашего stock
arguments - название аргументов, в которые будет помещена информация для обработки. Названия могут быть любыми, как и в случае с переменными. Про ограничение на количество этих аргументов в одном stock мне не известно. Если Вы об это что-то знаете, просьба отписаться с предоставлением каких-либо доказательств. Но уж точно не менее 8 аргументов использовать можно.
Пример использования stock:
Допустим, у нас есть диалог, который мы используем в нескольких участках кода (одинаковый). Чтобы каждый раз не писать его, мы можем создать stock с ним
Примечание: Хоть для отображения диалога требуется аргумент "playerid", в stock мы указали имя аргумента "id". Поэтому в ShowPlayerDialog мы должны указать именно "id", а уже при вызове stock мы присвоим значение аргументу "id" значение аргумента "playerid".
Обратите внимание, что "id", при создании stock, я написал лишь для того, чтобы Вы поняли, что имя аргумента может быть любое. Вы можете сразу написать "playerid" и в ShowPlayerDialog использовать "playerid". А можете написать "Deimos_noob" и так же использовать в диалоге уже "Deimos_noob". Главное не забывайте менять название аргумента в нативных функциях (кликабельно) внутри stock на такое, какое Вы указали при создании stock (примером является "id" в создании stock и "playerid" в ShowPlayerDialog). Но менять название нужно именно в тех аргументах, значение которых Вы будете "доставлять" в код, находящийся в stock, при вызове этого stock. В этом примере это был "palyerid" и ниже Вы это увидите
Ну и создадим команду для отображения этого диалога
Ну и при коннекте игрока вызовем диалог
А теперь попробуем создать команду для передачи денег от одного игрока к другому с помощью stock. Сначала создадим stock с тремя аргументами, в которые запишем ID обоих игроков и сумму передачи денег
И теперь создадим команду, в которой и присвоим нужные значения для аргументов stock
Код, требуемый для правильной работы strtok
"playerid" хранит значение ID игрока, который ввёл команду и передаст это значение аргументу "player1" из нашего stock
"giveplayerid" имеет значение ID игрока, которому надо передать деньги и передаст это значение аргументу "player2" из нашего stock
"pmoney" имеет значение суммы денег для передачи и передаст это значение аргументу "money" из нашего stock
Если кто-то не понял то, как я определил это всё, объясню по другому. Ниже будет предоставлен сам stock (таким, каким мы его создали) и способ вызова этого stock. Одинаковым цветом я выделю те аргументы, значения которых передаются от вызова stock к самому stock
stock PlayerMoneyToPlayer(player1, player2, money)
PlayerMoneyToPlayer(playerid, giveplayerid, pmoney);
То есть, аргументы отделяют друг от друга запятыми. Следовательно, при вызове stock, нам нужно расположить аргументы с данными в таком порядке, чтобы нужные данные присвоились нужному аргументу в stock
В данном примере я покажу вам как передать определённый текст с помощью stock на примере команды личных сообщений. Данный stock будет содержать уже аж 5 аргументов, два из которых будут содержать ники игроков, два будут содержать ID и один будет содержать текст. Да, с помощью strok можно и такое
Ну и теперь сама команда
Этот код нужно вставлять в самое начало паблика OnPlayerCommandText, если его нет. Без него функция srtok работать не будет
Типы данных для аргументов:
1. Вещественный (дробное число)
"Float:arguments"
2. Логический (bool. То есть true/false)
"bool:arguments"
3. Целочисленный (целые числа)
"arguments"
4. Строковый (символы, то бишь текст)
"arguments[]"
Примечание: Повторюсь, все типы данных работают так же, как и у переменных. Следовательно, использовать их нужно без аргументов ("Float","[]"."bool:"). Пример имеется в примере 3 (извиняюсь за тавтологию).
Прочие виды аргументов:
Ссылка (&):
Данный вид возвращает значения аргумента, получившиеся после выполнения кода функции. (аналогично "return")
"&arguments"
Автор: DeimoS
Сообщение отредактировал Dmitriy_Orell: 15 Июнь 2015 - 18:46



Сообщений: 922
Регистрация:

