Скриптер
Проверенный
Пользователь
- Сообщения
- 3,582
- Реакции
- 1,571
- Помог
- 137 раз(а)
Итак, наконец у меня дошли руки создать данную тему.
Предпосылки к созданию: Ищу "наставника" по amxx
Краткое описание: в этой теме я буду задавать интересующие меня вопросы по скриптингу, а после получения ответа, (если Sonyx немного поможет мне с таймингом редактирования поста) ответы будут размещаться здесь, в шапке темы, по виду:
Q: Вопрос
A: (автор ответа) Ответ
Для того, чтобы у новичков была возможность быстро прочитать все нюансы, не перерывая тему.
Итак, мой первый вопрос: какое меню лучше? Которое создается через
/* Начало F.A.Q. */
Предпосылки к созданию: Ищу "наставника" по amxx
Краткое описание: в этой теме я буду задавать интересующие меня вопросы по скриптингу, а после получения ответа, (если Sonyx немного поможет мне с таймингом редактирования поста) ответы будут размещаться здесь, в шапке темы, по виду:
Q: Вопрос
A: (автор ответа) Ответ
Для того, чтобы у новичков была возможность быстро прочитать все нюансы, не перерывая тему.
Итак, мой первый вопрос: какое меню лучше? Которое создается через
menu_create
(я так понял, это т.н. "новое" меню?), или через register_menu
? Попрошу дать развернутый ответ, почему то или иное меню лучше./* Начало F.A.Q. */
- Q: Какое меню лучше? "Старое" или "новое"?
- A: BlackSignature, gyxoBka: Это зависит от требуемых задач. Зачастую "новое" меню не может выполнить те задачи, которые может выполнить "старое", но иногда всё-же наоборот, удобнее использовать "новое" меню.
- Q: В чём разница между
static
иnew const
? - A: BlackSignature: const делает переменную/массив read-only, т.е. можно читать, но нельзя изменять.
static создаёт переменную при первом обращении в функции, и после завершения функции переменная не удаляется, т.е. сохраняет своё текущее значение.
1) В очень часто вызываемых функциях (каллбеки пофреймовых хуков вроде PreThink, AddToFullPack и т.п.) позволяет сэкономить процессорное время на создании переменных/массивов. Особенно актуально для последних (чем они больше, тем больше выигрыш).
2) Сохранение значения в локальных масштабах (в пределах функции).
- Q; Что такое
#pragma
, и какие они бывают? - A; wopox1337: это директивы препроцессора. Диктуют компилятору условия.
- Q:
ShowSyncHudMsg()
работает только внутри одного плагина, или синхронизирует весь худ со всеми плагинами, где он есть? - A: fantom: Всех. Ибо HUD имеет всего 4 канала. Вся работа SyncHud заключается в том, чтобы запомнить последний канал по которому было отправлено sync сообщение, и его же использовать при следующей отправке сообщения. Таким образом у вас не получится наложения предыдущего HUD на текущий. Ведь предыдущий будет заменен.
При этом последний аргумент вset_hudmessage()
можно не указывать. - Дополнение от w0w: Если в разных плагинах использовать
CreateHudSyncObj()
то при выводе худов из разных плагинов будет накладываться. Таким образом, необходимо передавать объект SyncHud'a в другие плагины с худом.
- Q: Нужно ли использовать
ClearSyncHud()
всякий раз передShowSyncHudMsg()
? - A: Ayk: Нет, не нужно. Суть синка в том чтобы не было наложений, значит предварительная очистка подразумевается.
- Q: Что за операторы
+=
и-=
? В чем их отличие от + и - ? - A: the_hunter: допустим, у тебя есть переменная
new variable = 5;
. Тебе нужно добавить какое-то значение к этой переменной. Как это сделать? Можно вот так:variable = variable + 10;
. Но оператор += позволяет сократить код который выше, до такого:variable += 10;
.
То есть, += это синтаксический "сахар", который позволяет сократить код.
- Q: За что отвечает
pev_gaitsecuence
? - A: Garey: за текущую анимацию нижней части модели игрока (для прыжков, бега, приседания и т.д.) на обычных энтитях не проигрывается и за чего криво анимации игрока выставляются при проигрывании.
- Q: Какие лимиты по кол-ву символов у HUD/DHUD?
- A: BalbuR: У обычного HUD 512, у DHUD 128.
- Q: Чем отличаются
ewrite_byte
(и другие функции для работы с мессагами) от обычных, без е? - A: Ayk: Отправка месаг с "е" вызывает хуки этих месаг.
- Q: В чем различие между записями
new const SOME_CONSTANT
иconst SOME_CONSTATNT?
- A: the_hunter:
const
- это константа, значение будет известно компилятору (compile-time).new const
это константная переменная, которая будет создана во время работы плагина (run-time) и заранее компилятору не известно ее значение.
Ключевое слово const в данном случае, говорит что этой переменной можно присвоить значение только 1 раз.
- Q: Для чего у хуков есть функция Disable? И в каких случаях её стоит применять? Например,
DisableHookChain
. - A: fantom: Больше всего времени тратится на вызовы между C++ частью AMXX и Pawn. Допустим, у вас есть хук который часто вызывается. И есть момент только один в котором вам нужно например заблокировать вызов этого хука. Если делать без disable, то вам в хуке придется все время проверять ваше событие это или нет (например глобальная булевая переменная). Если вы просто отключите хук когда он вам не нужен и просто включите когда нужен, то это в некоторых случаях может существенно скажется на оптимизации плагина? Но стоит понимать: не всегда и везде подобное стоит применять. Есть моменты когда вы получите совсем обратный эффект.
shadow: Например, тебе нужно будет выдать приз игроку первому, кто набрал 15 фрагов. Ты хукаешь событие Killed и сверяешь там количество фрагов убийцы и с необходимым количеством фрагов для выдачи приза. По достижении этого количества выдается приз. Все. Дальше необходимость в этом хуке отпадает. Тут мы и используем DisableHookChain.
- Q: Где можно посмотреть список всех предопределённых сообщений для
client_printex()
? - A: Ayk, fl0wer:
cstrike/titles.txt
илиcstrike/resource/cstrike_english.txt
- Q: Как убрать квары, которые уже были зарегистрированы на сервере?
- A: the_hunter: Отключить плагин, полностью перезагрузить сервер.
- Q: Как можно пропустить итерацию цикла, при проверке во вложенном в него ещё одном цикле?
- A: malniata: создать отдельную булевую функцию и вложить туда второй цикл, в первом же делать проверку на верно/неверно.
- A: Mistrick: Код-пример
- A: Ну и ещё один вариант, который я изначально пытался использовать, но у меня было неверное условие - это использование
goto
. Пример.
Последнее редактирование: