HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   Alle Objekte eines Typs in Array speichen. (https://hx3.de/editing-scripting-187/alle-objekte-typs-array-speichen-23673/)

marc_book 15.04.2014 22:47

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

Vienna 16.04.2014 07:52

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."
 };


marc_book 16.04.2014 10:25

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."};


Vienna 16.04.2014 13:25

... 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:
http://hx3.de/editing-scripting-167/...-tricks-22044/
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!

marc_book 16.04.2014 17:58

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

Xeno 16.04.2014 19:01

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

Xeno

marc_book 16.04.2014 20:45

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.

Vienna 17.04.2014 06:58

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

marc_book 17.04.2014 11:10

Danke, werde es gleich mal ausprobieren.

Ben-at-Arms 14.05.2014 06:05

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 :daumen:

Vienna 14.05.2014 07:46

Zitat:

Zitat von Ben-at-Arms (Beitrag 472693)
...
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.]};

Ben-at-Arms 14.05.2014 07:53

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.

Vienna 14.05.2014 11:57

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?

Ben-at-Arms 14.05.2014 19:04

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?

Vienna 14.05.2014 20:40

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.

Ben-at-Arms 14.05.2014 22:53

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

Danke abermals.

Ben-at-Arms 15.05.2014 08:18

Jetzt hab ich mich eingebunkert :stupid:

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.

Vienna 15.05.2014 11:57

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";

Ben-at-Arms 16.05.2014 11:53

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 16.05.2014 12:42

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.

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