[CS:GO] Доработка No Block Trigger

Astron4ik

Участник
Сообщения
3
Реакции
0
Для нужд на сервере дорабатываю плагин No Block Trigger.

Требуется: В сообщении, которое выводится в чат об активации No Block, добавить Имя игрока, который активирует его.
---
Пробовал использовать "client", выводит № игрока на сервере, что не подходит.

PHP:
*code*
PrintToChatAll("%s Noblock enabled for %f seconds [%d]", SM, Time, client);
*code*
---
Изучив примеры получения Имени игрока, добавил функцию получения имени.
Плагин компилируется, но на сервере вываливается следующая ошибка

C-подобный:
L 03/08/2017 - 13:27:59: [SM] Exception reported: Client index -1 is invalid
L 03/08/2017 - 13:27:59: [SM] Blaming: noblocktrigger.smx
L 03/08/2017 - 13:27:59: [SM] Call stack trace:
L 03/08/2017 - 13:27:59: [SM]   [0] GetClientName
L 03/08/2017 - 13:27:59: [SM]   [1] Line 40, D:\_srv\_server\csgo\addons\sourcemod\scripting\noblocktrigger.sp::Command_NoBlock

Из ошибки понял что не правильно читается ИД, почему то берется ИД сервере.
Прикладываю код плагина с изменения.

PHP:
public OnPluginStart()
{
    LoadTranslations("common.phrases");
    RegConsoleCmd("sm_noblock", Command_NoBlock);
    g_CollisionOffset = FindSendPropInfo("CBaseEntity", "m_CollisionGroup");
    sm_noblock_time = CreateConVar("sm_noblock_time", "10", "Sets the noblock timer value");
    AutoExecConfig(true, "sm_noblock");
}

public Action:Command_NoBlock(client, args)
{
    
    if (IsClientInGame(client) && IsPlayerAlive(client) && TimerActive == 0)
    {
        new Float:Time;
        Time = GetConVarFloat(sm_noblock_time);
        
        char name[128];
        GetCmdArg(1, name, sizeof(name));
        int targetplayer = FindTarget(client, name, true);
        GetClientName(targetplayer, name, sizeof(name));
        
        PrintToChatAll("%s Noblock enabled for %f seconds [%d]", SM, Time, name);   
        TimerActive = 1;
        CreateTimer(Time, Timer_UnBlockPlayer, client);
        
        // enable noblock on every client in the server
        for (new i = 1; i <= MaxClients; i++)
        {   
            if (IsClientInGame(i) && IsPlayerAlive(i))
            {
                EnableNoBlock(i);
            }
        }
    }
    else if (TimerActive == 1)
    {
        PrintToChat(client, "%s Command is already in use", SM);
    }
    else
    {
        PrintToChat(client, "%s You must be alive to use this command", SM);
    }
    
    return Plugin_Handled;
    
}

Прошу помощи в решение данной проблемы.
Спасибо.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
PHP:
#include <sdkhooks>

new bool:g_bBlock[MAXPLAYERS+1], g_offsCollisionGroup;

public OnPluginStart()
{
   if((g_offsCollisionGroup = FindSendPropInfo("CBaseEntity", "m_CollisionGroup")) == -1) SetFailState("Offset \"m_CollisionGroup\" not found!");
}

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
   if(buttons & IN_USE && g_bBlock[client] == false)
   {
       SDKHook(client, SDKHook_Touch, PlayerTouch);
       SetEntData(client, g_offsCollisionGroup, 2, 4, true);
       CreateTimer(0.5, PlayerBlock, client);

       g_bBlock[client] = true;
   }
   return Plugin_Continue;
}

public Action:PlayerTouch(client, entity)
{
   if(0 < entity <= MaxClients && g_bBlock[entity] == false)
   {
       SetEntData(entity, g_offsCollisionGroup, 2, 4, true);
       CreateTimer(0.5, PlayerBlock, entity);
       PrintToChatAll("%N, активировал прохождение сквозь игрока", client);
       g_bBlock[entity] = true;
   }
   return Plugin_Continue;
}

public Action:PlayerBlock(Handle:timer, any:client)
{
   g_bBlock[client] = false;
   SDKUnhook(client, SDKHook_Touch, PlayerTouch);
   if(IsClientInGame(client)) SetEntData(client, g_offsCollisionGroup, 5, 4, true);
   return Plugin_Stop;
}

Написание плагинов
Активация на "E", прохождение через своих...
Но это пагубно влияет на процесс игры.
 
Последнее редактирование:

Astron4ik

Участник
Сообщения
3
Реакции
0
"Ларчик просто открывался"
Спасибо.
 
Сверху Снизу