Run time error 4: index out of bounds

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
Alexandrow
Извън линия
Потребител
Потребител
Мнения: 157
Регистриран на: 22 Ное 2017, 16:05
Се отблагодари: 14 пъти
Получена благодарност: 9 пъти

Run time error 4: index out of bounds

Мнение от Alexandrow » 10 Май 2018, 14:01

Здравейте, имам проблем с работата на този плъгин.
[AMXX] Run time error 4: index out of bounds
[AMXX] [0] crux_ansata.sma::eRoundStart (line 65)
Това е плъгина:

Код за потвърждение: Избери целия код

/*
	Плагин: Crux Ansata
	Автор: DUKKHAZ0R | Сайт: http://aimbat.ru/plugins/
	
	Описание:
	Плагин добавляет на сервер талисман жизни, у человека имеющего его будет восстанавливаться 5 хп каждые 2 секунды.
	В начале рануда рандомному игроку выпадает талисман жизни, если человек умирает, то любой другой сможет подобрать талисман.
	Минимальное количество игроков для работы плагина, количество восстанавливаемого здоровья и интервал восстанавления можно настроить в исходнике.
	
*/

#include <amxmodx>
#include <engine>

#define SCREENFADE					//Затемнять экран при регенерации здоровья
#define MIN_PLAYERS 5				//Минимальное кол-во игроков для работы плагина
#define ROUND_ACCESS 3				//С какого раунда доступен талисман
#define GIVE_HEALTH 5				//Кол-во выдаваемого здоровья
#define INTERVAL_REGENERATION 2.0	//Интервал между восстановлением

new const g_szModel[] = "models/crux_ansata.mdl";

new g_iPlayerId, g_iRoundCounter, szName[32];

public plugin_init()
{
	register_plugin("Crux Ansata", "1.0", "DUKKHAZ0R");
	
	register_touch("crux_ansata", "player", "fw_TouchEntity");
	
	register_logevent("eRoundStart", 2, "1=Round_Start");
	register_event("DeathMsg", "eDeathMsg", "a", "1>0");
	register_event("TextMsg", "eRoundRestart", "a", "2&#Game_C", "2&#Game_w");
	
	set_task(INTERVAL_REGENERATION, "RegenerationHealth", .flags="b");
}

public plugin_precache()
{
	precache_model(g_szModel);
}

public client_disconnect(id)
{
	if(g_iPlayerId == id)
		SpawnAnsata(id);
}

public eRoundRestart()
	g_iRoundCounter = 0;

public eRoundStart()
{
	if(++g_iRoundCounter < ROUND_ACCESS || get_playersnum() < MIN_PLAYERS)
		return;
		
	static iEnt;
	
	while((iEnt = find_ent_by_class(iEnt, "crux_ansata")))
		remove_entity(iEnt);
		
	static apPlayers[32], iPlayers;
	get_players(apPlayers, iPlayers, "ach");
	
	g_iPlayerId = apPlayers[random(iPlayers-1)];
	get_user_name(g_iPlayerId, szName, charsmax(szName));
	
	ChatColor(0, "^4[CA] ^3%s ^1выпал талисман жизни.", szName);
}

public eDeathMsg()
{
	if(read_data(2) == g_iPlayerId)
		SpawnAnsata(g_iPlayerId);
}

public fw_TouchEntity(iEnt, id)
{
	if(!is_valid_ent(iEnt) || g_iPlayerId)
		return 1;
		
	entity_set_int(iEnt, EV_INT_flags, FL_KILLME);
	get_user_name(g_iPlayerId = id, szName, charsmax(szName));
	ChatColor(0,"^4[CA] ^3%s ^1поднял талисман жизни.",szName);
	return 1;
}

public RegenerationHealth()
{
	if(!g_iPlayerId || get_playersnum() < MIN_PLAYERS)
		return;
	
	static Float:fHealth, MsgId_Health; fHealth = entity_get_float(g_iPlayerId, EV_FL_health);
	
	if(!MsgId_Health) MsgId_Health = get_user_msgid("Health");
	
	if(fHealth < 100 && is_user_alive(g_iPlayerId))
	{
		static Float:giveHealth; giveHealth = (fHealth + GIVE_HEALTH) < 100 ? float(GIVE_HEALTH) : (100 - fHealth);
		
		entity_set_float(g_iPlayerId, EV_FL_health, fHealth + giveHealth);
		
		message_begin(MSG_ONE_UNRELIABLE, MsgId_Health, _, g_iPlayerId);
		write_byte(floatround(fHealth + giveHealth));
		message_end();
		
#if defined SCREENFADE
		message_begin(MSG_ONE_UNRELIABLE, 98, _, g_iPlayerId);
		write_short(1<<10);
		write_short(1<<10);
		write_short(0x0000);
		write_byte(0);
		write_byte(255);
		write_byte(0);
		write_byte(40);
		message_end();
#endif
	}
}

stock SpawnAnsata(id)
{
	static Float:fOrigin[3];
	entity_get_vector(id, EV_VEC_origin, fOrigin);
	
	new iEnt = create_entity("info_target");
	
	if(!is_valid_ent(iEnt))
		return;
	
	entity_set_vector(iEnt, EV_VEC_origin, fOrigin);
	entity_set_string(iEnt, EV_SZ_classname, "crux_ansata");
	entity_set_int(iEnt, EV_INT_solid, SOLID_TRIGGER);
	entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_NONE);
	entity_set_int(iEnt, EV_INT_effects, 8);
	entity_set_model(iEnt, g_szModel);
	entity_set_size(iEnt, Float:{-16.0,-16.0,-16.0}, Float:{16.0,16.0,16.0});
	ChatColor(g_iPlayerId = 0, "^4[CA] ^3%s ^1потерял талисман жизни.", szName);
}

stock ChatColor(const id, const szMessage[], any:...)
{
	static szBuffer[191], apPlayers[32], iPlayers; iPlayers = 1;
	vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
	if(id)
	{
		if(!is_user_connected(id)) return;
		apPlayers[0] = id;
		iPlayers = 1;
	}
	else get_players(apPlayers, iPlayers, "ch");
	for(new i;i < iPlayers; i++)
	{
		message_begin(MSG_ONE_UNRELIABLE, 76, .player = apPlayers[i]);
		write_byte(apPlayers[i]);
		write_string(szBuffer);
		message_end();
	}
}
Грешката идва от този ред:

Код за потвърждение: Избери целия код

g_iPlayerId = apPlayers[random(iPlayers-1)];
	get_user_name(g_iPlayerId, szName, charsmax(szName));

Аватар
BlueTwist3r
Извън линия
Потребител
Потребител
Мнения: 8
Регистриран на: 07 Мар 2018, 17:05

Run time error 4: index out of bounds

Мнение от BlueTwist3r » 10 Май 2018, 14:07

Предполагам просто смени

Код за потвърждение: Избери целия код

g_iPlayerId = apPlayers[random(iPlayers-1)];
на

Код за потвърждение: Избери целия код

g_iPlayerId = apPlayers[random(iPlayers)];

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Run time error 4: index out of bounds

Мнение от OciXCrom » 10 Май 2018, 23:47

Липсва проверка за празен сървър + горното мнение.

Код за потвърждение: Избери целия код

/*
	Плагин: Crux Ansata
	Автор: DUKKHAZ0R | Сайт: http://aimbat.ru/plugins/
	
	Описание:
	Плагин добавляет на сервер талисман жизни, у человека имеющего его будет восстанавливаться 5 хп каждые 2 секунды.
	В начале рануда рандомному игроку выпадает талисман жизни, если человек умирает, то любой другой сможет подобрать талисман.
	Минимальное количество игроков для работы плагина, количество восстанавливаемого здоровья и интервал восстанавления можно настроить в исходнике.
	
*/

#include <amxmodx>
#include <engine>

#define SCREENFADE					//Затемнять экран при регенерации здоровья
#define MIN_PLAYERS 5				//Минимальное кол-во игроков для работы плагина
#define ROUND_ACCESS 3				//С какого раунда доступен талисман
#define GIVE_HEALTH 5				//Кол-во выдаваемого здоровья
#define INTERVAL_REGENERATION 2.0	//Интервал между восстановлением

new const g_szModel[] = "models/crux_ansata.mdl";

new g_iPlayerId, g_iRoundCounter, szName[32];

public plugin_init()
{
	register_plugin("Crux Ansata", "1.0", "DUKKHAZ0R");
	
	register_touch("crux_ansata", "player", "fw_TouchEntity");
	
	register_logevent("eRoundStart", 2, "1=Round_Start");
	register_event("DeathMsg", "eDeathMsg", "a", "1>0");
	register_event("TextMsg", "eRoundRestart", "a", "2&#Game_C", "2&#Game_w");
	
	set_task(INTERVAL_REGENERATION, "RegenerationHealth", .flags="b");
}

public plugin_precache()
{
	precache_model(g_szModel);
}

public client_disconnect(id)
{
	if(g_iPlayerId == id)
		SpawnAnsata(id);
}

public eRoundRestart()
	g_iRoundCounter = 0;

public eRoundStart()
{
	if(++g_iRoundCounter < ROUND_ACCESS || get_playersnum() < MIN_PLAYERS)
		return;
		
	static iEnt;
	
	while((iEnt = find_ent_by_class(iEnt, "crux_ansata")))
		remove_entity(iEnt);
		
	static apPlayers[32], iPlayers;
	get_players(apPlayers, iPlayers, "ach");
	
	if(!iPlayers)
		return
	
	g_iPlayerId = apPlayers[random(iPlayers)];
	get_user_name(g_iPlayerId, szName, charsmax(szName));
	
	ChatColor(0, "^4[CA] ^3%s ^1выпал талисман жизни.", szName);
}

public eDeathMsg()
{
	if(read_data(2) == g_iPlayerId)
		SpawnAnsata(g_iPlayerId);
}

public fw_TouchEntity(iEnt, id)
{
	if(!is_valid_ent(iEnt) || g_iPlayerId)
		return 1;
		
	entity_set_int(iEnt, EV_INT_flags, FL_KILLME);
	get_user_name(g_iPlayerId = id, szName, charsmax(szName));
	ChatColor(0,"^4[CA] ^3%s ^1поднял талисман жизни.",szName);
	return 1;
}

public RegenerationHealth()
{
	if(!g_iPlayerId || get_playersnum() < MIN_PLAYERS)
		return;
	
	static Float:fHealth, MsgId_Health; fHealth = entity_get_float(g_iPlayerId, EV_FL_health);
	
	if(!MsgId_Health) MsgId_Health = get_user_msgid("Health");
	
	if(fHealth < 100 && is_user_alive(g_iPlayerId))
	{
		static Float:giveHealth; giveHealth = (fHealth + GIVE_HEALTH) < 100 ? float(GIVE_HEALTH) : (100 - fHealth);
		
		entity_set_float(g_iPlayerId, EV_FL_health, fHealth + giveHealth);
		
		message_begin(MSG_ONE_UNRELIABLE, MsgId_Health, _, g_iPlayerId);
		write_byte(floatround(fHealth + giveHealth));
		message_end();
		
#if defined SCREENFADE
		message_begin(MSG_ONE_UNRELIABLE, 98, _, g_iPlayerId);
		write_short(1<<10);
		write_short(1<<10);
		write_short(0x0000);
		write_byte(0);
		write_byte(255);
		write_byte(0);
		write_byte(40);
		message_end();
#endif
	}
}

stock SpawnAnsata(id)
{
	static Float:fOrigin[3];
	entity_get_vector(id, EV_VEC_origin, fOrigin);
	
	new iEnt = create_entity("info_target");
	
	if(!is_valid_ent(iEnt))
		return;
	
	entity_set_vector(iEnt, EV_VEC_origin, fOrigin);
	entity_set_string(iEnt, EV_SZ_classname, "crux_ansata");
	entity_set_int(iEnt, EV_INT_solid, SOLID_TRIGGER);
	entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_NONE);
	entity_set_int(iEnt, EV_INT_effects, 8);
	entity_set_model(iEnt, g_szModel);
	entity_set_size(iEnt, Float:{-16.0,-16.0,-16.0}, Float:{16.0,16.0,16.0});
	ChatColor(g_iPlayerId = 0, "^4[CA] ^3%s ^1потерял талисман жизни.", szName);
}

stock ChatColor(const id, const szMessage[], any:...)
{
	static szBuffer[191], apPlayers[32], iPlayers; iPlayers = 1;
	vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
	if(id)
	{
		if(!is_user_connected(id)) return;
		apPlayers[0] = id;
		iPlayers = 1;
	}
	else get_players(apPlayers, iPlayers, "ch");
	for(new i;i < iPlayers; i++)
	{
		message_begin(MSG_ONE_UNRELIABLE, 76, .player = apPlayers[i]);
		write_byte(apPlayers[i]);
		write_string(szBuffer);
		message_end();
	}
}

Аватар
Alexandrow
Извън линия
Потребител
Потребител
Мнения: 157
Регистриран на: 22 Ное 2017, 16:05
Се отблагодари: 14 пъти
Получена благодарност: 9 пъти

Run time error 4: index out of bounds

Мнение от Alexandrow » 11 Май 2018, 15:38

Благодаря! Работи чудесно.
Ако може да попитам, какво трябва да се промени, за да се върти в кръг, а не да седи на едно място?

Аватар
OciXCrom
Извън линия
Администратор
Администратор
Мнения: 7206
Регистриран на: 06 Окт 2016, 19:20
Местоположение: /resetscore
Се отблагодари: 117 пъти
Получена благодарност: 1295 пъти
Обратна връзка:

Run time error 4: index out of bounds

Мнение от OciXCrom » 11 Май 2018, 15:51

Кое да се върти в кръг?!

Аватар
Alexandrow
Извън линия
Потребител
Потребител
Мнения: 157
Регистриран на: 22 Ное 2017, 16:05
Се отблагодари: 14 пъти
Получена благодарност: 9 пъти

Run time error 4: index out of bounds

Мнение от Alexandrow » 11 Май 2018, 16:20

Модела към плъгина. Тука има снимки. > https://fungun.net/shop/?p=show&id=93
До колкото съм виждал, след като умре играча, който го е получил седи над трупа и се върти в кръг, а не както е статично на снимка примерно.

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Заявки за плъгини”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 14 госта