HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Script müsste funktionieren tut es aber nicht (https://hx3.de/editing-scripting-167/script-muesste-funktionieren-tut-21983/)

Calvin 28.10.2012 02:35

Script müsste funktionieren tut es aber nicht
 
Liebe Community,

in einer MP-Mission soll ein Flugzeug und ein Pilot via Script spawnen und einen Heli abschießen. Beides: Flugzeug und Pilot spawnen, aber der Pilot fällt vom Himmel und das Flugzeug stürzt ab. Das ganze ist unter ACE und eben für MP gedacht. Hier das Script, das auch ausgeführt wird. Erkennt jemand den Fehler?

grpMig1=createGroup "East";

_Mig1Pilot="RU_Soldier_Pilot" createUnit [[(getMarkerPos "mrkMig1Spawn" select 0),(getMarkerPos "mrkMig1Spawn" select 1),70],grpMig1,[],0,"form"];
_Mig1Pilot setSkill 1.0;

Mig1 = createVehicle ["SU34",[(getMarkerPos "mrkMig1Spawn" select 0),(getMarkerPos "mrkMig1Spawn" select 1),70], [], 0, "FLY"];
Mig1 lock false;
_Mig1Pilot moveInDriver Mig1;
Mig1 FlyInHeight 70;
Mig1 setDir 280;
_vel = velocity Mig1;
_dir = direction Mig1;
_speed = 200;
Mig1 setVelocity [(_vel select 0)+(sin _dir*_speed),(_vel select 1)+ (cos _dir*_speed),(_vel select 2)];
grpMig1 addVehicle Mig1;

hint format ["%1", (isNull _Mig1Pilot)];



;_wp1 = grpMig1 addWaypoint [getMarkerPos "mrkMig1Destroy",0];
;_wp1 setWaypointType "SAD";
;_wp1 setWaypointSpeed "FULL"
;_wp1 setWaypointStatements ["true",""];
;_wp2 = grpMig1 addWaypoint [getMarkerPos "mrkMig1Move",0,1];
;_wp2 setWaypointType "MOVE";
;_wp2 setWaypointSpeed "NORMAL";
;_wp2 setWaypointStatements ["true",""];
;_wp3 = grpMig1 addWaypoint [getMarkerPos "mrkMig1Unload",0,2];
;_wp3 setWaypointType "UNLOAD";
;_wp3 setWaypointSpeed "NORMAL";


Vielen Dank für die Hilfe - haben zu zweit schon das Internet durchstöbert und den Editing Guide benutzt. Kommen trotzdem nicht drauf.

Vienna 28.10.2012 09:05

Muss nicht! Du hast hier die unterschiedlichen Aufrufmöglichkeiten von createUnit vermischt.

//Seite ohne Anführungszeichen
grpMig1=createGroup East;

//Gruppe vor createUnit anführen
_Mig1Pilot = grpMig1 createUnit ["RU_Soldier_Pilot", [0,0], [], 0, "FORM"];

Wenn du die Unit gleich in ein Objekt versetzt, dann reicht als Position [0,0]

Wenn vermeidbar solltest du in einem Skript nur lokale Variable verwenden.


Fehler sind einfach mit einem Test über einen Funk-Auslöser zu finden:

Code:

Mig1      = createVehicle ["SU34",position player, [], 0, "FLY"];
Mig1Pilot = createGroup East createUnit ["RU_Soldier_Pilot",[0,0],[],0,"FORM"];
Mig1Pilot moveInDriver Mig1;
player moveInGunner Mig1;

Kopiere das in "Bei Akt." in einen solchen Auslöser. Voraussetzung ist natürlich, dass Pilot und Spieler der selben Seite angehören.

Noqmar 28.10.2012 09:49

Hallo zusammen,

ich bin der andere Teil von "wir haben zu zweit...". :D
Erstmal danke für die Fehler- und Verbesserungshinweise.
Das eigentliche Problem scheint das "moveInDriver" zu sein. Jet und Pilot werden erzeugt (beide übrigens gegnerische Fraktion), nur wird der Pilot nicht in den Jet gesetzt, sondern fällt runter und der Jet stürzt führerlos ab.
Bin im BI-Wiki über einen Hinweis über "MP-Locality" gestolpert, d. h. moveInDriver soll nur für "local units" funtionieren (z. B. Player, was auch klappt). Das legt nahe, dass der erzeugte Pilot nicht "local" ist. Die richtige Bedeutung habe ich aber noch nicht vollends verstanden.

Vielleicht hat jemand dazu einen Tipp?

Viele Grüße,
Noqmar

Noqmar 28.10.2012 09:55

Abgefahren (-geflogen)
 
Nach beherzigung der Ratschläge, Umstellung auf SQF-Syntax, und Eliminierung von unnötigem Zeugs funktioniert es jetzt hiermit:

Code:

// create SU-34 at spawn marker
_su1 = createVehicle ["SU34",[(getMarkerPos "mrkSU1Spawn" select 0),(getMarkerPos "mrkSU1Spawn" select 1),70],[],0,"FLY"];

// set direction and velocity vector
_dir = 280;
_su1 setDir _dir;
_vel = velocity _su1;
_speed = 200;
_su1 setVelocity [(_vel select 0)+(sin _dir * _speed),(_vel select 1)+ (cos _dir * _speed),(_vel select 2)];

// create group for later waypoint additions
_grpSU1 = createGroup East;

// create group assigned pilot and move him into SU-34
_su1Pilot = _grpSU1 createUnit ["RU_Soldier_Pilot", [0,0], [], 0, "FORM"];
_su1Pilot moveInDriver _su1;


Vienna 28.10.2012 11:50

Um in MP Lokalitäts-Probleme zu vermeiden, sollte in den Sripten if (! isServer) exitWith {}; die erste Zeile sein, wenn das Skript Befehle abruft, welche nicht für einen Client bestimmt sind.

So ist auch sichergestellt, dass ein solches Skript nicht auf mehreren PCs aufgerufen wird, sondern nur beim Server/Host (z.B. wenn das Skript über einen allgemeinen Ereignis-Auslöser aufgerufen wird).

KIs, welche nicht der Kontrolle eines Spielers zugewiesen sind, werden vom Host/Server gesteuert und befolgen keine "lokalen Befehle" von einem Client. Eine KI, welche der Gruppe des Spielers angehört, kann nur von diesem Spieler mit lokalen Befehlen befehligt werden.

Solches ist beim Befehl http://community.bistudio.com/wiki/moveInDriver zu sehen (ganz oben).

http://community.bistudio.com/wiki/setPos hingegen ist ein globaler Befehl!

Xeno 28.10.2012 12:06

*deleted*

Xeno

Calvin 28.10.2012 13:47

super, vielen Dank an alle!!! Sehr coole und schnelle Hilfe.

Vienna 28.10.2012 14:52

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Xeno (Beitrag 433270)
Frage: Warum nehmt ihr nicht einfach die BIS_fnc_spawnVehicle Funktion ?

Solche Funktionen verderben einem die Freude am Skripten! Es ist doch viel interessanter eigene Skripte zu erstellen.

Diese BIS-Funktionen sind in entpackter Form geeignet sich was "abzuschauen". Allerdings für Anfänger oft verwirrend.

Einmal zum Reinschauen siehe Anhang.

Dabei ist zu beachten, dass es sich um Funktionen handelt. Diese geben Werte zurück, dürfen aber keine Verzögerung (sleep) beinhalten. Die darin enthaltenen Kommentare müssen zuvor entfernt werden. Das geschieht durch den Preprozessor wie folgt:

FunktionsName = compile preprocessFileLineNumbers "SkriptFunktionName.sqf";

Aufruf dann mit: _Ergebnis = [x,y] call FunktionsName;

Dazu auch ein Beispiel im Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119