Problem z petla for i tablicami

Moderator: Inkwizytor

Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Problem z petla for i tablicami

Post autor: Trance »

Witam!
Tworze swoja misje i napotkałem znowu problem.

Definiuje w pliku init.sqf tablice nazwana przeze mnie west_array.
west_array = [p1,p2,p3,p4,p5,p6,p7,p8,p9,10];
W innym pliku mam taką petle:
for "_i" from 1 to (count west_array) do
{
_postac = west_array select (_i-1);
hint format ["Player: %1",_postac];
sleep 1;
};
Teoretycznie, skrypt powinien co sekunde wyswietlac za pomoca "hinta" kazdy element z tablicy west_array po kolei. Jednak zamiast tego wyswietla sie dla kazdego elementu Player: scalar bool array string 0x0fffffff czy cos podobnego.
Wie ktos moze czym jest to spowodowane?
Obrazek
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: aszek »

Do zmiennej '_postać' nie zostaje przypisany element z tablicy 'west_array' (obiekt Null), z tąd bład. A że pętla wygląda poprawnie, więc zbadaj czy 'west_array' ma wogóle jakieś elementy (może gdzieś tablicę zerujesz/modyfikujesz):

hint format ["%1", count west_array];

albo dla ułatwienia możesz je wszystkie wyświetlić na raz:

hint format ["%1", west_array];

A, ostatni element 'west_array' to liczba (10), a chyba chciałeś mieć tam obiekt (p10).
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: Trance »

Wyswietlilem sobie tą tablice hintem i dostalem ciekawy wynik, mianowicie cos w stylu:
scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef,scalar bool array string 0x0fffffef
mniewiecej tyle razy, ile jest w tej tablicy obiektow (ich tam jest wiecej niz 10 i sa inaczej nazwane, takze ten blad z 10 na koncu to tylko pomylka tutaj na forum).

Ale zawartosci tablicy nigdzie nie zmienialem.

Jezeli to moze pomoc, to ja w 1 skrypcie taka petle wywoluje 2 razy. Za pierwszy razem dziala. Ale kiedy ktorys z graczy na tej liscie zginie i po odrodzeniu juz robia sie takie krzaki jak teraz wlasnie opisane.
Obrazek
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: aszek »

Spróbuj zadeklarować 'west_array' jako zmienną publiczną (w 'init.sqs'):

publicVariable west_array;
west_array = [......];

Bo pewnie w lokalnych sesjach MP po respawnie obiekty w 'west_array' nie wskazują już na graczy, a serwer tego nie rozgłasza (nie bawię się MP, więc tylko zgaduje...).
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: Trance »

west_array od poczatku mialem zadeklarowane w init.sqf, teraz sprobowalem publikowac ta zmienna co 2 sekundy, dla pewnosci, ale niestety, nic to nie daje.
Obrazek
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: aszek »

To może spróbuj jeszcze opublikować zmienną, ale z cudzysłowami:

Kod: Zaznacz cały

publicVariable "west_array";

A że zmienne mają płynąć z serwera do kilentów to klient nie powinien ich rozgłaszać, więc może tak:

Kod: Zaznacz cały

? not (local player) : publicVariable "west_array";

Za każdym razem kiedy ktoś się respawnie, to zawartość tablicy bedziesz musiał znowu publikować. Aby wykrywać taką sytuację, to możesz podczepić graczowi skrypt:

Kod: Zaznacz cały

player addEventHandler ["killed", {_this exec "respawn.sqs"}];
respawn.sqs

Kod: Zaznacz cały

@(alive player);
west_array = [..., ..., ...];
publicVariable "west_array";
exit;
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: Trance »

Niestety te zabiegi tez nic nie dają.
Obrazek
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem z petla for i tablicami

Post autor: kondor »

Jako tymczasowe rozwiązanie, zanim znajdziesz bug/odkryjesz właściwość army tłumaczącą to zachowanie, spróbuj odwoływać się do graczy przez ich grupy:
-na początku pobrać te grupy

Kod: Zaznacz cały

west_groups = [group p1, group p2, ...];
-a w szczegółowym miejscu gracz jest w postaci:

Kod: Zaznacz cały

(west_groups select _i) select 0
(zakładając, że gracze są w oddzielnych jednoosobowych grupach)

PS1:

Kod: Zaznacz cały

? not (local player) : publicVariable "west_array";
nie uwzględnia sytuacji, gdy gracz hostuje serwer - do wykrycia serwera mamy komendę isServer
PS2: uwzględniłeś, Trance, sytuację, gdy niektóre ze slotów są wyłączone w lobby (lub po prostu zechcesz je wyłączyc odgórnie poprzez disabledAI = true;)?
Bo wówczas taki slot, np p3 będzie zawsze scalar bool array string 0x0fffffef
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: Trance »

Niestety, grupy nie sa jednoosobowe. Jest kilka grup, kazda z nich ma inna ilosc czlonkow.
Dostosowanie Twojego pomysłu, kondor, do realiów mojej misji, niestety nic nie dało, a wrecz podporzadkowało markery wszystkich jednostek obecnych na mapie mi. Moze bedzie pomocne, kiedy wkleje poprostu cały skrypt.
if (side player == WEST) then
{
for "_i" from 1 to wcount do
{
_postac = west_array select (_i - 1);
_marker = createMarkerLocal [format ["w%1marker",_i],[0,0]];
format ["w%1marker",_i] setMarkerColorLocal "ColorBlue";
format ["w%1marker",_i] setMarkerSizeLocal [0.4,0.4];
format ["w%1marker",_i] setMarkerShapeLocal "ICON";
format ["w%1marker",_i] setMarkerTypeLocal "Dot";
format ["w%1marker",_i] setMarkerTextLocal format ["%1",(name _postac)];
format ["w%1marker",_i] setMarkerPosLocal (position _postac);
};
//////////////////////////////////////////////////////////////////
while {true} do
{
sleep 2;

for "_j" from 1 to wcount do
{
if (player in west_array) then
{
_postac = west_array select (_j - 1);
_pozycja = position _postac;
format ["w%1marker",_j] setMarkerPosLocal _pozycja;
};
};
};
};
exitWith;
Tutaj zmienna west_array przechowuje w formie tablicy wszystkie jednostki znajdujace sie po stronie zachodniej.
west_array = [wa1,wa2,wa3,wa4,wa5,wa6,wa7,wpp1,wpp2,wpp3,wpp4,wpp5,wp1,wp2,wp3,ws1,ws2,ws3,ws4,wz1,wz2,wz3,wz4];

Zmienna wcount liczy ilosc elementow tablicy west_array (wcount = count west_array;)

Skrypt działa jak najbardziej poprawnie, zarowno tworza sie markery we wlasciwych miejscach i wszystko dziala. Co 2 sekundy markery zmieniaja swoje polozenie zgodnie z polozeniem graczy. Problem zaczyna sie po pierwszej smierci gracza. Marker zostaje poprostu na miejscu ciała gracza i juz nigdy nie wraca na jego pozycje po respawnie.
Dziekuje za zainteresowanie tematem, ale prosze o jakies inne podpowiedzi, nawet jak ktos nie jest pewien rozwiazania, ale mu cokolwiek swita w glowie niech pisze, ja to sprawdze i poinformuje o wynikach.
Pozdrawiam serdecznie.
Obrazek
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem z petla for i tablicami

Post autor: kondor »

do "sabotage" napisałem niemal identyczny skrypt (działał niezależnie od śmierci), z tą różnicą, że pozycje poszczególnych markerów ustawiałem w ten sposób:

Kod: Zaznacz cały

...
"m0" setMarkerPos getPos g1;
"m1" setMarkerPos getPos g2;
"m2" setMarkerPos getPos g3;
"m3" setMarkerPos getPos g4;
"m4" setMarkerPos getPos g5;
"m5" setMarkerPos getPos g6;
...
co oznacza, że Twoje wa1,wa2,wa3 ... wskazują poprawnie na graczy, tablica jednak nie, (podejrzenie: ) gdyż przechowuje coś w rodzaju wskaźnika na miejsce w pamięci (które po śmierci i respawnie się nie zmienia - czyli wskazuje trupa do czasu "hideBody").
Wg mnie wystarczy update tej tablicy w momencie śmierci.
Przykładowy kod:

Kod: Zaznacz cały

ktos_zginal_w = false;
"ktos_zginal_w" addPublicVariableEventHandler
{  
 if( sidePlayer == west )then
 {
   west_array = [...];
   ktos_zginal_w = false;
 };
};
a w skrypcie uruchamianym przy smierci gracza:

Kod: Zaznacz cały

...
waitUntil { alive player };
if( sidePlayer == west )then
{
     ktos_zginal_w = true;
     publicVariable "ktos_zginal_w";
     ktos_zginal_w = false;
     west_array = [...];
};
PS: na początku sprawdzasz:

Kod: Zaznacz cały

if (side player == WEST) then 
a później:

Kod: Zaznacz cały

if (player in west_array) then 
to drugie chyba jest zbędne, chyba, że są gracze west, których nie ma w west_array
Ostatnio zmieniony 27 lutego 2009, 19:39 przez kondor, łącznie zmieniany 1 raz.
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z petla for i tablicami

Post autor: Trance »

Tzn. nie moge zrozumiec pierwszego kodu. Mam te linijki wkleic do init.sqf? Czy do jakiegos innego pliku?
Obrazek
ODPOWIEDZ

Wróć do „Edytor - tworzenie misji, skrypty oraz programowanie”