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. |
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"]; |
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 |
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 |
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! |
*deleted*
Xeno |
super, vielen Dank an alle!!! Sehr coole und schnelle Hilfe.
|
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
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