Написание плагинов

Мотыга

сила в силе духа ☠️☠️☠️
Сообщения
84
Реакции
49
Ошибка : Exception reported: Entity 53 (53) is not a CBaseEntity

1:
public Action:ParticleDelete(Handle:hSomeTimer, any:particle)
{
    AcceptEntityInput(particle,"kill");
    
    return Plugin_Stop;
}

помогите исправить ошибку
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Доброе утро всем, подскажите пожалуйста как решить проблему с компиляцией
error 100: function prototypes do not match

Код:
public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect_Post(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iVictim, int& iAttacker, int& inflictor, float & damage, float& damagetype, int& weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
}

UPD Инклуд <sdkhooks> подключен
 

babka68

Участник
Сообщения
2,124
Реакции
956
Доброе утро всем, подскажите пожалуйста как решить проблему с компиляцией
error 100: function prototypes do not match

Код:
public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect_Post(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iVictim, int& iAttacker, int& inflictor, float & damage, float& damagetype, int& weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
}

UPD Инклуд <sdkhooks> подключен
C-подобный:
#include <sdkhooks>

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect_Post(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iVictim, int &iAttacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
    
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
C-подобный:
public void OnClientDisconnect_Post(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
В этом куске кода нет никакой необходимости: анхук производится автоматически при отключении игрока.
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Ошибка : Exception reported: Entity 53 (53) is not a CBaseEntity

1:
public Action:ParticleDelete(Handle:hSomeTimer, any:particle)
{
    AcceptEntityInput(particle,"kill");
   
    return Plugin_Stop;
}

помогите исправить ошибку
Не факт что по истечению таймера энтитя с таким id является тем же партиклем. Нужно использовать связку EntIndexToEntRef - EntRefToEntIndex
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C-подобный:
#include <sdkhooks>

public void OnClientPutInServer(int iClient)
{
    SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public void OnClientDisconnect_Post(int iClient)
{
    SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int iVictim, int &iAttacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
   
}
Спасибо большое помогло
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброе утро, подскажите пожалуйста как решить проблему:
Если игрок ЗА КТ, выключает показ текста, то при общем показе игроков он не учитывается. Как я понял проблема именно в функции PrintHintText
Если сделать PrintHintTextToAll то все работает корректно

Сам плагин:
#include <sdktools_functions>
#include <clientprefs>

#pragma newdecls required
#pragma semicolon 1

public Plugin myinfo =
{
    name             = "Team Info",
    description     = "Показ живых игроков, раунда, счета в командах",
    author            = "Str1k3r (rework by Ало, Ва-Вадик?)",
    version         = "1.1",
    url             = "vk.com/kopojlebckuu_7pelllhuk",
};


Handle     g_hTimer,
        g_hCookie;

int    g_iTT,
    g_iCT,
    g_iRounds_TT,
    g_iRounds_CT;
        
bool     g_bHUD[MAXPLAYERS + 1];

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart);
    HookEvent("round_end", Event_RoundEnd);

    g_hCookie = RegClientCookie("TeamInfo", "Team Info", CookieAccess_Private);
    SetCookieMenuItem(TeamCookieHandler, 0, "TeamInfo");
}


public void OnClientCookiesCached(int iClient)
{
    char sValue[4];
    GetClientCookie(iClient, g_hCookie, sValue, sizeof(sValue));
    if (sValue[0])    g_bHUD[iClient] = view_as<bool>(StringToInt(sValue));
    else g_bHUD[iClient] = true;
}

public void  TeamCookieHandler(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
{
    switch (action)
    {
        case CookieMenuAction_DisplayOption: FormatEx(buffer, maxlen, "Показ живых игроков %s", (g_bHUD[iClient] ? "[+]":"[-]"));
        case CookieMenuAction_SelectOption:
        {
            if (g_bHUD[iClient])
            {
                SetClientCookie(iClient, g_hCookie, "0");
                g_bHUD[iClient] = false;
            }
            else
            {
                SetClientCookie(iClient, g_hCookie, "1");
                g_bHUD[iClient] = true;
            }
            
            ShowCookieMenu(iClient);
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_bHUD[iClient] = false;
}

public Action Event_RoundStart(Event hEvent, const char[] name, bool dontBroadcast)
{
    if (g_hTimer != null)
    {
        KillTimer(g_hTimer);
        g_hTimer = null;
    }

    g_hTimer = CreateTimer(1.0, UpdateInfo, _, TIMER_REPEAT);
}

public Action Event_RoundEnd(Event hEvent, const char[] name, bool dontBroadcast)
{
    g_iRounds_TT = GetTeamScore(2);
    g_iRounds_CT = GetTeamScore(3);

    if (g_hTimer != null)
    {
        KillTimer(g_hTimer);
        g_hTimer = null;
    }
}

public Action UpdateInfo(Handle hTimer)
{
    g_iTT =  g_iCT = 0;

    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && IsPlayerAlive(i))
        {
            if (GetClientTeam(i) == 2) g_iTT++;
            else if (GetClientTeam(i) == 3) g_iCT++;
            if (g_bHUD[i]) UpdateHUD(i);
        }
    }

    return Plugin_Continue;
}

void UpdateHUD(int iClient)
{
    if (g_bHUD[iClient]) PrintHintText(iClient, "   [Раунд %i]    \n [%i] [CT: %d]      [TT: %d] [%i]", 1 + (g_iRounds_TT + g_iRounds_CT), g_iRounds_CT, g_iCT, g_iTT, g_iRounds_TT);
}
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Всем доброе утро, подскажите пожалуйста как решить проблему:
Если игрок ЗА КТ, выключает показ текста, то при общем показе игроков он не учитывается. Как я понял проблема именно в функции PrintHintText
Если сделать PrintHintTextToAll то все работает корректно

Сам плагин:
#include <sdktools_functions>
#include <clientprefs>

#pragma newdecls required
#pragma semicolon 1

public Plugin myinfo =
{
    name             = "Team Info",
    description     = "Показ живых игроков, раунда, счета в командах",
    author            = "Str1k3r (rework by Ало, Ва-Вадик?)",
    version         = "1.1",
    url             = "vk.com/kopojlebckuu_7pelllhuk",
};


Handle     g_hTimer,
        g_hCookie;

int    g_iTT,
    g_iCT,
    g_iRounds_TT,
    g_iRounds_CT;
        
bool     g_bHUD[MAXPLAYERS + 1];

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart);
    HookEvent("round_end", Event_RoundEnd);

    g_hCookie = RegClientCookie("TeamInfo", "Team Info", CookieAccess_Private);
    SetCookieMenuItem(TeamCookieHandler, 0, "TeamInfo");
}


public void OnClientCookiesCached(int iClient)
{
    char sValue[4];
    GetClientCookie(iClient, g_hCookie, sValue, sizeof(sValue));
    if (sValue[0])    g_bHUD[iClient] = view_as<bool>(StringToInt(sValue));
    else g_bHUD[iClient] = true;
}

public void  TeamCookieHandler(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
{
    switch (action)
    {
        case CookieMenuAction_DisplayOption: FormatEx(buffer, maxlen, "Показ живых игроков %s", (g_bHUD[iClient] ? "[+]":"[-]"));
        case CookieMenuAction_SelectOption:
        {
            if (g_bHUD[iClient])
            {
                SetClientCookie(iClient, g_hCookie, "0");
                g_bHUD[iClient] = false;
            }
            else
            {
                SetClientCookie(iClient, g_hCookie, "1");
                g_bHUD[iClient] = true;
            }
            
            ShowCookieMenu(iClient);
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_bHUD[iClient] = false;
}

public Action Event_RoundStart(Event hEvent, const char[] name, bool dontBroadcast)
{
    if (g_hTimer != null)
    {
        KillTimer(g_hTimer);
        g_hTimer = null;
    }

    g_hTimer = CreateTimer(1.0, UpdateInfo, _, TIMER_REPEAT);
}

public Action Event_RoundEnd(Event hEvent, const char[] name, bool dontBroadcast)
{
    g_iRounds_TT = GetTeamScore(2);
    g_iRounds_CT = GetTeamScore(3);

    if (g_hTimer != null)
    {
        KillTimer(g_hTimer);
        g_hTimer = null;
    }
}

public Action UpdateInfo(Handle hTimer)
{
    g_iTT =  g_iCT = 0;

    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && IsPlayerAlive(i))
        {
            if (GetClientTeam(i) == 2) g_iTT++;
            else if (GetClientTeam(i) == 3) g_iCT++;
            if (g_bHUD[i]) UpdateHUD(i);
        }
    }

    return Plugin_Continue;
}

void UpdateHUD(int iClient)
{
    if (g_bHUD[iClient]) PrintHintText(iClient, "   [Раунд %i]    \n [%i] [CT: %d]      [TT: %d] [%i]", 1 + (g_iRounds_TT + g_iRounds_CT), g_iRounds_CT, g_iCT, g_iTT, g_iRounds_TT);
}
Тебе нужно 2 раза цикл обходить, первый раз считаешь общее количество за кт и т, а во 2 показываешь худ для каждого игрока в отдельности
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK, ты выводи в хинт инфу после подсчёта, а не во время его.
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <clientprefs>

Handle
    g_hTimer,
    g_hCookie;
int
    g_iTT,
    g_iCT,
    g_iRounds_TT,
    g_iRounds_CT;
bool
    g_bHUD[MAXPLAYERS+1];

public Plugin myinfo =
{
    name        = "Team Info",
    description    = "Показ живых игроков, раунда, счета в командах",
    author        = "Str1k3r (rework by Ало, Ва-Вадик?)",
    version        = "1.1_fix",
    url            = "vk.com/kopojlebckuu_7pelllhuk",
}

public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_Round, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_Round, EventHookMode_PostNoCopy);

    g_hCookie = RegClientCookie("TeamInfo", "Team Info", CookieAccess_Private);
    SetCookieMenuItem(TeamCookieHandler, 0, "TeamInfo");
}


public void OnClientCookiesCached(int iClient)
{
    if(IsFakeClient(iClient)) return;

    char sValue[4];
    GetClientCookie(iClient, g_hCookie, sValue, sizeof(sValue));
    g_bHUD[iClient] = sValue[0] != '0';
}

public void TeamCookieHandler(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
{
    switch(action)
    {
        case CookieMenuAction_DisplayOption:
            FormatEx(buffer, maxlen, "Показ живых игроков %s", (g_bHUD[iClient] ? "[+]":"[-]"));
        case CookieMenuAction_SelectOption:
        {
            if ((g_bHUD[iClient] ^= true))
                SetClientCookie(iClient, g_hCookie, "1");
            else SetClientCookie(iClient, g_hCookie, "0");

            ShowCookieMenu(iClient);
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_bHUD[iClient] = false;
}

public void Event_Round(Event hEvent, const char[] name, bool dontBroadcast)
{
    if(g_hTimer) CloseHandle(g_hTimer);

    if(name[6] == 'e')
    {
        g_hTimer = null;

        g_iRounds_TT = GetTeamScore(2);
        g_iRounds_CT = GetTeamScore(3);
    }
    else g_hTimer = CreateTimer(1.0, UpdateInfo, _, TIMER_REPEAT);
}

public Action UpdateInfo(Handle hTimer)
{
    static int i, t, clients[MAXPLAYERS], num;
    for(i = 1, num = g_iTT = g_iCT = 0; i <= MaxClients; i++) if(IsClientInGame(i))
    {
        if((t = GetClientTeam(i)) > 1 && IsPlayerAlive(i))
        {
            if(t == 2)        g_iTT++;
            else if(t == 3)    g_iCT++;
        }

        if(g_bHUD[i]) clients[num++] = i;
    }

    while(--num >= 0) PrintHintText(clients[num], "   [Раунд %i]    \n [%i] [CT: %d]      [TT: %d] [%i]", 1 + (g_iRounds_TT + g_iRounds_CT), g_iRounds_CT, g_iCT, g_iTT, g_iRounds_TT);

    return Plugin_Continue;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Тебе нужно 2 раза цикл обходить, первый раз считаешь общее количество за кт и т, а во 2 показываешь худ для каждого игрока в отдельности
Пробовал, проблема оставалась
Сообщения автоматически склеены:

@7pElllHuK, ты выводи в хинт инфу после подсчёта, а не во время его.
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_functions>
#include <clientprefs>

Handle
    g_hTimer,
    g_hCookie;
int
    g_iTT,
    g_iCT,
    g_iRounds_TT,
    g_iRounds_CT;
bool
    g_bHUD[MAXPLAYERS+1];

public Plugin myinfo =
{
    name        = "Team Info",
    description    = "Показ живых игроков, раунда, счета в командах",
    author        = "Str1k3r (rework by Ало, Ва-Вадик?)",
    version        = "1.1_fix",
    url            = "vk.com/kopojlebckuu_7pelllhuk",
}

public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_Round, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_Round, EventHookMode_PostNoCopy);

    g_hCookie = RegClientCookie("TeamInfo", "Team Info", CookieAccess_Private);
    SetCookieMenuItem(TeamCookieHandler, 0, "TeamInfo");
}


public void OnClientCookiesCached(int iClient)
{
    if(IsFakeClient(iClient)) return;

    char sValue[4];
    GetClientCookie(iClient, g_hCookie, sValue, sizeof(sValue));
    g_bHUD[iClient] = sValue[0] != '0';
}

public void TeamCookieHandler(int iClient, CookieMenuAction action, any info, char[] buffer, int maxlen)
{
    switch(action)
    {
        case CookieMenuAction_DisplayOption:
            FormatEx(buffer, maxlen, "Показ живых игроков %s", (g_bHUD[iClient] ? "[+]":"[-]"));
        case CookieMenuAction_SelectOption:
        {
            if ((g_bHUD[iClient] ^= true))
                SetClientCookie(iClient, g_hCookie, "1");
            else SetClientCookie(iClient, g_hCookie, "0");

            ShowCookieMenu(iClient);
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_bHUD[iClient] = false;
}

public void Event_Round(Event hEvent, const char[] name, bool dontBroadcast)
{
    if(g_hTimer) CloseHandle(g_hTimer);

    if(name[6] == 'e')
    {
        g_hTimer = null;

        g_iRounds_TT = GetTeamScore(2);
        g_iRounds_CT = GetTeamScore(3);
    }
    else g_hTimer = CreateTimer(1.0, UpdateInfo, _, TIMER_REPEAT);
}

public Action UpdateInfo(Handle hTimer)
{
    static int i, t, clients[MAXPLAYERS], num;
    for(i = 1, num = g_iTT = g_iCT = 0; i <= MaxClients; i++) if(IsClientInGame(i))
    {
        if((t = GetClientTeam(i)) > 1 && IsPlayerAlive(i))
        {
            if(t == 2)        g_iTT++;
            else if(t == 3)    g_iCT++;
        }

        if(g_bHUD[i]) clients[num++] = i;
    }

    while(--num >= 0) PrintHintText(clients[num], "   [Раунд %i]    \n [%i] [CT: %d]      [TT: %d] [%i]", 1 + (g_iRounds_TT + g_iRounds_CT), g_iRounds_CT, g_iCT, g_iTT, g_iRounds_TT);

    return Plugin_Continue;
}
Огромная благодарнасть, все работает
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый день, подскажите пожалуйста, почему на сервере вместо SteamID Пишет STEAM_ID_PENDING

Код:
public Action Player_Connect(Event hEvent, char[] sName, bool bDB)
{
    if (!bDB) SetEventBroadcast(hEvent, true);
    char sConnect[255], sDisconnect[255], sSteamID[24], sNick[48], sIP[16];
    GetEventString(hEvent, "networkid", sSteamID, sizeof(sSteamID));
    GetEventString(hEvent, "name", sNick, sizeof(sNick));
    
    if (strcmp(sName, "player_connect"))
    {
        int iClient = GetClientOfUserId(GetEventInt(hEvent,"userid"))
        if (iClient < 1) return;
        GetClientIP(iClient, sIP, sizeof(sIP));
        Format(sDisconnect,sizeof(sDisconnect),"{default}[{green}» {red}ZK {green}«{default}] {red}%s {default}• {green}вышел {default}• [{green}IP {default}- {red}%s {default}| {green}SteamID {default}- {red}%s{default}]", sNick, sIP, sSteamID);
        Format(sConnect, sizeof(sConnect),"{default}[{green}» {red}ZK {green}«{default}] {red}%s {default}• {green}вышел с сервера{default}•", sNick);
    }
    else
    {   
        GetEventString(hEvent, "address", sIP, sizeof(sIP));
        SplitString(sIP,":",sIP,sizeof(sIP));
        Format(sDisconnect, sizeof(sDisconnect), "{default}[{green}» {red}ZK {green}«{default}] {red}%s {default}• {green}зашел {default}• [{green}IP {default}- {red}%s {default}| {green}SteamID {default}- {red}%s{default}]", sNick, sIP, sSteamID);
        Format(sConnect,sizeof(sConnect), "{default}[{green}» {red}ZK {green}«{default}] {red}%s {default}• {green}заходит на сервер{default}•", sNick);
    }
    
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientConnected(i) && IsClientInGame(i))
        {
            if (GetUserFlagBits(i)) CPrintToChat(i, "%s", CheckAdminFlagsByString(i, "b") ? sConnect : sDisconnect);
            else CPrintToChat(i, "%s", sConnect);
        }
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK, видимо поэтому:
clients.inc:
/**
 * Auth string types.
 *
 * Note that for the Steam2 and Steam3 types, the following ids are
 * also valid values:
 * "STEAM_ID_PENDING" - Authentication is pending.   // "Ожидается аутентификация."
 * "STEAM_ID_LAN" - Authentication is disabled because of being on a LAN server.
 * "BOT" - The client is a bot.
 */
enum AuthIdType
{
    AuthId_Engine = 0,     /**< The game-specific auth string as returned from the engine */
    
    // The following are only available on games that support Steam authentication.
    AuthId_Steam2,         /**< Steam2 rendered format, ex "STEAM_1:1:4153990" */
    AuthId_Steam3,         /**< Steam3 rendered format, ex "[U:1:8307981]" */
    AuthId_SteamID64       /**< A SteamID64 (uint64) as a String, ex "76561197968573709" */
};
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, видимо поэтому:
clients.inc:
/**
 * Auth string types.
 *
 * Note that for the Steam2 and Steam3 types, the following ids are
 * also valid values:
 * "STEAM_ID_PENDING" - Authentication is pending.   // "Ожидается аутентификация."
 * "STEAM_ID_LAN" - Authentication is disabled because of being on a LAN server.
 * "BOT" - The client is a bot.
 */
enum AuthIdType
{
    AuthId_Engine = 0,     /**< The game-specific auth string as returned from the engine */
 
    // The following are only available on games that support Steam authentication.
    AuthId_Steam2,         /**< Steam2 rendered format, ex "STEAM_1:1:4153990" */
    AuthId_Steam3,         /**< Steam3 rendered format, ex "[U:1:8307981]" */
    AuthId_SteamID64       /**< A SteamID64 (uint64) as a String, ex "76561197968573709" */
};
И как это исправить?
Пробовал брать Steam игрока через GetClientAuthId, но выводило пустую строку вместо стима
UPD Разобрался, спасибо за помощь
 
Последнее редактирование:

cmb

Участник
Сообщения
15
Реакции
2
Как сделать чтобы при входе клиента он моментально скипая мотд и прочие окна спавнился как террорист и не мог никаким образом сменить команду и убить себя через jointeam, joinclass?
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Как сделать чтобы при входе клиента он моментально скипая мотд и прочие окна спавнился как террорист и не мог никаким образом сменить команду и убить себя через jointeam, joinclass?
code:
#include <cstrike>

#define dSetTeam 2 // За какую команду перекидывать игрока
// 1 - наблюдатели
// 2 - террористы
// 3 - контр-террористы

public void OnPluginStart(){
    RegConsoleCmd("kill", cmd_block);
    RegConsoleCmd("spectate", cmd_block);
    RegConsoleCmd("joinclass", cmd_block);
    RegConsoleCmd("jointeam", cmd_block);
}
public Action cmd_block(int client, int args){
    if(IsValidClient(client)){
        CS_SwitchTeam(client, dSetTeam);
        if(IsPlayerAlive(client))
            return Plugin_Handled;
    }
    return Plugin_Continue;
}
public void OnClientPutInServer(int client){
    if(IsValidClient(client))
        ChangeClientTeam(client, dSetTeam);
        
}
stock bool IsValidClient(int client){ return client > 0 && client <= MaxClients && IsClientInGame(client) && IsClientConnected(client); }
 
Сверху Снизу