BenjaminPaul
Code is poetry
- Сообщения
- 177
- Реакции
- 220
Привет всем, я Neatek.
Видео версия.
Что нужно для скриптинга?
http://dl.notepad-plus-plus.org/downloads/6.x/6.7.4/npp.6.7.4.Installer.exe
https://sm.alliedmods.net/dl.php?filename=sourcemod-1.7.0-windows.zip
Добавить закладку в браузер:
https://sm.alliedmods.net/new-api/
Как начать?
Установите Notepad++, разорхивируйте папку scripting из архива sourcemod1.7.0
откройте папку scripting, создайте файл Plugin.sp (именно .sp, а не .sp.txt)
Что дальше?
Весь скриптинг начинается с типов переменных.
В нашем случае это:
Это 3 самых основных типа.
int - Целочисленные. Обычные строчки.
char - Строковые.
bool - Булева алгебра. (true и false, правда или ложь)
Как создавать переменные?
Синтаксис -> [тип] [название][размер];
итого создаем 3 типа переменных:
по умолчанию int = 0, bool = false, ну и пустая строка.
Логический оператор if
синтаксис простой.
пишем это нормальным языком
Как управлять строками, числами и булевой переменной?
с числами все легко:
И так далее как вам угодно с числами(int).
теперь давайте с булевыми переменными.
Если честно, для простого понимания...
true = 1
false = 0
т.е. это как бы та же целочисленная, но оно быстрее выполняется, за счет быстрого нахождения в памяти устройства, поэтому и выделили отдельный тип bool, 0 или 1.
а для программистов проще писать true или false, дабы не путаться.
Как сравнивать char(строчки)?
Ну тут есть уже встроенные функции.
https://sm.alliedmods.net/new-api/string/StrEqual
https://sm.alliedmods.net/new-api/string/strcmp
почитать о них можете по ссылкам.
пример:
теперь рассмотрим параметры и возвращаемое значение функции StrEqual.
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
жирным текстом я буду выделять то, о чем идет речь.
значит первое значение перед функцией - это возвращаемое значение.
в нашем случае bool. оно будет возвращать true или false.
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
название самой функции
StrEqual(char[] str1, char[] str2, bool caseSensitive)
параметры функции
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
рассмотрим первый параметр функции StrEqual.
char[] str1.
Это строковая переменная, значит первый агрумент принимает только строчки.
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
Это чувствителен или нет к регистру.
Подробнее здесь.
Цикл for.
самый распространенный и простой для понимания.
можно выполнять определенные действия несколько раз.
Рассмотрим for(int i = 0; i <= 10; i++)
for(int i = 0; i <= 10; i++)
название цикла.
for(int i = 0; i <= 10; i++)
создаем переменную i, со значением 0 для цикла.
for(int i = 0; i <= 10; i++)
это условие. если i меньше или равно 10, то будет выполняться i++
for(int i = 0; i <= 10; i++)
выполняемое действие, если условие проходит.
по сути i++ равноценно i = i + 1;
то есть переменная сама к себе прибавляет +1.
есть еще i-- и.т.д я в них особо не вникал.
События Sourcemod.
основы типо мы якобы поняли, как создавать переменные, как делать условия, как делать цикл for.
Итак, давайте-ка зарегистрируем событие.
Событие это момент времени в который происходит определенное действие.
Начнём мы с простого события - если игрок умирает.
заходим на https://wiki.alliedmods.net/Game_Events_(Source)
нас интересует Counter-Strike: Source, жмакаем по ней.
https://wiki.alliedmods.net/Counter-Strike:_Source_Events
жмем на Player_death.
https://wiki.alliedmods.net/Counter-Strike:_Source_Events#player_death
после анализа того, что мы можем получить хукируем событие (регистрируем).
https://sm.alliedmods.net/new-api/events/HookEvent
void HookEvent(char[] name, EventHook callback, EventHookMode mode)
void - функция нихера не возвратит.
char[] name - название события, в нашем случае player_death
EventHook callback - Коллбэк для функции, ну это функция для функции... типо событие произошло, делаем это. вот так по простому по пацански определил вам.
EventHookMode mode - хук мод, он отвечает возвращать значения или нет, или когда делать событие до происхождения события или после. Кароче тупо не указывайте, вы же нупки.
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
название действия.
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
хэндл события, из него вытаскиваем инфу о событии.
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
ваще не знаю чо это, но наверное название события... типо можно сделать дохера хуков в один коллбэк, и потом определять чо же вам пришло...
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
отображать событие или нет, этим можно отключать в чате сообщения когда человек заходи на сервер, или изменение переменной сервера, забейте кароч.
int client = GetClientOfUserId(GetEventInt(event, "userid"));
создали переменную client
int client = GetClientOfUserId(GetEventInt(event, "userid"));
Выдирание значений из событий
https://sm.alliedmods.net/new-api/events/GetEventInt
функция GetEventInt, выдирает значение из события, мы о них уже говорили о значениях, когда разбирали само событие.
на данной странице:
https://wiki.alliedmods.net/Counter-Strike:_Source_Events#player_death
GetEventInt типо получаем целочисленное значение из события...
еще существуют GetEventBool, GetEventString.
урезанную табличку скинул, которая была ранее.
видим GetEventInt(event, "userid") и в таблице есть userid, только там short.
short то же самое что и integer (int), только малого размера, но мы его берем как Integer. мы получим userid игрока который здох. (номер игрока).
Что же еще можно взять из события?
Оружие! Почему бы и нет?
смотрим на https://sm.alliedmods.net/new-api/events/GetEventString
void GetEventString(Handle event, char[] key, char[] value, int maxlength, char[] defvalue)
handle event (1) -> хэндл евента
char[] key -> название чего извлекать, в нашем случае weapon
char[] value -> куда извлекать будем, в нашем случае создадим переменную char gWeapon
int maxlength -> размер того, куда записываем, тупо пишем sizeof(gWeapon)
char defvalue[] -> по умолчанию значение, тупо не указываем.
можно также писать так:
hEvent.GetString(char[] key, char[] value, int maxlength);
hEvent. -> хэндл события, этакий класс. к которому можно обращаться.
остальное тоже самое что и выше.
Вот получили оружие!
то же самое и с userid, только там значение типо userid игрока(номер игрока).
int client = GetClientOfUserId(GetEventInt(event, "userid"));
разобрали.
int client = GetClientOfUserId(GetEventInt(event, "userid"));
GetEventInt(event, "userid") функция берет значение игрока (userid)
GetEventInt(event, "userid") = userid
GetClientOfUserId(userid) = номер клиента, по userid.
суть: на сервере когда играет игрок он получает номер игрока, он может быть 50 или 346 и так далее... функция GetClientOfUserId как бы делает стандарт для всех игроков. Если на сервере 10 игроков, то и номеров клиента будет 10 штук. без всяких 50 или 346... Тем самым делая легче "проход" по игрокам с помощью цикла.
int client = значение получило клиента...
теперь мы можем его кикнуть!
https://sm.alliedmods.net/new-api/clients/KickClient
int KickClient(int client, char[] format, any ...)
как я вас учил, анализируйте...
возвращает int(integer), параметры -> клиент, и char[] format(текст, строка)...
any... любое значение...
мы можем написать даже так.
я бы объяснил почему %d %s %i %f ... и так далее, но это долго и геморно.
Писал сразу на форум, монотонно, без проверки знаний или еще чего...
просто сел и по быстрому написал. код возможно не рабочий, не проверял.
устал. пальцы вверх кому понравилось, может еще накатаю.
пишите про что бы вы хотели узнать.
Видео версия.
Что нужно для скриптинга?
http://dl.notepad-plus-plus.org/downloads/6.x/6.7.4/npp.6.7.4.Installer.exe
https://sm.alliedmods.net/dl.php?filename=sourcemod-1.7.0-windows.zip
Добавить закладку в браузер:
https://sm.alliedmods.net/new-api/
Как начать?
Установите Notepad++, разорхивируйте папку scripting из архива sourcemod1.7.0
откройте папку scripting, создайте файл Plugin.sp (именно .sp, а не .sp.txt)
Что дальше?
Весь скриптинг начинается с типов переменных.
В нашем случае это:
PHP:
int
bool
char
Это 3 самых основных типа.
int - Целочисленные. Обычные строчки.
char - Строковые.
bool - Булева алгебра. (true и false, правда или ложь)
Как создавать переменные?
Синтаксис -> [тип] [название][размер];
итого создаем 3 типа переменных:
PHP:
#include <sourcemod>
int Chislo;
char Stroka[86];
bool Pravda;
по умолчанию int = 0, bool = false, ну и пустая строка.
Логический оператор if
синтаксис простой.
C-подобный:
если(то-то то... выполняет условия) { то мы делаем это }
иначе { петя идёт ****}
PHP:
if(0 > 1) { /* это никогда не произойдет потому что 0 меньше 1 */ }
else { /* петя в любом случае идёт *****/ }
Как управлять строками, числами и булевой переменной?
с числами все легко:
PHP:
if(Chislo > 0)
{ /* Число больше 0 */}
if(Chislo < 1)
{ /* Число меньше 1 */}
теперь давайте с булевыми переменными.
PHP:
if(Pravda == false) {
/* О круто! Pravda == false, значит кто-то лжёт. */
}
if(Pravda == true) {
/* О круто! Pravda == true, значит это правда. */
}
bool PravdaNet; // создали PravdaNet
PravdaNet = false; // Присвоили значение переменной PravdaNet = false (ложь/0)
if(Pravda == Pravda) {
// что-то там...
}
Если честно, для простого понимания...
true = 1
false = 0
т.е. это как бы та же целочисленная, но оно быстрее выполняется, за счет быстрого нахождения в памяти устройства, поэтому и выделили отдельный тип bool, 0 или 1.
а для программистов проще писать true или false, дабы не путаться.
Как сравнивать char(строчки)?
Ну тут есть уже встроенные функции.
https://sm.alliedmods.net/new-api/string/StrEqual
https://sm.alliedmods.net/new-api/string/strcmp
почитать о них можете по ссылкам.
пример:
PHP:
char stroka1[48];
char stroka2[48];
if(StrEqual(stroka1, stroka2)) {
// ура они равны!
}
else
{
// не чувак, ты не прав. они ***** не похожи...
}
теперь рассмотрим параметры и возвращаемое значение функции StrEqual.
PHP:
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
жирным текстом я буду выделять то, о чем идет речь.
значит первое значение перед функцией - это возвращаемое значение.
в нашем случае bool. оно будет возвращать true или false.
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
название самой функции
StrEqual(char[] str1, char[] str2, bool caseSensitive)
параметры функции
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
рассмотрим первый параметр функции StrEqual.
char[] str1.
Это строковая переменная, значит первый агрумент принимает только строчки.
bool StrEqual(char[] str1, char[] str2, bool caseSensitive)
Это чувствителен или нет к регистру.
Подробнее здесь.
Цикл for.
самый распространенный и простой для понимания.
можно выполнять определенные действия несколько раз.
PHP:
for(int i = 0; i <= 10; i++)
{
// делаем 10 раз действие
}
Рассмотрим for(int i = 0; i <= 10; i++)
for(int i = 0; i <= 10; i++)
название цикла.
for(int i = 0; i <= 10; i++)
создаем переменную i, со значением 0 для цикла.
for(int i = 0; i <= 10; i++)
это условие. если i меньше или равно 10, то будет выполняться i++
for(int i = 0; i <= 10; i++)
выполняемое действие, если условие проходит.
по сути i++ равноценно i = i + 1;
то есть переменная сама к себе прибавляет +1.
есть еще i-- и.т.д я в них особо не вникал.
События Sourcemod.
основы типо мы якобы поняли, как создавать переменные, как делать условия, как делать цикл for.
Итак, давайте-ка зарегистрируем событие.
Событие это момент времени в который происходит определенное действие.
Начнём мы с простого события - если игрок умирает.
заходим на https://wiki.alliedmods.net/Game_Events_(Source)
нас интересует Counter-Strike: Source, жмакаем по ней.
https://wiki.alliedmods.net/Counter-Strike:_Source_Events
жмем на Player_death.
https://wiki.alliedmods.net/Counter-Strike:_Source_Events#player_death
PHP:
player_death // название события
Note: When a client dies // когда происходит событие
Name: player_death // название события
Structure: // структура события, чо возвращается
short userid user ID who died // userID кто здох
short attacker user ID who killed // userID кто убил
string weapon weapon name killer used // оружие с которого убили, во внимание возмите STRING, строка будет возвращаться.
bool headshot singals a headshot // В голову или нет. Во внимание возьмите BOOL, булева переменная, Ложь или Правда - В кочан или нет. (true, false)
short dominated did killer dominate victim with this kill // а это х*ня какая-то. типо сдоминировал или нет, крч мне срать.
short revenge did killer get revenge on victim with this kill // тоже херня...
после анализа того, что мы можем получить хукируем событие (регистрируем).
https://sm.alliedmods.net/new-api/events/HookEvent
void HookEvent(char[] name, EventHook callback, EventHookMode mode)
void - функция нихера не возвратит.
char[] name - название события, в нашем случае player_death
EventHook callback - Коллбэк для функции, ну это функция для функции... типо событие произошло, делаем это. вот так по простому по пацански определил вам.
EventHookMode mode - хук мод, он отвечает возвращать значения или нет, или когда делать событие до происхождения события или после. Кароче тупо не указывайте, вы же нупки.
PHP:
#include <sourcemod>
public OnPluginStart() {
HookEvent("player_death", FUNCIAMATTVOY);
}
public Action FUNCIAMATTVOY(Event hEvent, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
char gWeapon[64];
hEvent.GetString("weapon", gWeapon, sizeof(gWeapon));
}
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
название действия.
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
хэндл события, из него вытаскиваем инфу о событии.
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
ваще не знаю чо это, но наверное название события... типо можно сделать дохера хуков в один коллбэк, и потом определять чо же вам пришло...
Action:FUNCIAMATTVOY(Handle:event, const String:name[], bool:dontBroadcast)
отображать событие или нет, этим можно отключать в чате сообщения когда человек заходи на сервер, или изменение переменной сервера, забейте кароч.
int client = GetClientOfUserId(GetEventInt(event, "userid"));
создали переменную client
int client = GetClientOfUserId(GetEventInt(event, "userid"));
Выдирание значений из событий
https://sm.alliedmods.net/new-api/events/GetEventInt
функция GetEventInt, выдирает значение из события, мы о них уже говорили о значениях, когда разбирали само событие.
на данной странице:
https://wiki.alliedmods.net/Counter-Strike:_Source_Events#player_death
GetEventInt типо получаем целочисленное значение из события...
еще существуют GetEventBool, GetEventString.
C-подобный:
Structure: // структура события, чо возвращается
short userid user ID who died // userID кто здох
short attacker user ID who killed // userID кто убил
string weapon weapon name killer used // оружие с которого убили
видим GetEventInt(event, "userid") и в таблице есть userid, только там short.
short то же самое что и integer (int), только малого размера, но мы его берем как Integer. мы получим userid игрока который здох. (номер игрока).
Что же еще можно взять из события?
C-подобный:
string weapon weapon name killer used // оружие с которого убили
смотрим на https://sm.alliedmods.net/new-api/events/GetEventString
void GetEventString(Handle event, char[] key, char[] value, int maxlength, char[] defvalue)
handle event (1) -> хэндл евента
char[] key -> название чего извлекать, в нашем случае weapon
char[] value -> куда извлекать будем, в нашем случае создадим переменную char gWeapon
int maxlength -> размер того, куда записываем, тупо пишем sizeof(gWeapon)
char defvalue[] -> по умолчанию значение, тупо не указываем.
можно также писать так:
hEvent.GetString(char[] key, char[] value, int maxlength);
hEvent. -> хэндл события, этакий класс. к которому можно обращаться.
остальное тоже самое что и выше.
PHP:
char gWeapon[64];
hEvent.GetString("weapon", gWeapon, sizeof(gWeapon));
Вот получили оружие!
то же самое и с userid, только там значение типо userid игрока(номер игрока).
int client = GetClientOfUserId(GetEventInt(event, "userid"));
разобрали.
int client = GetClientOfUserId(GetEventInt(event, "userid"));
GetEventInt(event, "userid") функция берет значение игрока (userid)
GetEventInt(event, "userid") = userid
GetClientOfUserId(userid) = номер клиента, по userid.
суть: на сервере когда играет игрок он получает номер игрока, он может быть 50 или 346 и так далее... функция GetClientOfUserId как бы делает стандарт для всех игроков. Если на сервере 10 игроков, то и номеров клиента будет 10 штук. без всяких 50 или 346... Тем самым делая легче "проход" по игрокам с помощью цикла.
int client = значение получило клиента...
теперь мы можем его кикнуть!
https://sm.alliedmods.net/new-api/clients/KickClient
PHP:
#include <sourcemod>
public OnPluginStart() {
HookEvent("player_death", FUNCIAMATTVOY);
}
public Action FUNCIAMATTVOY(Event hEvent, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
char gWeapon[64];
hEvent.GetString("weapon", gWeapon, sizeof(gWeapon));
KickClient(client, "Ты дно");
}
int KickClient(int client, char[] format, any ...)
как я вас учил, анализируйте...
возвращает int(integer), параметры -> клиент, и char[] format(текст, строка)...
any... любое значение...
мы можем написать даже так.
PHP:
#include <sourcemod>
public OnPluginStart() {
HookEvent("player_death", FUNCIAMATTVOY);
}
public Action FUNCIAMATTVOY(Event hEvent, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(hEvent.GetInt("userid"));
char gWeapon[64];
hEvent.GetString("weapon", gWeapon, sizeof(gWeapon));
KickClient(client, "Client номер: %d", client);
}
я бы объяснил почему %d %s %i %f ... и так далее, но это долго и геморно.
Писал сразу на форум, монотонно, без проверки знаний или еще чего...
просто сел и по быстрому написал. код возможно не рабочий, не проверял.
устал. пальцы вверх кому понравилось, может еще накатаю.
пишите про что бы вы хотели узнать.
Последнее редактирование: