Automatyczne wsiadanie do pojazdów

Edytor Arma (Arma, Arma2, Arma2OA)

Moderatorzy: kondor, Inkwizytor

ODPOWIEDZ
fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Automatyczne wsiadanie do pojazdów

Post autor: fdd »

Witam.

Sprawa wygląda tak: robię prostą misję multiplayer. Mam kilku graczy (playable) i zrobione respawny. Na mapie jest kilka pojazdów. Zrobiłem prosty skrypt, dzięki któremu boty automatycznie wsiadają do pojazdów w pobliżu. Problem jest taki, że skrypt działa tylko raz, tzn. zaraz po starcie gry botek jak napotka pojazd na swojej drodze wsiada i fajnie jedzie dalej, ale jak zginie, po respawnie już za nic nie chce z powrotem do żadnego pojazdu wsiąść. Jestem początkującym w pisaniu skryptów i nie mogę sobie z tym poradzić.

w init jednostkom daję:

Kod: Zaznacz cały

nul=[this] execVM "getin.sqf"
natomiast sam plik getin.sqf wygląda tak:

Kod: Zaznacz cały

_text = "sprawdzam";
_text2 = "sprawdzam2";
_auto = nearestObject [getPos _unit, "landvehicle"];

while {1 < 2} do 
{
	_unit = _this select 0;
		hint _text;
	_auto = nearestObject [getPos _unit, "landvehicle"];
	sleep 3;
		hint _text2;
	sleep 3;
	if ((_unit distance _auto < 30) and ({not alive _x} count crew _unit == 0)) then (_unit moveinDriver _auto);	
};
Dwa hinty dałem żeby widzieć czy skrypt "pracuje" i niby jest przetwarzany nawet po respawnie, a nie działa jak trzeba :(
Będę bardzo wdzięczny za pomoc.
Awatar użytkownika
kondor
Posty: 1522
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Automatyczne wsiadanie do pojazdów

Post autor: kondor »

Po pierwsze, kilka błędów:
-w 3. linijce masz:

Kod: Zaznacz cały

_auto = nearestObject [getPos _unit, "landvehicle"];
a _unit jest jeszcze nie ustawiony. Przenieś

Kod: Zaznacz cały

_unit = _this select 0;
na sam początek (dodatkowo nie będziesz niepotrzebnie przypisywać tego samego w każdym obrocie pętli)
-zamiast

Kod: Zaznacz cały

1 < 2
można po prostu napisać true
-

Kod: Zaznacz cały

({not alive _x} count crew _unit == 0)
co w końcu tu chcesz zrobić? W każdym bądź razie jest źle, bo _x nie jest przypisany
-włącz sobie pokazywanie błędów: viewtopic.php?f=65&t=2683&start=0&hilit ... riptErrors - ułatwi to debugowanie

Jednak spory problem jest jeszcze gdzie indziej. Po respawnie jednostka jest już innym obiektem. Tzn:

Kod: Zaznacz cały

_jednostkaPrzedRespawnem = jakasJednostka;
//zabicie jednostki:
_jednostkaPrzedRespawnem setDammage 1;
sleep 20; //czas nie krótszy niż czas respawnu
hint format["Po smierci jednostka jest tym samym obiektem to: %1", jednostkaPrzedRespawnem == jakasJednostka];
pokaże false.
Czyli powinieneś:
1. zakończyć poprzedni skrypt (bo tamten obiekt (wskazywany przez zmienną _unit) już się nie podniesie
2. uruchomić skrypt dla nowej jednostki
fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Re: Automatyczne wsiadanie do pojazdów

Post autor: fdd »

Dzięki odpowiedź.

Kod: Zaznacz cały

and ({not alive _x} count crew _unit == 0))
Chciałem żeby _unit wchodził do _auto jak będzie < 30 od niego i _auto będzie puste, ale to jest nieważne.

Zrobiłem teraz tak

Kod: Zaznacz cały

#start
_text = "sprawdzam";
_text2 = "sprawdzam2";
_unit = _this select 0;
_auto = nearestObject [getPos _unit, "landvehicle"];

while {alive _unit} do 
{
		hint _text;
	_auto = nearestObject [getPos _unit, "landvehicle"];
	sleep 3;
		hint _text2;
	sleep 3;
	if (_unit distance _auto < 30) then (_unit moveinDriver _auto);	
};

goto "start";
ale nie działa, bo chyba w sqf nie działa goto, tak ? Nie mam już pojęcia jak napisać ten skrypt żeby działal wielokrotnie, a jest mi bardzo potrzebny. Wziąłem się za to bo nie chciało mi się robić 30 triggerów dla botów i teraz żałuję bo zmarnowałem o wiele więcej czasu.

Uczyłem się według tego skryptu (respawnu) http://www.speedyshare.com/files/22898785/vehicle.sqf, on bez problemu działa wielokrotnie, nie mogę tego zrozumieć, przerasta mnie to, dlatego bardzo proszę o pomoc w przepisaniu tego.
Awatar użytkownika
kondor
Posty: 1522
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Automatyczne wsiadanie do pojazdów

Post autor: kondor »

O! w tym skrypcie jest komenda, której nie byłem świadomy (i która Ci też pomoże): http://community.bistudio.com/wiki/vehicleVarName

spróbuj tak:

Kod: Zaznacz cały

_text = "sprawdzam";
_text2 = "sprawdzam2";
_unit = _this select 0;
_unitEditorName = vehicleVarName _unit;
_auto = nearestObject [getPos _unit, "landvehicle"];

while {alive _unit} do
{
      hint _text;
   _auto = nearestObject [getPos _unit, "landvehicle"];
   sleep 3;
      hint _text2;
   sleep 3;
   if (_unit distance _auto < 30) then (_unit moveinDriver _auto);   
};
waitUntil {alive (call compile _unitEditorName)};
sleep 3;
[call compile _unitEditorName] execVM "getin.sqf";
Ale musisz ponazywać te grywalne jednostki jakoś, np: p1, p2, ..., p30
fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Re: Automatyczne wsiadanie do pojazdów

Post autor: fdd »

Działa !
Wielkie dzięki, mistrzostwo :)
:dworship :dworship :dworship :dworship
fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Re: Automatyczne wsiadanie do pojazdów

Post autor: fdd »

tutaj troszkę podrasowana wersja 'po latach'. Może komuś się przyda.

Kod: Zaznacz cały

// gta =[this] execVM "gta.sqf";
// [email protected]
// 
// jednostki musza miec nazwe nadana w edytorze

_unit = _this select 0;
_unitEditorName = vehicleVarName _unit;
_auto = [];


_ilikevehicles	= 0.5;		 
_boredRatio	= 0.08;		
_range		= 20;		
_pauza		= 5;		
_debug		= false;	

_pauza		= _pauza + ((random 10)*_ilikevehicles);
if (isPlayer _unit) exitWith {	if (_debug) then {Hint "is player !"};	};
	
while {alive _unit} do
{

_auto = nearestObject [getPos _unit, "landvehicle"];	

	if !(_unit in (crew _auto)) then {
   		sleep 1;
   		if ((_unit distance _auto < _range)&&((random 1) < _ilikevehicles)) then {_unit moveinDriver _auto}; 
	};

	if (_unit in (crew _auto)) then {
		waitUntil {sleep _pauza; (random 1) < _boredRatio};
		_unit leaveVehicle _auto;
	};


 

sleep _pauza;  
};

waitUntil {alive (call compile _unitEditorName)};
sleep 3; 
[call compile _unitEditorName] execVM "gta.sqf";
ODPOWIEDZ

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