Помогите исправить код

MAGNAT2645

Участник
Сообщения
63
Реакции
7
У меня появилась проблема, из-за которой я и другие игроки не могут играть на сервере почти месяц.

Сервер крашит при подключении игрока (когда у всех выявляется сообщение о том, что игрок подключён) и при перезагрузке плагина (если игрок на сервере в момент перезагрузки).


Вообще у меня множество ошибок в коде (по моему мнению, но компилятор ошибок и предупреждений не находит).

Также некоторые отрывки я взял из плагина Army Ranks для создания Базы Данных SQLite.

Код загрузки плагина:
PHP:
#define MAX_PLAYER_SIGN_LENGTH 128

char PlayerSign[MAXPLAYERS + 1][MAX_PLAYER_SIGN_LENGTH],
PlayerSteamID[MAXPLAYERS + 1][24],
sPlayerType[MAXPLAYERS + 1][40],
sPlayerTypeHex[MAXPLAYERS + 1][256],
//sPlayerRank[MAXPLAYERS + 1][36],
//sPlayerRankColor[MAXPLAYERS + 1][256],
LEVEL_UP_SOUND[PLATFORM_MAX_PATH],
LEVEL_DOWN_SOUND[PLATFORM_MAX_PATH],
PlayerTypeConfigPath[PLATFORM_MAX_PATH],
NICKTAG[] = "[NTHN]";

float fHud_FX_Time,
fHud_HoldTime,
fHud_Name_X_Pos,
fHud_Name_Y_Pos,
fHud_Level_X_Pos,
fHud_Level_Y_Pos,
fHud_FadeIn,
fHud_FadeOut,
PlayerEXPProgressPercent[MAXPLAYERS + 1];

bool Naithon_Level_Enabled, PlayerCanDoubleBonus[MAXPLAYERS + 1],
bIsClientLoaded[MAXPLAYERS + 1];

ConVar CVAR_Version,
CVAR_Enabled,
CVAR_TMREXP,
CVAR_DoubleEXP,
CVAR_TripleCash,
CVAR_killEXP,
CVAR_pickUpEXP,
CVAR_CaptureFlagEXP,
CVAR_DefendFlagEXP,
CVAR_BlockerCapEXP,
CVAR_VictimCapEXP,
CVAR_CapturePointEXP,
CVAR_StartCapPointEXP,
CVAR_Hud_Name_Channel,
CVAR_Hud_Level_Channel,
CVAR_Hud_Name_Color_R,
CVAR_Hud_Name_Color_G,
CVAR_Hud_Name_Color_B,
CVAR_Hud_Name_Color_A,
CVAR_Hud_Level_Color_R,
CVAR_Hud_Level_Color_G,
CVAR_Hud_Level_Color_B,
CVAR_Hud_Level_Color_A,
CVAR_Hud_Double_Level_Color_R,
CVAR_Hud_Double_Level_Color_G,
CVAR_Hud_Double_Level_Color_B,
CVAR_Hud_Double_Level_Color_A,
CVAR_Hud_FX_Time,
CVAR_Hud_HoldTime,
CVAR_Hud_Name_X_Pos,
CVAR_Hud_Name_Y_Pos,
CVAR_Hud_Level_X_Pos,
CVAR_Hud_Level_Y_Pos,
CVAR_Hud_FadeIn,
CVAR_Hud_FadeOut,
CVAR_Hud_Refresh,
CVAR_Timer_Cash,
CVAR_Timer_EXP,
CVAR_Timer_Gems,
CVAR_Sound_LvlUp,
CVAR_Sound_LvlDown;

KeyValues kvPlayerType;

public void OnPluginStart()
{
    CVAR_Version = CreateConVar("sm_naithon_level_version", PLUGIN_VERSION, "Версия плагина", FCVAR_NOTIFY, false);
    CVAR_Enabled = CreateConVar("sm_naithon_level_enabled", "1", "Вкл/откл плагина", _, true, 0.0, true, 1.0);
   
    CVAR_TMREXP = CreateConVar("sm_naithon_level_time_exp", "1", "Дает это количество очков опыта каждые 2 минуты", _, true, 0.0, false);
    CVAR_killEXP = CreateConVar("sm_naithon_level_kill_exp", "1", "Дает это количество очков опыта при убийстве", _, true, 0.0, false);
    CVAR_pickUpEXP = CreateConVar("sm_naithon_level_pickup_exp", "3", "Дает это количество очков опыта при взятии флага", _, true, 0.0, false);
    CVAR_CaptureFlagEXP = CreateConVar("sm_naithon_level_capture_exp", "7", "Дает это количество очков опыта при захвате флага", _, true, 0.0, false);
    CVAR_DefendFlagEXP = CreateConVar("sm_naithon_level_defend_exp", "5", "Дает это количество очков опыта при защите флага", _, true, 0.0, false);
    CVAR_BlockerCapEXP = CreateConVar("sm_naithon_level_blocker_exp", "5", "Дает это количество очков опыта, тому кто остановил захват точки", _, true, 0.0, false);
    CVAR_VictimCapEXP = CreateConVar("sm_naithon_level_victim_exp", "3", "Дает это количество очков опыта, тому кто попытался захватить точку", _, true, 0.0, false);
    CVAR_CapturePointEXP = CreateConVar("sm_naithon_level_cap_point_exp", "3", "Дает это количество очков опыта, тем кто захватил точку", _, true, 0.0, false);
    CVAR_StartCapPointEXP = CreateConVar("sm_naithon_level_startcap_point_exp", "1", "Дает это количество очков опыта, тому кто начал захват точки", _, true, 0.0, false);
    CVAR_DoubleEXP = CreateConVar("sm_naithon_level_double_exp", "2", "Прибавляет получение очков опыта", _, true, 0.0, false);
    CVAR_TripleCash = CreateConVar("sm_naithon_level_triple_cash", "3", "Прибавляет получение денег", _, true, 0.0, false);
   
    CVAR_Hud_Name_Channel = CreateConVar("sm_naithon_level_hud_channel_name", "0", "Канал для отображения HUD текста про имя и тип игрока", _, true, -1.0, false);
    CVAR_Hud_Level_Channel = CreateConVar("sm_naithon_level_hud_channel_level", "1", "Канал для отображения HUD текста про уровень, ОП и подпись", _, true, -1.0, false);
   
    CVAR_Hud_FX_Time = CreateConVar("sm_naithon_level_hud_fx_time", "1.0", "Длительность FX для HUD текста", _, false);
    CVAR_Hud_HoldTime = CreateConVar("sm_naithon_level_hud_hold_time", "0.3", "Длительность показа HUD текста", _, false);
    CVAR_Hud_Name_X_Pos = CreateConVar("sm_naithon_level_hud_name_x_pos", "0.005", "Координата X для HUD текста про ник", _, true, -1.0, true, 1.0);
    CVAR_Hud_Name_Y_Pos = CreateConVar("sm_naithon_level_hud_name_y_pos", "0.005", "Координата Y для HUD текста про ник", _, true, -1.0, true, 1.0);
    CVAR_Hud_Level_X_Pos = CreateConVar("sm_naithon_level_hud_level_x_pos", "0.005", "Координата X для HUD текста про уровень", _, true, -1.0, true, 1.0);
    CVAR_Hud_Level_Y_Pos = CreateConVar("sm_naithon_level_hud_level_y_pos", "0.04", "Координата Y для HUD текста про уровень", _, true, -1.0, true, 1.0);
    CVAR_Hud_FadeIn = CreateConVar("sm_naithon_level_hud_fadein", "0.5", "Вход для HUD текста", _, false);
    CVAR_Hud_FadeOut = CreateConVar("sm_naithon_level_hud_fadeout", "0.5", "Выход для HUD текста", _, false);
   
    CVAR_Hud_Name_Color_R = CreateConVar("sm_naithon_level_hud_color_name_r", "255", "Цвет Red для HUD текста про ник", _, true, 0.0, true, 255.0);
    CVAR_Hud_Name_Color_G = CreateConVar("sm_naithon_level_hud_color_name_g", "255", "Цвет Green для HUD текста про ник", _, true, 0.0, true, 255.0);
    CVAR_Hud_Name_Color_B = CreateConVar("sm_naithon_level_hud_color_name_b", "255", "Цвет Blue для HUD текста про ник", _, true, 0.0, true, 255.0);
    CVAR_Hud_Name_Color_A = CreateConVar("sm_naithon_level_hud_color_name_a", "255", "Цвет Alpha для HUD текста про ник", _, true, 0.0, true, 255.0);
   
    CVAR_Hud_Level_Color_R = CreateConVar("sm_naithon_level_hud_color_level_r", "55", "Цвет Red для HUD текста про уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Level_Color_G = CreateConVar("sm_naithon_level_hud_color_level_g", "225", "Цвет Green для HUD текста про уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Level_Color_B = CreateConVar("sm_naithon_level_hud_color_level_b", "220", "Цвет Blue для HUD текста про уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Level_Color_A = CreateConVar("sm_naithon_level_hud_color_level_a", "255", "Цвет Alpha для HUD текста про уровень", _, true, 0.0, true, 255.0);
   
    CVAR_Hud_Double_Level_Color_R = CreateConVar("sm_naithon_level_hud_color_double_level_r", "165", "Цвет Red для HUD текста про бонусный уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Double_Level_Color_G = CreateConVar("sm_naithon_level_hud_color_double_level_g", "30", "Цвет Green для HUD текста про бонусный уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Double_Level_Color_B = CreateConVar("sm_naithon_level_hud_color_double_level_b", "230", "Цвет Blue для HUD текста про бонусный уровень", _, true, 0.0, true, 255.0);
    CVAR_Hud_Double_Level_Color_A = CreateConVar("sm_naithon_level_hud_color_double_level_a", "255", "Цвет Alpha для HUD текста про бонусный уровень", _, true, 0.0, true, 255.0);
   
    CVAR_Hud_Refresh = CreateConVar("sm_naithon_level_hud_refresh", "0.49", "Время, через которое таймер будет обновлять HUD текст", _, true, 0.0, false);
    CVAR_Timer_Cash = CreateConVar("sm_naithon_level_timer_cash", "300.0", "Время, через которое игрок будет получать кредиты за игру на сервере", _, true, 0.0, false);
    CVAR_Timer_EXP = CreateConVar("sm_naithon_level_timer_exp", "120.0", "Время, через которое игрок будет получать ОП за игру на сервере", _, true, 0.0, false);
    CVAR_Timer_Gems = CreateConVar("sm_naithon_level_timer_gems", "600.0", "Время, через которое игрок будет получать кристаллы за игру на сервере", _, true, 0.0, false);
   
    CVAR_Sound_LvlUp = CreateConVar("sm_naithon_level_sound_lvl_up", "misc/achievement_earned.wav", _, false);
    CVAR_Sound_LvlDown = CreateConVar("sm_naithon_level_sound_lvl_down", "ui/duel_challenge_rejected_with_restriction.wav", _, false);

    HookConVarChange(CVAR_Enabled, HookPluginActive);
    HookConVarChange(CVAR_Version, HookPluginActive);
    HookConVarChange(CVAR_TMREXP, HookPluginActive);
    HookConVarChange(CVAR_killEXP, HookPluginActive);
    HookConVarChange(CVAR_pickUpEXP, HookPluginActive);
    HookConVarChange(CVAR_CaptureFlagEXP, HookPluginActive);
    HookConVarChange(CVAR_DefendFlagEXP, HookPluginActive);
    HookConVarChange(CVAR_BlockerCapEXP, HookPluginActive);
    HookConVarChange(CVAR_VictimCapEXP, HookPluginActive);
    HookConVarChange(CVAR_CapturePointEXP, HookPluginActive);
    HookConVarChange(CVAR_StartCapPointEXP, HookPluginActive);
    HookConVarChange(CVAR_DoubleEXP, HookPluginActive);
    HookConVarChange(CVAR_TripleCash, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Channel, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Channel, HookPluginActive);
    HookConVarChange(CVAR_Hud_FX_Time, HookPluginActive);
    HookConVarChange(CVAR_Hud_HoldTime, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_X_Pos, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Y_Pos, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_X_Pos, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Y_Pos, HookPluginActive);
    HookConVarChange(CVAR_Hud_FadeIn, HookPluginActive);
    HookConVarChange(CVAR_Hud_FadeOut, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Color_R, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Color_G, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Color_B, HookPluginActive);
    HookConVarChange(CVAR_Hud_Name_Color_A, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Color_R, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Color_G, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Color_B, HookPluginActive);
    HookConVarChange(CVAR_Hud_Level_Color_A, HookPluginActive);
    HookConVarChange(CVAR_Hud_Double_Level_Color_R, HookPluginActive);
    HookConVarChange(CVAR_Hud_Double_Level_Color_G, HookPluginActive);
    HookConVarChange(CVAR_Hud_Double_Level_Color_B, HookPluginActive);
    HookConVarChange(CVAR_Hud_Double_Level_Color_A, HookPluginActive);
    HookConVarChange(CVAR_Hud_Refresh, HookPluginActive);
    HookConVarChange(CVAR_Timer_Cash, HookPluginActive);
    HookConVarChange(CVAR_Timer_EXP, HookPluginActive);
    HookConVarChange(CVAR_Timer_Gems, HookPluginActive);
    HookConVarChange(CVAR_Sound_LvlUp, HookPluginActive);
    HookConVarChange(CVAR_Sound_LvlDown, HookPluginActive);
   
    Naithon_Level_Enabled = GetConVarBool(CVAR_Enabled);
   
    CVAR_Version.SetString(PLUGIN_VERSION);
   
    AutoExecConfig(true, "naithon_level", "sourcemod/naithon");
   
    if (Naithon_Level_Enabled)
    {
        #if defined DEBUG
        LogToFileEx(DEBUG_LOG_FILE, "-----------------------------------------------------------------");
        LogToFileEx(DEBUG_LOG_FILE, "--- Начало отладки ---");
        #endif
        PrintToServer("***NAITHON'S CORE: NAITHON'S LEVEL SYSTEM LOADED (VERSION: %s)***", PLUGIN_VERSION);
        PrintToServer("***NAITHON'S CORE: NAITHON'S LEVEL SYSTEM NOW WATCHING FOR MODULES...***");
        #if defined DEBUG
        LogToFileEx(DEBUG_LOG_FILE, "Система уровней версии %s загружена!", PLUGIN_VERSION);
        #endif
        HookEvent("player_death", EVENT_PlayerDeath);
        HookEvent("teamplay_flag_event", EVENT_TeamPlay_Flag);
        HookEvent("teamplay_capture_blocked", EVENT_TeamPlay_Cap_Blocked);
        HookEvent("teamplay_point_captured", EVENT_TeamPlay_Point_Captured);
        HookEvent("teamplay_point_startcapture", EVENT_TeamPlay_Point_StartCap);
       
        RegConsoleCmd("sm_creditstoexp", CMD_CreditsToEXP, "Обменивает кредиты на опыт.");
        RegConsoleCmd("sm_exptocredits", CMD_EXPToCredits, "Обменивает опыт на кредиты.");
        RegConsoleCmd("sm_removelvl", CMD_RemoveLVL, "Обнуляет ваш уровень и очки опыта.");
        RegConsoleCmd("sm_removecash", CMD_RemoveCash, "Обнуляет ваши кредиты.");
        RegConsoleCmd("sm_setsign", CMD_SetSign, "Меняет вашу подпись.");
        RegConsoleCmd("sm_mycredits", CMD_MyCredits, "Показывает информацию о ваших кредитах.");
        RegConsoleCmd("sm_mygems", CMD_MyGems, "Показывает информацию о ваших кристаллах.");
        RegConsoleCmd("sm_myexp", CMD_MyEXP, "Показывает информацию о вашем опыте.");
        RegConsoleCmd("sm_pay", CMD_PayCash, "Отдаёт ваши кредиты другому игроку.");
        RegAdminCmd("sm_giveexp", ACMD_GiveEXP, ADMFLAG_CONFIG, "Даёт/забирает/устанавливает у игрока определённое количество очков опыта.");
        RegAdminCmd("sm_givelvl", ACMD_GiveLvl, ADMFLAG_CONFIG, "Даёт/забирает/устанавливает у игрока определённый уровень.");
        RegAdminCmd("sm_givecash", ACMD_GiveCash, ADMFLAG_CONFIG, "Даёт/забирает/устанавливает у игрока определённое количество кредитов.");
        RegAdminCmd("sm_givegems", ACMD_GiveGems, ADMFLAG_CONFIG, "Даёт/забирает/устанавливает у игрока определённое количество кристаллов.");
        RegAdminCmd("sm_asetsign", ACMD_SetSign, ADMFLAG_CONFIG, "Позволяет менять подпись у игрока (подпись указывать в \"ковычках\").");
        RegAdminCmd("sm_settype", ACMD_SetType, ADMFLAG_CONFIG, "Позволяет менять тип игрока.");
        RegAdminCmd("sm_saveclient", ACMD_SaveClient, ADMFLAG_GENERIC, "Сохраняет данные игрока (Уровень, ОП, тип и т.п.) в БД. Используйте это, если автосохранение не работает!");
        RegAdminCmd("sm_slvlup", ACMD_SmplIncreaseLvl, ADMFLAG_CONFIG, "Повышает игрока на +1 уровень.");
        RegAdminCmd("sm_alvlup", ACMD_AdvIncreaseLvl, ADMFLAG_CONFIG, "Повышает игрока на несколько уровней (нужно указать количество).");
        RegAdminCmd("sm_slvldown", ACMD_SmplReduceLvl, ADMFLAG_CONFIG, "Понижает на -1 уровень игрока.");
        RegAdminCmd("sm_alvldown", ACMD_AdvReduceLvl, ADMFLAG_CONFIG, "Понижает на несколько уровней игрока (нужно указать количество).");

        ConnectToDB();
       
        CVAR_Sound_LvlUp.GetString(LEVEL_UP_SOUND, sizeof(LEVEL_UP_SOUND));
        CVAR_Sound_LvlDown.GetString(LEVEL_DOWN_SOUND, sizeof(LEVEL_DOWN_SOUND));
       
        BuildPath(Path_SM, PlayerTypeConfigPath, sizeof(PlayerTypeConfigPath), "configs/naithon/level/player_type.cfg");
        kvPlayerType = CreateKeyValues("PlayerType");
        FileToKeyValues(kvPlayerType, PlayerTypeConfigPath);
       
        DoubleEXP = GetConVarInt(CVAR_DoubleEXP);
        TripleCash = GetConVarInt(CVAR_TripleCash);
        TMREXP = GetConVarInt(CVAR_TMREXP);
        TMRDEXP = TMREXP + DoubleEXP;
        killEXP = GetConVarInt(CVAR_killEXP);
        DEXP = killEXP + DoubleEXP;
        pickUp_Flag_EXP = GetConVarInt(CVAR_pickUpEXP);
        pickUp_Flag_EXP_D = pickUp_Flag_EXP + DoubleEXP;
        Capture_Flag_EXP = GetConVarInt(CVAR_CaptureFlagEXP);
        Capture_Flag_EXP_D = Capture_Flag_EXP + DoubleEXP;
        Defend_Flag_EXP = GetConVarInt(CVAR_DefendFlagEXP);
        Defend_Flag_EXP_D = Defend_Flag_EXP + DoubleEXP;
        Cap_Blocker_EXP = GetConVarInt(CVAR_BlockerCapEXP);
        Cap_Blocker_EXP_D = Cap_Blocker_EXP + DoubleEXP;
        Cap_Victim_EXP = GetConVarInt(CVAR_VictimCapEXP);
        Cap_Victim_EXP_D = Cap_Victim_EXP + DoubleEXP;
        Cap_Point_EXP = GetConVarInt(CVAR_CapturePointEXP);
        Cap_Point_EXP_D = Cap_Point_EXP + DoubleEXP;
        Start_Cap_Point_EXP = GetConVarInt(CVAR_StartCapPointEXP);
        Start_Cap_Point_EXP_D = Start_Cap_Point_EXP + DoubleEXP;
        iHud_Name_Channel = GetConVarInt(CVAR_Hud_Name_Channel);
        iHud_Level_Channel = GetConVarInt(CVAR_Hud_Level_Channel);
        iHud_Name_Color_R = GetConVarInt(CVAR_Hud_Name_Color_R);
        iHud_Name_Color_G = GetConVarInt(CVAR_Hud_Name_Color_G);
        iHud_Name_Color_B = GetConVarInt(CVAR_Hud_Name_Color_B);
        iHud_Name_Color_A = GetConVarInt(CVAR_Hud_Name_Color_A);
        iHud_Level_Color_R = GetConVarInt(CVAR_Hud_Level_Color_R);
        iHud_Level_Color_G = GetConVarInt(CVAR_Hud_Level_Color_G);
        iHud_Level_Color_B = GetConVarInt(CVAR_Hud_Level_Color_B);
        iHud_Level_Color_A = GetConVarInt(CVAR_Hud_Level_Color_A);
        iHud_Double_Level_Color_R = GetConVarInt(CVAR_Hud_Double_Level_Color_R);
        iHud_Double_Level_Color_G = GetConVarInt(CVAR_Hud_Double_Level_Color_G);
        iHud_Double_Level_Color_B = GetConVarInt(CVAR_Hud_Double_Level_Color_B);
        iHud_Double_Level_Color_A = GetConVarInt(CVAR_Hud_Double_Level_Color_A);
       
        fHud_FX_Time = GetConVarFloat(CVAR_Hud_FX_Time);
        fHud_HoldTime = GetConVarFloat(CVAR_Hud_HoldTime);
        fHud_Name_X_Pos = GetConVarFloat(CVAR_Hud_Name_X_Pos);
        fHud_Name_Y_Pos = GetConVarFloat(CVAR_Hud_Name_Y_Pos);
        fHud_Level_X_Pos = GetConVarFloat(CVAR_Hud_Level_X_Pos);
        fHud_Level_Y_Pos = GetConVarFloat(CVAR_Hud_Level_Y_Pos);
        fHud_FadeIn = GetConVarFloat(CVAR_Hud_FadeIn);
        fHud_FadeOut = GetConVarFloat(CVAR_Hud_FadeOut);
       
        for (int i = 1; i <= MaxClients; i++)
        {
            if (IsValidClient(i))
            {
                ShowHUD(i);
                TIMER_HudRefresh[i] = CreateTimer(GetConVarFloat(CVAR_Hud_Refresh), RefreshPlayerHUD, GetClientUserId(i), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
                TIMER_Cash[i] = CreateTimer(GetConVarFloat(CVAR_Timer_Cash), TMR_AddCash, GetClientUserId(i), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
                TIMER_EXP[i] = CreateTimer(GetConVarFloat(CVAR_Timer_EXP), TMR_AddEXP, GetClientUserId(i), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
                TIMER_Gems[i] = CreateTimer(GetConVarFloat(CVAR_Timer_Gems), TMR_AddGems, GetClientUserId(i), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
               
                GetPlayerTypeData(i, "string", sPlayerType[i], sizeof(sPlayerType[]));
                GetPlayerTypeData(i, "chat", sPlayerTypeHex[i], sizeof(sPlayerTypeHex[]));
                //Army_GetStringRank(i, sPlayerRank[i]);
               
                char buffer[MAX_NAME_LENGTH];
                GetClientName(i, buffer, sizeof(buffer));
                PlayerCanDoubleBonus[i] = !strncmp(buffer, NICKTAG, sizeof(NICKTAG) - 1);
            }
        }
    }
    else
    {
        PrintToServer("***NAITHON'S CORE: NAITHON'S LEVEL SYSTEM DISABLED BY CVARS!***");
    }
}

Код подключения игрока:
PHP:
public void OnClientPostAdminCheck(int iClient)
{
 if (Naithon_Level_Enabled && IsValidClient(iClient))
 {
 DataPack pack = new DataPack();
 DATATIMER_Connect[iClient] = CreateDataTimer(0.1, TMR_Connected, pack);
 pack.WriteCell(iClient);
 
 char buffer[MAX_NAME_LENGTH];
 GetClientName(iClient, buffer, sizeof(buffer));
 PlayerCanDoubleBonus[iClient] = !strncmp(buffer, NICKTAG, sizeof(NICKTAG) - 1);
 }
}

public Action TMR_Connected(Handle timer, DataPack pack)
{
 int iClient;
 
 pack.Reset();
 iClient = pack.ReadCell();
 DATATIMER_Connect[iClient] = INVALID_HANDLE;

 if (IsValidClient(iClient))
 {
 //Army_GetStringRank(iClient, sPlayerRank[iClient]);
 //Army_GetStringAtributes(iClient, "PrefixColor", "{green}", sPlayerRankColor[iClient], sizeof(sPlayerRankColor[]));
 GetPlayerTypeData(iClient, "string", sPlayerType[iClient], sizeof(sPlayerType[]));
 GetPlayerTypeData(iClient, "chat", sPlayerTypeHex[iClient], sizeof(sPlayerTypeHex[]));
 CPrintToChatAll("{lime}[+] {gold}%N {default}- \x07%s%s %i уровня {default}подключился{lime}!", iClient, /*sPlayerRankColor[iClient], sPlayerRank[iClient],*/sPlayerTypeHex[iClient], sPlayerType[iClient], PlayerLevel[iClient]);
 #if defined DEBUG
 LogToFileEx(DEBUG_LOG_FILE, "[+] %N - %s %i уровня подключился!", iClient, sPlayerType[iClient], PlayerLevel[iClient]);
 #endif
 
 PlayerEXPProgressPercent[iClient] = GetPlayerEXPProgressPercent(iClient);
 PlayerEXPUpNeeded[iClient] = GetPlayerEXPUpNeeded(iClient);
 #if defined DEBUG
 LogToFileEx(DEBUG_LOG_FILE, "%N: Получены данные об ОП: %i / %i ОП, осталось собрать %i ОП, общий прогресс %.0f%%", iClient, PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerEXPUpNeeded[iClient], PlayerEXPProgressPercent[iClient]);
 #endif
 
 ShowHUD(iClient);
 PrintEdictsToChat(iClient);
 CPrintToChat(iClient, "{yellowgreen}Добро пожаловать на сервер! {greenyellow}Вам осталось собрать {yellow}%i {greenyellow}ОП, общий прогресс: {yellow}%.0f%%", PlayerEXPUpNeeded[iClient], PlayerEXPProgressPercent[iClient]);
 
 TIMER_HudRefresh[iClient] = CreateTimer(GetConVarFloat(CVAR_Hud_Refresh), RefreshPlayerHUD, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
 TIMER_Cash[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_Cash), TMR_AddCash, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
 TIMER_EXP[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_EXP), TMR_AddEXP, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
 TIMER_Gems[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_Gems), TMR_AddGems, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
 }
 return Plugin_Continue;
}


В чём может быть причина? Просто друзья просят, чтобы я включил сервер, а я не могу из-за этой проблемы.
Если надо, я могу добавить ещё отрывки из кода.
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Если ты передаешь в коллбек таймера только индекс клиента, то датапак не нужен.
А так из того что есть, ничего крашить сервер не будет.
Ну а функции типа GetPlayerEXPProgressPercent, GetPlayerEXPUpNeeded и т.д. ты не выложил. В общем, всё, что ты показал просто бесполезно.

Так как ты не хочешь скидывать свой плагин, а писать вот такие вот темки, то просто ставь штуку, а потом показывай краш дампы.
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Если ты передаешь в коллбек таймера только индекс клиента, то датапак не нужен.
А так из того что есть, ничего крашить сервер не будет.
Ну а функции типа GetPlayerEXPProgressPercent, GetPlayerEXPUpNeeded и т.д. ты не выложил. В общем, всё, что ты показал просто бесполезно.

Так как ты не хочешь скидывать свой плагин, а писать вот такие вот темки, то просто ставь штуку, а потом показывай краш дампы.
Дело в том, что у меня в стартовом батнике сервера стоит параметр -nocrashdialog, но если есть сообщение о краше, оно записывается в логи.
В этой ситуации при подключении игрока сервер крашится без ошибок, в логах пусто (создаются пустые логи).
--- Добавлено позже ---
Теперь я пробую вообще удалить TMR_Connected и записать всё в OnClientPutInServer (ведь OnClientPutInServer вызывается когда игрок уже подключён к серверу и ожидает появления MOTD, не так ли?)
--- Добавлено позже ---
Как я и думал, Accelerator не создал краш дампы. Также я залогинился на Throttle, но там тоже пусто, а ведь сервер крашится без причины...
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
OnClientPutInServer вызывается когда игрок уже подключён к серверу и ожидает появления MOTD, не так ли?
Нет. Ближайший аналог подобного для встроенных в SM обратных вызовов:
C-подобный:
public void OnClientPostAdminCheck(int client)
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Нет. Ближайший аналог подобного для встроенных в SM обратных вызовов:
C-подобный:
public void OnClientPostAdminCheck(int client)
но ведь во многих плагинах используют именно OnClientPutInServer, как например способ поприведствовать игрока на сервере
--- Добавлено позже ---
а ещё если я щас перепишу в OnClientPostAdminCheck (не всё, а только мои собственные функции), можно использовать например вот так:
PHP:
#include <validClient>

public void OnClientPostAdminCheck(int iClient)
{
     if (Naithon_Level_Enabled && IsValidClient(iClient))
 {
  doSomething();
 }
}

P.S. я про то, что IsValidClient будет возвращать true? Просто там есть IsClientInGame, и я боюсь, что если игрок подключается ещё, то может быть false и тогда событие вообще не сработает.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
во многих плагинах используют именно OnClientPutInServer
Так многие пишут и на довольно низком уровне, не уделяя внимания оптимизации, например.
IsValidClient будет возвращать true? Просто там есть IsClientInGame
Всё, что выполняется позже OnClientPutInServer (при подключении) - пройдёт эту проверку. Строго говоря, она там и вовсе не нужна.
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
а ещё если я щас перепишу в OnClientPostAdminCheck (не всё, а только мои собственные функции), можно использовать например вот так:
PHP:
#include <validClient>

public void OnClientPostAdminCheck(int iClient)
{
     if (Naithon_Level_Enabled && IsValidClient(iClient))
{
  doSomething();
}
}

P.S. я про то, что IsValidClient будет возвращать true? Просто там есть IsClientInGame, и я боюсь, что если игрок подключается ещё
Так многие пишут и на довольно низком уровне, не уделяя внимания оптимизации, например.Всё, что выполняется позже OnClientPutInServer - пройдёт эту проверку. Строга говоря, она там и вовсе не нужна.
Ну а если вступает фейковый игрок или бот или SourceTV бот?
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
На то есть отдельные проверки - это уже конечно обязательно указывать, если необходимо.
Ладно, с этим понятно. У меня там есть ещё парочка проблем (2 серьёзных и остальных мало, с остальными легко разберусь), но про них потом напишу.

Вот у меня код. Мне надо заменить тип переменной hQuery, чтобы убрать ошибку:
error 105, cannot find method or property Handle.FetchRow, Handle.FetchInt и Handle.FetchString.

Код:
PHP:
public void SQLT_OnClientPutInServer(Handle hOwner, Handle hQuery, const char[] sError, any iUserId)
{
 int iClient = GetClientOfUserId(iUserId);
 
 if (!iClient)
 {
 return;
 }

 if (hQuery == INVALID_HANDLE)
 {
 LogError("SQLT_OnClientPutInServer: %s", sError);
 bIsClientLoaded[iClient] = false;
 #if defined DEBUG
 LogToFileEx(DEBUG_LOG_FILE, "ОШИБКА: SQLT_OnClientPutInServer: %s", sError);
 #endif
 }

 char sName[MAX_NAME_LENGTH], sName2[MAX_NAME_LENGTH];
 GetClientName(iClient, sName, sizeof(sName));
 if (hQuery.FetchRow())
 {
 iPlayerType[iClient] = hQuery.FetchInt(0);
 PlayerEXP[iClient] = hQuery.FetchInt(1);
 PlayerEXPUp[iClient] = hQuery.FetchInt(2);
 PlayerLevel[iClient] = hQuery.FetchInt(3);
 PlayerCash[iClient] = hQuery.FetchInt(4);
 PlayerCashLimit[iClient] = hQuery.FetchInt(5);
 PlayerGems[iClient] = hQuery.FetchInt(6);
 hQuery.FetchString(7, PlayerSign[iClient], sizeof(PlayerSign[]));
 bIsClientLoaded[iClient] = true;
 }
 else
 {
 iPlayerType[iClient] = 1;
 PlayerEXP[iClient] = 0;
 PlayerEXPUp[iClient] = GetRandomInt(5, 20);
 PlayerLevel[iClient] = 0;
 PlayerCash[iClient] = 0;
 PlayerCashLimit[iClient] = 2000;
 PlayerGems[iClient] = 0;
 PlayerSign[iClient] = NULL_STRING;
 char sQuery[1500];
 SQL_EscapeString(DB, sName, sName2, sizeof(sName2));
 Format(sQuery, sizeof(sQuery), "INSERT INTO `naithon_level` (`Players`, `SteamID`, `PlayerType`, `PlayerEXP`, `PlayerEXPUp`, `PlayerLevel`, `PlayerCash`, `PlayerCashLimit`, `PlayerGems`, `PlayerSign`) VALUES ('%s', '%s', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%s');", sName, PlayerSteamID[iClient], iPlayerType[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerGems[iClient], PlayerSign[iClient]);
 SQL_TQuery(DB, SQLT_OnInsertClient, sQuery, GetClientUserId(iClient));
 }
 
 Call_StartForward(WhenPlayerConnect);
 Call_PushCell(iClient);
 Call_PushCell(iPlayerType[iClient]);
 Call_PushCell(PlayerEXP[iClient]);
 Call_PushCell(PlayerEXPUp[iClient]);
 Call_PushCell(PlayerLevel[iClient]);
 Call_PushCell(PlayerCash[iClient]);
 Call_PushCell(PlayerCashLimit[iClient]);
 Call_PushCell(PlayerGems[iClient]);
 Call_PushString(PlayerSign[iClient]);
 Call_Finish();
}
--- Добавлено позже ---
На то есть отдельные проверки - это уже конечно обязательно указывать, если необходимо.
Короче, я всё поменял, но всё равно при подключении игрока (когда уже идёт "Отправка сведений о клиенте") сервер крашит. Отладка в лог пишет это:

L 07/08/2016 - 03:38:31: --- Начало отладки ---
L 07/08/2016 - 03:38:31: Система уровней версии 1.2.4.3.1 загружена!
L 07/08/2016 - 03:38:51: Получение данных SourceTV: Тип игрока - 0, ОП - 0/0, Уровень - 0, Кредиты - 0/0, Кристаллы - 0, Подпись - ''
L 07/08/2016 - 03:38:51: SourceTV: Получены данные об ОП: 0 / 0 ОП, осталось собрать -1 ОП, общий прогресс %
L 07/08/2016 - 03:39:11: --- Закончена отладка ---

Может мне скинуть тебе в личку плагин? Просто я уже целый месяц копаюсь в коде. Друзья просят, чтобы я убрал пароль с сервера, но если я это сделаю, они начнут подключатся и сервер будет постоянно крашить.
--- Добавлено позже ---
Щас мне ещё труднее будет, т.к., Volvo выпустили большое обновление сегодня в 4 утра на TF2 под названием "Meet your Watch". Я посмотрел новости обновлений и там добавили новые насмешки и суть в том, что мне теперь надо обновлять все TF2Items и т.д.
--- Добавлено позже ---
Щас мне ещё труднее будет, т.к., Volvo выпустили большое обновление сегодня в 4 утра
Ладно, с этим понятно. У меня там есть ещё парочка проблем (2 серьёзных и остальных мало, с остальными легко разберусь), но про них потом напишу.

Вот у меня код. Мне надо заменить тип переменной hQuery, чтобы убрать ошибку:
error 105, cannot find method or property Handle.FetchRow, Handle.FetchInt и Handle.FetchString.

Код:
PHP:
public void SQLT_OnClientPutInServer(Handle hOwner, Handle hQuery, const char[] sError, any iUserId)
{
int iClient = GetClientOfUserId(iUserId);

if (!iClient)
{
return;
}

if (hQuery == INVALID_HANDLE)
{
LogError("SQLT_OnClientPutInServer: %s", sError);
bIsClientLoaded[iClient] = false;
#if defined DEBUG
LogToFileEx(DEBUG_LOG_FILE, "ОШИБКА: SQLT_OnClientPutInServer: %s", sError);
#endif
}

char sName[MAX_NAME_LENGTH], sName2[MAX_NAME_LENGTH];
GetClientName(iClient, sName, sizeof(sName));
if (hQuery.FetchRow())
{
iPlayerType[iClient] = hQuery.FetchInt(0);
PlayerEXP[iClient] = hQuery.FetchInt(1);
PlayerEXPUp[iClient] = hQuery.FetchInt(2);
PlayerLevel[iClient] = hQuery.FetchInt(3);
PlayerCash[iClient] = hQuery.FetchInt(4);
PlayerCashLimit[iClient] = hQuery.FetchInt(5);
PlayerGems[iClient] = hQuery.FetchInt(6);
hQuery.FetchString(7, PlayerSign[iClient], sizeof(PlayerSign[]));
bIsClientLoaded[iClient] = true;
}
else
{
iPlayerType[iClient] = 1;
PlayerEXP[iClient] = 0;
PlayerEXPUp[iClient] = GetRandomInt(5, 20);
PlayerLevel[iClient] = 0;
PlayerCash[iClient] = 0;
PlayerCashLimit[iClient] = 2000;
PlayerGems[iClient] = 0;
PlayerSign[iClient] = NULL_STRING;
char sQuery[1500];
SQL_EscapeString(DB, sName, sName2, sizeof(sName2));
Format(sQuery, sizeof(sQuery), "INSERT INTO `naithon_level` (`Players`, `SteamID`, `PlayerType`, `PlayerEXP`, `PlayerEXPUp`, `PlayerLevel`, `PlayerCash`, `PlayerCashLimit`, `PlayerGems`, `PlayerSign`) VALUES ('%s', '%s', '%i', '%i', '%i', '%i', '%i', '%i', '%i', '%s');", sName, PlayerSteamID[iClient], iPlayerType[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerGems[iClient], PlayerSign[iClient]);
SQL_TQuery(DB, SQLT_OnInsertClient, sQuery, GetClientUserId(iClient));
}

Call_StartForward(WhenPlayerConnect);
Call_PushCell(iClient);
Call_PushCell(iPlayerType[iClient]);
Call_PushCell(PlayerEXP[iClient]);
Call_PushCell(PlayerEXPUp[iClient]);
Call_PushCell(PlayerLevel[iClient]);
Call_PushCell(PlayerCash[iClient]);
Call_PushCell(PlayerCashLimit[iClient]);
Call_PushCell(PlayerGems[iClient]);
Call_PushString(PlayerSign[iClient]);
Call_Finish();
}
--- Добавлено позже ---

Короче, я всё поменял, но всё равно при подключении игрока (когда уже идёт "Отправка сведений о клиенте") сервер крашит. Отладка в лог пишет это:

L 07/08/2016 - 03:38:31: --- Начало отладки ---
L 07/08/2016 - 03:38:31: Система уровней версии 1.2.4.3.1 загружена!
L 07/08/2016 - 03:38:51: Получение данных SourceTV: Тип игрока - 0, ОП - 0/0, Уровень - 0, Кредиты - 0/0, Кристаллы - 0, Подпись - ''
L 07/08/2016 - 03:38:51: SourceTV: Получены данные об ОП: 0 / 0 ОП, осталось собрать -1 ОП, общий прогресс %
L 07/08/2016 - 03:39:11: --- Закончена отладка ---

Может мне скинуть тебе в личку плагин? Просто я уже целый месяц копаюсь в коде. Друзья просят, чтобы я убрал пароль с сервера, но если я это сделаю, они начнут подключатся и сервер будет постоянно крашить.
--- Добавлено позже ---
Щас мне ещё труднее будет, т.к., Volvo выпустили большое обновление сегодня в 4 утра на TF2 под названием "Meet your Watch". Я посмотрел новости обновлений и там добавили новые насмешки и суть в том, что мне теперь надо обновлять все TF2Items и т.д.
Хотя их обновлять не надо.
 
Последнее редактирование:

Reg1oxeN

Участник
Сообщения
399
Реакции
314
в чем проблема методом тыка удалять части кода и проверять их на краши?
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Щас мне ещё труднее будет, т.к., Volvo выпустили большое обновление сегодня в 4 утра
в чем проблема методом тыка удалять части кода и проверять их на краши?
Дело в том, что я уже не могу вспомнить, что я сделал такого, что всё крашится без ошибок. Я много каких изменений сделал в коде, где-то удалил ненужное (для меня), где-то просто подправил, где-то перенёс на синтакс SourceMod 1.7 (methodmap и т.д.).

Для меня код выглядит вполне нормальным, критических ошибок нет, есть только предупреждения о том, что я создал переменные и не использую их.
И я ещё кое-что проверил, оказывается сервер крашит не только когда я подключаюсь. Если отключить плагин и зайти, то я нормально могу играть на сервере, но если в этот момент загрузить плагин, консоль сразу же закрывается и перезапускается. В логах пусто, дамп крашей нету, сервер молчит про это и просто перезапускается.

Я уже всё перерыл, но всё равно не пойму в чём дело.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
если в этот момент загрузить плагин, консоль сразу же закрывается и перезапускается
Тут, скорей всего, дело в:
Или в содержимом цикла:
for (int i = 1; i <= MaxClients; i++)
Что напихано в OnPluginStart(). Попробуй временно отключить эти функции (сначала одну, потом другую).
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Тут, скорей всего, дело в:Или в содержимом:Что напихано в OnPluginStart(). Попробуй временно отключить эти функции (сначала одну, потом другую).
ConnectToDB( ) я взял из плагина Army Ranks 1.0.1, но там у меня щас стоит Army Ranks 2.0 Alpha. Причём Army Ranks хорошо работает, а в свой плагин я большинство действий с SQLite взял из кода Army Ranks 1.0.1, но щас я смотрю в код Army Ranks 2.0 и там подключение к БД идёт по другому. Там используется void OnConfigsExecuted и SQL_TConnect.
--- Добавлено позже ---
Может попробовать и мне сделать подключение через SQL_TConnect?
--- Добавлено позже ---
P.S. Цикл for (int i = 1; i <= MaxClients; i++) я удалил вообще.
--- Добавлено позже ---
ПРОБЛЕМУ С КРАШЕМ ВРОДЕ РЕШИЛ, НО ТЕПЕРЬ ПОЯВИЛАСЬ ДРУГАЯ.
В БД (SQLite), в .sq3 файле (я его программой SQLiteStudio открываю) у меня отображаются данные правильно, но на сервере всё равно 0;
 
Последнее редактирование:
Сверху Снизу