[Skrypt] Interaktywne ustalanie klasy obiektu

Moderator: Inkwizytor

ODPOWIEDZ
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

[Skrypt] Interaktywne ustalanie klasy obiektu

Post autor: aszek »

Projektując misję pewnie nie raz chcieliście wstawić jakiś ciekawy obiekt, niestety najpewniej był niedostępny w edytorze.
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;
Nie wszystkie klasy są w skrypcie ad'hoc dostępne. Krzaczków, drzewek i innego złomu znaleść można na:
http://community.bistudio.com/wiki/CfgVehicles
i pozostaje dodać do listy '_objectTypes'. Albo coś z niej usunąć, jeśli przeszkadza.
"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
ODPOWIEDZ

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