Ошибка в плагине

Nobody

Участник
Сообщения
54
Реакции
4
Операционная система
Linux
Текст ошибки
[SM] Exception reported: Client index 0 is invalid
[SM] Blaming: AutoChoiceOfSantaClaus.smx
SM] Call stack trace:
[SM] [0] IsClientInGame
[SM] [1] Line 142, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd
Здравствуйте! Помогите пожалуйста решить проблему с плагином, заранее спасибо!

C-подобный:
#include <sdktools_functions>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdkhooks>
#include <lvl_ranks>
#include <morecolors>

public Plugin myinfo =
{
    name = "Auto Choice Of Santa Claus",
    author = "KiKiEEKi (vk.com/kikieeki)",
    version = "1.0"
};

int iMaxPlayers = 6;
char sModelT[64] = "models/player/vad36santa/red.mdl";
char sModelCT[64] = "models/player/vad36santa/blue.mdl";
int iHealth = 150;
float fSpeed = 2.0;
float fGravity = 0.5;
float fDamage = 5.0;
float fBlockDamage = 0.6;
int iLvlRanksXP = 111;

int iRandomPlayer = 0;
float fGetGravityRandomPlayer;
int g_iClient = 0;
float fGetGravityClient;

int iNumberRound = 0; //Номер раунда
int iEveryRound = 2; //Каждый раунд N раунд будет выбран Санта

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
    //HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Post);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

    RegAdminCmd("sm_santa", Cmd_GiveSanta, ADMFLAG_ROOT, "Выбор дед-мороза");
    RegAdminCmd("sm_santa_reload", Cmd_ReloadCFG, ADMFLAG_CONFIG, "Перезагрузить конфиг");
}

public Action Cmd_GiveSanta(int iClient, int args)
{
    fGetGravityClient =  GetEntityGravity(iClient);
    g_iClient = iClient;
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере

    if(iGetCountPlayers >= iMaxPlayers)
    {
        SetSantaPlayer(g_iClient);
    }
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
  
    iNumberRound++; //Прибавляем +1 к счетчику раундов
    if(iGetCountPlayers >= iMaxPlayers && iNumberRound == iEveryRound)
    {
        fGetGravityRandomPlayer =  GetEntityGravity(iRandomPlayer); //Получаем гравитацию рандомного игрока
        iRandomPlayer = GetRandomClient(); //Выбор рандомного игрока

        SetSantaPlayer(iRandomPlayer);
        iNumberRound = 0; //Обнуляем счетчик раундов
    }
}

stock void SetSantaPlayer(int iRandomPlayerANDiClient)
{
    if(GetClientTeam(iRandomPlayerANDiClient) == 2) //2 - это Т
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelT); //Установить модель
    }
    else if(GetClientTeam(iRandomPlayerANDiClient) == 3) //3 - это КТ
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelCT); //Установить модель
    }

    SetEntityHealth(iRandomPlayerANDiClient, iHealth); //Установить здоровье
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flLaggedMovementValue", fSpeed); //Установить скорость
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flGravity", fGravity); //Установить гравитацию

    SDKHook(iRandomPlayerANDiClient, SDKHook_OnTakeDamage, OnTakeDamage);

    CPrintToChatAll("\x04Игрок \x01%N \x04был выбран дед-морозом!", iRandomPlayerANDiClient);
    CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    if(iAttacker != iVictim && iVictim == iRandomPlayer || iVictim == g_iClient)
    {
        //LR_ChangeClientValue(iAttacker, iLvlRanksXP);

        CPrintToChatAll("\x04Игрок \x01%N \x04получает награду за убийство дед-мороза!", iAttacker);
        CPrintToChatAll("\x04Его награда\x01: %i \x04Опыта!", iLvlRanksXP);
    }
}

public Action OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    bool bChange;
    bChange = false;
    if(iRandomPlayer == attacker)
    {
        damage *= fDamage;
        bChange = true;
    }

    if(iRandomPlayer == victim)
    {
        damage *= fBlockDamage;
        bChange = true;
    }

    return bChange ? Plugin_Changed : Plugin_Continue;
}

/*
public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    int iDmgHealth = GetEventInt(event, "dmg_health"); //Получает количество нанесенного урона игроку (не включая броню).
  
    if(iAttacker != iVictim && iVictim == iRandomPlayer)
    {
        //Shop_GiveClientCredits(iAttacker, iShopCredits);
        PrintToChatAll("Игрок %N Получил %i Кредитов за убийство Санты!", iAttacker, iShopCredits);
    }
}
*/
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(iRandomPlayer, Prop_Data, "m_flGravity", fGetGravityRandomPlayer);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты, и убийца не получил награду
        iRandomPlayer = 0;
    }
    if(IsClientInGame(g_iClient)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(g_iClient, Prop_Data, "m_flGravity", fGetGravityClient);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты и убийца не получил награду
        g_iClient = 0;
    }
}

GetRandomClient()
{
    int iIndexPlayers[MAXPLAYERS+1]; //Индекс игроков
    int iPlayers = 0; //Масив для хранение игроков которые в игре

    for(int i = 1; i <= MaxClients; i++) //Цикл по всем игрокам
    {
        if(IsClientInGame(i)) //Проверяем в игре ли игрок
        {
            iIndexPlayers[iPlayers++] = i; //Прибавляем игрока в масив
        }
    }

    if(iPlayers > 0) //Если игроков больше нуля
    {
        return iIndexPlayers[GetRandomInt(0, iPlayers-1)]; //Возвращаем рандомный индекс игрока в вызывающию функцию
    }

    return 0;
}

stock void LoadCfg()
{
    char szPath[PLATFORM_MAX_PATH]; //PLATFORM_MAX_PATH - Применяется в буферах под путь файла
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/AutoChoiceOfSantaClaus.ini"); //Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("AutoChoiceOfSantaClaus");
    if(hKeyValues.ImportFromFile(szPath)) //Загружаем из файла
    {
        //Успешно загрузили
        //hKeyValues.Rewind(); //Возвращает указатель на позицию в самое начало структуры.
        iMaxPlayers = hKeyValues.GetNum("MaxPlayers");
        iEveryRound = hKeyValues.GetNum("EveryRound");
        hKeyValues.GetString("ModelT", sModelT, sizeof(sModelT));
        hKeyValues.GetString("ModelCT", sModelCT, sizeof(sModelCT));
        iHealth = hKeyValues.GetNum("Health");
        fSpeed = hKeyValues.GetFloat("Speed");
        fGravity = hKeyValues.GetFloat("Gravity");
        fDamage = hKeyValues.GetFloat("Damage");
        fBlockDamage = hKeyValues.GetFloat("BlockDamage");
        iLvlRanksXP = hKeyValues.GetNum("LvlRanksXP");
    }
    //delete hKeyValues;
}

public void OnMapStart()
{
    LoadCfg();
    PrecacheModel(sModelT);
    PrecacheModel(sModelCT);
}

public Action Cmd_ReloadCFG(int client, int args)
{
    LoadCfg();
    return Plugin_Handled;
}
 
Последнее редактирование:

sniper45301

<Выживаю и играю>
Сообщения
464
Реакции
133
Ошибку скинь, она начинается с Exception reported
вот он спрашивал до
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
C-подобный:
замени
if(IsClientInGame(g_iClient))
if(IsClientInGame(iRandomPlayer))

на
if(0 < g_iClient <= MaxClients && IsClientInGame(g_iClient))
if(0 < iRandomPlayer <= MaxClients && IsClientInGame(iRandomPlayer))
 

Nobody

Участник
Сообщения
54
Реакции
4
C-подобный:
замени
if(IsClientInGame(g_iClient))
if(IsClientInGame(iRandomPlayer))

на
if(0 < g_iClient <= MaxClients && IsClientInGame(g_iClient))
if(0 < iRandomPlayer <= MaxClients && IsClientInGame(iRandomPlayer))
Спасибо, но ошибки те же самые остались
C-подобный:
L 11/30/2022 - 18:38:04: [SM] Exception reported: Client index 0 is invalid
L 11/30/2022 - 18:38:04: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/30/2022 - 18:38:04: [SM] Call stack trace:
L 11/30/2022 - 18:38:04: [SM]   [0] IsClientInGame
L 11/30/2022 - 18:38:04: [SM]   [1] Line 149, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Спасибо, но ошибки те же самые остались
C-подобный:
L 11/30/2022 - 18:38:04: [SM] Exception reported: Client index 0 is invalid
L 11/30/2022 - 18:38:04: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/30/2022 - 18:38:04: [SM] Call stack trace:
L 11/30/2022 - 18:38:04: [SM]   [0] IsClientInGame
L 11/30/2022 - 18:38:04: [SM]   [1] Line 149, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd

C-подобный:
#include <sdktools_functions>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdkhooks>
#include <lvl_ranks>
#include <morecolors>

public Plugin myinfo =
{
    name = "Auto Choice Of Santa Claus",
    author = "KiKiEEKi (vk.com/kikieeki)",
    version = "1.0"
};

int iMaxPlayers = 6;
char sModelT[64] = "models/player/vad36santa/red.mdl";
char sModelCT[64] = "models/player/vad36santa/blue.mdl";
int iHealth = 150;
float fSpeed = 2.0;
float fGravity = 0.5;
float fDamage = 5.0;
float fBlockDamage = 0.6;
int iLvlRanksXP = 111;

int iRandomPlayer = 0;
float fGetGravityRandomPlayer;
int g_iClient = 0;
float fGetGravityClient;

int iNumberRound = 0; //Номер раунда
int iEveryRound = 2; //Каждый раунд N раунд будет выбран Санта

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
    //HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Post);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

    RegAdminCmd("sm_santa", Cmd_GiveSanta, ADMFLAG_ROOT, "Выбор дед-мороза");
    RegAdminCmd("sm_santa_reload", Cmd_ReloadCFG, ADMFLAG_CONFIG, "Перезагрузить конфиг");
}

public Action Cmd_GiveSanta(int iClient, int args)
{
    fGetGravityClient =  GetEntityGravity(iClient);
    g_iClient = iClient;
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере

    if(iGetCountPlayers >= iMaxPlayers)
    {
        SetSantaPlayer(g_iClient);
    }
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
  
    iNumberRound++; //Прибавляем +1 к счетчику раундов
    if(iGetCountPlayers >= iMaxPlayers && iNumberRound == iEveryRound)
    {
        fGetGravityRandomPlayer =  GetEntityGravity(iRandomPlayer); //Получаем гравитацию рандомного игрока
        iRandomPlayer = GetRandomClient(); //Выбор рандомного игрока

        SetSantaPlayer(iRandomPlayer);
        iNumberRound = 0; //Обнуляем счетчик раундов
    }
}

stock void SetSantaPlayer(int iRandomPlayerANDiClient)
{
    if(GetClientTeam(iRandomPlayerANDiClient) == 2) //2 - это Т
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelT); //Установить модель
    }
    else if(GetClientTeam(iRandomPlayerANDiClient) == 3) //3 - это КТ
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelCT); //Установить модель
    }

    SetEntityHealth(iRandomPlayerANDiClient, iHealth); //Установить здоровье
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flLaggedMovementValue", fSpeed); //Установить скорость
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flGravity", fGravity); //Установить гравитацию

    SDKHook(iRandomPlayerANDiClient, SDKHook_OnTakeDamage, OnTakeDamage);

    CPrintToChatAll("\x04Игрок \x01%N \x04был выбран дед-морозом!", iRandomPlayerANDiClient);
    CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    if(iAttacker != iVictim && iVictim == iRandomPlayer || iVictim == g_iClient)
    {
        //LR_ChangeClientValue(iAttacker, iLvlRanksXP);

        CPrintToChatAll("\x04Игрок \x01%N \x04получает награду за убийство дед-мороза!", iAttacker);
        CPrintToChatAll("\x04Его награда\x01: %i \x04Опыта!", iLvlRanksXP);
    }
}

public Action OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    bool bChange;
    bChange = false;
    if(iRandomPlayer == attacker)
    {
        damage *= fDamage;
        bChange = true;
    }

    if(iRandomPlayer == victim)
    {
        damage *= fBlockDamage;
        bChange = true;
    }

    return bChange ? Plugin_Changed : Plugin_Continue;
}

/*
public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    int iDmgHealth = GetEventInt(event, "dmg_health"); //Получает количество нанесенного урона игроку (не включая броню).
  
    if(iAttacker != iVictim && iVictim == iRandomPlayer)
    {
        //Shop_GiveClientCredits(iAttacker, iShopCredits);
        PrintToChatAll("Игрок %N Получил %i Кредитов за убийство Санты!", iAttacker, iShopCredits);
    }
}
*/
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(0 < iRandomPlayer <= MaxClients && IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(iRandomPlayer, Prop_Data, "m_flGravity", fGetGravityRandomPlayer);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты, и убийца не получил награду
        iRandomPlayer = 0;
    }
    if(IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(g_iClient, Prop_Data, "m_flGravity", fGetGravityClient);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты и убийца не получил награду
        g_iClient = 0;
    }
}

GetRandomClient()
{
    int iIndexPlayers[MAXPLAYERS+1]; //Индекс игроков
    int iPlayers = 0; //Масив для хранение игроков которые в игре

    for(int i = 1; i <= MaxClients; i++) //Цикл по всем игрокам
    {
        if(IsClientInGame(i)) //Проверяем в игре ли игрок
        {
            iIndexPlayers[iPlayers++] = i; //Прибавляем игрока в масив
        }
    }

    if(iPlayers > 0) //Если игроков больше нуля
    {
        return iIndexPlayers[GetRandomInt(0, iPlayers-1)]; //Возвращаем рандомный индекс игрока в вызывающию функцию
    }

    return 0;
}

stock void LoadCfg()
{
    char szPath[PLATFORM_MAX_PATH]; //PLATFORM_MAX_PATH - Применяется в буферах под путь файла
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/AutoChoiceOfSantaClaus.ini"); //Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("AutoChoiceOfSantaClaus");
    if(hKeyValues.ImportFromFile(szPath)) //Загружаем из файла
    {
        //Успешно загрузили
        //hKeyValues.Rewind(); //Возвращает указатель на позицию в самое начало структуры.
        iMaxPlayers = hKeyValues.GetNum("MaxPlayers");
        iEveryRound = hKeyValues.GetNum("EveryRound");
        hKeyValues.GetString("ModelT", sModelT, sizeof(sModelT));
        hKeyValues.GetString("ModelCT", sModelCT, sizeof(sModelCT));
        iHealth = hKeyValues.GetNum("Health");
        fSpeed = hKeyValues.GetFloat("Speed");
        fGravity = hKeyValues.GetFloat("Gravity");
        fDamage = hKeyValues.GetFloat("Damage");
        fBlockDamage = hKeyValues.GetFloat("BlockDamage");
        iLvlRanksXP = hKeyValues.GetNum("LvlRanksXP");
    }
    //delete hKeyValues;
}

public void OnMapStart()
{
    LoadCfg();
    PrecacheModel(sModelT);
    PrecacheModel(sModelCT);
}

public Action Cmd_ReloadCFG(int client, int args)
{
    LoadCfg();
    return Plugin_Handled;
}
Не могут быть ошибки такими же, местами условие поменяй
 

Nobody

Участник
Сообщения
54
Реакции
4
Не могут быть ошибки такими же, местами условие поменяй
Извиняюсь, каким-то случайным образом не изменил одну строку

Теперь вот такая ошибка:
C-подобный:
L 11/30/2022 - 18:55:37: SourceMod error session started
L 11/30/2022 - 18:56:08: [SM] Exception reported: String formatted incorrectly - parameter 3 (total 2)
L 11/30/2022 - 18:56:08: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/30/2022 - 18:56:08: [SM] Call stack trace:
L 11/30/2022 - 18:56:08: [SM]   [0] VFormat
L 11/30/2022 - 18:56:08: [SM]   [1] Line 48, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\include\morecolors.inc::CPrintToChat
L 11/30/2022 - 18:56:08: [SM]   [2] Line 89, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::SetSantaPlayer
L 11/30/2022 - 18:56:08: [SM]   [3] Line 66, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundStart
Но при этом, один раунд плагин корректно сработал
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP", iHealth); 89 строка
 

Nobody

Участник
Сообщения
54
Реакции
4
CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP", iHealth); 89 строка
Спасибо! А не подскажите почему опыт не добавляется? Хотя уведомление в чате пишет, что игрок получает 100 опыта за убийство дед мороза, стоит
C-подобный:
"LvlRanksXP"        "100"
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Спасибо! А не подскажите почему опыт не добавляется? Хотя уведомление в чате пишет, что игрок получает 100 опыта за убийство дед мороза, стоит
C-подобный:
"LvlRanksXP"        "100"
99 строку раскомментируй
 

google>

oldgamers
Сообщения
373
Реакции
210
Спасибо большое! А можно как-то спектаторов убрать с рандома выбора?
в Event_RoundStart

IsClientSourceTV:
        if(!IsClientSourceTV(iRandomPlayer) && IsPlayerAlive(iRandomPlayer) && GetClientTeam(iRandomPlayer) > 1)
        {
            SetSantaPlayer(iRandomPlayer);
            iNumberRound = 0; //Обнуляем счетчик раундов
        }

Или это все в GetRandomClient()
 
Последнее редактирование:
Сверху Снизу