Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Разбор выражаний и их значения в коде (как 2+2 только SP)
Разбор выражаний и их значения в коде
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
Сообщений: 944
Репутация: 132 [ +/- ]
Приветствую.
Цитата 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
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Разбор выражаний и их значения в коде (как 2+2 только SP)
Страница 1 из 11
Поиск: