Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 15.04.2014, 23:47   #1 (permalink)
Newbie
 
Registriert seit: 15.04.2014
Beiträge: 45
Standard 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"];
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."};
Vielen Dank
marc_book ist offline  
Alt 16.04.2014, 08:52   #2 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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.];
refuel_action.sqf:
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."
 };
Vienna ist offline  
Alt 16.04.2014, 11:25   #3 (permalink)
Newbie
 
Registriert seit: 15.04.2014
Beiträge: 45
Standard

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"];
refuel_action.sqf:
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."};
marc_book ist offline  
Alt 16.04.2014, 14:25   #4 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

... 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).
Vienna ist offline  
Alt 16.04.2014, 18:58   #5 (permalink)
Newbie
 
Registriert seit: 15.04.2014
Beiträge: 45
Standard

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
marc_book ist offline  
Alt 16.04.2014, 20:01   #6 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

https://community.bistudio.com/wiki/allUnitsUav

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.
Xeno ist offline  
Alt 16.04.2014, 21:45   #7 (permalink)
Newbie
 
Registriert seit: 15.04.2014
Beiträge: 45
Standard

Danke, ist schon fast das was ich suche.
Gibt es da auch noch eine andere Möglichkeit, denn ich möchte nur die Quadrokopter mit addAction versehen.
marc_book ist offline  
Alt 17.04.2014, 07:58   #8 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Code:
{
 if (typeOF _x == "TypenName") then
  {
   temp = _x addAction["<t color='#FF0000'>REFUEL</t>","refuel\refuel_action.sqf"];
  }
}forEach allUnitsUav;
Den TypenNamen feststellen:

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
Vienna ist offline  
Alt 17.04.2014, 12:10   #9 (permalink)
Newbie
 
Registriert seit: 15.04.2014
Beiträge: 45
Standard

Danke, werde es gleich mal ausprobieren.
marc_book ist offline  
Alt 14.05.2014, 07:05   #10 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

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";
Ich hoffe, jemand von euch kann mich einsteigerfreundlich erleuchten

Geändert von Ben-at-Arms (14.05.2014 um 07:07 Uhr).
Ben-at-Arms ist offline  
Alt 14.05.2014, 08:46   #11 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Zitat von Ben-at-Arms Beitrag anzeigen

...
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.
...

In die Init.sqf diese Zeile einfügen:
Code:
if (!isDedicated) then {{_x addAction[...]}forEach[Objekt1,Objekt2,usw.]};
Vienna ist offline  
Alt 14.05.2014, 08:53   #12 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

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.
Ben-at-Arms ist offline  
Alt 14.05.2014, 12:57   #13 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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?
Vienna ist offline  
Alt 14.05.2014, 20:04   #14 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

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?
Ben-at-Arms ist offline  
Alt 14.05.2014, 21:40   #15 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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;
Kann schon sein, dass das "Ziehen" wer brauchen kann.
Vienna ist offline  
Alt 14.05.2014, 23:53   #16 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

Das ist ja Wahnsinn. Dann stell ich das noch auf mehr Meter, damit es bis in die Logistikabteilung reicht

Danke abermals.
Ben-at-Arms ist offline  
Alt 15.05.2014, 09:18   #17 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

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.
Ben-at-Arms ist offline  
Alt 15.05.2014, 12:57   #18 (permalink)
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

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";
Vienna ist offline  
Alt 16.05.2014, 12:53   #19 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

Das Löschen der PublicVariable habe ich schon getestet, dann wird die Aktion auf dem dedizierten Server aber nicht mehr verfügbar.

Vielleicht sollte ich stattdessen mich in die privaten Variablen hereinlesen.
Ben-at-Arms ist offline  
Alt 16.05.2014, 13:42   #20 (permalink)
Newbie
 
Registriert seit: 14.05.2014
Beiträge: 7
Standard

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.
Ben-at-Arms ist offline  
 


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Kontakt - HX3.de - Archiv - Nach oben

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