Problem początkującego

Moderator: Inkwizytor

Awatar użytkownika
Matte
Posty: 805
Rejestracja: 17 stycznia 2007, 12:20
ID Steam:
Numer GG: 3470353
ID gracza: 2166020
Lokalizacja: Sosnowiec

Re: Problem początkującego

Post autor: Matte »

O ile nie bawiłem się zbyt dużo zmiennymi w MP zrobiłbym to tak:

Element Logiczny nazywam "server", w inicjacji ładuje "x = execVM "losuj.sqf"

Kod: Zaznacz cały

//Losuj.sqf
if(isServer)then
{
liczba = random 3;
PublicVariable "liczba";
};
a w twoim skrypcie zamiast:

Kod: Zaznacz cały

_rnd = random (3); 
dajesz:

Kod: Zaznacz cały

_rnd = liczba
@kondor, popraw mnie, znając życie coś namieszałem
Jestem BIS fanboyem! :ofp :weteran
FAQ:
Co zrobić gdy powiedzą coś złego o OFP:DR? DR nie żyje, a fani zapomnieli.
Co zrobić gdy powiedzą coś złego o ArmA II? - Do 1.96 jescze trochę brakuję...
All of BIS's programming is done by Ondrej's hair
Blogaska prowadzę, i gadam do mikrofonu w podcaście na matteprl.net
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem początkującego

Post autor: kondor »

1. działania na jednostkach grupy oraz pojazdach w MP działają tylko na komputerze, gdzie są one lokalne. w przypadku grup AI - na serwerze. Więc nawet jeśli skrypt uruchomi się na wszystkich komputerach, to kluczowe usuwanie będzie tylko jedno. I tak tylko serwer usunie te grupy i pojazdy, i jednoczesnie wysle automatycznie rozgłoszenie do reszy ze tych jednostek już nie ma.
Czyli nie jest istotne, czy na wszystkich komputerach graczy w MP wylosuje sie ta sama liczba, bo i tak bedzie istotna ta na serwerze (zakładając, ze są one lokalne właśnie na serwerze). I ten myk, który wczesniej przytoczylem jest zbędny.
Krótko mówiąc: nic nie musisz zmieniać

2. do wyswietlenia zmiennych przydatna jest funkcja "format". dla przykładu:

Kod: Zaznacz cały

a=1;
b=2;
c=3;
hint format["a=%1,\nb=%2, c=%3",a,b,c];
wyswietli:
"a=1
b=2, c=3"
więcej: http://community.bistudio.com/wiki/format
thebil
Posty: 17
Rejestracja: 01 lipca 2008, 23:40
ID Steam:
ID gracza: 0

Re: Problem początkującego

Post autor: thebil »

Dziękuje bardzo za pomoc. Pozwolicie, że pomęcze was dalej. Potrzebuję komendy, która zwróci mi pozycję waypointu. Może pokażę wam skrypt wraz z obiaśnieniami:

Kod: Zaznacz cały

/* Skrypt losuje ilosc grup i nadaje im losowe trasy patrolowe*/

_initGrpArray = [group d0, group d1, group d2, group d3, group d4];
// inicjalizacja grup jednostek d0 - d4
_grps = round (random((count _initGrpArray)-2));
// wyjsciowa ilosc grup
_grpArray = [grpnull];
// inicjalizacja wyjsciowej tablicy grup
for "_j" from 0 to _grps do 
{
	_grpArray set [_j,_initGrpArray select (_j)];
};
// wypelanianie tejze tablicy
_diffArray = _initgrparray - _grparray;
// inicjalizacja roznicy (potrzebne do usuniecia niepotrzebnych grup)
/*_iis = count( _diffarray);
hint format ["count _intGrpArray=%1 \n_iis=%2", _grps ,_iis];
// debug
*/
for "_i" from 0 to ((count _diffArray)-1) do
{
	{deleteVehicle _x} forEach units(_diffArray select _i);
};
// usuwanie jednostek z niepotrzebnych grup
_currGroup = +_grpArray select 0;
// kopiowanie zaw. _grparray dla bezpieczenstwa i łatwiejszej obsługi
for "_i" from 1 to 3 do
{ 
	_currGroupWaypoints = waypoints (_currgroup);
	// tablica waypointow - potrzebna do ustawienia kolejnych WP
	_a = _currGroup AddWaypoint [_currgroupWaypoints select (_i - 1), 50];
	// dodajemy WP dla grupy w odległości 50m od ostatniego
	[_currGroup, _i] setWaypointType "MOVE";
	// ustalamy typ waypointu
};
_a = _currGroup AddWaypoint [_currgroupWaypoints select 0, 50];
[_currGroup, 4] setWaypointType "Cycle";
// ustawiamy ostatni WP na pierwszy i zapetlamy droge

if (true) exitWith{};
Jak podaje w opisie - ma on losować ilość grup i nada im losowe 4 waypointy. Nie jest jeszcze skończony, bo robi (a własciwie nie robi) to tylko dla grupy 0 (uproszczenie kodu). Część z dodawaniem i usuwaniem jednostek jest okej. Problem pojawia się przy

Kod: Zaznacz cały

	_currGroupWaypoints = waypoints (_currgroup);
	// tablica waypointow - potrzebna do ustawienia kolejnych WP
	_a = _currGroup AddWaypoint [_currgroupWaypoints select (_i - 1), 50];
	// dodajemy WP dla grupy w odległości 50m od ostatniego
	[_currGroup, _i] setWaypointType "MOVE";
	// ustalamy typ waypointu
Kompilator chce jako 1 argument dla AddWaypoint position, a ja nie wiem jak go wyciągnąć z waypointu zapisanego jako _currgroupWaypoints select (_i - 1). Kiedy podaje go w tej postaci kompilator płacze, że:

Kod: Zaznacz cały

Error Typ Grupa, potrzebny Liczbowe
a komenda position wymaga obiektu.

Błedy kompilacji:

Kod: Zaznacz cały

Error in expression <s (leader _currgroup);

_a = _currGroup AddWaypoint [(_currgroupWaypoints select>
  Error position: <AddWaypoint [(_currgroupWaypoints select>
  Error Typ Grupa, potrzebny Liczbowe
File C:\Documents and Settings\K\Moje dokumenty\ArmA Other Profiles\tsuki\missions\test.Sara\squad.sqf, line 31
Error in expression <s (leader _currgroup);

_a = _currGroup AddWaypoint [(_currgroupWaypoints select>
  Error position: <AddWaypoint [(_currgroupWaypoints select>
  Error Dostarczone elementy 0, potrzebne 3
File C:\Documents and Settings\K\Moje dokumenty\ArmA Other Profiles\tsuki\missions\test.Sara\squad.sqf, line 31
Error in expression <Group AddWaypoint [(_currgroupWaypoints select (_i)), 50];

[_currGroup, (_i+1)]>
  Error position: <select (_i)), 50];

[_currGroup, (_i+1)]>
  Error Zerowy podzielnik
File C:\Documents and Settings\K\Moje dokumenty\ArmA Other Profiles\tsuki\missions\test.Sara\squad.sqf, line 31
Error in expression <aypointType "MOVE";

};
_a = _currGroup AddWaypoint [(_currgroupWaypoints select>
  Error position: <AddWaypoint [(_currgroupWaypoints select>
  Error Dostarczone elementy 0, potrzebne 3
File C:\Documents and Settings\K\Moje dokumenty\ArmA Other Profiles\tsuki\missions\test.Sara\squad.sqf, line 36

Stąd tez pytanie o funkcję zwracającą pozycję waypointu.

Edit: zapomniałem dopisać zasadę działania:
najpierw inicjaslizuję główną tablicę poczatkowa zaw. wszystkie grupy wchodzące w skład skryptu. Nasępnie losuje ilość grup, które faktycznie się pojawią. przepisuje fragment tablicy głównej do tablicy jednostek o długości _grps (ilość grup).
Następnie sprawdza różnicę pomiędzy tablicami i zapisuje ją w tablicy różnicowej. Kolejnym krokkiem jest usunięcie jednostek z mapy zawartych w _diffArray.

teraz waypointy - ogólny koncept to:
sprawdź waypoint 0 (pozycja grupy) i postaw 1 WP w promieniu 50 m (wartość będzie zmieniona - po prostu chcę widzieć, jak przemieszcza się jednostka).
Sprawdź WP 1 i postaw WP 2 w promieniu 50m i tak dalej.
Ostatni waypoint ustaw w miejscu WP 0 i ustaw jako cycle, aby zapętlić i tym samym nadać ruchowi charakter "patrolu".
Powtórz dla wszystkich grup zawartych w _grpArray.

algorytm jest dobry, ale wykonanie nie.
Awatar użytkownika
Matte
Posty: 805
Rejestracja: 17 stycznia 2007, 12:20
ID Steam:
Numer GG: 3470353
ID gracza: 2166020
Lokalizacja: Sosnowiec

Re: Problem początkującego

Post autor: Matte »

Jestem BIS fanboyem! :ofp :weteran
FAQ:
Co zrobić gdy powiedzą coś złego o OFP:DR? DR nie żyje, a fani zapomnieli.
Co zrobić gdy powiedzą coś złego o ArmA II? - Do 1.96 jescze trochę brakuję...
All of BIS's programming is done by Ondrej's hair
Blogaska prowadzę, i gadam do mikrofonu w podcaście na matteprl.net
thebil
Posty: 17
Rejestracja: 01 lipca 2008, 23:40
ID Steam:
ID gracza: 0

Re: Problem początkującego

Post autor: thebil »

Dzięki, skrypt działa, dodałem go dla wszystkich grup i jest miodzio. Wiem, że mozna okreslić parametry dla skryptu, ale w jaki sposób sie do nich odnosić? Chciałbym ustawić parę rzeczy, jak np. _initGrpArray w parametrze, ale nie wiem jak go potem wykozystać.
Awatar użytkownika
Matte
Posty: 805
Rejestracja: 17 stycznia 2007, 12:20
ID Steam:
Numer GG: 3470353
ID gracza: 2166020
Lokalizacja: Sosnowiec

Re: Problem początkującego

Post autor: Matte »

Kod: Zaznacz cały

x = [1,2,3,4] execVM "echo.sqf"
zmienna= _this select 0;
zmienna = 1
zmienna= _this select 1;
zmienna = 2
zmienna= _this select 2;
zmienna = 3
zmienna= _this select 3;
zmienna = 4
Jestem BIS fanboyem! :ofp :weteran
FAQ:
Co zrobić gdy powiedzą coś złego o OFP:DR? DR nie żyje, a fani zapomnieli.
Co zrobić gdy powiedzą coś złego o ArmA II? - Do 1.96 jescze trochę brakuję...
All of BIS's programming is done by Ondrej's hair
Blogaska prowadzę, i gadam do mikrofonu w podcaście na matteprl.net
thebil
Posty: 17
Rejestracja: 01 lipca 2008, 23:40
ID Steam:
ID gracza: 0

Re: Problem początkującego

Post autor: thebil »

Witam ponownie.

Zgadliście - przybyłem z kolejnym pytaniem. W jaki sposób można sprawdzić, czy jednostka jest w obrębie markera?
Jakikolwiek artunek bym nie wymyslił, to jest on cholernie skomplikowany i w dodatku nie da się skompilować. Ma ktoś jakiś pomysł? Albo może waruneczek, który nie zwraca błedu?
gremdek
Posty: 261
Rejestracja: 13 grudnia 2006, 16:53
ID Steam:

Re: Problem początkującego

Post autor: gremdek »

trigger który pokrywa marker?
przestawiasz market => przestawiasz trigger.

trigger grupujesz(F2) z jednostką która ma tam być a w opcjach zobaczysz już co i jak.
a jak nie powiązany z konkretną jednostką to thislist i te sprawy.
cfog skończył się na kill'em all
thebil
Posty: 17
Rejestracja: 01 lipca 2008, 23:40
ID Steam:
ID gracza: 0

Re: Problem początkującego

Post autor: thebil »

Heh, cóż - jak widać xle sprecyzowane pytania to moja specjalnośc ;).

Patroll script, który robie m. in wykozystuje marker do wyznaczenia waypointów (sprawdz czy sa w jego obrebie). Stąd też potrzebuję łatwy sposób na sprawdzenie czy coś jest w obrębie danego markera. jezeli nie - wylosuj inne współżędne.

Myslałem nad czymś takim, że:

Kod: Zaznacz cały

(abs (x_markera - x_waypointa ) > (wielkości_x_markera / 2)) OR (abs(y_markera - y_waypointa) > (wielkość_y_markera / 2))
Niby wyglada dobrze, ale przy zapisaniu jest jak supeł. Wyglada wtedy tak:

Kod: Zaznacz cały

if (((abs ((GetWPPos _nextWPpos) select 0) - ((markerPos (_this select 3)) select 0)) > _markerSize select 0) OR
   ((abs ((GetWPPos _nextWPpos) select 1) - ((markerPos (_this select 3)) select 1) > _markerSize select 1)) then
Ani się w tym połapać, zni znaleść błąd.
Awatar użytkownika
kondor
Posty: 1526
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem początkującego

Post autor: kondor »

Radziłbym Ci porzucić ambicję w tej kwestii i wykorzystać przetestowany i świetnie działający "Urban Patrol Script" autorstwa Kronzky'ego: http://kronzky.info/ups/index.htm . natomiast swoje umiejętności programistyczne wykorzystać do budowy innych elementów misji.
thebil
Posty: 17
Rejestracja: 01 lipca 2008, 23:40
ID Steam:
ID gracza: 0

Re: Problem początkującego

Post autor: thebil »

Widzisz, ten skrypt od początku był w celach głównie edukacyjnych - chciałem zapoznać się z tym językiem. przy okazji tworzę coś, co może mi się przydać w przyszłości. A poza tym, jest on pewnym pretekstem aby wyciągnąc troche informacji od użytkowników tego forum ^_^.
A poza tym UPS sam tworzy grupy, więc nie można im dać waypointów, czy kombinować z nimi dalej.

A poza tym - szczerze mówiąc nie widzę przyjemności w tworzeniu misji, która w zasadzie zrobi się sama, bo ja tylko wyexecuje skrypt i to wszystko. ;).
ODPOWIEDZ

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