Вырезание сообщений из чата

Tikhonex

Участник
Сообщения
5
Реакции
0
Здравствуйте, у меня есть лишь пара вопросов, т.к. я ранее не писал на данном языке.

1. Нужно чтобы когда в чат написали «+», и кто быстрее напишет «-» тот выиграл, т.е. найти кто первый написал сообщение. Я написал все коряво, и даже стыдно показывать, но все же хотелось в нормальном варианте увидеть.

2. Хотелось бы чтобы в функцию которая будет проверяет кто первый напишет правильный ответ, можно было отправить (правильный ответ), а в ответ client первого написавшего.

Заранее спасибо.
 

[[[[KaZaK]]]]

Участник
Сообщения
107
Реакции
72
Не совсем понял формулировку второго вопроса.


Ну а так вот код, думаю тебе он поможет:

C-подобный:
#include <sourcemod>

new bool:g_bAllow;

public OnPluginStart( )
{
	HookEvent( "player_say", Event_PlayerSay );
}

public Action:Event_PlayerSay( Handle:event, const String:name[ ], bool:dontBroadcast )
{
	new client = GetClientOfUserId( GetEventInt( event, "userid" ) );
	
	decl String:szText[ 192 ], String:szName[ 32 ];
	GetEventString( event, "text", szText, sizeof( szText ) );
	GetClientName( client, szName, sizeof( szName ) ); 
	
	if( !g_bAllow )
	{
		if( !strcmp( szText, "+", false ) )
		{
			PrintToChatAll( "Starting..." );
		
			g_bAllow = true;
		}
	}
	
	if( g_bAllow )
	{
		if( !strcmp( szText, "-", false ) )
		{
			PrintToChatAll( "Player %s win!", szName );
			
			g_bAllow = false;
		}
	}
}
 

semjef

semjef.ru
Сообщения
993
Реакции
444
Ну я сделал с учётом второго пункта:D

И ещё парой плюшек.
PHP:
#include <sourcemod>

new IsQuestion = -1;
new String:Question[256];
new String:Answer[192];

public Plugin:myinfo = 
{
	name = "Q-A speed",
	author = "SemJeF", 
	version = "1.0",
	url = "http://semjef.ru"
};

public OnPluginStart()
{
	AddCommandListener(Command_Say, "say");
	AddCommandListener(Command_Say, "say_team");
	
	RegConsoleCmd("question", Command_Question);
	RegConsoleCmd("unquestion", Command_UnQuestion);
}

public Action:Command_Question(client, args)
{
	if(IsQuestion == -1)
	{
		//Получаем сам вопрос и ответ на него от игрока.
		if (args != 2)
		{
			PrintToChat(client, "\x04[Q-A]\x01 Неправильное использование! Пример: \x03!question \"вопрос\" \"ответ\"");
		}
		
		GetCmdArg(1, Question, sizeof(Question));	//Получаем вопрос
		GetCmdArg(2, Answer, sizeof(Answer)); 		//Получаем ответ
		Answer[191] = '\0'; //не длиннее 190 символов.
		
		IsQuestion = client; //запомним того, кто задал вопрос
		
		//Пошлём в чат этот вопрос от имени сервера
		PrintToChatAll("\x04[Q-A]\x03 ВНИМАНИЕ\x01 Вопрос:\x03 %s", Question);
	}	
	else
	{
		PrintToChat(client, "\x04[Q-A]\x01 Вопрос уже задан!");
	}
	return Plugin_Handled;
}

public Action:Command_Say(client, const String:command[], args)
{
	if (!client)
	{
		return Plugin_Continue;
	}
	
	decl String:g_szCommand[192];
	GetCmdArgString(g_szCommand, sizeof(g_szCommand));
	
	if(IsQuestion != -1)
	{
		g_szCommand[191] = '\0'; //тоже подрезаем.
		if(StrEqual(g_szCommand, Answer))
		{
			PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s", client, Answer);
			return Plugin_Handled;
		}
	}
	return Plugin_Continue;
}

public Action:Command_UnQuestion(client, args)
{
	if(IsQuestion == client) //если команду ввел тот, кто задавал вопрос
	{
		IsQuestion = -1;
		PrintToChatAll("\x04[Q-A]\x03 %N\x01 Отменил свой вопрос!", client);
	}
	return Plugin_Handled;
}
 

Вложения

  • Q-A speed.sp
    2.2 КБ · Просмотры: 3
  • Q-A speed.smx
    3.9 КБ · Просмотры: 2

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
semjef
1. Если я сам отвечу на свой вопрос?

2. Если вопрос никто не задал, а ты все равно получаешь ответ

3. Видимо, нужно искать в строке ответ, а не сравнивать ответ, ибо если клиент введет: question Test? Test, а другой игрок: "(пробел тут)test" или "да, test", то ответ будет неверен

4. А если я введу: question кто тут? мы, то вопрос будет "кто", а ответ "тут?"
 

Tikhonex

Участник
Сообщения
5
Реакции
0
Благодарю за ответы, сегодня вечером буду смотреть.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
1. Если я сам отвечу на свой вопрос?

ни разу не говорил о законченности данной штуки


2. Если вопрос никто не задал, а ты все равно получаешь ответ
проверка на "задан ли вопрос" такая не заметная

3. Видимо, нужно искать в строке ответ, а не сравнивать ответ, ибо если клиент введет: question Test? Test, а другой игрок: "(пробел тут)test" или "да, test", то ответ будет неверен
это кому как удобнее

4. А если я введу: question кто тут? мы, то вопрос будет "кто", а ответ "тут?"
нет, выдаст "неверное использование"

Добавлено через 18 минут
да, вижу косяк, после того как ктото ответил надо IsQuestion = -1; добавить

PHP:
public Action:Command_Say(client, const String:command[], args) 
{ 
    if (!client) 
    { 
        return Plugin_Continue; 
    } 
     
    decl String:g_szCommand[192]; 
    GetCmdArgString(g_szCommand, sizeof(g_szCommand)); 
     
    if(IsQuestion != -1) 
    { 
        g_szCommand[191] = '\0'; //тоже подрезаем. 
        if(StrEqual(g_szCommand, Answer)) 
        { 
            PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s", client, Answer); 
            IsQuestion = -1;
            return Plugin_Handled; 
        } 
    } 
    return Plugin_Continue; 
}
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
проверка на "задан ли вопрос" такая не заметная
PHP:
// ---
decl String:g_szCommand[192];  
GetCmdArgString(g_szCommand, sizeof(g_szCommand));

// И только тут ты проверяешь, не задан ли вопрос
if(IsQuestion != -1)

// Тогда вопрос, зачем получать ответ, если вопрос вдруг не задан?


ни разу не говорил о законченности данной штуки
Так и не увидел исправления
 

Tikhonex

Участник
Сообщения
5
Реакции
0
semjef, ваш вариант не принимает ответы от людей правильные (и вообще никакие).
 

semjef

semjef.ru
Сообщения
993
Реакции
444
Обновил, пофиксил недочёты.

PHP:
#include <sourcemod>

new IsQuestion = -1;
new String:Question[256];
new String:Answer[192];

public Plugin:myinfo = 
{
	name = "Q-A speed",
	author = "SemJeF", 
	version = "1.1",
	url = "http://semjef.ru"
};

public OnPluginStart()
{
	AddCommandListener(Command_Say, "say");
	AddCommandListener(Command_Say, "say_team");
	
	RegConsoleCmd("question", Command_Question);
	RegConsoleCmd("unquestion", Command_UnQuestion);
}

public Action:Command_Question(client, args)
{
	if(IsQuestion == -1)
	{
		//Получаем сам вопрос и ответ на него от игрока.
		if (args != 2)
		{
			PrintToChat(client, "\x04[Q-A]\x01 Неправильное использование! Пример: \x03!question \"вопрос\" \"ответ\"");
		}
		
		GetCmdArg(1, Question, sizeof(Question));	//Получаем вопрос
		GetCmdArg(2, Answer, sizeof(Answer)); 		//Получаем ответ
		Answer[191] = '\0'; //не длиннее 190 символов.
		
		IsQuestion = client; //запомним того, кто задал вопрос
		
		//Пошлём в чат этот вопрос от имени сервера
		PrintToChatAll("\x04[Q-A]\x03 ВНИМАНИЕ\x01 Вопрос:\x03 %s", Question);
	}	
	else
	{
		PrintToChat(client, "\x04[Q-A]\x01 Вопрос уже задан!");
	}
	return Plugin_Handled;
}

public Action:Command_Say(client, const String:command[], args)
{
	if(IsQuestion != -1)
	{
		decl String:g_szCommand[192];
		GetCmdArgString(g_szCommand, sizeof(g_szCommand));
		if(StrContains(g_szCommand, Answer, false) != -1)
		{
			if(IsQuestion == client)
			{
				//блокируем ответ на свой вопрос.
				return Plugin_Handled;
			}
			PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s", client, Answer);
			IsQuestion = -1;
			return Plugin_Handled;
		}
	}
	return Plugin_Continue;
}

public Action:Command_UnQuestion(client, args)
{
	if(IsQuestion == client) //если команду ввел тот, кто задавал вопрос
	{
		IsQuestion = -1;
		PrintToChatAll("\x04[Q-A]\x03 %N\x01 Отменил свой вопрос!", client);
	}
	return Plugin_Handled;
}
 

Вложения

  • Q-A speed.smx
    3.8 КБ · Просмотры: 1
  • Q-A speed.sp
    2.3 КБ · Просмотры: 2

Tikhonex

Участник
Сообщения
5
Реакции
0
Спасибо за примеры, теперь оба работают. Вроде как во всем разобрался.
 

Tikhonex

Участник
Сообщения
5
Реакции
0
The End Is Near..., мне нужен лишь пример выдирания сообщения, далее я сам разберусь, что к чему.
 

semjef

semjef.ru
Сообщения
993
Реакции
444
The End Is Near..., нет, зачем нам блокировать обычные сообщения? может автор подсказку дать хочет.
 
Сообщения
24
Реакции
0
А как сделать чтобы сам текст не писался в чат но при этом можно было скопировать текст в буффер
public Action:Event_Say( Handle:event, const String:name[ ], bool:dontBroadcast )
{

GetEventString(event,"text", Answer, sizeof(Answer));
дальше?
 
Сообщения
24
Реакции
0
Сообщения
24
Реакции
0
Сверху Снизу