|
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Проблема с индексом (Array Index Out of bounds (variable "g_iLevel")) |
Проблема с индексом |
Дата: Пятница, 28.09.2018, 13:58 | Сообщение # 1
Любитель
Offline
![]()
Надо добавить размер массива, а вот где ?
(По ошибке понятно что в g_iLevel, но всё равно не помогает. Код #include < amxmodx > #include < amxmisc > #include < nvault > #include < fakemeta > #define PLUGIN_NAME "Level_System" #define PLUGIN_VERSION "None" #define PLUGIN_AUTHOR "None" #define MAX_CLIENTS 32 #define ID_SHOWHUD 666//(taskid - TASK_SHOWHUD) #define TASK_SHOWHUD 777 /*enum (+= 100) { TASK_SHOWHUD = 10 }*/ new const g_Rank[26] [] = { "0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20", "21", "22", "23", "24", "25" }; new const MAX_LEVELS[25] = { 5, //1 25, //2 50, //3 100, //4 250, //5 350, //6 500, //7 750, //8 950, //9 1150, //10 1350, //11 1500, //12 1750, //13 1950, //14 2150, //15 2350, //16 2500, //17 3000, //18 4000, //19 5000, //20 6000, //21 7000, //22 8000, //23 9000, //24 10000 //25 } const Float:HUD_STATS_X = 0.01; const Float:HUD_STATS_Y = 0.9; const Float:HUD_SPECT_X = -1.0; const Float:HUD_SPECT_Y = 0.8; const PEV_SPEC_TARGET = pev_iuser2 new g_iLevel[ MAX_CLIENTS], g_iExp[ MAX_CLIENTS + 1 ], g_playername[ MAX_CLIENTS + 1 ][ MAX_CLIENTS ]; new g_vault public plugin_init( ) { register_plugin ( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR ); register_event( "DeathMsg", "EV_DeathMsg", "a" ); g_vault = nvault_open("Levels__System") register_dictionary("levels.txt" ); register_clcmd("say /setlvl", "lvlset") register_clcmd("say /lowlvl", "lvllow") } /*public lvlset(id) { g_iLevel [id]= 25 } public lvllow(id) { g_iLevel [id]= 1 }*/ public plugin_natives() { register_native("lvl_get_user_level", "native_get_user_level", 1) register_native("lvl_set_user_level", "native_set_user_level", 1) register_native("lvl_get_user_exp", "native_get_user_exp", 1) register_native("lvl_set_user_exp", "native_set_user_exp", 1) } public client_disconnected(id) { SaveData(id); } public client_putinserver( iPlayer ) { get_user_name(iPlayer, g_playername[iPlayer], charsmax(g_playername[])) set_task(0.1, "ShowHUD", /*iPlayer+*/TASK_SHOWHUD, _, _, "b") LoadData( iPlayer ); } public plugin_end() { nvault_close(g_vault) } public EV_DeathMsg( ) { static iVictim, iKiller; iVictim = read_data( 2 ); iKiller = read_data( 1 ); new HS = read_data( 3 ); if( !is_user_connected( iVictim ) ) return; if( iKiller == iVictim || !iKiller ) return; if(HS) { g_iExp[ iKiller ] += 2; } else { g_iExp[ iKiller ] += 1; } if(get_user_weapon(iKiller) == CSW_KNIFE) { g_iExp[ iKiller ] += 3; } else { g_iExp[ iKiller ] += 1; } while( g_iExp[ iKiller ] >= MAX_LEVELS[ g_iLevel[ iKiller ] ] ) { g_iLevel[ iKiller ] += 1; new name[32]; get_user_name(iKiller, name, 31); client_print_color(0, print_team_default, "^4 [CSDM]^1Игрок ^4%s ^1получил уровень ^4%L", name, LANG_PLAYER, (g_Rank[ g_iLevel[ iKiller ] ]) ) /*while( g_iExp[ iKiller ] == MAX_LEVELS[ g_iLevel[iKiller]]) { if(~get_user_flags(iKiller) & ADMIN_LEVEL_A) { new read = read_flags("bijm") set_user_flags(iKiller, read) client_print_color(iKiller, print_team_default, "^4 [CSDM]^1Вы получили^4 VIP ^1за получение^4 %L", LANG_PLAYER, (g_Rank[ g_iLevel[ iKiller ] ]) ) } }*/ } } public ShowHUD(taskid) { static iPlayer iPlayer = ID_SHOWHUD; if (!is_user_alive( iPlayer ) ) { iPlayer = pev(iPlayer, PEV_SPEC_TARGET) // Target not alive if (!is_user_alive(iPlayer) ) return; } if (iPlayer != ID_SHOWHUD) { set_hudmessage( 255, 255, 0, HUD_SPECT_X, HUD_SPECT_Y, 0, 5.0, 3.0, 1.0, 1.0, -1 ); show_hudmessage( ID_SHOWHUD , "Наблюдение за: %s^n[Уровень: %L] [Опыт: %d / %d]", g_playername[ iPlayer ] , LANG_PLAYER, (g_Rank[g_iLevel [ID_SHOWHUD]]) , g_iExp[ ID_SHOWHUD ] , (MAX_LEVELS[g_iLevel[ ID_SHOWHUD ]]) ); } else { set_hudmessage( 0, 255, 255, HUD_STATS_X, HUD_STATS_Y, 0, 5.0, 3.0, 1.0, 1.0, -1 ); show_hudmessage( ID_SHOWHUD , "Уровень: %L | Опыт: %d из %d", LANG_PLAYER, (g_Rank[g_iLevel[ ID_SHOWHUD ]]) , g_iExp[ ID_SHOWHUD ] , (MAX_LEVELS[g_iLevel[ ID_SHOWHUD ]])); } } public SaveData(id) { new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] format(vaultkey,63,"%s-user",AuthID) format(vaultdata,255,"%i#%i#",g_iLevel[id],g_iExp[id]) nvault_set(g_vault,vaultkey,vaultdata) return PLUGIN_CONTINUE } public LoadData(id) { new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] format(vaultkey,63,"%s-user",AuthID) format(vaultdata,255,"%i#%i#",g_iLevel[id],g_iExp[id]) nvault_get(g_vault,vaultkey,vaultdata,255) replace_all(vaultdata, 255, "#", " ") new experience[32], playerlevel[32] parse(vaultdata, experience, 31, playerlevel, 31) g_iLevel [id]= str_to_num(experience) g_iExp [id]= str_to_num(playerlevel) /*while( g_iExp[ id ] == MAX_LEVELS[ g_iLevel[id]]) { if(~get_user_flags(id) & ADMIN_LEVEL_A) { new read = read_flags("bijm") set_user_flags(id, read) } } } return PLUGIN_CONTINUE*/ } public native_get_user_exp(iPl, params) { new id = get_param(1) return g_iExp[id]; } public native_set_user_exp(iPl, params) { new id = get_param(1) new amount = get_param(2) g_iExp [id]= amount; } public native_get_user_level(iPl, params) { new id = get_param(1) return g_iLevel[id]; } public native_set_user_level(iPl, params) { new id = get_param(1) new amount = get_param(2) g_iLevel [id]= amount; } |
Дата: Пятница, 28.09.2018, 14:21 | Сообщение # 2
Скриптер
Мастер
Offline
![]()
new const g_Rank[26] []
-> new const g_Rank[] new const MAX_LEVELS[25] -> new const MAX_LEVELS[] Добавлено (28.09.2018, 14:22) |
Дата: Пятница, 28.09.2018, 14:32 | Сообщение # 3
Скриптер
Мастер
Offline
![]()
Сделайте проверку на коннект игрока. Ошибка вызывается когда игрок умер от объекта. Т.е. индекс объекта больше MAX_CLIENTS.
UPD Либо замените: Код if( !is_user_connected( iVictim ) ) return; Код if( !is_user_connected( iKiller ) ) return;
Сообщение отредактировал Quin - Пятница, 28.09.2018, 14:33
|
Дата: Пятница, 28.09.2018, 16:19 | Сообщение # 4
Любитель
Offline
![]()
Сделал как вы сказали, но теперь какие-то рандомные числа выбиваются в чате-худе
Код #include < amxmodx > #include < amxmisc > #include < nvault > #include < fakemeta > #define PLUGIN_NAME "Level__System" #define PLUGIN_VERSION "0.1" #define PLUGIN_AUTHOR "Bos93 & FirsT & xoymiii" #define MAX_CLIENTS 32 #define ID_SHOWHUD (taskid - TASK_SHOWHUD) enum (+= 100) { TASK_SHOWHUD = 10 } new const g_Rank[] = { "0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20", "21", "22", "23", "24", "25" }; new const MAX_LEVELS[] = { 1, 5, //1 25, //2 50, //3 100, //4 250, //5 350, //6 500, //7 750, //8 950, //9 1150, //10 1350, //11 1500, //12 1750, //13 1950, //14 2150, //15 2350, //16 2500, //17 3000, //18 4000, //19 5000, //20 6000, //21 7000, //22 8000, //23 9000, //24 10000 //25 } const Float:HUD_STATS_X = 0.01; const Float:HUD_STATS_Y = 0.9; const Float:HUD_SPECT_X = -1.0; const Float:HUD_SPECT_Y = 0.8; const PEV_SPEC_TARGET = pev_iuser2 new g_iLevel[ MAX_CLIENTS + 1 ], g_iExp[ MAX_CLIENTS + 1 ], g_playername[ MAX_CLIENTS + 1 ][ MAX_CLIENTS ]; new g_vault public plugin_init( ) { register_plugin ( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR ); register_event( "DeathMsg", "EV_DeathMsg", "a" ); g_vault = nvault_open("Levels__System") register_dictionary("levels.txt" ); register_clcmd("say /setlvl", "lvlset") register_clcmd("say /lowlvl", "lvllow") } public lvlset(id) { g_iLevel [id]= 25 } public lvllow(id) { g_iLevel [id]= 1 } public plugin_natives() { register_native("lvl_get_user_level", "native_get_user_level", 1) register_native("lvl_set_user_level", "native_set_user_level", 1) register_native("lvl_get_user_exp", "native_get_user_exp", 1) register_native("lvl_set_user_exp", "native_set_user_exp", 1) } public client_disconnected(id) { SaveData(id); } public client_putinserver( iPlayer ) { get_user_name(iPlayer, g_playername[iPlayer], charsmax(g_playername[])) set_task(0.1, "ShowHUD", iPlayer + TASK_SHOWHUD, _, _, "b") LoadData( iPlayer ); } public plugin_end() { nvault_close(g_vault) } public EV_DeathMsg( ) { static iVictim, iKiller; iVictim = read_data( 2 ); iKiller = read_data( 1 ); new HS = read_data( 3 ); if( !is_user_connected( iKiller ) ) return; if( iKiller == iVictim || !iKiller ) return; if(HS) { g_iExp[ iKiller ] += 2; } else { g_iExp[ iKiller ] += 1; } if(get_user_weapon(iKiller) == CSW_KNIFE) { g_iExp[ iKiller ] += 3; } else { g_iExp[ iKiller ] += 1; } while( g_iExp[ iKiller ] >= MAX_LEVELS[ g_iLevel[ iKiller ] ] ) { g_iLevel[ iKiller ] += 1; new name[32]; get_user_name(iKiller, name, 31); client_print_color(0, print_team_default, "^4 [CSDM]^1Игрок ^4%s ^1получил уровень ^4%d", name, g_Rank[ g_iLevel[ iKiller ] ]) /*while( g_iExp[ iKiller ] == MAX_LEVELS[ g_iLevel[iKiller]]) { if(~get_user_flags(iKiller) & ADMIN_LEVEL_A) { new read = read_flags("bijm") set_user_flags(iKiller, read) client_print_color(iKiller, print_team_default, "^4 [CSDM]^1Вы получили^4 VIP ^1за получение^4 %L", LANG_PLAYER, (g_Rank[ g_iLevel[ iKiller ] ]) ) } }*/ } } public ShowHUD(taskid) { static iPlayer iPlayer = ID_SHOWHUD; if (!is_user_alive( iPlayer ) ) { iPlayer = pev(iPlayer, PEV_SPEC_TARGET) // Target not alive if (!is_user_alive(iPlayer) ) return; } if (iPlayer != ID_SHOWHUD) { set_hudmessage( 255, 255, 0, HUD_SPECT_X, HUD_SPECT_Y, 0, 5.0, 3.0, 1.0, 1.0, -1 ); show_hudmessage( ID_SHOWHUD , "Наблюдение за: %s^n[Уровень: %d] [Опыт: %d / %d]", g_playername[ iPlayer ] , g_Rank[g_iLevel[ ID_SHOWHUD ]] , g_iExp[ ID_SHOWHUD ] , (MAX_LEVELS[g_iLevel[ ID_SHOWHUD ]]) ); } else { set_hudmessage( 0, 255, 255, HUD_STATS_X, HUD_STATS_Y, 0, 5.0, 3.0, 1.0, 1.0, -1 ); show_hudmessage( ID_SHOWHUD , "Уровень: %s | Опыт: %d из %d", g_Rank[g_iLevel[ ID_SHOWHUD ]] , g_iExp[ ID_SHOWHUD ] , (MAX_LEVELS[g_iLevel[ ID_SHOWHUD ]])); } } public SaveData(id) { new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] format(vaultkey,63,"%s-user",AuthID) format(vaultdata,255,"%i#%i#",g_iLevel[id],g_iExp[id]) nvault_set(g_vault,vaultkey,vaultdata) return PLUGIN_CONTINUE } public LoadData(id) { new AuthID[35] get_user_authid(id,AuthID,34) new vaultkey[64],vaultdata[256] format(vaultkey,63,"%s-user",AuthID) format(vaultdata,255,"%i#%i#",g_iLevel[id],g_iExp[id]) nvault_get(g_vault,vaultkey,vaultdata,255) replace_all(vaultdata, 255, "#", " ") new experience[32], playerlevel[32] parse(vaultdata, experience, 31, playerlevel, 31) g_iLevel [id]= str_to_num(experience) g_iExp [id]= str_to_num(playerlevel) /*while( g_iExp[ id ] == MAX_LEVELS[ g_iLevel[id]]) { if(~get_user_flags(id) & ADMIN_LEVEL_A) { new read = read_flags("bijm") set_user_flags(id, read) } } } return PLUGIN_CONTINUE*/ } public native_get_user_exp(iPl, params) { new id = get_param(1) return g_iExp[id]; } public native_set_user_exp(iPl, params) { new id = get_param(1) new amount = get_param(2) g_iExp [id]= amount; } public native_get_user_level(iPl, params) { new id = get_param(1) return g_iLevel[id]; } public native_set_user_level(iPl, params) { new id = get_param(1) new amount = get_param(2) g_iLevel [id]= amount; } |
Дата: Пятница, 28.09.2018, 18:34 | Сообщение # 5
Скриптер
Мастер
Offline
![]()
Gordon200, потому что строки в массиве, а не числа... Строки, это ковычки, убрать их достаточно и все, чтобы были только цифры
|
Дата: Пятница, 28.09.2018, 19:11 | Сообщение # 6
Профи-ветеран
Offline
![]() Думаю следовало бы уточнить какие, судя по вопросам он не силен в этом. Решение: Найди эти строки: Код new const g_Rank[] = { "0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20", "21", "22", "23", "24", "25" }; и приведи к такому виду: Код new const g_Rank[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, 21, 22, 23, 24, 25 }; Так как при выводе используется формат %d так же возможен %i А для вывода строк используется %s |
| |||
| |||