Дата: Четверг, 04.08.2011, 19:20:38 | Сообщение # 1
Как Создать SourceMod Плагин
Скачайте SourceMod и куда-нибудь распакуйте папку addons/sourcemod/scripting В папке scripting вы увидите исходные файлы стандартных плагинов с расширением .sp Перетащив funcommands.sp на compile.exe, вы увидите похожее окно:
Если компилятор обнаружил в коде какие-либо ошибки, то он подробно сообщит о них в этом окне. Будет видно имя файла, номер строки, что именно за ошибка, её код и тд. Чтобы можно было копировать текст из окна, нажмите правой кнопкой мыши по верхней полосе окна, свойства, и там выделение мышью. Выделяете текст, нажимаете правую кнопку мыши и текст скопирован. В нашем случае никаких ошибок не было, .sp успешно скомпилирован и наш плагин лежит в scripting/compiled/funcommands.smx. Черное окно можно закрывать, оно уже не нужно. Теперь funcommands.smx достаточно переместить в addons/sourcemod/plugins и после включения сервера/смены карты он заработает.
Если переместить .smx файл в addons/sourcemod/plugins/disabled, то он не будет включаться. В папке plugins/ можно создавать свои папки и перемещать .smx файлы туда. Плагин (файл .smx) перезагружается после смены карты, если дата его последнего изменения не совпадает с прошлой. Чтобы немедленно перезагрузить/включить/отключить плагин, можно использовать RCON команды:
Код
sm plugins load x - вкл плагин (расширение .smx можно не указывать) sm plugins unload x - отключить sm plugins reload x - перезапустить (откл и сразу вкл) sm plugins list - список включенных плагинов
x - это имя .smx плагина, который находится в addons/sourcemod/plugins. Если x.smx лежит в plugins/my_folder/x.smx, то писать нужно sm plugins load my_folder/x
Создаём первый плагин:
1. Используйте текстовый редактор Notepad++ (скачать)
2. Создайте в папке scripting текстовый документ (.txt) и переименуйте его в x.sp, сменив расширение. Если вы не видите расширение .txt у вашего текстового файла, то гугл поможет -> "win 7 показывать расширения файлов".
3. Вставьте этот код:
Код
// UTF-8 (без BOM)
#pragma semicolon 1
#define HP_LIMIT 110
#include <sourcemod>
public OnPluginStart() { PrintToServer("SM скрипт включен!");
new x = 1; PrintToServer("x = %d", x); new y = 4 + x; PrintToServer("y = 4 + %d = %d", x, y);
new String:x_str[] = "CS:Source"; PrintToServer("x_str = \"%s\" | Символов в тексте: %d", x_str, strlen(x_str));
PrintToServer("Теперь пробуем цикл for"); for (new i = 1; i < 6; i++) { PrintToServer("i = %i", i); }
public player_jump(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); new hp = GetClientHealth(client); if (hp < HP_LIMIT) { SetEntityHealth(client, hp + 1); } else { PrintToChat(client, "Лимит: %d hp", HP_LIMIT); } }
4. Мы используем не только ASCII символы, поэтому преобразуйте кодировку в UTF-8 без BOM
5. Теперь скомпилируйте плагин. Перетаскиваем x.sp на compile.exe, открывшееся черное окно закрываем (ошибок же нет), и идём за x.smx в папку scripting/compiled. Включаем сервер, бросаем в addons/sourcemod/plugins наш x.smx и пишем в консоль сервера (rcon) sm plugins load x После чего в консоле сервера увидим результат:
Код
SM скрипт включен! x = 1 y = 4 + 1 = 5 x_str = "CS:Source" | Символов в тексте: 9 Теперь пробуем цикл for i = 1 i = 2 i = 3 i = 4 i = 5 Текущая карта: de_cbble Дата | Время: 25/05/2012 | 18:04 Слотов на сервере: 7
Зайдите на сервер и попрыгайте. После каждого прыжка вам будет добавлять 1 HP. А если у вас 110 HP или выше, то в чат напишет "Лимит: 110 hp"
-----
Вот ваш первый скрипт и работает. Теперь можете попробовать изменить его код на свой и проверить снова, т.к. важна практика.
В качестве отступов используйте TAB (это удобно), но внутри одной функции нельзя смешивать пробельные отступы и TAB (компилятору это не понравится). Можно довольно быстро изменить тип отступа, т.к. весь код функции можно сдвинуть влево, просто выделите нужный текст и нажмите shift + tab. Ну и конечно же нужно пользоваться ctrl + c (копировать), ctrl + v (вставить), ctrl + z (отменить), ctrl + y (повторить), ctrl + f (поиск).
В разных библиотеках разные функции и чтобы иметь доступ к определенной функции, нужно подключить соответствующую библиотеку. Все они находятся в addons/sourcemod/scripting/include (файлы с расширением .inc). Как узнать какие библиотеки подключать: об этом есть отдельный урок.
Советую сначала тестировать различные варианты кода в событии OnPluginStart(). Внутри используйте PrintToServer для вывода данных в консоль сервера - так вы сможете узнать что чему равно и когда было выполнено, и заходить в игру не надо.
Дата: Пятница, 13.07.2012, 15:08:02 | Сообщение # 2
Если у вас нет доступа к консолю сервера (RCON), то установите программу HLSW. Добавьте свой сервер в список, внизу перейдите в раздел Rcon Config и введите RCON пароль. Если пароль введен верно, переходите в раздел Консоль и запускайте плагин командой: sm plugins load x
Всем здравствуйте , я тут используя ваш код изменил его и хочу добавить сообщение игроку в чате , но не получается . Собщение не выводится (((( Не подскажете где ошибка ???
public PlaerDeath(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "attacker")); new hp = GetClientHealth(client); if (hp < 150) SetEntProp(client, Prop_Send, "m_iHealth", hp + 5); { PrintToChat("%t","Вы получили +5 HP"); } }
Дата: Пятница, 31.10.2014, 08:15:26 | Сообщение # 4
Код
public PlaerDeath(Handle:event, const String:name[], bool:dontBroadcast) { new id = GetEventInt(event, "attacker"); if (id != GetEventInt(event, "userid") && (id = GetClientOfUserId(id)) > 0 && IsPlayerAlive(id)) { new hp = GetClientHealth(id); if (hp < 150) { SetEntProp(id, Prop_Send, "m_iHealth", hp + 5); PrintToChat(id, "Вы получили +5 HP"); } } }
public OnPluginStart() { RegAdminCmd("sm_hp", CMD_TakeHP, ADMFLAG_GENERIC); //Регистрируем комманду для Админов с флагом "а" }
public Action:CMD_TakeHP(client, args) { //Начинаем отсеивать несоответствие введенных данных if (client < 1 || !IsClientInGame(client)) return Plugin_Handled; //Если индекс Админа меньше 1 (ошибка) или он не в игре, то сброс
if (args != 2) //Если он ввел недостаточное или избыточное количество данных, то сброс { PrintToChat(client, "Используйте sm_hp <id> <количество>!"); return Plugin_Handled; }
decl String:s_arg[5]; //Если все нормально, то создаем переменную для передачи наших данных GetCmdArg(1, s_arg, sizeof(s_arg)); //Получаем первый аргумент (Индекс игрока, которому надо дать ХП)
new target = StringToInt(s_arg); //Переводим строку в число, чтобы с ним уже работать
if (target < 1 || !IsClientInGame(target) || !IsPlayerAlive(target)) //Если индекс игрока некорректный, игрок мертв или не в игре { PrintToChat(client, "Игрока с таким индексом не существует, или он мертв!"); return Plugin_Handled; //То сброс }
GetCmdArg(2, s_arg, sizeof(s_arg));//Если все норм, то получаем второй аргумент (количество ХП)
new hp = StringToInt(s_arg); // Переводим строку в число, чтоб давать ХП
if (hp > 0) //Если введенное число больше 0 { SetEntityHealth(target, GetClientHealth(target)+hp); //Прибавляем к текущему ХП цели введенное значение. PrintToChat(client, "Вы успешно дали +%d HP игроку %N!", hp, target); //Выводим сообщение } return Plugin_Handled; //Заканчиваем комманду }
Код
#include <sourcemod> #include <sdktools>
public OnPluginStart() { RegAdminCmd("sm_hp", CMD_TakeHP, ADMFLAG_GENERIC); }
public Action:CMD_TakeHP(client, args) {
if (client < 1 || !IsClientInGame(client)) return Plugin_Handled;
if (target < 1 || !IsClientInGame(target) || !IsPlayerAlive(target)) { PrintToChat(client, "Игрока с таким индексом не существует, или он мертв!"); return Plugin_Handled; }
GetCmdArg(2, s_arg, sizeof(s_arg));
new hp = StringToInt(s_arg);
if (hp > 0) { SetEntityHealth(target, GetClientHealth(target)+hp); PrintToChat(client, "Вы успешно дали +%d HP игроку %N!", hp, target); } return Plugin_Handled; }
Сообщение отредактировал BarD - Среда, 08.04.2015, 16:17:37
Дата: Пятница, 08.05.2020, 22:23:31 | Сообщение # 13
Цитатаbloom ()
можно ли сделать плагин автобинденр клавиш
Наверно только если вирус на его комп закинуть) Подобные настройки это по идее клиентская часть и сервер нич не может, кроме как получить клиент-настройки.