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

Тема в разделе "Программирование / Скриптинг", создана пользователем MAGNAT2645, 7 июл 2016.

  1. MAGNAT2645

    MAGNAT2645

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

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


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

    Также некоторые отрывки я взял из плагина 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_EnabledPlayerCanDoubleBonus[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_NOTIFYfalse);
        
    CVAR_Enabled CreateConVar("sm_naithon_level_enabled""1""Вкл/откл плагина"_true0.0true1.0);
       
        
    CVAR_TMREXP CreateConVar("sm_naithon_level_time_exp""1""Дает это количество очков опыта каждые 2 минуты"_true0.0false);
        
    CVAR_killEXP CreateConVar("sm_naithon_level_kill_exp""1""Дает это количество очков опыта при убийстве"_true0.0false);
        
    CVAR_pickUpEXP CreateConVar("sm_naithon_level_pickup_exp""3""Дает это количество очков опыта при взятии флага"_true0.0false);
        
    CVAR_CaptureFlagEXP CreateConVar("sm_naithon_level_capture_exp""7""Дает это количество очков опыта при захвате флага"_true0.0false);
        
    CVAR_DefendFlagEXP CreateConVar("sm_naithon_level_defend_exp""5""Дает это количество очков опыта при защите флага"_true0.0false);
        
    CVAR_BlockerCapEXP CreateConVar("sm_naithon_level_blocker_exp""5""Дает это количество очков опыта, тому кто остановил захват точки"_true0.0false);
        
    CVAR_VictimCapEXP CreateConVar("sm_naithon_level_victim_exp""3""Дает это количество очков опыта, тому кто попытался захватить точку"_true0.0false);
        
    CVAR_CapturePointEXP CreateConVar("sm_naithon_level_cap_point_exp""3""Дает это количество очков опыта, тем кто захватил точку"_true0.0false);
        
    CVAR_StartCapPointEXP CreateConVar("sm_naithon_level_startcap_point_exp""1""Дает это количество очков опыта, тому кто начал захват точки"_true0.0false);
        
    CVAR_DoubleEXP CreateConVar("sm_naithon_level_double_exp""2""Прибавляет получение очков опыта"_true0.0false);
        
    CVAR_TripleCash CreateConVar("sm_naithon_level_triple_cash""3""Прибавляет получение денег"_true0.0false);
       
        
    CVAR_Hud_Name_Channel CreateConVar("sm_naithon_level_hud_channel_name""0""Канал для отображения HUD текста про имя и тип игрока"_true, -1.0false);
        
    CVAR_Hud_Level_Channel CreateConVar("sm_naithon_level_hud_channel_level""1""Канал для отображения HUD текста про уровень, ОП и подпись"_true, -1.0false);
       
        
    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.0true1.0);
        
    CVAR_Hud_Name_Y_Pos CreateConVar("sm_naithon_level_hud_name_y_pos""0.005""Координата Y для HUD текста про ник"_true, -1.0true1.0);
        
    CVAR_Hud_Level_X_Pos CreateConVar("sm_naithon_level_hud_level_x_pos""0.005""Координата X для HUD текста про уровень"_true, -1.0true1.0);
        
    CVAR_Hud_Level_Y_Pos CreateConVar("sm_naithon_level_hud_level_y_pos""0.04""Координата Y для HUD текста про уровень"_true, -1.0true1.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 текста про ник"_true0.0true255.0);
        
    CVAR_Hud_Name_Color_G CreateConVar("sm_naithon_level_hud_color_name_g""255""Цвет Green для HUD текста про ник"_true0.0true255.0);
        
    CVAR_Hud_Name_Color_B CreateConVar("sm_naithon_level_hud_color_name_b""255""Цвет Blue для HUD текста про ник"_true0.0true255.0);
        
    CVAR_Hud_Name_Color_A CreateConVar("sm_naithon_level_hud_color_name_a""255""Цвет Alpha для HUD текста про ник"_true0.0true255.0);
       
        
    CVAR_Hud_Level_Color_R CreateConVar("sm_naithon_level_hud_color_level_r""55""Цвет Red для HUD текста про уровень"_true0.0true255.0);
        
    CVAR_Hud_Level_Color_G CreateConVar("sm_naithon_level_hud_color_level_g""225""Цвет Green для HUD текста про уровень"_true0.0true255.0);
        
    CVAR_Hud_Level_Color_B CreateConVar("sm_naithon_level_hud_color_level_b""220""Цвет Blue для HUD текста про уровень"_true0.0true255.0);
        
    CVAR_Hud_Level_Color_A CreateConVar("sm_naithon_level_hud_color_level_a""255""Цвет Alpha для HUD текста про уровень"_true0.0true255.0);
       
        
    CVAR_Hud_Double_Level_Color_R CreateConVar("sm_naithon_level_hud_color_double_level_r""165""Цвет Red для HUD текста про бонусный уровень"_true0.0true255.0);
        
    CVAR_Hud_Double_Level_Color_G CreateConVar("sm_naithon_level_hud_color_double_level_g""30""Цвет Green для HUD текста про бонусный уровень"_true0.0true255.0);
        
    CVAR_Hud_Double_Level_Color_B CreateConVar("sm_naithon_level_hud_color_double_level_b""230""Цвет Blue для HUD текста про бонусный уровень"_true0.0true255.0);
        
    CVAR_Hud_Double_Level_Color_A CreateConVar("sm_naithon_level_hud_color_double_level_a""255""Цвет Alpha для HUD текста про бонусный уровень"_true0.0true255.0);
       
        
    CVAR_Hud_Refresh CreateConVar("sm_naithon_level_hud_refresh""0.49""Время, через которое таймер будет обновлять HUD текст"_true0.0false);
        
    CVAR_Timer_Cash CreateConVar("sm_naithon_level_timer_cash""300.0""Время, через которое игрок будет получать кредиты за игру на сервере"_true0.0false);
        
    CVAR_Timer_EXP CreateConVar("sm_naithon_level_timer_exp""120.0""Время, через которое игрок будет получать ОП за игру на сервере"_true0.0false);
        
    CVAR_Timer_Gems CreateConVar("sm_naithon_level_timer_gems""600.0""Время, через которое игрок будет получать кристаллы за игру на сервере"_true0.0false);
       
        
    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_EnabledHookPluginActive);
        
    HookConVarChange(CVAR_VersionHookPluginActive);
        
    HookConVarChange(CVAR_TMREXPHookPluginActive);
        
    HookConVarChange(CVAR_killEXPHookPluginActive);
        
    HookConVarChange(CVAR_pickUpEXPHookPluginActive);
        
    HookConVarChange(CVAR_CaptureFlagEXPHookPluginActive);
        
    HookConVarChange(CVAR_DefendFlagEXPHookPluginActive);
        
    HookConVarChange(CVAR_BlockerCapEXPHookPluginActive);
        
    HookConVarChange(CVAR_VictimCapEXPHookPluginActive);
        
    HookConVarChange(CVAR_CapturePointEXPHookPluginActive);
        
    HookConVarChange(CVAR_StartCapPointEXPHookPluginActive);
        
    HookConVarChange(CVAR_DoubleEXPHookPluginActive);
        
    HookConVarChange(CVAR_TripleCashHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_ChannelHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_ChannelHookPluginActive);
        
    HookConVarChange(CVAR_Hud_FX_TimeHookPluginActive);
        
    HookConVarChange(CVAR_Hud_HoldTimeHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_X_PosHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_Y_PosHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_X_PosHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_Y_PosHookPluginActive);
        
    HookConVarChange(CVAR_Hud_FadeInHookPluginActive);
        
    HookConVarChange(CVAR_Hud_FadeOutHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_Color_RHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_Color_GHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_Color_BHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Name_Color_AHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_Color_RHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_Color_GHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_Color_BHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Level_Color_AHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Double_Level_Color_RHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Double_Level_Color_GHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Double_Level_Color_BHookPluginActive);
        
    HookConVarChange(CVAR_Hud_Double_Level_Color_AHookPluginActive);
        
    HookConVarChange(CVAR_Hud_RefreshHookPluginActive);
        
    HookConVarChange(CVAR_Timer_CashHookPluginActive);
        
    HookConVarChange(CVAR_Timer_EXPHookPluginActive);
        
    HookConVarChange(CVAR_Timer_GemsHookPluginActive);
        
    HookConVarChange(CVAR_Sound_LvlUpHookPluginActive);
        
    HookConVarChange(CVAR_Sound_LvlDownHookPluginActive);
       
        
    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_GiveEXPADMFLAG_CONFIG"Даёт/забирает/устанавливает у игрока определённое количество очков опыта.");
            
    RegAdminCmd("sm_givelvl"ACMD_GiveLvlADMFLAG_CONFIG"Даёт/забирает/устанавливает у игрока определённый уровень.");
            
    RegAdminCmd("sm_givecash"ACMD_GiveCashADMFLAG_CONFIG"Даёт/забирает/устанавливает у игрока определённое количество кредитов.");
            
    RegAdminCmd("sm_givegems"ACMD_GiveGemsADMFLAG_CONFIG"Даёт/забирает/устанавливает у игрока определённое количество кристаллов.");
            
    RegAdminCmd("sm_asetsign"ACMD_SetSignADMFLAG_CONFIG"Позволяет менять подпись у игрока (подпись указывать в \"ковычках\").");
            
    RegAdminCmd("sm_settype"ACMD_SetTypeADMFLAG_CONFIG"Позволяет менять тип игрока.");
            
    RegAdminCmd("sm_saveclient"ACMD_SaveClientADMFLAG_GENERIC"Сохраняет данные игрока (Уровень, ОП, тип и т.п.) в БД. Используйте это, если автосохранение не работает!");
            
    RegAdminCmd("sm_slvlup"ACMD_SmplIncreaseLvlADMFLAG_CONFIG"Повышает игрока на +1 уровень.");
            
    RegAdminCmd("sm_alvlup"ACMD_AdvIncreaseLvlADMFLAG_CONFIG"Повышает игрока на несколько уровней (нужно указать количество).");
            
    RegAdminCmd("sm_slvldown"ACMD_SmplReduceLvlADMFLAG_CONFIG"Понижает на -1 уровень игрока.");
            
    RegAdminCmd("sm_alvldown"ACMD_AdvReduceLvlADMFLAG_CONFIG"Понижает на несколько уровней игрока (нужно указать количество).");

            
    ConnectToDB();
           
            
    CVAR_Sound_LvlUp.GetString(LEVEL_UP_SOUNDsizeof(LEVEL_UP_SOUND));
            
    CVAR_Sound_LvlDown.GetString(LEVEL_DOWN_SOUNDsizeof(LEVEL_DOWN_SOUND));
           
            
    BuildPath(Path_SMPlayerTypeConfigPathsizeof(PlayerTypeConfigPath), "configs/naithon/level/player_type.cfg");
            
    kvPlayerType CreateKeyValues("PlayerType");
            
    FileToKeyValues(kvPlayerTypePlayerTypeConfigPath);
           
            
    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<= MaxClientsi++)
            {
                if (
    IsValidClient(i))
                {
                    
    ShowHUD(i);
                    
    TIMER_HudRefresh[i] = CreateTimer(GetConVarFloat(CVAR_Hud_Refresh), RefreshPlayerHUDGetClientUserId(i), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
                    
    TIMER_Cash[i] = CreateTimer(GetConVarFloat(CVAR_Timer_Cash), TMR_AddCashGetClientUserId(i), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
                    
    TIMER_EXP[i] = CreateTimer(GetConVarFloat(CVAR_Timer_EXP), TMR_AddEXPGetClientUserId(i), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
                    
    TIMER_Gems[i] = CreateTimer(GetConVarFloat(CVAR_Timer_Gems), TMR_AddGemsGetClientUserId(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(ibuffersizeof(buffer));
                    
    PlayerCanDoubleBonus[i] = !strncmp(bufferNICKTAGsizeof(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.1TMR_Connectedpack);
     
    pack.WriteCell(iClient);
     
     
    char buffer[MAX_NAME_LENGTH];
     
    GetClientName(iClientbuffersizeof(buffer));
     
    PlayerCanDoubleBonus[iClient] = !strncmp(bufferNICKTAGsizeof(NICKTAG) - 1);
     }
    }

    public 
    Action TMR_Connected(Handle timerDataPack 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 уровня подключился!"iClientsPlayerType[iClient], PlayerLevel[iClient]);
     
    #endif
     
     
    PlayerEXPProgressPercent[iClient] = GetPlayerEXPProgressPercent(iClient);
     
    PlayerEXPUpNeeded[iClient] = GetPlayerEXPUpNeeded(iClient);
     
    #if defined DEBUG
     
    LogToFileEx(DEBUG_LOG_FILE"%N: Получены данные об ОП: %i / %i ОП, осталось собрать %i ОП, общий прогресс %.0f%%"iClientPlayerEXP[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), RefreshPlayerHUDGetClientUserId(iClient), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
     
    TIMER_Cash[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_Cash), TMR_AddCashGetClientUserId(iClient), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
     
    TIMER_EXP[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_EXP), TMR_AddEXPGetClientUserId(iClient), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
     
    TIMER_Gems[iClient] = CreateTimer(GetConVarFloat(CVAR_Timer_Gems), TMR_AddGemsGetClientUserId(iClient), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
     }
     return 
    Plugin_Continue;
    }

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

    gibs Фитиль народного волненья

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

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

    MAGNAT2645

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Нет. Ближайший аналог подобного для встроенных в SM обратных вызовов:
    Код:
    public void OnClientPostAdminCheck(int client)
     
  5. MAGNAT2645

    MAGNAT2645

    Сообщения:
    33
    Симпатии:
    0
    но ведь во многих плагинах используют именно OnClientPutInServer, как например способ поприведствовать игрока на сервере
    --- Добавлено позже ---
    а ещё если я щас перепишу в OnClientPostAdminCheck (не всё, а только мои собственные функции), можно использовать например вот так:
    PHP:
    #include <validClient>

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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Так многие пишут и на довольно низком уровне, не уделяя внимания оптимизации, например.
    Всё, что выполняется позже OnClientPutInServer (при подключении) - пройдёт эту проверку. Строго говоря, она там и вовсе не нужна.
     
  7. MAGNAT2645

    MAGNAT2645

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

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

    P.Sя про точто IsValidClient будет возвращать trueПросто там есть IsClientInGameи я боюсьчто если игрок подключается ещё
    Ну а если вступает фейковый игрок или бот или SourceTV бот?
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    На то есть отдельные проверки - это уже конечно обязательно указывать, если необходимо.
     
  9. MAGNAT2645

    MAGNAT2645

    Сообщения:
    33
    Симпатии:
    0
    Ладно, с этим понятно. У меня там есть ещё парочка проблем (2 серьёзных и остальных мало, с остальными легко разберусь), но про них потом напишу.

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

    Код:
    PHP:
    public void SQLT_OnClientPutInServer(Handle hOwnerHandle hQuery, const char[] sErrorany 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(iClientsNamesizeof(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(7PlayerSign[iClient], sizeof(PlayerSign[]));
     
    bIsClientLoaded[iClient] = true;
     }
     else
     {
     
    iPlayerType[iClient] = 1;
     
    PlayerEXP[iClient] = 0;
     
    PlayerEXPUp[iClient] = GetRandomInt(520);
     
    PlayerLevel[iClient] = 0;
     
    PlayerCash[iClient] = 0;
     
    PlayerCashLimit[iClient] = 2000;
     
    PlayerGems[iClient] = 0;
     
    PlayerSign[iClient] = NULL_STRING;
     
    char sQuery[1500];
     
    SQL_EscapeString(DBsNamesName2sizeof(sName2));
     
    Format(sQuerysizeof(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');"sNamePlayerSteamID[iClient], iPlayerType[iClient], PlayerEXP[iClient], PlayerEXPUp[iClient], PlayerLevel[iClient], PlayerCash[iClient], PlayerCashLimit[iClient], PlayerGems[iClient], PlayerSign[iClient]);
     
    SQL_TQuery(DBSQLT_OnInsertClientsQueryGetClientUserId(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 утра
    Хотя их обновлять не надо.
     
    Последнее редактирование: 8 июл 2016
  10. Reg1oxeN

    Reg1oxeN

    Сообщения:
    83
    Симпатии:
    26
    в чем проблема методом тыка удалять части кода и проверять их на краши?
     
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Оффтоп С таким не работаю, да и не до того.
     
  12. MAGNAT2645

    MAGNAT2645

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

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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Тут, скорей всего, дело в:
    Или в содержимом цикла:
    Что напихано в OnPluginStart(). Попробуй временно отключить эти функции (сначала одну, потом другую).
     
  14. MAGNAT2645

    MAGNAT2645

    Сообщения:
    33
    Симпатии:
    0
    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;
     
    Последнее редактирование: 8 июл 2016