Znając klasę obiektu można łatwo go w .sqm podmienić. Aby się klasy dowiedzieć to (najszybciej) podajemy ID do funkcji 'nearestObject', a ze zwrotnego obiektu badamy klasę 'typeOf'.
Mnie znudziło mi się wklepywanie numerków ID, więc zrobiłem tak a żeby było interaktywnie.
Wyciągamy laser i idziemy na polowanie:
Kod: Zaznacz cały
; "whatis.sqs", wersja 1.0
; Skrypt ułatwia identyfikację klas obiektów będących na mapie (tych z numerami ID), bez czasochłonnych wycieczek w CA config.bin'y
; Jest to tylko narzędzie wspomagające projektowanie misji, i nie nadaję się do użycia w normalnej grze.
; Jeśli chcemy wstawić jakiś obiekt, który widzieliśmy w Arma i który nam się spodobał, to dzięki skryptowi ustalimy jego klasę dla funkcji createvehicle,
; lub po prostu podmienimy klasę jakiemuś łatwo dostępnemu obiektowi (z poziomu edytora) w pliku mission.SQM.
; aszek, 2009
; Składnia wywołania:
; this exec "whatis.sqs"; lub: [] exec "whatis.sqs";
; Żadnych parametrów nie trzeba !
_operator = player;
_viewDistance = 2000;
setviewdistance _viewDistance;
;removeAllWeapons _operator;
_operator addweapon "laserdesignator"; _operator addMagazine "laserbatteries";
_objectTypes = ["Static", "Thing", "Building", "Strategic", "NonStrategic", "House", "Ruins", "GrassGeneral", "Names", "MineGeneric", "AllVehicles"] - [typeof _operator, LaserTarget];
_message = "";
_messageNull = " ";
_messageHint = "W ekwipunku masz wskaznik laserowy.\nUzyj go do wskazania obiektu ktorego klase chcesz poznac.";
_messageObject = " Objekt: \n %1 \n\n Klasa: \n %2 \n\n Pozycja: \n %3 \n";
_messageUnknown = "Objekt: ?";
titleText [_messageHint, "plain down", -1];
~5
titleText [_messageNull, "plain down", -1];
#showMessage
hint _message;
_message = _messageNull;
; szukamy aktywnego znacznika laserowego, ogólna klasa obiektu "LaserTarget"
#findTarget
~0.1
? (_message != _messageNull) : goto "showMessage";
; funkcja nearestObject zwraca obiekt będący w odległości do 50m,
; dlatego, aby nie było sztucznych ograniczeń dla znacznika laserowego to w tym miejscu lepsza jest funkcja nearestObjects,
; która takich ograniczeń nie ma, za to zwracająca listę,
; mając listę, bierzemy pierwszy i jedyny element za obiekt znacznika (tutaj zakładam, że nikt inny równocześnie desygratora nie używa)
_target = (nearestObjects [position _operator, ["LaserTarget"], _viewDistance]) select 0;
? (isNull _target) : {_message = _messageUnknown; goto "findTarget";};
_index = 0;
; wskaźnik istnieje i został znaleziony, teraz szukamy obiektu w który celuje destygnator laserowy
#findObject
; kolejno dla głównych klas obiektów z listy _objectTypes, szukamy najbliższego wskaźnikowi obiektu po klasie
; ważna jest kolejność klas w liście, a "AllVehicles" jest trochę zbyt ogólna i nieprzewidywalna,
; i często zwraca obiekt gracza z drugiego końca mapy - zalecam zawęzić tą klasę.
_needType = _objectTypes select _index;
; tutaj funkacja nearestObject ma same zalety, bo szukamy celu bardzo blisko znacznika
_object = position _target nearestObject _needType;
_index = _index + 1;
; jeśli w okolicy znacznika jest coś interesującego, to pokażamy co to takiego
? not (isNull _object) : goto "showObject";
; jeśli dla tego typu z listy nic nie ma, to może następna klasa
? _index <= count _objectTypes : goto "findObject";
; nic nie znaleziono, desygnator w nic interesującego nie celuje
_message = _messageUnknown;
goto "findTarget";
#showObject
? (_object distance _target) > 10 : goto "findObject";
_message = format [_messageObject, _object, typeOf _object, getpos _object];
;_object setdir random (360);
goto "findTarget";
exit;
http://community.bistudio.com/wiki/CfgVehicles
i pozostaje dodać do listy '_objectTypes'. Albo coś z niej usunąć, jeśli przeszkadza.