15.04.2014, 23:47 | #1 (permalink) |
Registriert seit: 15.04.2014
Beiträge: 45
|
Alle Objekte eines Typs in Array speichen.
Hallo,
ich bin gerade dabei einen Script zu schreiben, mit dem man die kleinen Drohnen wieder aufladen kann. Mein Problem ist es jetzt, alle Drohnen in ein Array zu speichen. Habe den Befehl listObjects gefunden, weiß jedoch nicht was er macht und wie ich ihn benutzen muss. So sieht mein Code momentan aus. refuel_init.sqf: Code:
_this = player; _uav = drohne; _uav addAction["<t color='#FF0000'>REFUEL</t>", "refuel\refuel_action.sqf"]; Code:
_this = player; _uav = drohne; hint format ["%1", fuel _uav]; if(fuel _uav < 0.5) then { if((magazines _this) find "Laserbatteries" > -1) then { _uav setFuel 1; _this removeMagazine "Laserbatteries"; sleep 2; hint format ["1%", fuel _uav]; } else {hint "Du musst eine Laserbatterie in deinem Inventar haben."}; } else {hint "Sorry, deine Drohne muss mindestens zu 50% leer sein."}; |
16.04.2014, 08:52 | #2 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Dem Skript, welches von addAction aufgerufen wird, werden automatisch Parameter übergeben:
[wer die Aktion hat, wer die Aktion aufruft, ID-der Aktion, eigene Parameter] In addAction können nach dem Skriptnamen auch eigene Parameter angeführt werden (wird hier nicht benötigt). https://community.bistudio.com/wiki/addAction Die Aktionen werden direkt für die Drohnennamen erstellt: Code:
{ temp = _x addAction["<t color='#FF0000'>REFUEL</t>","refuel\refuel_action.sqf"] }forEach [Drohne1, Drohne2, usw.]; Code:
//Übernahme der addAction-Parameter: _target = _this select 0; // UAV _caller = _this select 1; // SPIELER hint format ["%1", fuel _target]; if(fuel _target < 0.5) then { if((magazines _caller) find "Laserbatteries" > -1) then { _target setFuel 1; _caller removeMagazine "Laserbatteries"; sleep 2; hint format ["1%", fuel _target] } else { hint "Du musst eine Laserbatterie in deinem Inventar haben." } } else { hint "Sorry, deine Drohne muss mindestens zu 50% leer sein." }; |
16.04.2014, 11:25 | #3 (permalink) |
Registriert seit: 15.04.2014
Beiträge: 45
|
Vielen Dank für deine Hilfe, jedoch funktioniert addAction bei mir nicht.
Mein Script schaut momentan so aus. refuel_init.sqf: Code:
{ temp = _x addAction["<t color='#FF0000'>REFUEL</t>","refuel\refuel_action.sqf"]; }forEach ["B_UAV_01_F", "I_UAV_01_F"]; Code:
_target = _this select 0; // UAV _caller = _this select 1; // SPIELER hint format ["%1", fuel _target]; //if(fuel _target < 0.5) then { if((magazines _caller) find "Laserbatteries" > -1) then { _target setFuel 1; _caller removeMagazine "Laserbatteries"; //hint "Refuelled"; sleep 2; hint format ["1%", fuel _target]; } else {hint "Du musst eine Laserbatterie in deinem Inventar haben."}; //} else {hint "Sorry, deine Drohne muss mindestens zu 50% leer sein."}; |
16.04.2014, 14:25 | #4 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
... forEach ["B_UAV_01_F", "I_UAV_01_F"];
Nicht in Anführungszeichen! Das sind die Namen der UAV die im Editor unter Namen oder bei createVehicle angeführt sind. ( Drohne1 = createVehicle [....]; ) Du kannst auch zuvor eine Liste (Array) mit den Drohnennamen erstellen: Drohnen = [Drohne1, Drohne2]; ... forEach Drohnen; Links fürs Missionserstellen und Skripten: Missionserstellung Tipps&Tricks http://hx3.de/editing-scripting-167/sqf-handbuch-22579/ Edit: //} else {hint "Sorry, deine Drohne muss mindestens zu 50% leer sein."}; Die erste } gehört noch zu if! Geändert von Vienna (16.04.2014 um 14:27 Uhr). |
16.04.2014, 18:58 | #5 (permalink) |
Registriert seit: 15.04.2014
Beiträge: 45
|
Danke, dass du dir so viel Mühe gibst, jedoch glaube ich, dass du nicht weisst, was ich will. Ich möchte die gesamte Map nach Drohnen absuchen und diesen dann addAction hinzufügen, ohne dass ich ihnen im Editor einen Namen gebe.
Ich hoffe du kannst mir dabei helfen. Danke |
17.04.2014, 07:58 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Code:
{ if (typeOF _x == "TypenName") then { temp = _x addAction["<t color='#FF0000'>REFUEL</t>","refuel\refuel_action.sqf"]; } }forEach allUnitsUav; Die gewünschte Drohne im Editor aufstellen und mit einem Funk-Auslöser anzeigen lassen. Dabei die Waffe auf die Drohne richten und den Funk-Auslöser betätigen. Code in Bei Akt. des Auslösers: hint str typeOf cursorTarget |
14.05.2014, 07:05 | #10 (permalink) |
Registriert seit: 14.05.2014
Beiträge: 7
|
Hallo,
bitte entschuldigt, wenn ich einfach so in diesen Thread platze. Ich suche nach ähnlichem Mein Vorhaben ist es, bei Missionsstart an Ammo-Boxen, Verkehrsleitkegel, Fässer etc. eine AddAction anzubringen. Das Ziehen dieser "Kleinlasten" soll mir/uns helfen und den Umgang mit dem IgiLoad-Script zu erleichtern. Jetzt Mappe ich eigentlich schon mehrere Jahre, aber bis dato immer auf Beginner-Niveau was das Scripten anbelangt. Vielleicht könnt ihr mir dabei behilflich sein? Mein Plan: Bei Missionsstart in der Init.sqf die Datei Greifer.sqf zu initialisieren, die alle von mir ausgesuchten Objekte mit Classnames in einem Array zusammenfasst. Dieses Array sollte dann die AddAction aufgedrückt bekommen. _Last addAction ["Ziehen","scripts\ziehen.sqf",nil,1,false,false,"" ,"!attached// and player distance _target<5"];}; komisch ist, wenn ich obigen Satz in die Init-Zeile jedes Objektes einfüge, kann ich es ziehen und wieder loslassen. Das Einfügen in jede Initzeile möchte ich aber gerne umgehen, sodass das Script bei Missionsstart den ausgewählten Objekten diese AddAction verpassen soll. Die drei Dateien soweit: ziehen.sqf Code:
_Last = _this select 0; _spieler = _this select 1; _act = _this select 2; player setvariable ["drop",[_Last,_spieler,_act],true]; _spieler removeAction _act; _spieler playMove "acinpknlmstpsraswrfldnon";//Für die DragGrab-Animation sleep 2; _Last attachTo [_spieler,[0,1.5,0.3]]; _Last setdir 90; attached = true; publicVariable "attached"; _actionId = _spieler addAction ["fallenlassen", "scripts\loslassen.sqf", [], 5, false, true, "", "(attached && (_target == _this))"]; _spieler setvariable ["getragenes",_Last]; _spieler addMPEventHandler ["MPkilled", {detach ( _this select 0) getvariable "getragenes",attached=false;publicVariable "attached";}]; //So funktioniert es schonmal nicht. //if (_Last isKindOf "Box_IND_Ammo_F") then {_Last addAction //["Ziehen","scripts\ziehen.sqf",nil,1,false,false,"","!attached// and player distance _target<5"];}; loslassen.sqf Code:
_temp = player getvariable "drop"; _Last = _temp select 0; _spieler = _temp select 1; _act = _temp select 2; _spieler removeAction _act; _spieler removeMPEventHandler ["killed",0]; //hint format ["%1",_temp]; detach _Last; _Last setpos [(getpos _Last) select 0 , (getpos _Last) select 1 , 0.4]; _spieler switchMove ""; attached = false; publicVariable "attached"; removeAllActions _spieler; und Greifer.sqf - welche ich mit dem Init.sqf Eintrag:0 = execVM "scripts\Greifer.sqf"; aufrufe. Code:
waitUntil { !(isNull player) }; waitUntil { time > 0 }; player setvariable ["drop",[_Last,_spieler,_act],true]; Lasten = ["Box_IND_Ammo_F","WL_GER_Back_Box_Flecktarn"]; { _Last = _x addAction["ziehen","scripts\ziehen.sqf"] }forEach Lasten; hint "Greifer durchlaufen"; Geändert von Ben-at-Arms (14.05.2014 um 07:07 Uhr). |
14.05.2014, 08:46 | #11 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
In die Init.sqf diese Zeile einfügen: Code:
if (!isDedicated) then {{_x addAction[...]}forEach[Objekt1,Objekt2,usw.]}; |
14.05.2014, 08:53 | #12 (permalink) |
Registriert seit: 14.05.2014
Beiträge: 7
|
Vielen Dank für deine Antwort, Vienna.
Darf/Kann ich irgendwie an Stelle der Objekt1 Objekt2 ein Array angeben, so dass Klassennamen verwendet werden? Zum Beispiel so:? meinArray = ["Box_IND_Ammo_F","Land_MetalBarrel_F","Land_WaterT ank_F" etc?] Das wäre leichter und man müsste nicht die ganzen Objekte im Editor benennen. |
14.05.2014, 12:57 | #13 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Natürlich geht das bei forEach. Du kannst alles anführen was ein Array enthält.
https://community.bistudio.com/wiki/forEach https://community.bistudio.com/wiki/...s#forEach-Loop https://community.bistudio.com/wiki/...ccess_elements Allerdings verlangt addAction in ein Objekt. https://community.bistudio.com/wiki/addAction Mit Klassennamen müsstest du dir zuvor mit https://community.bistudio.com/wiki/nearestObjects ein Array der Objekte der jeweiligen Klasse ausgeben lassen. Willst du die Aktion für alle Objekte dieser Klassen haben? |
14.05.2014, 20:04 | #14 (permalink) |
Registriert seit: 14.05.2014
Beiträge: 7
|
Danke für den Denkanstoß,
ich hab es mal so gemacht, quasi schnell und dreckig Ist noch unaufgeräumt, da ich noch eher Anfänger bin, aber es funktioniert. Ich starte von der Init aus die sqf, die meine Objekte enthält: gueter = nearestobjects [getpos player,[ "Box_IND_Ammo_F","Land_MetalBarrel_F","Land_WaterT ank_F",...(gekürzt) "Box_IND_Support_F", "Box_East_Support_F", "Box_NATO_Support_F","Land_CargoBox_V1_F","x39_med icBox","Land_Pallet_MilBoxes_F","Land_PaperBox_clo sed_F","Land_PaperBox_open_empty_F","Land_PaperBox _open_full_F" ],15000] ;{_x addAction ["<t color=""#FFAD1F"">" +"Ziehen", "BDD\ziehen.sqf", "", 5,true, true, "", "!attached and player distance _target<3"];} foreach gueter; Und kann diese Objekte dann ziehen =) Danke nochmals. Nur noch eine Frage bleibt: Ist so etwas nützlich genug für ein Release für die Kommi? |
14.05.2014, 21:40 | #15 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Du könntest das auch so anlegen, dass jeweils der Spieler nur die Objekte ziehen kann, welche z.B. in einem Umkreis von 10m beim Spielstart um ihn vorhanden sind:
Code:
_radius = 10; _klassen = [ "Box_IND_Ammo_F", "Land_MetalBarrel_F", "Land_WaterT ank_F", "Box_IND_Support_F", "Box_East_Support_F", "Box_NATO_Support_F", "Land_CargoBox_V1_F", "x39_med icBox", "Land_Pallet_MilBoxes_F", "Land_PaperBox_clo sed_F", "Land_PaperBox_open_empty_F", "Land_PaperBox _open_full_F" ]; _gueter = nearestObjects [getPos player, _klassen, _radius]; { _x addAction [ "<t color=""#FFAD1F"">"+"Ziehen", "BDD\ziehen.sqf", "",5,true,true,"", "!attached and player distance _target<3" ] } forEach _gueter; |
15.05.2014, 09:18 | #17 (permalink) |
Registriert seit: 14.05.2014
Beiträge: 7
|
Jetzt hab ich mich eingebunkert
Jetzt kann nur noch ein Mann gleichzeitig die Ziehen und Fallenlassen - Aktionen verwenden. Sobald er loslässt erscheint bei allen anderen wieder die Aktion ziehen, bis der nächste diese auswählt. Das ist komisch. |
15.05.2014, 12:57 | #18 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das ist bei deiner Programmierung korrekt.
Wenn ein Spieler zieht, dann verhindert die publike Variable das Ziehen durch andere Spieler: attached = true; publicVariable "attached"; Wenn jeder Spieler eigene Objekte hat, dann die zweite Zeile entfernen. Auch hier: attached = false; publicVariable "attached"; |
16.05.2014, 13:42 | #20 (permalink) |
Registriert seit: 14.05.2014
Beiträge: 7
|
Stopp. Kommando zurück.
Ich habe übersehen, dass ich die attached = true; in meiner greifer.sqf selbst reinschreibe. Danke nochmals für deine Hilfe, Vienna. Hier ist die erste spielbare Version: http://www.armaholic.com/page.php?id=25675 Geändert von Ben-at-Arms (16.05.2014 um 14:54 Uhr). Grund: Release Multiplayerfähig. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Performanceprobleme (Lösung: Objekte nur bei Bedarf erscheinen lassen) | sandmanGER | Editing & Scripting | 6 | 31.12.2012 09:53 |
Objekte auf Inseln löschen | Buliwyf | Editing & Scripting | 2 | 24.11.2012 19:00 |
Problem mit Helmand Karte und Aiaktalik - Help please! | FlashAUT | Mods & Addons | 8 | 24.11.2011 10:05 |
Linux Server aufsetzen . Vorgehen ? | Nightshift | Multiplayer | 2 | 29.08.2011 22:37 |
Objekte ausrichten | hypercop | Editing | 5 | 17.02.2011 00:29 |