Всем доброго времени суток.
Ребят, мне нужна помощь!
У меня есть плагин армейского ранга для CS 1.6 Где качал, как называется, какая версия и т.д я не помню так как их было скачено тонна и понравился только он.
В общем о проблеме. Плагин дает опыт за убийство, чем больше опыта тем выше ранг. Больше он ничего не делает, только опыт - только ранг. Так вот если у игрока максимальный опыт то сервер выдает ошибку:
Код
L 02/18/2017 - 00:59:17: [AMXX] Displaying debug trace (plugin "aSystem.amxx")
L 02/18/2017 - 00:59:17: [AMXX] Run time error 4: index out of bounds
L 02/18/2017 - 00:59:17: [AMXX] [0] aSystem.sma::check_level (line 334)
L 02/18/2017 - 00:59:17: [AMXX] [1] aSystem.sma::cmdCheck (line 218)
L 02/18/2017 - 00:59:17: [AMXX] [2] aSystem.sma::client_putinserver (line 151)
Это вот эти строки:
Код
while ( UserData [ id ][ exp ] >= levels [ UserData [ id ][ level ] ] )
Код
check_level ( id )
Код
cmdCheck ( id )
Я так понимаю что проблема конкретно в том у кого максимальный опыт так как у других игроков вроде все нормально.
Ребят помогите решить данную проблему. Качать какой то Арми-Ранг или что то другое не хочу. Мне нужен просто ранг а не ранг + бонусы в виде автоматов или гранат или что то в этом роде.
Вот исходный код:
Код
#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < nvault >
#include < sqlx >
#pragma tabsize 0
enum _:udata
{
level, exp, bonus, kills, deaths, target, hazing,
uhud
}
enum _:sdata
{
type, host, user, pass, db, name, ntime, nvault,
head_exp, head_bonus, stand_exp, stand_bonus,
minus_exp, hud, maxplayers
}
new const prefix [ ][ ] =
{
"!t [!g ИНФО !g]!y",
"\d[ ИНФО ]\r"
}
new UserData [ 33 ][ udata ]
new UserSteam [ 33 ][ 35 ]
new OptServer [ sdata ]
new SQL_Active, SQL_Player[33]
new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect
new const rank_names [ ][ ] =
{
"R_0", "R_1", "R_2", "R_3", "R_4", "R_5", "R_6", "R_7", "R_8", "R_9", "R_10", "R_11", "R_12", "R_13", "R_14",
"R_15", "R_16", "R_17", "R_18", "R_19", "R_20"
}
new const levels [ ] =
{
0, 30, 60, 120, 200, 350, 700, 800, 1000, 1500, 2000, 3000, 3500, 4000, 5000, 5500, 6000, 6500, 10000, 20000
}
public plugin_init ( )
{
register_plugin ( "ARMY SYSTEM :: MAIN", "2.2.1", "OverGame" )
register_forward ( FM_PlayerPreThink, "fwdPlayerPreThink", 0 )
register_event ( "DeathMsg", "event_killing", "a" )
OptServer [ type ] = register_cvar ( "as_type", "1" )
OptServer [ stand_exp ] = register_cvar ( "as_stand_exp", "1" )
OptServer [ stand_bonus ] = register_cvar ( "as_stand_bonus", "1" )
OptServer [ head_exp ] = register_cvar ( "as_head_exp", "3" )
OptServer [ head_bonus ] = register_cvar ( "as_head_bonus", "3" )
OptServer [ minus_exp ] = register_cvar ( "as_minus_exp", "1" )
OptServer [ maxplayers ] = get_maxplayers ( )
OptServer [ hud ] = CreateHudSyncObj ( )
switch ( get_pcvar_num ( OptServer [ type ] ) )
{
case 0:
{
new nvault_name [ 128 ]
get_cvar_string ( "as_nvault_name", nvault_name, 63 )
OptServer [ name ] = register_cvar ( "as_nvault_name", "army_system" )
OptServer [ ntime ] = register_cvar ( "as_nvault_time", "31" )
OptServer [ nvault ] = nvault_open ( nvault_name )
if ( OptServer [ nvault ] == INVALID_HANDLE)
set_fail_state ( "Error opening nVault!" )
nvault_prune ( OptServer [ nvault ], 0, get_systime ( ) - ( 86400 * get_pcvar_num ( OptServer [ ntime ] ) ) )
}
case 1:
{
OptServer [ host ] = register_cvar ( "as_mysql_host", "127.0.0.1" )
OptServer [ user ] = register_cvar ( "as_mysql_user", "root" )
OptServer [ pass ] = register_cvar ( "as_mysql_pass", "" )
OptServer [ db ] = register_cvar ( "as_mysql_db", "asystem" )
set_task ( 1.0, "MYSQL_Load" )
}
}
register_clcmd ( "as_hud", "function_hud" )
register_clcmd ( "say /as_hud", "function_hud" )
register_clcmd ( "say_team /as_hud", "function_hud" )
set_task ( 1.0, "show_info", _, _, _, "b" )
register_dictionary ( "asystem.txt" )
}
public plugin_cfg ( )
{
new szCfgDir [ 64 ], szFile [ 192 ]
get_configsdir ( szCfgDir, charsmax ( szCfgDir ) )
format ( szFile, charsmax ( szFile ), "%s/as_setting.cfg", szCfgDir )
if ( file_exists ( szFile ) )
server_cmd ( "exec %s", szFile )
}
public plugin_end ( )
{
if ( !get_pcvar_num ( OptServer [ type ] ) )
nvault_close ( OptServer [ nvault ] )
}
public MYSQL_Load ( )
{
new szHostname [ 30 ], szUsername [ 30 ], szPassword [ 30 ], szDatabase [ 30 ]
new szError [ 512 ], szErr
get_pcvar_string ( OptServer [ host ], szHostname, charsmax ( szHostname ) )
get_pcvar_string ( OptServer [ user ], szUsername, charsmax ( szUsername ) )
get_pcvar_string ( OptServer [ pass ], szPassword, charsmax ( szPassword ) )
get_pcvar_string ( OptServer [ db ], szDatabase, charsmax ( szDatabase ) )
MYSQL_Tuple = SQL_MakeDbTuple ( szHostname, szUsername, szPassword, szDatabase )
MYSQL_Connect= SQL_Connect ( MYSQL_Tuple, szErr, szError, charsmax ( szError ) )
if ( MYSQL_Connect == Empty_Handle )
set_fail_state ( szError )
SQL_Active = true
}
public function_hud ( id )
{
if ( UserData [ id ][ uhud ] )
UserData [ id ][ uhud ] = false
else
UserData [ id ][ uhud ] = true
}
public client_authorized ( id )
{
get_user_authid ( id, UserSteam [ id ], charsmax ( UserSteam [ ] ) )
}
public client_putinserver ( id )
{
UserData [ id ][ uhud ] = true
cmdCheck ( id )
}
public client_disconnect ( id )
{
cmdSave ( id )
}
public cmdCheck ( id )
{
switch ( get_pcvar_num ( OptServer [ type ] ) )
{
case 0:
{
new s_GetLvl [ 40 ], s_GetExp [ 40 ], s_GetBonus [ 40 ]
formatex ( s_GetLvl, charsmax ( s_GetLvl ), "%sRANK", UserSteam [ id ] )
new s_Level = nvault_get ( OptServer [ nvault ], s_GetLvl )
formatex ( s_GetExp, charsmax ( s_GetExp ), "%sEXP", UserSteam [ id ] )
new s_Exp = nvault_get ( OptServer [ nvault ], s_GetExp )
formatex ( s_GetBonus, charsmax ( s_GetBonus ), "%sBONUS", UserSteam [ id ] )
new s_Bonus = nvault_get ( OptServer [ nvault ], s_GetBonus )
if ( s_Level )
{
UserData [ id ][ level ] = s_Level
UserData [ id ][ exp ] = s_Exp
UserData [ id ][ bonus ] = s_Bonus
} else {
cmdSave(id)
}
}
case 1:
{
if (!SQL_Active)
{
set_task ( 1.0, "MYSQL_Load", id )
}
new szError [ 512 ]
new szMYSQLName [ 35 ]
new Handle:szSelect
szSelect = SQL_PrepareQuery ( MYSQL_Connect, "SELECT * FROM asystem" )
if ( !SQL_Execute ( szSelect ) )
{
SQL_QueryError ( szSelect, szError, charsmax ( szError ) )
set_fail_state ( szError )
}
while ( SQL_MoreResults ( szSelect ) )
{
SQL_ReadResult ( szSelect, 1, szMYSQLName, charsmax ( szMYSQLName ) )
if ( equal ( szMYSQLName, UserSteam [ id ] ) )
{
UserData [ id ][ level ] = SQL_ReadResult ( szSelect, 3 )
UserData [ id ][ exp ] = SQL_ReadResult ( szSelect, 4 )
UserData [ id ][ bonus ] = SQL_ReadResult ( szSelect, 5 )
UserData [ id ][ kills ] = SQL_ReadResult ( szSelect, 6 )
UserData [ id ][ deaths ] = SQL_ReadResult ( szSelect, 7 )
SQL_Player [ id ] = true
check_level ( id )
break
} else {
SQL_NextRow ( szSelect )
}
}
new szName [ 33 ]
get_user_name ( id, szName, charsmax ( szName ) )
if ( !SQL_Player [ id ] )
{
new Handle:szInsert
szInsert = SQL_PrepareQuery ( MYSQL_Connect, "INSERT INTO `asystem` (`steam`, `nick`, `level`, `exp`, `bonus`, `kills`, `deaths` ) VALUES ('%s', '%s', '0', '0', '0', '0', '0');", UserSteam [ id ], szName )
if ( !SQL_Execute ( szInsert ) )
{
SQL_QueryError ( szInsert, szError, charsmax ( szError ) )
set_fail_state ( szError )
}
SQL_Player [ id ] = true
}
}
}
return PLUGIN_HANDLED
}
public cmdSave ( id )
{
switch ( get_pcvar_num ( OptServer [ type ] ) )
{
case 0:
{
new s_SaveLvl [ 40 ], s_SaveExp [ 40 ], s_SaveBonus [ 40 ], s_Level [ 64 ], s_Exp [ 64 ], s_Bonus [ 64 ]
format ( s_SaveLvl, charsmax ( s_SaveLvl ), "%sRANK", UserSteam [ id ] )
format ( s_Level, charsmax ( s_Level ), "%d", UserData [ id ][ level ] )
format ( s_SaveExp, charsmax ( s_SaveExp ) , "%sEXP", UserSteam [ id ] )
format ( s_Exp, charsmax ( s_Exp ), "%d", UserData [ id ][ exp ] )
format ( s_SaveBonus, charsmax ( s_SaveBonus ) , "%sBONUS", UserSteam [ id ] )
format ( s_Bonus, charsmax ( s_Bonus ), "%d", UserData [ id ][ bonus ] )
nvault_set ( OptServer [ nvault ], s_SaveLvl, s_Level )
nvault_set ( OptServer [ nvault ], s_SaveExp, s_Exp )
nvault_set ( OptServer [ nvault ], s_SaveBonus, s_Bonus )
}
case 1:
{
new szError [ 512 ]
new Handle:szUpdate
szUpdate = SQL_PrepareQuery ( MYSQL_Connect, "UPDATE `asystem` SET `level` = '%i', `exp` = '%i', `bonus` = '%i', `kills` = '%i', `deaths` = '%i' WHERE `asystem`.`steam` = '%s';", UserData [ id ][ level ], UserData [ id ][ exp ], UserData [ id ][ bonus ], UserData [ id ][ kills ], UserData [ id ][ deaths ], UserSteam [ id ] )
if ( !SQL_Execute ( szUpdate ) )
{
SQL_QueryError ( szUpdate, szError, charsmax ( szError ) )
set_fail_state ( szError )
}
}
}
return PLUGIN_HANDLED
}
public fwdPlayerPreThink ( id )
{
new itarget, body
get_user_aiming ( id, itarget, body, 9999 )
if ( 0 < itarget <= get_maxplayers ( ) )
{
UserData [ id ][ target ] = itarget
}
return PLUGIN_HANDLED
}
public event_killing ( )
{
new iKiller = read_data ( 1 )
new iVictim = read_data ( 2 )
new iHead = read_data ( 3 )
if ( iHead && iKiller != iVictim && is_user_connected ( iKiller ) && is_user_connected ( iVictim ) && UserData [ iKiller ][ level ] <= 19 )
{
UserData [ iKiller ][ exp ] += get_pcvar_num ( OptServer [ head_exp ] )
UserData [ iKiller ][ bonus ] += get_pcvar_num ( OptServer [ head_bonus ] )
} else
if ( iKiller != iVictim && is_user_connected ( iKiller ) && is_user_connected ( iVictim ) && UserData [ iKiller ][ level ] <= 19 )
{
UserData [ iKiller ][ exp ] += get_pcvar_num ( OptServer [ stand_exp ] )
UserData [ iKiller ][ bonus ] += get_pcvar_num ( OptServer [ stand_bonus ] )
}
if ( get_pcvar_num ( OptServer [ minus_exp ] ) )
{
if ( UserData [ iVictim ][ exp ] > 0 )
UserData [ iVictim ][ exp ]--
}
check_level ( iKiller )
return PLUGIN_CONTINUE
}
public check_level ( id )
{
if ( UserData [ id ][ level ] <= 0 )
UserData [ id ][ level ] = 1
if ( UserData [ id ][ exp ] < 0 )
UserData [ id ][ exp ] = 0
while ( UserData [ id ][ exp ] >= levels [ UserData [ id ][ level ] ] )
{
UserData [ id ][ level ]++
static buffer [ 192 ]
new szName [ 33 ]
get_user_name ( id, szName, 32 )
format ( buffer, charsmax ( buffer ), "%s %L %L", prefix [ 0 ], id, "DI_NEW_RANK", szName, id, rank_names [ UserData [ id ][ level ] ] )
ShowMsg ( 0, buffer )
}
}
public show_info ( )
{
for ( new id = 0; id <= OptServer [ maxplayers ]; id++ )
{
if ( !is_user_bot ( id ) && is_user_connected ( id ) && UserData [ id ][ uhud ] )
{
static buffer [ 192 ], len
set_hudmessage ( 100, 100, 100, 0.01, 0.20, 0, 15.0, 1.0, _, _, -1 )
if ( !is_user_alive(id) )
{
new szName [ 33 ]
get_user_name ( UserData [ id ][ target ], szName, charsmax ( szName ) )
len = format ( buffer, charsmax ( buffer ), "%L", id, "DI_NAME", szName )
len += format ( buffer [ len ], charsmax ( buffer ) - len, "^n%L %L", id, "DI_RANK", id, rank_names [ UserData [ UserData [ id ][ target ] ][ level ] ] )
if ( UserData [ id ][ level ] <= 19)
{
len += format ( buffer [ len ], charsmax ( buffer ) - len, "^n%L", id, "DI_EXP", UserData [ UserData [ id ][ target ] ][ exp ], levels [ UserData [ UserData [ id ][ target ] ][ level ] ] )
} else {
len += format ( buffer [ len ], charsmax ( buffer ) - len, "^n%L", id, "DI_EXP_MAX" )
}
} else {
len = format ( buffer, charsmax(buffer), "%L %L", id, "DI_RANK", id, rank_names [ UserData [ id ][ level ] ] )
if(UserData[id][level] <= 19)
{
len += format ( buffer [ len ], charsmax ( buffer ) - len, "^n%L", id, "DI_EXP", UserData [ id ][ exp ], levels [ UserData [ id ][ level ] ] )
} else {
len += format ( buffer [ len ], charsmax ( buffer ) - len, "^n%L", id, "DI_EXP_MAX" )
}
}
ShowSyncHudMsg ( id, OptServer [ hud ], buffer )
}
}
return PLUGIN_CONTINUE
}
public plugin_natives ( )
{
register_native ( "get_as_level", "native_get_as_level", 1 )
register_native ( "set_as_level", "native_set_as_level", 1 )
register_native ( "get_as_exp", "native_get_as_exp", 1 )
register_native ( "set_as_exp", "native_set_as_exp", 1 )
register_native ( "get_as_bonus", "native_get_as_bonus", 1 )
register_native ( "set_as_bonus", "native_set_as_bonus", 1 )
}
public native_get_as_level ( id )
return UserData [ id ][ level ]
public native_set_as_level ( id, num )
UserData [ id ][ level ] = num
public native_get_as_exp ( id )
return UserData [ id ][ exp ]
public native_set_as_exp ( id, num )
UserData [ id ][ exp ] = num
public native_get_as_bonus ( id )
return UserData [ id ][ bonus ]
public native_set_as_bonus ( id, num )
UserData [ id ][ bonus ] = num
stock ShowMsg ( const id, const input [ ], any:... )
{
new count = 1, players [ 32 ]
static msg [ 188 ]
vformat ( msg, 187, input, 3 )
replace_all ( msg, 187, "!g", "^4" )
replace_all ( msg, 187, "!y", "^1" )
replace_all ( msg, 187, "!t", "^3" )
if ( id ) players [ 0 ] = id; else get_players ( players, count, "ch" )
{
for ( new i = 0; i < count; i++ )
{
if ( is_user_connected ( players [ i ] ) )
{
message_begin ( MSG_ONE_UNRELIABLE, get_user_msgid ( "SayText" ), _, players [ i ] )
write_byte ( players [ i ] )
write_string ( msg )
message_end ( )
}
}
}
}
Заранее спасибо за помощь.