| 
 
 
	
		
		
			| Разбор выражаний и их значения в коде |  |  |  | 
| 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 |  |  |  |  |  
 |