Дата: Четверг, 04.08.2011, 19:20:38 | Сообщение # 1
Как создать SourceMod плагин/скрипт
Скачайте SourceMod и куда-нибудь распакуйте папку addons/sourcemod/scripting. В папке scripting вы увидите исходные файлы стандартных плагинов с расширением .sp Перетащив funcommands.sp на compile.exe, вы увидите похожее окно:
$IMAGE1$
Если компилятор обнаружил в коде какие-либо ошибки, то он подробно сообщит о них в этом окне. Будет видно имя файла, номер строки, что именно за ошибка, её код и тд. Чтобы можно было копировать текст из окна, нажмите правой кнопкой мыши по верхней полосе окна, свойства, и там выделение мышью. Выделяете текст, нажимаете правую кнопку мыши и текст скопирован. В нашем случае никаких ошибок не было, .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
2. Создайте в папке scripting текстовый документ (.txt) и переименуйте его в x.sp, сменив расширение. Если вы не видите расширение .txt у вашего текстового файла, то поисковики помогут -> "windows показывать расширения файлов".
3. Вставьте этот код:
Код
#include <sdktools>
#pragma semicolon 1 #pragma newdecls required
public void OnPluginStart() { PrintToServer("My first plugin is enabled."); PrintToServer("Slots: %d", MaxClients);
static void Event_player_jump(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if (client) { int health = GetClientHealth(client) + (GetClientButtons(client) & IN_DUCK ? -10 : 1); if (health > 0) { if (health <= HEALTH_LIMIT) { SetEntityHealth(client, health); } else { PrintToChat(client, "Health limit: %d", HEALTH_LIMIT); } } else { ForcePlayerSuicide(client); } } }
4. Теперь скомпилируйте плагин. Перетаскиваем x.sp на compile.exe, открывшееся черное окно закрываем (ошибок же нет), и идём за x.smx в папку scripting/compiled. Включаем сервер, перемещаем в addons/sourcemod/plugins наш x.smx и пишем в консоль сервера (RCON) sm plugins load x, после чего в консоле сервера увидим результат:
Код
My first plugin is enabled. Slots: 7 Current map: de_dust2 Date: 12.02.2022 02:12
Зайдите на сервер и попрыгайте. После каждого прыжка вам будет добавляться 1 HP (до 110 HP). Если прыгать с зажатым приседанием (CTRL), то будет отниматься по 10 HP и в итоге убьёт.
-----
Вот ваш первый плагин и работает. Теперь можете попробовать изменить его код на свой и проверить снова, т.к. важна практика.
В качестве отступов используйте TAB (это удобно и большинство так и делают), но внутри одной функции нельзя смешивать пробельные отступы и TAB (компилятору это не понравится). Можно довольно быстро изменить тип отступа, т.к. весь код функции можно сдвинуть влево, просто выделите нужный текст и нажмите shift + tab. Ну и конечно же нужно пользоваться ctrl + c (копировать), ctrl + v (вставить), ctrl + z (отменить), ctrl + y (повторить), ctrl + f (поиск).
Советую сначала тестировать различные варианты кода в событии OnPluginStart(). Внутри используйте PrintToServer для вывода данных в консоль сервера - так вы сможете узнать что чему равно и когда было выполнено, и заходить в игру не нужно.
Всем здравствуйте , я тут используя ваш код изменил его и хочу добавить сообщение игроку в чате , но не получается . Собщение не выводится (((( Не подскажете где ошибка ???
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 | Сообщение # 3
Код
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 | Сообщение # 12
Цитатаbloom ()
можно ли сделать плагин автобинденр клавиш
Наверно только если вирус на его комп закинуть) Подобные настройки это по идее клиентская часть и сервер нич не может, кроме как получить клиент-настройки.