• Страница 1 из 1
  • 1
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Проблема с индексом (Array Index Out of bounds (variable "g_iLevel"))
Проблема с индексом
Дата: Пятница, 28.09.2018, 13:58 | Сообщение # 1
Любитель
Offline
  • Gordon200
  • Репутация: 0
  • Сообщений:25
  • Пользователь
  • Статус пользователя Собираю паблик на минимальных плагинах.
Надо добавить размер массива, а вот где ?
(По ошибке понятно что в 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
  • MakapoH
  • Репутация: 71
  • Сообщений:140
  • Разработчик
new const g_Rank[26] []
->
new const g_Rank[]

new const MAX_LEVELS[25]
->
new const MAX_LEVELS[]

Добавлено (28.09.2018, 14:22)
---------------------------------------------
И в массиве g_Rank не нужно цифры делать строками... В чате так же заменить %s на %d не забыть

Дата: Пятница, 28.09.2018, 14:32 | Сообщение # 3
Скриптер
Мастер
Offline
  • Quin
  • Репутация: 56
  • Сообщений:121
  • Разработчик
  • Статус пользователя
Сделайте проверку на коннект игрока. Ошибка вызывается когда игрок умер от объекта. Т.е. индекс объекта больше 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
  • Gordon200
  • Репутация: 0
  • Сообщений:25
  • Пользователь
  • Статус пользователя Собираю паблик на минимальных плагинах.
Сделал как вы сказали, но теперь какие-то рандомные числа выбиваются в чате-худе
Код
#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
  • MakapoH
  • Репутация: 71
  • Сообщений:140
  • Разработчик
Gordon200, потому что строки в массиве, а не числа... Строки, это ковычки, убрать их достаточно и все, чтобы были только цифры
Дата: Пятница, 28.09.2018, 19:11 | Сообщение # 6
Профи-ветеран
Offline
  • pro100web
  • Репутация: 60
  • Сообщений:250
  • Разработчик
  • Статус пользователя Life in San Andreas
Цитата MakapoH ()
Строки, это ковычки, убрать их достаточно и все, чтобы были только цифры

Думаю следовало бы уточнить какие, судя по вопросам он не силен в этом.

Решение:
Найди эти строки:
Код
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
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Проблема с индексом (Array Index Out of bounds (variable "g_iLevel"))
  • Страница 1 из 1
  • 1
Поиск:
(threadpage)