13.09.2012, 16:35 | #1 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Problem mit Script in einer Mission...
Hallo zusammen,
ich arbeite gerade an einer A.C.E Mission und habe da ein Problem mit einem (oder mehreren) Script(s). Und zwar wollte ich eine Multiplayer Mission machen, bei der man einen Gegner tötet, dann zu diesem hingehen und einen Koffer o.ä. einsammel muss. Danach soll man eine neue Waffe bekommen. Als ich zwischendurch meine Mission testen wollte hat das Script, welches eigentlich die Trigger und den Koffer zu der Leiche teleportieren sollte nicht richtig geklappt. Hier der Code: Code:
//BLU2Down.sqf while {true} do { _pos = (getPos _this); sleep 1; if (!alive _this) then { BLU2Tag setpos _pos; BLU2BLU setpos _pos; BLU2OPF1 setpos _pos; BLU2OPF2 setpos _pos; BLU2OPF3 setpos _pos; "BLU2Mark" setMarkerPos _pos; waitUntil { alive _this }; execVM "BLU2Rearm.sqf"; }; }; Code:
nul = execVM "BLU2Down.sqf"; MfG Rhisd |
13.09.2012, 17:36 | #2 (permalink) |
Die herangehensweise ist denkbar ungünstig und unnötig kompliziert.
Mach es anders: - setze einen Koffer in eine Stille Ecke der Map mit dem Namen KOFFER - setze einen Auslöser auf die Map mit Bedingung isServer && !alive BLU2 und ausgelöst wird KOFFER setPos getPos BLU2 - in die Init des Koffers schreibst du folgendes: this allowDamage false; this addAction ["Koffer öffnen","koffer.sqf"]; - in der Datei koffer.sqf erledigst du nun einfach den Waffenwechsel, wie auch immer du diesen gestalten möchtest und alles was sonst noch dazu gehört. Zum debuggen von Scripten starte Arma einfach mit dem Kommando -showScriptErrors in der .exe unter Ausführen. Falls weitere Fragen zu dem von mir geschriebenen aufkommen hilft dir dieser Guide hier: Armed Assault Editing Guide - Deluxe Edition - German - Editing References - Armaholic Grüße
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
13.09.2012, 19:56 | #4 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Problem halb gelöst...
Das von dir genannte Verfahren klappt soweit. Allerdings hab ich nun eine weitere Frage:
Ist es möglich in dem koffer.sqf Script herauszufinden, wer den Koffoer geöffnet hat? Wenn ja wie? Weil die Mission sollte ein 3 vs. 3 Match werden und nur derjenige, der den Koffer öffnet soll eine neue Waffe erhalten. EDIT: Problem mit Distanzabfrage gelöst... Geändert von TheRhisd (13.09.2012 um 21:14 Uhr). |
14.09.2012, 19:13 | #6 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Klappt prima :)
Der von dir geschriebene Weg klappt wunderbar. Danke
Habe aber noch ein Script mit einem Problem: Das Script soll eine Munitionskiste mit dem Inhalt füllen, den sie am Anfang der Mission hatte: Code:
//Refill.sqf _weap = getWeaponCargo _this; _ammo = getMagazineCargo _this; _boxname = _this select 0; _true = true; while {_true} do { clearWeaponCargo _boxname; clearMagazineCargo _boxname; {_boxname addWeaponCargo [_x select 0,_x select 1];} forEach _weap; {_boxname addMagazineCargo [_x select 0,_x select 1];} forEach _ammo; sleep 30; _boxname setdammage 0; if( !alive _boxname) then { _newbox = (typeOf _boxname) createvehicle (getpos _boxname); _newbox setpos (getpos _boxname); deletevehicle _boxname; _boxname = _newbox; }; }; Code:
nul = execVM "Refill.sqf" Hat jemand eine Idee? MfG Rhisd |
14.09.2012, 19:51 | #7 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
Code:
//Refill.sqf _weap = getWeaponCargo _this; _ammo = getMagazineCargo _this; _boxname = _this select 0; _true = true; while {_true} do { clearWeaponCargoGlobal _boxname; clearMagazineCargoGlobal _boxname; {_boxname addWeaponCargoGlobal [_x, 1]} forEach _weap; {_boxname addMagazineCargoGlobal [_x, 10]} forEach _ammo; sleep 30; _boxname setdammage 0; if( !alive _boxname) then { _newbox = (typeOf _boxname) createvehicle (getpos _boxname); _newbox setpos (getpos _boxname); deletevehicle _boxname; _boxname = _newbox; }; }; Code:
if (isServer) then {0 = execVM "Refill.sqf"} hoschi |
14.09.2012, 19:54 | #8 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Naja... wenn die Kiste den Inhalt haben soll, den sie am Anfang hatte, dann musst Du Variablen _weap und _ammo global machen.. also bspw. myBoxWeapon und myBoxAmmo und die neuen Variablen außerhalb des Scripts Refill.sqf mit Leben füllen.
Also zB kurz nach Missionsstart mittels eines Triggers oder was auch immer... hauptsache raus aus der Datei Refill.sqf, weil Du ja sonst jedesmal den Ist-Stand der Kiste auslesen würdest... und das willste ja eben nicht. |
14.09.2012, 23:19 | #11 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Noch ein Problem... jippie
Also ich hab die erste Mission jetzt fertig und wollte diese mit einem Kumpel testen. Wenn jemand in der Mission stirbt verliert er bekanntlich alles was er hatte und erhält das standart Equipment. In der Mission ist es aber wichtig, dass man Nach dem Tod wieder den gleichen Stand der Waffen hat wie vorher. Ich habe das Problem für mich gelöst aber auf gleichem Weg passiert bei meinem Kumpel nichts. Wenn ich aber mit der Einheit spiele, die mein Kumpel vorher hatte, und sterbe bekomm ich auch das richtige Equipment wieder. Hier die nötigen Codezeilen:
Code:
BLU1Koffer setPos getPos BLU1; "BLU1Mark" setMarkerPos getpos BLU1Koffer; sleep 42; //Respawn Zeit überbrücken execVM "refillblu1.sqf";//neu Ausrüsten Fällt euch was ein? |
15.09.2012, 11:50 | #12 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das Problem liegt vermutlich daran, dass du der Host und der Mitspieler ein Client ist. Sozusagen ein "Lokalitätsprobelm". Die üblichen globalen Variablen können auf den PCs unterschiedliche Werte haben, wenn sie nicht mit publicVariable synchronisiert werden.
Wenn du als Host in einem Skript eine globale Variable änderst, dann hat den Wert ein Client nur, wenn du den Wert mit publicVariable "Variablename"; sendest. Die Waffenzuteilung solltest du so lösen: Erstelle im Editor einen Mehrfachauslöser mit Bedingung: alive player Bei Akt: temp = [] execVM "refillblu1.sqf" Im Skript ist für player die gewünschte Bewaffnung durchzuführen. Der Name player bezieht sich automatisch lokal auf den jeweiligen Spieler auf seinem PC. Immer wenn ein Spieler eine neue Spielfigur erhält, ruft dieser Auslöser das Skript auf. Das gilt auch für den Spielstart. Sollen die Spieler unterschiedliche Bewaffnungen haben, dann müsstest du im Skript noch Abfragen mit den Soldatennamen einbinden wie z.B.: if (player == Soldat1) then {... Bewaffnung ...}; if (player == Soldat2) then {... Bewaffnung ...}; ... Willst du die Bewaffnung des toten Spielers übernehmen dann musst du die FigurenID vor dem Tod absichern. Dabei ist aber einiges zu beachten. Das kann man auch über ein einmalig aufzurufendes Skript lösen. Siehe diesen Thread: Problem: Respawn mit Vor-Tod-Bewaffnung |
15.09.2012, 13:02 | #13 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Kann ich auch die Namenanfrage im Trigger unterbringen also quasi mehrere trigger
Die in der bedingungszeile z.b. Alive Player && Player == BLU1. Stehen haben? Hab nämlich schon für jeden ein Bewaffnungs Skript... Bin grad nicht am PC und kann's nicht testen... |
15.09.2012, 15:33 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Ja, das geht auch mit der von dir genannten Abfrage und jeweils eigenem Skript.
Es ist aber zweckmäßig den Programmaufwand so weit wie möglich zu verkürzen, weil man bei Änderungen sonst leicht die Übersicht verliert. Bei Verwendung von mehreren Auslösern könnte man auch mit nur einem Skript auskommen, wenn die jeweilige Bewaffnung als Parameter übergeben wird. z.B.: Bedingung: alive player and player == Soldat1 Bei Akt: temp = ["MagazinName", MagazinAnzahl, "Waffenname"] execVM "Bewaffnung.sqf" Noch erheblich übersichtlicher ist ein Auskommen mit einem Auslöser und einem Skript. Der Auslöser wie bereits im vorherigen Post angeführt: Mehrfachauslöser Bedingung: alive player Bei Akt: temp = [] execVM "Bewaffnung.sqf" Dann im Skript die jeweilige Bewaffnung festlegen: //allgemeine Bewaffnung _mag = "MagName"; _magAnzahl = 4; _waffe = "WaffeName"; //besondere Bewaffnung if (player == Soldat1) then {_mag="MagName"; _magAnzahl= 4; _waffe="WaffeName"}; if (player == Soldat2) then {_mag="MagName"; _magAnzahl= 4; _waffe="WaffeName"}; ... Auch sind übersichtliche Programmroutinen einfacher in andere Missionen zu übernehmen! |
16.09.2012, 20:53 | #16 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Waffen Kiste auffüllen klappt nicht
Ich habe mal, wie ihr gesagt habt, versucht die Waffen aus der Waffenkiste woanders zu speichern, allerdings hat es nicht geklappt.
Ich habe versucht in der Init.sqf den Variablen die Werte zu geben: ohne Erfolg Ich habe versucht mittels Trigger, welcher direkt nach der Mission auslöst: bedingung: Blufor vorhanden akt: variable = getWeaponCargo Munnikiste; ... Hab auch in dem script die Namen geändert. Hat auch nicht funktioniert... Hab auch versucht den getWeaponCargo Befehl in Klammern () und {} zu setzen... auch ohne Erfolg... |
17.09.2012, 08:46 | #17 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wenn du das z.B. in die Initialisierungszeile der Munikiste reinschreibst:
Waffen1 = getWeaponCargo this; Muni1 = getMagazineCargo this; dann sollte der Inhalt vom Spielstart in den Variablen gesichert sein. (Die beiden Befehle sind nur in Arma2 OA anwendbar!) Zum Testen erstelle einen Funk-Auslöser in den du Bei Akt. folgendes reinschreibst: hint format["Waffen: %1 Muni: %2", Waffen1, Muni1] Beim Aufruf des Funk-Auslösers wird dir der Inhalt der Variablen angezeigt. So einen Funk-Auslöser kannst du natürlich auch zum Testen des Inhalts der Variablen deiner derzeitigen Lösung verwenden. Er dient der Feststellung, ob der Fehler beim Sichern des Inhalts oder beim Auffüllen liegt. |
17.09.2012, 17:38 | #18 (permalink) |
Registriert seit: 12.09.2012
Beiträge: 33
|
Ok werd ich gleich mal ausprobieren. Danke schonmal für den Hinweis aber meinst du mit:
Dass die Befehle nicht in ArmA 2 vorhanden sind oder dass sie mit Mods wie z.B. A.C.E nicht funktionieren? EDIT: Jo der Fehler liegt auf jedem Fall beim Befüllen der Kiste... hab auch schon eine Vermutung, was falsch sein könnte. Geändert von TheRhisd (17.09.2012 um 17:47 Uhr). |
17.09.2012, 18:44 | #19 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wie du hier siehst: http://community.bistudio.com/wiki/getWeaponCargo gibt es den Befehl nur für OA ab Version 1.54.
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Beta-Patch für OpA erschienen | det99 | Community | 1429 | 18.07.2014 17:51 |
Patch 1.60! | Xeno | Community | 69 | 11.01.2012 13:41 |
1.60 rc | Dieter66 | Community | 47 | 22.12.2011 16:49 |
Ammobox Script problem | G36Firestorm | Editing & Scripting | 11 | 18.07.2011 16:04 |
Revive Script Problem | wArDoG81 | Editing & Scripting | 8 | 13.05.2011 23:35 |