Нужна помощь по SourcePawn

cgduude

Участник
Сообщения
8
Реакции
0
Сразу скажу, что я новичок в sourcepawn. И мне пришла идея написать плагин для игры 1 на 1.
Суть в том, что когда игроки вдвоем пропишут !ready, то начинается матч. Но баг плагина в том, что один игрок может 2 раза прописать !ready и игра запуститься.
Вопрос: Как сделать, чтобы 1 игрок мог писать команду только 1 раз?
Есть вот такой вот код:
C-подобный:
#pragma semicolon 1
 

#include <sourcemod>
new a = 0;
public OnPluginStart()
 {
    
     RegConsoleCmd( "say", CommandSay);
     HookEvent("player_connect", player_connect, EventHookMode_Post);
    
    
    
 }
 
 public Action:CommandSay(client, args)     
 {   
    
     decl String:text[128];
     GetCmdArgString(text, sizeof(text) - 1 );
     StripQuotes(text);
     TrimString(text);
     if(StrEqual(text, "!ready")){
         PrintToChat(client, "You write !ready");
         a = a + 1;
     }
    
     PrintToServer("Ready: %d", a);
     if(a==2){
         ServerCommand("mp_warmup_end");
         ServerCommand("mp_restartgame 1");
     }
    
 }
    

public void player_connect(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));           
    PrintToChat(client, "Write !ready");
}
Т.е когда игрок пишет
 

Temlik

Участник
Сообщения
668
Реакции
174
Сразу скажу, что я новичок в sourcepawn. И мне пришла идея написать плагин для игры 1 на 1.
Суть в том, что когда игроки вдвоем пропишут !ready, то начинается матч. Но баг плагина в том, что один игрок может 2 раза прописать !ready и игра запуститься.
Вопрос: Как сделать, чтобы 1 игрок мог писать команду только 1 раз?
Есть вот такой вот код:
C-подобный:
#pragma semicolon 1
 

#include <sourcemod>
new a = 0;
public OnPluginStart()
 {
 
     RegConsoleCmd( "say", CommandSay);
     HookEvent("player_connect", player_connect, EventHookMode_Post);
 
 
 
 }
 
 public Action:CommandSay(client, args)  
 {
 
     decl String:text[128];
     GetCmdArgString(text, sizeof(text) - 1 );
     StripQuotes(text);
     TrimString(text);
     if(StrEqual(text, "!ready")){
         PrintToChat(client, "You write !ready");
         a = a + 1;
     }
 
     PrintToServer("Ready: %d", a);
     if(a==2){
         ServerCommand("mp_warmup_end");
         ServerCommand("mp_restartgame 1");
     }
 
 }
 

public void player_connect(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));        
    PrintToChat(client, "Write !ready");
}
Т.е когда игрок пишет
Перед началом матча сделать проверку переменной на то была ли использована команда. (Соответственно при начале матча установить её значение на 1, например)
 

cgduude

Участник
Сообщения
8
Реакции
0
Перед началом матча сделать проверку переменной на то была ли использована команда. (Соответственно при начале матча установить её значение на 1, например)
Сделал проверку для игроков, но все равно не работает. Как будто значение true не присваивается
C-подобный:
// UTF-8 (без BOM)
 
#pragma semicolon 1
 

#include <sourcemod>
new a = 0;
new b = 0;
new bool:player1 = false;
new bool:player2 = false;
public OnPluginStart()
 {
   
     RegConsoleCmd( "say", CommandSay);
     HookEvent("player_spawn", player_spawn, EventHookMode_Post);
   
 }
 
 public Action:CommandSay(client, args)    
 {  
     PrintToServer("Скачал игрок: %d", client);
     decl String:text[128];
     GetCmdArgString(text, sizeof(text) - 1 );
     StripQuotes(text);
     TrimString(text);
     if(StrEqual(text, "!ready") && client == 1 && player1 == false){
         player1 == true;
         PrintToChat(client, "You write !ready");        
         a = a + 1;
         PrintToServer("Написал: %d", client);
     }
     else if(player1 == true){
         PrintToChat(client, "You have already written !ready");
     }
   
   
     if(StrEqual(text, "!ready") && client == 2 && player2 == false)
     {
         player2 == true;
         PrintToChat(client, "You write !ready");        
         a = a + 1;
         PrintToServer("Написал: %d", client);
     }
      else if(player2 == true){
         PrintToChat(client, "You have already written !ready");
     }

   
     PrintToServer("Ready: %d", a);
     if(player1 == true && player2 == true){
         ServerCommand("mp_warmup_end");
         ServerCommand("mp_restartgame 1");
     }
   
 }
   

public void player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));  
    PrintToChat(client,"Write !ready");

}
 

DarkerZ

Участник
Сообщения
397
Реакции
176
ну как-то так
C-подобный:
#pragma semicolon 1
#pragma newdecls required

bool g_bReady[MAXPLAYERS+1] = {false, ...};
bool g_bAlready = false;

public void OnPluginStart()
{
    RegConsoleCmd("sm_ready", Command_Ready, "Prepare to fight");    //регистрируем новую команду
}

public void OnMapStart()    //в начале карты обнуляем массив и переменную состоявшегося голосования
{
    for(int i = 1; i <= MaxClients; i++) g_bReady[i] = false;
    g_bAlready = false;
}

public Action Command_Ready(int iClient, int iArgs)
{
    if(!g_bAlready && IsClientConnected(iClient) && IsClientInGame(iClient))
    {
        if(!g_bReady[iClient]) //игрок не голосовал
        {
            g_bReady[iClient] = true;    //устанавливаем флаг, что игрок голосовал
            int iCount = 0;    //переменная для подсчета количества
            for(int i = 1; i <= MaxClients; i++) if(g_bReady[iClient]) iCount++;    //считаем количество
            if(iCount>=2)    //количество больше или равно 2, то начинаем раунд
            {
                g_bAlready = true;
                ServerCommand("mp_warmup_end");
                ServerCommand("mp_restartgame 1");
            }
        }
    }
    return Plugin_Handled;
}

public void OnClientDisconnect(int iClient) //игрок вышел обнуляем его если он голосовал
{
    g_bReady[iClient] = false;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,051
C-подобный:
#pragma semicolon 1

#include <cstrike>
#include <sdktools_gamerules>

bool
    bReady[MAXPLAYERS+1];
int
    iNum;

public OnPluginStart()
{
    HookEvent("player_spawn", Event_Spawn);

    RegConsoleCmd( "sm_ready", Cmd_Ready);
}

public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{
    for(int i = 1; i <= MaxClients; i++) bReady[i] = false;
    iNum = 0;
}

public void OnClientPutInServer(int client)
{
    bReady[client] = false;

    PrintToChat(client, "\x01Write \x04!ready \x01to end the warmup");
}

public void Event_Spawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(client) bReady[client] = false;
}

public Action Cmd_Ready(int client, int args)
{
    if(!client || GetClientTeam(client) < 2 || bReady[client] || GameRules_GetProp("m_bWarmupPeriod"))
        return Plugin_Handled;

    PrintToChat(client, "\x01You wrote \x04!ready");
    PrintToServer("\x01Ready: \x04%d", ++iNum);
    if(iNum != 2)
        return Plugin_Handled;

    ServerCommand("mp_warmup_end");
    ServerCommand("mp_restartgame 1");
    return Plugin_Handled;
}
 

cgduude

Участник
Сообщения
8
Реакции
0
Спасибо всем за помощь, но уже сам написал)
Вот еще вариант реализации моего вопроса.
C-подобный:
// UTF-8 (без BOM)
 
#pragma semicolon 1
 

#include <sourcemod>
new bool:player1 = false; // прописал ли игрок 1 команду !ready
new bool:player2 = false; // прописал ли игрок 2 команду !ready
new bool:match = false; // проверяем был ли уже запущен матч
public OnPluginStart()
 {
   
     RegConsoleCmd( "say", CommandSay);
     HookEvent("player_spawn", player_spawn, EventHookMode_Post);
   
 }
 
 public Action:CommandSay(client, args)    
 {  
     PrintToServer("Скачал игрок: %d", client);
     decl String:text[128];
     GetCmdArgString(text, sizeof(text) - 1 );
     StripQuotes(text);
     TrimString(text);
     if(StrEqual(text, "!ready") && client == 1 && player1 == false){ // проверяем прописал ли игрок 1 команду !ready
         player1 = true; // выставляем значение true, типа прописал
         PrintToChat(client, "You write !ready");        
         PrintToServer("Написал: %d", client);
     }
     if(StrEqual(text, "!ready") && player1 == true){
         PrintToChat(client, "You have already written !ready");
     }
   
   
     if(StrEqual(text, "!ready") && client == 2 && player2 == false) // проверяем прописал ли игрок 2 команду !ready
     {
         player2 = true; // выставляем значение true, типа прописал
         PrintToChat(client, "You write !ready");        
         PrintToServer("Написал: %d", client);
     }
     if(StrEqual(text, "!ready") && player2 == true){
         PrintToChat(client, "You have already written !ready");
     }

   
     //PrintToServer("Ready: %d", a);
     if(player1 == true && player2 == true && match == false){ // проверяем готовы ли игроки и запущен ли матч
         match = true; // выставляем значение, что матч уже запущен
         ServerCommand("mp_warmup_end");
         //ServerCommand("mp_restartgame 1");
     }
   
 }
   

public void player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));  
    PrintToChat(client,"Write !ready");

}
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@Grey83, я думаю если игрок вышел, следовало бы его голос отнимать.
Сообщения автоматически склеены:

@cgduude, Рассмотри лучше реализацию которую выше тебе скинули.
 

cgduude

Участник
Сообщения
8
Реакции
0
@Grey83, я думаю если игрок вышел, следовало бы его голос отнимать.
Ну вообще, если выходит игрок, то надо матч на паузу ставить. Когда он заходит то пауза снимается и матч автоматически продолжается. В связи с этим вопрос: Как можно паузу поставить, если игрок вышел? Через плагин естественно
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,558
Реакции
5,051
@cgduude, хз. Я не любитель КСГО.
Если есть команда для такого, то можно её вызвать.
Ну и, наверное, при каждом входе/выходе нужно считать игроков.
 

cgduude

Участник
Сообщения
8
Реакции
0
@cgduude, хз. Я не любитель КСГО.
Если есть команда для такого, то можно её вызвать.
Ну и, наверное, при каждом входе/выходе нужно считать игроков.
Все равно на сервер смогут подлючиться только 2 игрока(Так задумано), так не вижу особого смысла считать кол-во игроков
 
Сверху Снизу