Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie
CoD Nowy

[ROZWIĄZANE] Run time error 4: index out of bounds (jak naprawić)error w wielu klasach

cod nowy

  • Zamknięty Temat jest zamknięty
14 odpowiedzi w tym temacie

#1 Gacekk

    Początkujący

  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 28.04.2014 20:05

Witam w wielu klasach wywala mi errory :

L 04/28/2014 - 17:42:43: [AMXX] Displaying debug trace (plugin "codclass_gacek.amxx")
L 04/28/2014 - 17:42:43: [AMXX] Run time error 4: index out of bounds 
L 04/28/2014 - 17:42:43: [AMXX]    [0] codclass_gacek.sma::DeathMsg (line 89)

Nie potrafie tego naprawić sma jednej z wielu klas z tym errorem:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <codmod>
#include <fakemeta>
#include <hamsandwich>

new const nazwa[] = "Gacek (Klasa Premium)";
new const opis[] = "20 hp oraz pelen magazynak za kazde zabojstwo, Posiada eliminator rozrzutu";
new const bronie = 1<<CSW_M4A1 | 1<<CSW_AK47;
new const zdrowie = 30;
new const kondycja = 38;
new const inteligencja = 10;
new const wytrzymalosc = 20;

new bool:ma_klase[33];

new bool:moze_skoczyc[33];

new const maxClip[31] = { -1, 13, -1, 10,  1,  7,  1,  30, 30,  1,  30,  20,  25, 30, 35, 25,  12,  20, 
10,  30, 100,  8, 30,  30, 20,  2,  7, 30, 30, -1,  50 };

public plugin_init() {
	register_plugin(nazwa, "1.0", "QTM_Peyote");
	
	cod_register_class(nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
	
	register_forward(FM_PlayerPreThink, "PreThink");
	register_forward(FM_UpdateClientData, "UpdateClientData", 1)
	register_forward(FM_CmdStart, "CmdStart");
	register_event("DeathMsg", "DeathMsg", "ade");
}

public cod_class_enabled(id)
{
	if(!(get_user_flags(id) & ADMIN_LEVEL_F))
	{
		client_print(id, print_chat, "[Gacek] Nie masz uprawnien, aby uzywac tej klasy.")
		return COD_STOP;
	}
	ma_klase[id] = true;
	return COD_CONTINUE;
}

public PreThink(id)
{
	if(ma_klase[id])
		set_pev(id, pev_punchangle, {0.0,0.0,0.0})
}
public UpdateClientData(id, sw, cd_handle)
{
	if(ma_klase[id])
		set_cd(cd_handle, CD_PunchAngle, {0.0,0.0,0.0})   
}

public cod_class_disabled(id)
	ma_klase[id] = false;

public CmdStart(id, uc_handle)
{
	if(!ma_klase[id])
		return FMRES_IGNORED;
	
	new button = get_uc(uc_handle, UC_Buttons);
	new oldbutton = pev(id, pev_oldbuttons);
	new flags = pev(id, pev_flags);
	if((button & IN_JUMP) && !(flags & FL_ONGROUND) && !(oldbutton & IN_JUMP) && moze_skoczyc[id])
	{
		moze_skoczyc[id] = false;
		new Float:velocity[3];
		pev(id, pev_velocity, velocity);
		velocity[2] = random_float(265.0,285.0);
		set_pev(id, pev_velocity, velocity);
	}
	else if(flags & FL_ONGROUND)	
		moze_skoczyc[id] = true;
		
	return FMRES_IGNORED;
}

public DeathMsg()
{
	new killer = read_data(1);
	new victim = read_data(2);
	
	if(!is_user_connected(killer))
		return PLUGIN_CONTINUE;
	
	if(ma_klase[victim] && !ma_klase[killer])
		cod_set_user_xp(killer, cod_get_user_xp(killer)+10);
	
	if(ma_klase[killer])
	{
		new cur_health = pev(killer, pev_health);
		new Float:max_health = 100.0+cod_get_user_health(killer);
		new Float:new_health = cur_health+20.0<max_health? cur_health+20.0: max_health;
		set_pev(killer, pev_health, new_health);
		
		new weapon = get_user_weapon(killer);
		if(maxClip[weapon] != -1)
			set_user_clip(killer, maxClip[weapon]);
	}
	
	
	return PLUGIN_CONTINUE;
}

stock set_user_clip(id, ammo)
{
	new weaponname[32], weaponid = -1, weapon = get_user_weapon(id, _, _);
	get_weaponname(weapon, weaponname, 31);
	while ((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponname)) != 0)
		if (pev(weaponid, pev_owner) == id) {
		set_pdata_int(weaponid, 51, ammo, 4);
		return weaponid;
	}
	return 0;
}

Kto powie jak naprawić ten problem w klasach.


  • +
  • -
  • 0

#2 wiwi249

    Wszechobecny

  • Użytkownik

Reputacja: 150
Profesjonalista

  • Postów:440
  • GG:
  • Imię:Wiktor
  • Lokalizacja:Tarnobrzeg
Offline

Napisano 28.04.2014 20:32

public DeathMsg()
{
	new killer = read_data(1);
	new victim = read_data(2);


        if( killer > get_maxplayers() || victim > get_maxplayers() )
            return PLUGIN_CONTINUE
        	
	if(!is_user_connected(killer))
		return PLUGIN_CONTINUE;
	
	if(ma_klase[victim] && !ma_klase[killer])
		cod_set_user_xp(killer, cod_get_user_xp(killer)+10);
	
	if(ma_klase[killer])
	{
		new cur_health = pev(killer, pev_health);
		new Float:max_health = 100.0+cod_get_user_health(killer);
		new Float:new_health = cur_health+20.0<max_health? cur_health+20.0: max_health;
		set_pev(killer, pev_health, new_health);
		
		new weapon = get_user_weapon(killer);
		if(maxClip[weapon] != -1)
			set_user_clip(killer, maxClip[weapon]);
	}
	
	
	return PLUGIN_CONTINUE;
}

Index out of bounds jest wiadomością, że plugin próbuje pobrać wartość tablicy powyżej jej rozmiaru.

 

DeathMsg rejestruje jako zabójcę również inne byty, które mogły zadać graczowi śmierć. Byty te też mają swoje id, jak gracz (a ID gracza znajduje się w przedziale <0; 32> albo <1;32>, nie pamiętam. W każdym razie jesli gracz został zabity przez byt o innym id (np. byt ten ma id = 53), to wtedy w linijce (ta, która wskazywała błąd)

if(ma_klase[victim] && !ma_klase[killer])
		cod_set_user_xp(killer, cod_get_user_xp(killer)+10);

będzie sprawdzało ma_klase[53], bo takie jest id zabójcy, a tablica

new bool:ma_klase[33];

ma tylko 34 rekordy, więc 53 będzie już za wysokie i wykracza poza jej rozmiary, dlatego plugin zwróci błąd.


  • +
  • -
  • 1

Wykonuję strony internetowe, zlecenia AMXX i HLDS - w tym pisanie pluginów, ogarnianie serwerów, edycja i tworzenie modeli.

Potrzebujesz czegoś? Pisz!

 

"śpieszmy się pisać posty, tak szybko banują..." ~ sebul


#3 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 28.04.2014 20:53

ok zaraz sprawdze czy pomoże

 

Edit.

 

Zastanawia mnie tylko że te errory występują nie grając tą klasa


Użytkownik Gacekk edytował ten post 28.04.2014 21:02

  • +
  • -
  • 0

#4 wiwi249

    Wszechobecny

  • Użytkownik

Reputacja: 150
Profesjonalista

  • Postów:440
  • GG:
  • Imię:Wiktor
  • Lokalizacja:Tarnobrzeg
Offline

Napisano 28.04.2014 21:48

To jest plugin amxx i to, ze spełnia rolę klasy nic nie znaczy. Jeśli jest wywoływany event DeathMsg, będzie on wywoływany w każdym z pluginów, które go zawierają, a ma go chyba kazda klasa.


  • +
  • -
  • 0

Wykonuję strony internetowe, zlecenia AMXX i HLDS - w tym pisanie pluginów, ogarnianie serwerów, edycja i tworzenie modeli.

Potrzebujesz czegoś? Pisz!

 

"śpieszmy się pisać posty, tak szybko banują..." ~ sebul


#5 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 28.04.2014 21:52

czyli żeby nie było tego błedu powiedzmy na tej klasie musze naprawić DeathMsg w każdej klasie? dobrze rozumiem ?

 

Czy jak zmienie to tylko w tej klasie to poprostu error przestanie sie pojawiać w tej klasie.

 

Edit.

 

Jutro dam znać czy pomogło bo errory nie wyskakują cały czas.


Użytkownik Gacekk edytował ten post 28.04.2014 21:53

  • +
  • -
  • 0

#6 wiwi249

    Wszechobecny

  • Użytkownik

Reputacja: 150
Profesjonalista

  • Postów:440
  • GG:
  • Imię:Wiktor
  • Lokalizacja:Tarnobrzeg
Offline

Napisano 29.04.2014 14:09

Sprawdź najpierw w których klasach Ci to wywala, potem sprawdź na jednej z nich czy to działa, jak działa to zrób resztę.


  • +
  • -
  • 0

Wykonuję strony internetowe, zlecenia AMXX i HLDS - w tym pisanie pluginów, ogarnianie serwerów, edycja i tworzenie modeli.

Potrzebujesz czegoś? Pisz!

 

"śpieszmy się pisać posty, tak szybko banują..." ~ sebul


#7 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 29.04.2014 18:11

na tej klasie działa lecz nie wiem jak naprawić np. tą klase:

errory:

L 04/29/2014 - 15:07:24: [AMXX] Displaying debug trace (plugin "codawans_destroyer.amxx")
L 04/29/2014 - 15:07:24: [AMXX] Run time error 4: index out of bounds 
L 04/29/2014 - 15:07:24: [AMXX]    [0] codawans_destroyer.sma::Death (line 55)

SMA:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <codmod>
#include <colorchat>
#include <engine>
#include <amxmisc>
#include <fakemeta>

#define DMG_BULLET (1<<1)

new bool:ma_klase[33];

new const nazwa[] = "Destroyer (100 lvl TNT)";
new const opis[] = "Wybuchasz po smierci zadajac zabijajac wrogow, 1/5 na oslepienie wroga, podwojny skok";
new const bronie = 1<<CSW_AUG | 1<<CSW_USP | 1<<CSW_HEGRENADE | 1<<CSW_FLASHBANG | 1<<CSW_SMOKEGRENADE;
new const zdrowie = 0;
new const kondycja = 0;
new const inteligencja = 0;
new const wytrzymalosc = 0;

new sprite_blast, sprite_white;
new g_msg_screenfade;
new bool:moze_skoczyc[33];

public plugin_init() 
{
	register_plugin(nazwa, "1.0", "QTM_Peyote");
	
	cod_register_advance(cod_get_classid("TNT (50 lvl Demolitions)"), 100, nazwa, opis, bronie, zdrowie, kondycja, inteligencja, wytrzymalosc);
	register_event("DeathMsg", "Death", "ade");
	register_event("Damage", "Damage", "b", "2!=0");
	register_forward(FM_CmdStart, "CmdStart");
	g_msg_screenfade = get_user_msgid("ScreenFade");
}

public plugin_precache()
{
	sprite_white = precache_model("sprites/white.spr") ;
	sprite_blast = precache_model("sprites/dexplo.spr");
}

public cod_class_enabled(id)
{
	ColorChat(id, GREEN, "");
	ma_klase[id] = true;
	return COD_CONTINUE;
}
	
public cod_class_disabled(id)
	ma_klase[id] = false;

public Death()
{ 
	new id = read_data(2);
	if(ma_klase[id])
		Eksploduj(id);
}

public Eksploduj(id)
{
	new Float:fOrigin[3], iOrigin[3];
	entity_get_vector( id, EV_VEC_origin, fOrigin);
	iOrigin[0] = floatround(fOrigin[0]);
	iOrigin[1] = floatround(fOrigin[1]);
	iOrigin[2] = floatround(fOrigin[2]);
	
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY, iOrigin);
	write_byte(TE_EXPLOSION);
	write_coord(iOrigin[0]);
	write_coord(iOrigin[1]);
	write_coord(iOrigin[2]);
	write_short(sprite_blast);
	write_byte(32);
	write_byte(20);
	write_byte(0);
	message_end();
	
	message_begin( MSG_BROADCAST, SVC_TEMPENTITY, iOrigin );
	write_byte( TE_BEAMCYLINDER );
	write_coord( iOrigin[0] );
	write_coord( iOrigin[1] );
	write_coord( iOrigin[2] );
	write_coord( iOrigin[0] );
	write_coord( iOrigin[1] + 300 );
	write_coord( iOrigin[2] + 300 );
	write_short( sprite_white );
	write_byte( 0 ); // startframe
	write_byte( 0 ); // framerate
	write_byte( 10 ); // life
	write_byte( 10 ); // width
	write_byte( 255 ); // noise
	write_byte( 255 ); // r, g, b
	write_byte( 100 );// r, g, b
	write_byte( 100 ); // r, g, b
	write_byte( 128 ); // brightness
	write_byte( 8 ); // speed
	message_end();
	
	new entlist[33];
	new numfound = find_sphere_class(id, "player", 300.0 , entlist, 32);
	
	for (new i=0; i < numfound; i++)
	{		
		new pid = entlist[i];
		
		if (!is_user_alive(pid) || get_user_team(id) == get_user_team(pid))
			continue;
		cod_inflict_damage(id, pid, 90.0, 0.7);
	}
	return PLUGIN_CONTINUE;
}

public Damage(id)

{

    new attacker = get_user_attacker(id);

    

    if(!is_user_alive(attacker) || !is_user_connected(attacker) || id == attacker)

        return PLUGIN_CONTINUE;

    

    if(ma_klase[attacker] && random(5) == 1)

        Display_Fade(id,1<<14,1<<14 ,1<<16,255,155,50,230);

    

    return PLUGIN_CONTINUE;

}

stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)

{

    message_begin( MSG_ONE, g_msg_screenfade,{0,0,0},id );

    write_short( duration );    // Duration of fadeout

    write_short( holdtime );    // Hold time of color

    write_short( fadetype );    // Fade type

    write_byte ( red );        // Red

    write_byte ( green );        // Green

    write_byte ( blue );        // Blue

    write_byte ( alpha );    // Alpha

    message_end();

}

public CmdStart(id, uc_handle)

{

if(!ma_klase[id])

return FMRES_IGNORED;

 

new button = get_uc(uc_handle, UC_Buttons);

new oldbutton = pev(id, pev_oldbuttons);

new flags = pev(id, pev_flags);

if((button & IN_JUMP) && !(flags & FL_ONGROUND) && !(oldbutton & IN_JUMP) && moze_skoczyc[id])

{

moze_skoczyc[id] = false;

new Float:velocity[3];

pev(id, pev_velocity, velocity);

velocity[2] = random_float(265.0,285.0);

set_pev(id, pev_velocity, velocity);

}

else if(flags & FL_ONGROUND)

moze_skoczyc[id] = true;

 

return FMRES_IGNORED;

}


  • +
  • -
  • 0

#8 wiwi249

    Wszechobecny

  • Użytkownik

Reputacja: 150
Profesjonalista

  • Postów:440
  • GG:
  • Imię:Wiktor
  • Lokalizacja:Tarnobrzeg
Offline

Napisano 02.05.2014 21:21

Identycznie jak poprzednio.

public Death()
{ 
	new id = read_data(2);

        if( id > get_maxplayers())
            return PLUGIN_CONTINUE

	if(ma_klase[id])
		Eksploduj(id);
}

  • +
  • -
  • 1

Wykonuję strony internetowe, zlecenia AMXX i HLDS - w tym pisanie pluginów, ogarnianie serwerów, edycja i tworzenie modeli.

Potrzebujesz czegoś? Pisz!

 

"śpieszmy się pisać posty, tak szybko banują..." ~ sebul


#9 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 02.05.2014 21:36

ok super już sprawdzam


  • +
  • -
  • 0

#10 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 02.05.2014 21:50

Hola hola...to że kod działa nie znaczy że jest dobry dla serwera.

Sprawdzanie co śmierć ilość slotów to duże obciążenie dla serwera...

Zamiast wstawiać:

get_maxplayers()

lepiej wstawić

32

A najlepiej to zamiast:

if( id > get_maxplayers())

wpisać

if(!(1 <= id <= 32))

Użytkownik d0naciak edytował ten post 02.05.2014 21:51

  • +
  • -
  • 1

#11 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 02.05.2014 21:55

rozumiem że liczba 32 odpowiada za liczbe slotów na serwerze ?


  • +
  • -
  • 0

#12 d0naciak

    Godlike

  • Power User

Reputacja: 1 029
Hero

  • Postów:2 414
  • GG:
  • Steam:steam
  • Imię:Dawid
  • Lokalizacja:Kotlarka
Offline

Napisano 02.05.2014 22:04

No można tak powiedzieć, ale ja tak też jest dobrze, a nawet lepiej jeśli zostanie 32 ;)


  • +
  • -
  • 2

#13 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 02.05.2014 23:44

ok zaraz sprawdze jak to sie spisuje


  • +
  • -
  • 0

#14 Gacekk

    Początkujący

  • Autor tematu
  • Użytkownik

Reputacja: 4
Nowy

  • Postów:16
  • Imię:Michał
  • Lokalizacja:Wrocław
Offline

Napisano 03.05.2014 16:19

Dziala wszystko ok mozna zamknac
  • +
  • -
  • 0

#15 Misiaczek ;c

    /dev/null

  • Moderator

Reputacja: 1 678
Godlike

  • Postów:2 496
  • GG:
  • Steam:steam
  • Imię:Michał
  • Lokalizacja:Halemba
Offline

Napisano 04.05.2014 09:12

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
  • +
  • -
  • 0





Również z jednym lub większą ilością słów kluczowych: cod nowy

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych