Wielkość tablic / Informacje w hud.
WeBsteR
08.04.2015
Witam, stworzyłem sobie pewien hud na, którym nie powiem jest dość sporo rzeczy.
Mam 2 pytania, który z metod wyświetlania "informacji" na hud jest, że tak powiem najlepszy?
Obecnie używam:
formatex
Lecz nie wiem czy to dobra metoda, bo powyżej 10 osób już hud miga a od czasu do czasu hud w ogóle zniknie.
Czyżby użycie funkcji:
ShowSyncHudMsg
było by lepsze?
Kolejne z pytań to jak sprawdzić jaka wielkość tablicy jest w sam raz? Obecnie zrobiłem sobie pewną zmienną np.:
new zmienna[512];
I na moim przykładzie:
formatex(zmienna, 511, "Tutaj wszystkie moje informacje");
Gdy gra powiedzmy 5 osób wszystko jest ok, 0 errorów, lecz jak powiedzmy gra 15 osób to pojawiają się cały czas errory (i hud miga albo całkowicie się nie pokazuje/zanika):
[AMXX] Run time error 4: index out of bounds
Jak można by było to rozwiązać?
Edited by WeBsteR, 08.04.2015 13:24.
WeBsteR
08.04.2015
Ciągły error jaki w tym pluginie wyskakuje to:
[AMXX] Run time error 4: index out of bounds
W tej linijce którą podałem:
formatex(zmienna, 511, "Tutaj wszystkie moje informacje");
Tablica:
new zmienna[512];
Hmm może to dlatego, że ten hud wysyłam do wszystkich graczy po kolei a nie 1 do wszystkich, lecz chciałbym aby pozostało, że hud wyświetla się do każdego po kolei.
Rivit
08.04.2015
Według mnie problem leży w parametrach do stringa w formatex... Masz tam jakieś zmienne tablicowe, do których podajesz index? Raczej tam bym szukał.
WeBsteR
08.04.2015
Na przykład mam taki kod:
public task_server() { if(end_usun) return; #if defined DEBUG log_to_file("jail_api_jailbreak.log", "task_server pre"); #endif for(new id=1; id<=MAX; id++) { if(!is_user_alive(id) || !is_user_connected(id)) continue; if(gTeam[id] == 1) { if(dane_dnia[6]) { new PlayerPos[3]; get_user_origin(id, PlayerPos); if(PlayerPos[0] == LastPosition[id][0] && PlayerPos[1] == LastPosition[id][1]) { TimeAfk[id]++; if(TimeAfk[id] == 15) { ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak] ^x01Przestan Kampic!"); ExecuteHam(Ham_TakeDamage, id, 0, 0, 5.0, (1<<14)); } else if(TimeAfk[id] == 18) { ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak] ^x01Przestan Kampic!"); ExecuteHam(Ham_TakeDamage, id, 0, 0, 10.0, (1<<14)); } else if(TimeAfk[id] >= 20) { ColorChat(id, TEAM_COLOR, "^x04[PrisonBreak] ^x01Przestan Kampic!"); ExecuteHam(Ham_TakeDamage, id, 0, 0, 20.0, (1<<14)); } } else TimeAfk[id] = 0; LastPosition[id][0] = PlayerPos[0]; LastPosition[id][1] = PlayerPos[1]; } if(czas_bronie && dane_dnia[0] == 1 && ostatni_wiezien == id && !pokaz_raz) { new iRet; usun_ustawienia_dzien(); ExecuteForward(fLastPrisonerShowWish, iRet, id); obsluga_dala = true; pokaz_raz = true; } } else if(gTeam[id] == 2) { PokazStatusText(id, "Wiezniowie: %i zywi | %i Wszyscy", ilosc_graczy[ZYWI], ilosc_graczy[WSZYSCY]); if(czas_bronie && !dane_dnia[0] && ostatni_wiezien && prowadzacy == id && !pokaz_raz) { menu_display(id, ProwadzacyMenu); usun_ustawienia_dzien(); pokaz_raz = true; } } } //set_hudmessage(0, 255, 0, 0.6, 0.1, 0, 0.01, 1.0); //ShowSyncHudMsg(0, SyncHudObj2, "Dzien %i - %s", jail_day, dni_tygodnia[jail_day%7]); new szDay[512]; formatex(szDay, 511, "Dzien %i - %s^n I TUTAJ DAJE WIECEJ INFORMACJI", jail_day, dni_tygodnia[jail_day%7]); set_hudmessage(0, 255, 0, 0.01, 0.18, 0, 0.01, 1.0); if(prowadzacy && !szInfo[0]) { set_hudmessage(0, 255, 0, 0.01, 0.18, 0, 0.01, 1.0); format(szDay, 511, "%s%s jest prowadzacym straznikiem.", szDay, nazwa_gracza[prowadzacy]); } else if(szInfo[0]) { set_hudmessage(255, 0, 0, 0.01, 0.18, 0, 0.01, 1.0); format(szDay, 511, "%s%s", szDay, szInfo); } ShowSyncHudMsg(0, SyncHudObj3, szDay); if(szPoszukiwani[0] && !szInfoPosz[0]) { set_hudmessage(255, 85, 85, 0.01, 0.4, 0, 0.01, 1.0); ShowSyncHudMsg(0, SyncHudObj4, "Poszukiwani:%s", szPoszukiwani); } else if(szInfoPosz[0]) { set_hudmessage(0, 255, 0, 0.01, 0.22, 0, 0.01, 1.0); ShowSyncHudMsg(0, SyncHudObj4, szInfoPosz); } #if defined DEBUG log_to_file("jail_api_jailbreak.log", "task_server post"); #endif }
Tylko mam ustawione, że hud jest do wszystkich graczy po kolei (id), a nie do wszystkich razem (0).
Błąd wywala w linijce:
formatex(szDay, 511, "Dzien %i - %s^n I TUTAJ DAJE WIECEJ INFORMACJI", jail_day, dni_tygodnia[jail_day%7]);
Edited by WeBsteR, 08.04.2015 15:21.
Rivit
08.04.2015
Według mnie problem leży w parametrach do stringa w formatex... Masz tam jakieś zmienne tablicowe, do których podajesz index? Raczej tam bym szukał.
Wątpie żeby wynik działania jail_day%7 przekroczył zakres tablicy, na moje oko coś w tym co dodałeś i wywala błąd...
WeBsteR
08.04.2015
Do tego kodu @up mam jeszcze dodane:
new szDay[512]; new Time[9]; get_time("%H:%M:%S",Time,8); new szMapName[32]; get_mapname(szMapName, 31); new nextmap[32]; get_cvar_string("amx_nextmap",nextmap,31); new timeleft = get_timeleft();
Czyżby to zmieniało postać rzeczy?
Wielkie Jol
09.04.2015
Mi się wydaje, że powinieneś sprawdzić typ dnia oraz to, czy jest już prowadzący czyli:
if(!prowadzacy && !szInfo[0]).
I nie rezerwuj dla każdej zmiennej 511 znaków, bo to jest trochę dużo.
WeBsteR
09.04.2015
Wytłumacz mi ktoś na chłopski, co oznacza ten error:
[AMXX] Run time error 4: index out of bounds
Czyżby, plugin próbował pobrać wartość tablicy powyżej jej rozmiaru ?
oeN.
09.04.2015
Dokładnie, to tak jakbyś dał zmienną o indeksie 22 dla 32 graczy. No nie da rady.
Wielkie Jol
09.04.2015
Wytłumacz mi ktoś na chłopski, co oznacza ten error:
[AMXX] Run time error 4: index out of boundsCzyżby, plugin próbował pobrać wartość tablicy powyżej jej rozmiaru ?
Tak, ale chyba nie dodałeś 511+ znaków do zmiennej?
WeBsteR
09.04.2015
No, nie dodałem. Ale jak dałbym zmienna np. 64 czy 256 to w niektórych miejscach ucinało mi tekst, więc myślałem, że jak dam więcej to będzie lepiej, bo przynajmniej nic nie ucina
Ale chyba to nie na takiej zasadzie działa, więc skąd mam wiedzieć jaką dać wielkość tablicy, aby była w sam raz na dany tekst?
Rivit
09.04.2015
formatex ucina tekst. Na moje oko coś nie tak z parametrami w formatex, tam może wystąpić przekroczenie zakresu.