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

Тема в разделе "Программирование / Скриптинг", создана пользователем Tikhonex, 10 мар 2014.

  1. Tikhonex

    Tikhonex

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

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

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

    Заранее спасибо.
     
  2. [[[[KaZaK]]]]

    [[[[KaZaK]]]]

    Сообщения:
    82
    Симпатии:
    64
    Не совсем понял формулировку второго вопроса.


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

    Код:
    #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;
    		}
    	}
    }
     
    Tikhonex нравится это.
  3. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Ну я сделал с учётом второго пункта: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(clientargs)
    {
        if(
    IsQuestion == -1)
        {
            
    //Получаем сам вопрос и ответ на него от игрока.
            
    if (args != 2)
            {
                
    PrintToChat(client"\x04[Q-A]\x01 Неправильное использование! Пример: \x03!question \"вопрос\" \"ответ\"");
            }
            
            
    GetCmdArg(1Questionsizeof(Question));    //Получаем вопрос
            
    GetCmdArg(2Answersizeof(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_szCommandsizeof(g_szCommand));
        
        if(
    IsQuestion != -1)
        {
            
    g_szCommand[191] = '\0'//тоже подрезаем.
            
    if(StrEqual(g_szCommandAnswer))
            {
                
    PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s"clientAnswer);
                return 
    Plugin_Handled;
            }
        }
        return 
    Plugin_Continue;
    }

    public 
    Action:Command_UnQuestion(clientargs)
    {
        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
    Tikhonex нравится это.
  4. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    semjef
    1. Если я сам отвечу на свой вопрос?

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

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

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

    Tikhonex

    Сообщения:
    5
    Симпатии:
    0
    Благодарю за ответы, сегодня вечером буду смотреть.
     
  6. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    ни разу не говорил о законченности данной штуки


    проверка на "задан ли вопрос" такая не заметная

    это кому как удобнее

    нет, выдаст "неверное использование"

    Добавлено через 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_szCommandsizeof(g_szCommand)); 
         
        if(
    IsQuestion != -1
        { 
            
    g_szCommand[191] = '\0'//тоже подрезаем. 
            
    if(StrEqual(g_szCommandAnswer)) 
            { 
                
    PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s"clientAnswer); 
                
    IsQuestion = -1;
                return 
    Plugin_Handled
            } 
        } 
        return 
    Plugin_Continue
     
    Последнее редактирование: 14 мар 2014
    Tikhonex нравится это.
  7. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    PHP:
    // ---
    decl String:g_szCommand[192];  
    GetCmdArgString(g_szCommandsizeof(g_szCommand));

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

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


    Так и не увидел исправления
     
    Серый™ нравится это.
  8. Tikhonex

    Tikhonex

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

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Обновил, пофиксил недочёты.

    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(clientargs)
    {
        if(
    IsQuestion == -1)
        {
            
    //Получаем сам вопрос и ответ на него от игрока.
            
    if (args != 2)
            {
                
    PrintToChat(client"\x04[Q-A]\x01 Неправильное использование! Пример: \x03!question \"вопрос\" \"ответ\"");
            }
            
            
    GetCmdArg(1Questionsizeof(Question));    //Получаем вопрос
            
    GetCmdArg(2Answersizeof(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_szCommandsizeof(g_szCommand));
            if(
    StrContains(g_szCommandAnswerfalse) != -1)
            {
                if(
    IsQuestion == client)
                {
                    
    //блокируем ответ на свой вопрос.
                    
    return Plugin_Handled;
                }
                
    PrintToChatAll("\x04[Q-A]\x01 Игрок\x03 %N\x01 Первым правильно ответил на вопрос!\n Верный ответ :\x03 %s"clientAnswer);
                
    IsQuestion = -1;
                return 
    Plugin_Handled;
            }
        }
        return 
    Plugin_Continue;
    }

    public 
    Action:Command_UnQuestion(clientargs)
    {
        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 нравится это.
  10. Tikhonex

    Tikhonex

    Сообщения:
    5
    Симпатии:
    0
    Спасибо за примеры, теперь оба работают. Вроде как во всем разобрался.
     
  11. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    Опять же, if(IsQuestion == client) очень поздно
     
  12. Tikhonex

    Tikhonex

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

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    The End Is Near..., нет, зачем нам блокировать обычные сообщения? может автор подсказку дать хочет.
     
  14. Ибрагим Зубаилов

    Ибрагим Зубаилов

    Сообщения:
    24
    Симпатии:
    0
    А как сделать чтобы сам текст не писался в чат но при этом можно было скопировать текст в буффер
    public Action:Event_Say( Handle:event, const String:name[ ], bool:dontBroadcast )
    {

    GetEventString(event,"text", Answer, sizeof(Answer));
    дальше?
     
  15. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Серый™ и Ибрагим Зубаилов нравится это.
  16. Ибрагим Зубаилов

    Ибрагим Зубаилов

    Сообщения:
    24
    Симпатии:
    0
    Оффтоп
     
  17. Ибрагим Зубаилов

    Ибрагим Зубаилов

    Сообщения:
    24
    Симпатии:
    0
    Через эвент не получилось, сделал с помощью regconsolecmd