PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Waffencheck/Angriffshubschrauber limitieren/JIP...


Duke49th
19.03.2014, 23:11
So...ich hole kurz aus...

Ich habe ein Script, was checkt ob eine Launcher-Waffe (Nlaw, Titan usw.) abgeschossen wurde.

waffencheck.sqf:

waitUntil {!isNull player};
Waffencheck = {
private ["_launcher"];
_weaponFired = _this select 1;
_weaponItems = ["launch_NLAW_F","launch_RPG32_F","launch_I_Titan_short_F","launch_O_Titan_short_F","launch_Titan_short_F"];
_launcher = false;

{
if (_weaponFired == _x) then {
_launcher = true;
};
} forEach _weaponItems;



_launcher
};
player addEventHandler["fired", {if (_this call Waffencheck) then {execVM "attackhelo.sqf"}}];

Dann lasse ich einen Attackheli spawnen und auf SAD - also Suche und Zerstöre.

attackhelo.sqf:

waitUntil {!isNull player};
_marker = createMarkerLocal ["attack", position player];
_marker setMarkerShapeLocal "ICON";
_marker setMarkerTypeLocal "mil_objective";
_marker setMarkerAlphaLocal 1;

_markerpos = getMarkerPos "attack";

_grp = createGroup East;

_heli = createVehicle ["O_Heli_Attack_02_black_F",[10500,28000], [], 0, "FLY"];
_heli flyInHeight 100;

_pilot1 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot2 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot1 moveInDriver _heli;
_pilot2 moveInGunner _heli;



_wp1 =_grp addWaypoint [_markerpos, 75];
_wp1 setWaypointType "MOVE";
_wp1 setWaypointSpeed "NORMAL";
_wp1 setWaypointCombatMode "RED";
_wp1 setWaypointType "SAD";
_wp1 setWaypointTimeout [1200, 1200, 1200];
_grp setcurrentWaypoint _wp1;

Meine beiden Fragen sind:

Ist der JIP in der ersten Zeitle korrekt? Habs aus dem Biki kopiert.
Edit: Ist dieser Aufruf in der Initzeile des Players JIP tauglich und optimal? "nul=execVM "waffencheck.sqf";"

Und wie mache ich es nun das er den Heli nur einmal spawnen lässt und nicht jedesmal, wenn die Launcher-Waffe abgefeuert wurde - solange der Heli noch lebt?

P.s.: Ich weiss übrigens das der MarkerAlpha auf 1 und somit sichtbar gesetzt ist...dient nur zum Testen...später isser unsichtbar...

P.p.s.: Herrje ist das alles kompliziert :zahn:

Duke49th
20.03.2014, 00:45
Ich hab nochmal bisschen rumgebastelt...:

attackhelo.sqf:

waitUntil {!isNull player};

attackhelo=true;

_marker = createMarkerLocal ["attack", position player];
_marker setMarkerShapeLocal "ICON";
_marker setMarkerTypeLocal "mil_objective";
_marker setMarkerAlphaLocal 1;

_markerpos = getMarkerPos "attack";

_grp = createGroup East;

_heli = createVehicle ["O_Heli_Attack_02_black_F",[10000,25500], [], 0, "FLY"];
_heli flyInHeight 50;

_pilot1 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot2 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot1 moveInDriver _heli;
_pilot2 moveInGunner _heli;

_marker = createMarkerLocal ["attack2", _heli];
_marker setMarkerShapeLocal "ICON";
_marker setMarkerTypeLocal "mil_objective";
_marker setMarkerAlphaLocal 1;

_markerpos2 = getMarkerPos "attack2";


_wp1 =_grp addWaypoint [_markerpos, 0];
_wp1 setWaypointType "MOVE";
_wp1 setWaypointSpeed "NORMAL";
_wp1 setWaypointCombatMode "RED";
_wp1 setWaypointType "SAD";
_wp1 setWaypointCompletionRadius 50;
_wp1 setWaypointTimeout [12, 12, 12];
_wp1 setWaypointStatements ["true",""];
_wp2 =_grp addWaypoint [_markerpos2, 1];
_wp2 setWaypointType "MOVE";
_wp2 setWaypointSpeed "NORMAL";
_wp2 setWaypointCombatMode "RED";
_wp2 setWaypointType "MOVE";
_wp2 setWaypointStatements ["true", "attackhelo = false;"];

_grp setcurrentWaypoint _wp1;

waitUntil{(!attackhelo) or (!alive _heli)};
if((!attackhelo) and (alive _heli))then{deleteVehicle _heli;};
if(alive _pilot1)then{deleteVehicle _pilot1};
if(alive _pilot2)then{deleteVehicle _pilot2};
deleteMarkerLocal "attack";
deleteMarkerLocal "attack2";

if(true)exitWith{player execVM "waffencheck.sqf"};


Aber die Abfrage nach dem zweiten Helo brauche ich immer noch.

Ausserdem scheint das mit der letzten Zeile nicht zu funzen...jedenfalls klappt das mit dem "waffencheck" dann nicht mehr, nachdem der Heli bzw. die Helis deleted wurden. Ich kann schiessen so lange ich will...da kommt kein neuer Heli mehr. :(

Ich gebs auf für heute. Ich hoffe mir kann einer helfen :)

Vienna
20.03.2014, 07:45
Zur letzten Zeile: die Bedingung ist immer wahr. Da kannst du das gleich so schreiben:

player execVM "waffencheck.sqf";

Duke49th
20.03.2014, 08:07
Siehste mal..so wenig verstehe ich davon. Dachte das true bezieht sich darauf das er wartet bis das restliche Script abgearbeitet ist...also die "if then" Sachen fertig sind...

Aber wenn es eh true ist, dann müsste es doch auch so gehen...oder? Wäre ja dann nur doppelt gemoppelt. Aber er fürht es dann nicht aus.

Ich muss jetzt leider los...werde das heute Abend alles testen...auch das andere (anderer Thread) habe ich noch garnicht alles ausführlich getestet...


Stimmt denn das JIP in der ersten Zeile?

Vor allem...ich muss das doch garnicht in beide Scripte schreiben...oder? Reicht doch im "waffenscheck.sqf" - da dieses ja dann erst das "attackhelo.sqf" ausführt.

Muss leider los....:(

Duke49th
22.03.2014, 01:28
:juhu:

So funzt es nun..:

attackheli=true;
attackhelo=true;
{
if (typeof _x == "O_Heli_Attack_02_black_F") then {
attackhelo = false;
};
} foreach vehicles;

If (attackhelo) then {
_marker = createMarkerLocal ["attack", position player];
_marker setMarkerShapeLocal "ICON";
_marker setMarkerTypeLocal "mil_objective";
_marker setMarkerAlphaLocal 0;

_markerpos = getMarkerPos "attack";

_grp = createGroup East;

_heli = createVehicle ["O_Heli_Attack_02_black_F",[10000,25000], [], 0, "FLY"];
_heli flyInHeight 50;

_pilot1 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot2 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_pilot1 moveInDriver _heli;
_pilot2 moveInGunner _heli;

_marker = createMarkerLocal ["attack2", _heli];
_marker setMarkerShapeLocal "ICON";
_marker setMarkerTypeLocal "mil_objective";
_marker setMarkerAlphaLocal 0;

_markerpos2 = getMarkerPos "attack2";


_wp1 =_grp addWaypoint [_markerpos, 0];
_wp1 setWaypointSpeed "FULL";
_wp1 setWaypointCombatMode "RED";
_wp1 setWaypointType "SAD";
_wp1 setWaypointCompletionRadius 50;
_wp1 setWaypointTimeout [1200, 1200, 1200];
_wp1 setWaypointStatements ["true",""];

_wp2 =_grp addWaypoint [_markerpos2, 1];
_wp2 setWaypointType "MOVE";
_wp2 setWaypointSpeed "FULL";
_wp2 setWaypointCombatMode "RED";
_wp2 setWaypointType "MOVE";
_wp2 setWaypointStatements ["true", "attackheli = false;"];

_grp setcurrentWaypoint _wp1;

waitUntil{(!attackheli) or (!alive _heli)};
if((!attackheli) and (alive _heli))then{deleteVehicle _heli;};
publicVariable "_heli";
if(alive _pilot1)then{deleteVehicle _pilot1};
if(alive _pilot2)then{deleteVehicle _pilot2};
deleteMarkerLocal "attack";
deleteMarkerLocal "attack2";
attackheli=false;
};

Also der Teil..:

attackhelo=true;
{
if (typeof _x == "O_Heli_Attack_02_black_F") then {
attackhelo = false;
};
} foreach vehicles;

If (attackhelo) then {

Hätte ich aber ohne meinen Staffelkollegen der gerade studiert und bissl programmieren gelernt hat, nicht geschafft. (genau genommen war er es...wir hatten uns die halbe Nacht um die ohren geschlagen..) Danke Firebird :)

Vienna
22.03.2014, 07:32
_pilot1 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_marker = createMarkerLocal ["attack2", _heli];
_heli enthält ein Objekt, verlangt wird eine Position.
https://community.bistudio.com/wiki/createUnit_array
https://community.bistudio.com/wiki/createMarkerLocal

publicVariable "_heli";
Mit einer lokalen Variablen wird das nicht klappen.
https://community.bistudio.com/wiki/publicVariable

Hast du die Anzeige von Skriptfehlern beim Aufruf von Arma nicht aktiviert? (Arma3 ?)

".....\xxx.exe" -showscripterrors

https://community.bistudio.com/wiki/ArmA:_Startup_Parameters

Sajiki
22.03.2014, 09:14
attackhelo=true;
{
if (typeof _x == "O_Heli_Attack_02_black_F") then {
attackhelo = false;
};
} foreach vehicles;

If (attackhelo) then {



Kann mir einer erklären was das bringt? Also den Teil in die {} zu setzen ohne wirklich was davor steht wie if oder co?

mfg
Sajiki

Duke49th
22.03.2014, 10:22
_pilot1 = _grp createUnit ["O_Pilot_F",_heli, [], 0, "FORM"];
_marker = createMarkerLocal ["attack2", _heli];
_heli enthält ein Objekt, verlangt wird eine Position.
https://community.bistudio.com/wiki/createUnit_array
https://community.bistudio.com/wiki/createMarkerLocal

publicVariable "_heli";
Mit einer lokalen Variablen wird das nicht klappen.
https://community.bistudio.com/wiki/publicVariable

Hast du die Anzeige von Skriptfehlern beim Aufruf von Arma nicht aktiviert? (Arma3 ?)

".....\xxx.exe" -showscripterrors

https://community.bistudio.com/wiki/ArmA:_Startup_Parameters

Doch. Und das Script arbeitet verlässlich ;) Der Marker wird bei der Position gesetzt, wo der Heli spawnt.

Scripterror werden mir nur bei den BIS Modulen angezeigt :zahn:

Die Position ist ja der Heli. Und es funzt..egal was BIS da schreibt :zahn:

Darfst es gerne testen, wenn Du dich davon überzeugen möchtest:

4503

Edit: Setze den Alpha des Marker auf 1 und schau es dir an...geht wirklich..;) Wir haben ja gestern die Mission von mir gespielt. UNd wie gesagt..beim Testen kamen keine Fehler und es ging alles genau so wie es sollte.










Kann mir einer erklären was das bringt? Also den Teil in die {} zu setzen ohne wirklich was davor steht wie if oder co?

mfg
Sajiki

Ist überflüssig, wenn ich das (Prinzip + Scriptguide) richtig verstanden habe. Aber mein Kumpel hat es so geschrieben. Fällt mir jetzt auch erst auf, wo Du es sagst :D
Ne Klammer oder Semikolon zu viel ist in den meisten Fällen kein Problem...vielleicht überflüssig, aber kein Problem.

Z.B.: Kann man schreiben _Drei = 1+2;
Aber genauso auch _Drei = (1+2);

Duke49th
22.03.2014, 11:47
Habe mir gerade nochmal Gedanken darüber gemacht.

Im Grunde enthält ja _heli auch die Information der Position des Heli. Statt aber position _heli zu schreiben, habe ich einfach nur _heli geschrieben.

Da player auch nur ein Object ist, daß die Positionsangaben enthält, denke ich man könnte hier genauso das "position" weg lassen.

Aber ganz ehrlich...bin zu faul das jetzt zu testen^^

Ich denke der nimmt sich automatisch aus einem schon erstellten, also vorhandenen Object, die nötige Info..in dem Fall die Position.

Vienna
22.03.2014, 12:13
Edit 2: Da stehts doch sogar im Link den Du gepostet hast^^

_marker= createMarkerLocal [Marker1, position player ]

Es wird der Player (object) übernommen. ;
Lass dir zum Testen einmal diese Zeile ausgeben.

hintC format["1 = %1 \n\n2 = %2", player, position player];

Sie zeigt dir den Unterschied zwischen player und position player an.

Die Beschreibungen von createMarkerLocal und createUnit sind nicht mehr aktuell, es kann eine Position oder ein Objekt angeführt werden, vom Objekt wird automatisch die Position übernommen.

Duke49th
22.03.2014, 13:33
Lass dir zum Testen einmal diese Zeile ausgeben.

hintC format["1 = %1 \n\n2 = %2", player, position player];

Sie zeigt dir den Unterschied zwischen player und position player an.

Die Beschreibungen von createMarkerLocal und createUnit sind nicht mehr aktuell, es kann eine Position oder ein Objekt angeführt werden, vom Objekt wird automatisch die Position übernommen.

Ich schaus mir mal an.


Die Beschreibungen von createMarkerLocal und createUnit sind nicht mehr aktuell, es kann eine Position oder ein Objekt angeführt werden, vom Objekt wird automatisch die Position übernommen.

Aber dann passt es doch :komisch: