Иконка ресурса

Kill Trigger (!kill) 3

3anyda

Every Day Is a Saturday
Сообщения
76
Реакции
8
  • Автор ресурса
  • #1
Kill Trigger
Описание: чат триггер, при написании !kill в чат происходит суицид (альтернатива kill в консоль для самых ленивых)
Версия: v3
Автор: Halloween
 
Последнее редактирование модератором:

★Сириус★

Участник
Сообщения
743
Реакции
197
Re: [ANY]AutoSuicide (!kill)

название плагина только как-то не правильно подобрал "autosuicide"
прочитав название темы, сначало не о том подумал
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Ну для двух команд одинаковый код, то можно было сделать просто
PHP:
#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;
}
Причем чуть не понимаю зачем две эти строки
PHP:
PrintToConsole(client, "kill", client);
			ForcePlayerSuicide(client);
Можно было еще сделать так
PHP:
#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;
}
 

3anyda

Every Day Is a Saturday
Сообщения
76
Реакции
8
  • Автор ресурса
  • #5
Первый плагин все таки)
 

neatek

Участник
Сообщения
424
Реакции
226
DoK_1997,
PHP:
    RegConsoleCmd("sm_kill", sui); 
    RegConsoleCmd("kill", sui);
Это одно и тоже, достаточно одной верхней строчки.
ибо sm_ отбрасывается в чате...


ilga80, это так сделали Sourcemod'овцы, все команды в сприптинге
не нуждаются в ! или /

Halloween, я помню я взялся писать первый плагин это были бананы для Deathrun
чтобы все были бананами (скин такой)...
у меня было в логах over ~5000 ошибок, но я б?ть был доволен до ушей, что он работал ;P

Щас делаю Builders мод, обычный props ;)
 

neatek

Участник
Сообщения
424
Реакции
226
Тогда вопрос как сделать чтобы команда kill без ! принималась в чат. А то на jail когда говоришь пиши килл, нубы в чат пишут.
Нужно делать вот так:
PHP:
	AddCommandListener(Command_Listener, "say");
	AddCommandListener(Command_Listener, "say2");
	AddCommandListener(Command_Listener, "say_team");

Ну там конечно же нужно будет сверять команды введенные в чат
и любимое золотое наше: return Plugin_Handled;

Если делать по тупому то вот так:
PHP:
	RegConsoleCmd("say", Command_Callback);
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
neatek
С чего бы это по тупому?


ilga80
Попробуй
PHP:
#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;
}
 

BloodyAngel

Участник
Сообщения
72
Реакции
54
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;
}
 

Nekro

Терра инкогнита
Сообщения
4,169
Реакции
2,500
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;
}
А если чуть чуть теории?
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(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?)
 
Последнее редактирование:

Lappland_Saluzzo

Владелец Sibnet Software
Сообщения
162
Реакции
102
А если чуть чуть теории?
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?)
В моем плагине простом - добавлен другой подход - если ForcePlayerSuicide не срабатывает по каким-то причинам - вызывается SDKHooks Take Damage вроде, с уроном в 9999999, чтоб наверняка.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
@Nekro, я бы вообще сначала проверял клиента и только потом, в случае его валидности, получал и проверял текст аргумента команды.
И проверка sCmd[0] без надобности, кмк: strcmp() сделает то же самое с теми же затратами примерно.
Кстати, strcmp() возвращает 0 в случае совпадения строк. Поправь у себя.
Если в оригинале написано с ошибкой и будет убивать при отправке в чат любого сообщения, кроме «kill», то ты бы мог и поправить это дело у себя. =)
А если 5, то зачем нам буфер в 8?
потому что компилер округляет до ближайшего большего кратного 4 (по крайней мере в SM1.11 ещё округлял, емнип).
Сообщения автоматически склеены:

Ну и ещё я бы сравнивал с «/kill» и «!kill» без проверки на совпадение регистра символов. И при совпадении после убийства возвращал Plugin_Handled, в случае, когда первым идёт «/» (хотя лучше бы прикрутить проверку символа из дефолтных плагинов SM, т.к. символ скрытия можно в конфиге менять, хоть и мало кто его меняет).
 
Последнее редактирование:
Сверху Снизу