#include <sourcemod>
#include <sdktools>
public OnPluginStart()
{
RegConsoleCmd("sm_kill", sui);
RegConsoleCmd("kill", sui);
}
public Action:sui(client,args)
{
if (GetClientTeam(client) > 1)
{
if (IsPlayerAlive(client))
{
PrintToConsole(client, "kill", client);
ForcePlayerSuicide(client);
}
else
{
PrintToChat(client, "\x01[You need to be alive]\x04 Вы должны быть живыми!");
}
}
else
{
PrintToChat(client, "\x01[You can't die in spectate]\x04 Вы не можете умереть в спектаторах!");
}
return Plugin_Handled;
}
PrintToConsole(client, "kill", client);
ForcePlayerSuicide(client);
#include <sourcemod>
#include <sdktools>
public OnPluginStart() RegConsoleCmd("kill", kill);
public Action:kill(client, args)
{
if(IsPlayerAlive(client) && GetClientTeam(client) != 1)
{
ForcePlayerSuicide(client);
}
return Plugin_Handled;
}
RegConsoleCmd("sm_kill", sui);
RegConsoleCmd("kill", sui);
Нужно делать вот так:Тогда вопрос как сделать чтобы команда kill без ! принималась в чат. А то на jail когда говоришь пиши килл, нубы в чат пишут.
AddCommandListener(Command_Listener, "say");
AddCommandListener(Command_Listener, "say2");
AddCommandListener(Command_Listener, "say_team");
RegConsoleCmd("say", Command_Callback);
#include <sourcemod>
#include <sdktools>
public OnPluginStart()
{
RegConsoleCmd("say", CommandSay);
RegConsoleCmd("say_team", CommandSay);
}
public Action:CommandSay(client, args)
{
decl String:command[128];
GetCmdArgString(command, sizeof(command) - 1);
StripQuotes(command);
TrimString(command);
if(strcmp(command, "kill") && IsPlayerAlive(client) && GetClientTeam(client) != 1)
{
ForcePlayerSuicide(client);
}
return Plugin_Continue;
}
#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#define PLUGIN_VERSION "v3"
public Plugin myinfo =
{
name = "sm chat kill",
author = "Halloween",
description = "Chat Trigger: suicide",
version = PLUGIN_VERSION,
url = "www.project-cccp.at.ua"
};
public void OnPluginStart()
{
CreateConVar("sm_autosuicide", PLUGIN_VERSION, "version", FCVAR_NOTIFY|FCVAR_SPONLY|FCVAR_DONTRECORD);
AddCommandListener(Command_Listener, "say");
AddCommandListener(Command_Listener, "say2");
AddCommandListener(Command_Listener, "say_team");
}
Action Command_Listener(int client, const char[] command, int args)
{
char cCommandKill[8];
GetCmdArg(0, cCommandKill, sizeof(cCommandKill));
if(strcmp(cCommandKill, "kill") && IsPlayerAlive(client) && GetClientTeam(client) != 1)
{
ForcePlayerSuicide(client);
}
return Plugin_Continue;
}
А если чуть чуть теории?C++:#pragma semicolon 1 #pragma newdecls required #include <sourcemod> #include <sdktools> #define PLUGIN_VERSION "v3" public Plugin myinfo = { name = "sm chat kill", author = "Halloween", description = "Chat Trigger: suicide", version = PLUGIN_VERSION, url = "www.project-cccp.at.ua" }; public void OnPluginStart() { CreateConVar("sm_autosuicide", PLUGIN_VERSION, "version", FCVAR_NOTIFY|FCVAR_SPONLY|FCVAR_DONTRECORD); AddCommandListener(Command_Listener, "say"); AddCommandListener(Command_Listener, "say2"); AddCommandListener(Command_Listener, "say_team"); } Action Command_Listener(int client, const char[] command, int args) { char cCommandKill[8]; GetCmdArg(0, cCommandKill, sizeof(cCommandKill)); if(strcmp(cCommandKill, "kill") && IsPlayerAlive(client) && GetClientTeam(client) != 1) { ForcePlayerSuicide(client); } return Plugin_Continue; }
#pragma semicolon 1
#pragma newdecls required
#include <sdktools_functions>
public Plugin myinfo =
{
name = "sm chat kill",
author = "Halloween Fork",
description = "Chat Trigger: suicide",
version = "v3.1",
};
public void OnPluginStart()
{
AddCommandListener(Command_Listener, "say");
AddCommandListener(Command_Listener, "say2");
AddCommandListener(Command_Listener, "say_team");
}
Action Command_Listener(int client, const char[] command, int args)
{
char sCmd[8];
GetCmdArg(0, sCmd, sizeof(sCmd));
if(IsPlayerAlive(client) && GetClientTeam(client) > 1 && !strcmp(sCmd, "kill"))
{
ForcePlayerSuicide(client);
}
return Plugin_Continue;
}
В моем плагине простом - добавлен другой подход - если ForcePlayerSuicide не срабатывает по каким-то причинам - вызывается SDKHooks Take Damage вроде, с уроном в 9999999, чтоб наверняка.А если чуть чуть теории?
C-подобный:#pragma semicolon 1 #pragma newdecls required #include <sdktools_functions> public Plugin myinfo = { name = "sm chat kill", author = "Halloween Fork", description = "Chat Trigger: suicide", version = "v3.1", }; public void OnPluginStart() { AddCommandListener(Command_Listener, "say"); AddCommandListener(Command_Listener, "say2"); AddCommandListener(Command_Listener, "say_team"); } Action Command_Listener(int client, const char[] command, int args) { char sCmd[8]; GetCmdArg(0, sCmd, sizeof(sCmd)); if(sCmd[0] && IsPlayerAlive(client) && GetClientTeam(client) > 1 && strcmp(sCmd, "kill")) { ForcePlayerSuicide(client); } return Plugin_Continue; }
Скорее больше вопросов:
1. То есть в сдктулс тянем лишь нужную часть, это вообще имеет значение? (инклюд см мы откидываем т.к. меньше кода - меньше ошибок, он тут не нужен)
2. Тиму проверим на > 1, так как она может быть и 0. Перенесём в начало, дешевле же проверить её, чем пересчитывать все буквы и сравнивать? (Жизнь тоже в начало по той же причине)
3. Добавляем проверку на наличие текста в начало.. А команда разве может быть без него (порой могут умельцы читаки удивить)? Или просто проверить, что бы там было 5 символов и не больше? "!kill". А если 5, то зачем нам буфер в 8?
4. А почему везде (гугл) say2? Это что такое и зачем? Имеет ли смысл?
5. Сайт не работает давно, выкинул с кода, версия там тоже не к чему совсем, лишь место занимала.
6. Нужна ли проверка на отсутствие аргументов команды?
Выпуск еженедельной рубрики странных вопросов по sourcemod?)
sCmd[0] без надобности, кмк: strcmp() сделает то же самое с теми же затратами примерно.strcmp() возвращает 0 в случае совпадения строк. Поправь у себя.потому что компилер округляет до ближайшего большего кратного 4 (по крайней мере в SM1.11 ещё округлял, емнип).А если 5, то зачем нам буфер в 8?