Разбор выражаний и их значения в коде
| |
4ELOCE4EK
|
Дата: Среда, 02.03.2016, 09:53:10 | Сообщение # 1 |
|
Сообщений: 1
Репутация: 0 [ +/- ]
|
|
Доброго времени суток, Дамы и Господа.
Я понимаю как "строить" код, его принцип, его логику. Будто передо мной предложение на Испанском и я знаю почему тут именно так расставлены слова, а не иначе, но я не понимаю значения этих слов.
Вот пример из темы: http://world-source.ru/forum/100-2253-1
#include <sourcemod> // Что использовать для плагина
public OnPluginStart() // При старте работы плагина выполнять код ниже { HookEvent("round_start", round_start); // Взять событие "Начало раунда", не понятно, почему оно дублировано без ковычек, для чего? Дублирование без ковычек просто говорит коду что Round_start отсылается к этой строчке, то-есть, начало раунда? }
public round_start(Handle:event, const String:name[], bool:dontBroadcast) // Вот тут вообще для меня иероглифы, понятия не имею что тут написано, а главное, для чего. { PrintToChatAll("timelimit = %d", GetEventInt(event, "timelimit")); // Тут уже понятней, не понимаю зачем нужна строчка выше если тут написано как реагировать коду на событие. Написать в Алл чат, тут я понял что написано. Написать в общий чат: Лимит карты целым числом и где его получать и в какой форме. }
|
|
| |
BarD
|
Дата: Среда, 02.03.2016, 10:45:31 | Сообщение # 2 |
|
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
Приветствую.
Цитата 4ELOCE4EK ( ) HookEvent("round_start", round_start); // Взять событие "Начало раунда", не понятно, почему оно дублировано без ковычек, для чего? Дублирование без ковычек просто говорит коду что Round_start отсылается к этой строчке, то-есть, начало раунда? Дублирование не обязательно. round_start (без кавычек) - это имя блока, который будет вызываться при активации этого события (т.е. начало каждого раунда). Имя может быть любым, но название нужно изменять и в блоке, который будет вызываться.
Цитата 4ELOCE4EK ( ) public round_start(Handle:event, const String:name[], bool:dontBroadcast) Разберем по полочкам.
Цитата public - означает, что это событие round_start - имя блока, которое мы писали в начале. Может быть любым, но обязательно должно совпадать с тем, что мы пишем при хуке (HookEvent). Чтобы события понимало, код из какого блока нужно выполнять при каждой активации.
Handle:event - Хэндл переменная события (его структура). Нужно, чтобы вытаскивать всякие данные из события. Например, GetEventInt(event, "timelimit"); вытаскивает значение врмени раунда (вроде бы, это). Список событий и того, что из них можно вытащить, посмотрите здесь: https://wiki.alliedmods.net/Game_Events_(Source)
const String:name[] - строка, в которой записано имя события ("round_start", "player_death", "player_spawn" и др.). Например, нам нужно захукать 3 события: "player_death", "player_spawn" и "round_start". И хотим так, чтобы все 3 события вызывались в одном блоке.
Код public OnPluginStart() { HookEvent("player_spawn", EventCallback); HookEvent("player_death", EventCallback); HookEvent("round_start", EventCallback); }
//И теперь нам надо как-то разделить эти три события в одном блоке. Тут и помогает const String:name[]. public EventCallback(Handle:event, const String:name[], bool:dontBroadcast) { if (StrEqual(name, "player_death")) { //код для player_death } else if (StrEqual(name, "player_spawn")) { //код для player_spawn } else if (StrEqual(name, "round_start")) { //код для round_start } }
Применяется это редко, но все же.
Цитата bool:dontBroadcast - переменная скрытности события. Поменяв ее значение, можно скрыть показ этого события. Например, так скрывают отображение убийств в правом верхнем углу или сообщения о заходе/выходе игрока.
Существует несколько функций получения информации из события. Смотря, что нужно. Ниже несколько примеров получения разных типов данных.
Цитата new value = GetEventInt(event, "dmg_health"); - получает количество нанесенного урона игроку (не включая броню). Используется в событии "player_hurt".
new Float:x = GetEventFloat(event, "x"); - получает X-координату взрыва гранаты в событиях, связанных со взрывом гранат. (hegrenade_detonate, flashbang_detonate и подобных).
new bool:headshot = GetEventBool(event, "headshot"); - получает значение хэдшота в player_death. true - хэдшот, false - нет.
new String:weapon_name[30]; GetEventString(event, "weapon", weapon_name, 30); - получает название оружия, из которого был убит игрок/нанесен урон игроку и записывает его в переменную weapon_name.
Список всех событий и переменных можешь посмотреть по ссылке, которую я дал выше.
На самом деле, называть переменные в шапке события можно, как угодно. Но важно не забывать их так же называть при использовании. Например:
Код public EventCallback(Handle:e, const String:n[], bool:db) { PrintToChatAll("timelimit = %d", GetEventInt(e, "timelimit")); }
Надеюсь, было полезно. Удачи!
Сообщение отредактировал BarD - Среда, 02.03.2016, 10:50:06 |
|
| |
GodlikE145
|
Дата: Среда, 02.03.2016, 11:21:08 | Сообщение # 3 |
|
Сообщений: 33
Репутация: 9 [ +/- ]
|
|
Могу дополнить немного про #include<>.
#include<> - это подключение библиотек, в которых лежат функции, которые вы используете в плагине. Существует 4 основных инклуда:
1) #include<sourcemod> - В этой библиотеке "sourcemod" хранятся все основные функции и все эвенты, которые вы используете. Например, "round_start". Функции, связанные с эвентами (GetEventInt и т.п.), тоже лежат в этой библиотеке.
2) #include<sdktools> - Здесь лежат все функции для работы с "энтити" - объектами в игре. Например, вы можете получить позицию игрока функцией "GetClientAbsOrigin", и эта функция находится в библиотеке "sdktools". Также вы можете создавать свои энтити, но советую заняться этим через месяц-другой, когда ознакомитесь с азами.
3) #include<sdkhooks> - Тут хранятся хуки для эвентов, связанных с энтити. Например, вы можете отловить событие, когда игрок касается какого-нибудь предмета, использовав (SDKHook_StartTouch). Советую пока что не использовать эти хуки, т.к это расширение возможностей не нужно для простых плагинов.
4) #include<cstrike> - В этой библиотеке хранятся некоторые события и функции, связанные с игровой механикой, например, "CS_RespawnPlayer" (возрождает игрока) или "CS_OnBuyCommand" (событие, когда игрок закупается).
Список всех функций и событий по библиотекам, вместе с описанием, есть на этом сайте --> https://sm.alliedmods.net/api/
Вы можете подключить все 4 библиотеки, чтобы наверняка, и использовать только одну из них. Компиллятор не посчитает это за ошибку, и вам будет спокойнее. Впоследствии вы поймете, какие функции из каких библиотек берутся. Все функции и события, хранящиеся в этих библиотеках, вы можете посмотреть, открыв их в текстовом редакторе (addons/sourcemod/scripting/include/). Чтобы узнать, какие функции вам нужны, советую гуглить по этому сайту.
===========================Урок "Как гуглить по определенному сайту"============================ 1) Открываем Гугл или Яндекс. 2) Вводим запрос, например "Урон от падения site:world-source.ru". Приписка "site:world-source.ru" будет сортировать запросы ТОЛЬКО по этому сайту. 3) Радуемся. =================================================================================
Сообщение отредактировал GodlikE145 - Четверг, 03.03.2016, 12:39:26 |
|
| |
|