Einzelnen Beitrag anzeigen
Alt 26.09.2014, 13:59   #13 (permalink)
Grollig
Newbie
 
Registriert seit: 27.11.2013
Alter: 49
Beiträge: 10
Standard

Vorweg: Sorry, dass ich mich erst so spät zurückmelde. Ich hatte in den vergangenen Tagen wirklich wenig Zeit.

Ich habe Viennas letzte Version des Scripts noch einige Male angepasst, konnte aber das "Problem" mit der Darstellung des Laptops am Körper des Spielers leider nicht lösen. Auch die Auslagerung des Scriptes hat dabei leider nicht zum Erfolg geführt. Ich bin allerdings sicher, dass mein Scheitern an meinen bescheidenen Fähigkeiten und nicht an Viennas Code liegt.

Viennas Script hat mich aber auf eine Lösung für das korrekte Entfernen der Aktion "Laptop ablagen" gebracht. Leider musste bei dafür eine globale Variable herhalten, über welche der Prozess einer Neuaufnahme des Laptops an andere laufende Instanzen des Scriptes übermittelt wird.

Das Ergebnis ist aus Sicht eines erfahreneren Scripters sicherlich alles andere als gut gelöst, jedoch funktioniert es für meine kleine Mission nun fehlerfrei und mit den genannten positiven Nebeneffekten (flüssiges Ablegen des Laptops, korrekte Darstellung am Spieler, korrektes Entfernen der Aktion "Laptop ablegen" beim tragenden Spieler, wenn ihm der Laptop von einem anderen Spieler abgenommen wird).

Ich möchte hier die funktionierende Version nochmal posten, da es anderen vielleicht mal dienlich sein kann, wenn vielleicht auch nur als Grundlage für eine bessere Lösung:

Benötigt wird im Editor:
Ein offener Latop (Land_Laptop_unfolded_F) mit folgendem Eintrag in der Init:
Code:
this addAction["<t color='#ff1111'>Laptop nehmen</t>", "scripts\laptop_nehmen.sqf", nil, 6, true, true, "", "alive _target && ((getPos _target) distance (getPos _this)) <= 3"];
In der init.sqf:
Code:
FAS_fnc_addAction = {
    private["_object","_script"];
    _object = _this select 0;
    _script = _this select 1;
    _object addAction _script;
};
Im Unterordner \scripts:

laptop_nehmen.sqf
Code:
private ["_laptop","_activatingPlayer","_aktionAblegen"];
_laptop = _this select 0;
_activatingPlayer = _this select 1;

//Globale Variable zur Info an andere laufende Instanzen dieses Skriptes: Eine neue Aufnahme des Laptops findet statt
NeueAufnahmeLaptop = true;
publicVariable "NeueAufnahmeLaptop";

//Bisherigen Laptop löschen
deleteVehicle _laptop;

//Globale Variable für Missionsziel-Triggerabfrage setzen
LaptopAbgelegt = false; 
publicVariable "LaptopAbgelegt";

//Neuen Laptop zur Darstellung am Körper des nehmenden Spielers erzeugen
laptop = "Land_Laptop_F" createVehicle (getPos _activatingPlayer);

//Neuen Laptop an den aufhebenden Spieler heften
laptop attachTo [Player, [-0.25, -0.04, 0], "pelvis"];
laptop setVectorDirAndUp [[0.1,1,0],[-1,0,0.2]];

//Aktion 'Laptop Nehmen' für den neuen Laptop erzeugen (die Funktion 'FAS_fnc_addAction' muss in der init.sqf definiert sein)
[[laptop, ["<t color='#ff1111'>Laptop nehmen</t>", "scripts\laptop_nehmen.sqf", nil, 6, true, true, "", "alive _target && ((getPos _target) distance (getPos _this)) <= 3"]], "FAS_fnc_addAction", nil, true] spawn BIS_fnc_MP;  

//Aktion 'Laptop ablegen' für nehmenden Spieler im Actionmenü erzeugen
_aktionAblegen = _activatingPlayer addAction [("<t color=""#CC2900"">" + ("Laptop ablegen") + "</t>"), "scripts\laptop_ablegen.sqf", nil, 6, false, true,"", "_this == _target"];

//Globale Variable zur Info an andere laufende Instanzen dieses Skriptes: Die neue Aufnahme des Laptops ist abgeschlossen
sleep 0.5;
NeueAufnahmeLaptop = false;
publicVariable "NeueAufnahmeLaptop";

//Warten bis sich der Laptop nicht mehr am nehmenden Spieler befindet,dann Aktion 'Laptop ablegen' entfernen
waitUntil {sleep 0.2; !alive player or NeueAufnahmeLaptop or LaptopAbgelegt};  // or count attachedObjects player == 0
_activatingPlayer removeAction _aktionAblegen;

//Ende des Scripts
und

laptop_ablegen.sqf
Code:
//Laptop ablegen
detach laptop;

//Globale Variable für Missionsziel-Triggerabfrage setzen
LaptopAbgelegt = true; 
publicVariable "LaptopAbgelegt";
Dann noch im Editor einen Trigger erstellen für die Zone, in welche der Laptop zum Abschluss der Mission verbracht werden soll:

Größe: 20 x 20
Typ: Keine
Aktivierung: Jeder, Einmal, Vorhanden
Bedingung:
Code:
this && {LaptopAbgelegt} && {laptop in thisList}
Bei Aktivierung:
Code:
nul = ["<t size='1.2' color='#ffffff'>Der Laptop wurde gesichert.<br/>Mission erfolgreich!</t>",0,0.3,10,5] spawn bis_fnc_dynamictext;
Alternativ kann bei Aktivierung natürlich auch das Ende der Mission oder die Erfüllung einer Missionsaufgabe veranlasst werden.

Abschließend möchte ich Vienna nochmals ausdrücklich dafür danken, daß er sich soviel Zeit für mich genommen und mir durch sein Script eine - für mich ausreichende und funktionierende - Lösung aufgezeigt hat. Ich hoffe nur, daß Du nicht sauer bist, weil ich Dein Script nun im Grunde doch nicht verwendet habe.
Grollig ist offline