PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gruppenmitglieder neu erstellen


aXXIs262
20.02.2009, 16:57
hi,

habe eine frage die sehr allgemein ist und ich konnte im Forum hier nicht passendes finden...

Und zwar:

ich habe eine Gruppe: 1 Spieler (groupleader) und 4 KI-Soldaten(nicht spielbar)
ich habe den Standart Respawn, also wenn ich sterbe kan ich respawnen aber wenn einer der KI stirbt wird kein Respawn ausgeführt, aber ich möchte gerne einen respawn für meine leute haben...

Wie kann ich das machen das die KI aus meiner guppe am marker respawnt und wieder in meiner gruppe ist ?

Vienna
20.02.2009, 19:55
Mit diesem Skript ist das möglich. Im Anhang auch die Beispielmission:

Gruppe.sqf

//Erstellen einer Gruppe für den Spieler.
//
//Stirbt ein Soldat der Gruppe, so wird er ersetzt


Private ["_soldaten","_i","_gruppe","_s","_n"];


//Soldtenbezeichnungen (es können weitere -auch gleiche- hinzugefügt werden)
_soldaten = ["SoldierWB","SoldierWAT","SoldierWMG","SoldierWSniper"];


//Soldaten erstellen
_gruppe = [];
for [{_i=0}, {_i<count _soldaten}, {_i=_i+1}] do
{
_s = group player createUnit [_soldaten select _i, Position player, [], 0, "FORM"];
_gruppe = _gruppe + [_s]
};


//Ersetzen von getöteten Soldaten
while {true} do
{
_n = 0;
_i = -1;
{if(!alive _x)then{_i=_n};_n=_n+1}forEach _gruppe;
if(_i > -1)then
{
_s = group player createUnit [_soldaten select _i, Position player, [], 0, "FORM"];
_gruppe set [_i, _s];
};
sleep 5
};


Damit die getöten Soldaten am Marker erstellt werden, musst du noch ändern (anstelle von "Position player" in der unteren Schleife).

S4mmy
20.02.2009, 20:03
Hachja da war wieder jemand schneller.

Na dann hat sich das erledigt^^..

Xeno
21.02.2009, 00:24
Spaßeshalber noch zwei Lösungen...


//Erstellen einer Gruppe für den Spieler.
//
//Stirbt ein Soldat der Gruppe, so wird er ersetzt
private ["_soldaten","_gruppe"];

//Soldtenbezeichnungen (es können weitere -auch gleiche- hinzugefügt werden)
_soldaten = ["SoldierWB","SoldierWAT","SoldierWMG","SoldierWSniper"];

//Soldaten erstellen
_gruppe = [];
{
_gruppe = _gruppe + [(group player createUnit [_x, Position player, [], 0, "FORM"])];
sleep 0.01;
} forEach _soldaten;

//Ersetzen von getöteten Soldaten
while {true} do {
for "_i" from 0 to (count _gruppe - 1) do {
_unit = _gruppe select _i;
if (!alive _unit) then {
_gruppe set [_i, (group player createUnit [_soldaten select _i, position player, [], 0, "FORM"])];
};
sleep 0.01;
};
sleep 5
};


//Erstellen einer Gruppe für den Spieler.
//
//Stirbt ein Soldat der Gruppe, so wird er ersetzt
private ["_soldaten"];

NewKilledSoldier = {
private ["_type","_newunit"];
_type = typeOf _this;
_newunit = group player createUnit [_type, Position player, [], 0, "FORM"];
_newunit addEventHandler ["killed", {_this select 0 spawn NewKilledSoldier}];
};

//Soldtenbezeichnungen (es können weitere -auch gleiche- hinzugefügt werden)
_soldaten = ["SoldierWB","SoldierWAT","SoldierWMG","SoldierWSniper"];

//Soldaten erstellen
{
_unit = group player createUnit [_x, Position player, [], 0, "FORM"];
_unit addEventHandler ["killed", {_this select 0 spawn NewKilledSoldier}];
sleep 0.01;
} forEach _soldaten;
Xeno

Vienna
21.02.2009, 11:46
Wenn man es optimal verkürzt, dann reichen die beiden Array-Variablen. Das ist aber für Anfänger nur noch schwer verständlich.

//Erstellen einer Gruppe für den Spieler.
//
//Stirbt ein Soldat der Gruppe, so wird er ersetzt

Private ["_soldaten","_gruppe"];

//Soldtenbezeichnungen (es können weitere -auch gleiche- hinzugefügt werden)
_soldaten = ["SoldierWB","SoldierWAT","SoldierWMG","SoldierWSniper"];

//Soldaten erstellen
_gruppe = [];
{_gruppe = _gruppe+[group player createUnit[_x,Position player,[],0,"FORM"]]}forEach _soldaten;

//Ersetzen von getöteten Soldaten
while {true} do
{
{if(!alive _x)then{_gruppe set[_soldaten find typeOf _x, group player createUnit[typeOf _x,Position player,[],0,"FORM"]]}}forEach _gruppe;
sleep 5
};

aXXIs262
21.02.2009, 14:15
ja geil, danke schonmal, kommte aber noch nicht so damit klar die gruppe am marker zu erstellen, bin noch was beschäftigt :)

ich möchte das die soldaten an einem marker respawnen und auf befehle warten :)

@vienna
anstelle von "Position player", "mein marker" oder was?

Vienna
21.02.2009, 14:48
getMarkerPos "MarkerName"

Der Markername muss in Anführungszeichen stehen!



Zu meiner letzten (der optimierten) Variante habe ich vergessen anzuführen, dass in _soldaten keine gleichen Typen enthalten sein dürfen, weil sonst beim Tod einer gleichen Type der vorher definierte Soldat ersetzt wird, was dazu führt, dass ständig ein neuer Soldat dieser Type zusätzlich erstellt wird.

aXXIs262
21.02.2009, 16:20
getmarkerpos... jo das ist das was ich suchte... danke :)

Vienna
21.02.2009, 19:48
Im Editing-Guide von Mr-Murray findest du auch vieles, sowie hier: Category:Scripting Commands ArmA - Bohemia Interactive Community (http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA)

aXXIs262
22.02.2009, 14:04
"FORM"

was ist denn damit gemeint ?

und eine 2. frage: wie kann ich es machen das die soldaten die gerade erstellt wurden den befehl halt bzw stop erhalten, damit die nicht über die map rennen..

Garstiger Hobbit
22.02.2009, 14:16
Nun "Form" damit ist gemeint das die Einheit die erstellt wird in Formation geht die,die Gruppe gerade hat.

Möglich wäre auch "NONE" die Einheit macht nichts und es gibt noch "FLY" damit erstellt man normalerweise Einheiten die in Der Luft starten.

Um die Einheit die erstellt wird stehen zu lassen kann du (commandStop)
benutzen.

aXXIs262
22.02.2009, 16:59
wie kann ich einen trigger der auf der map besteht mit hilfe der .sqf datei prüfen ob er true ist oder nicht ? der hintergedanke ist, dass der spieler erst neue Leute bekommt wenn er den trigger löst...

ich habs damit versucht, aber leider syntax wrong :)

_trigger = ["newmember"];
if(_trigger=true) then {
while {true} do
{
_n = 0;
_i = -1;
{if(!alive _x)then{_i=_n};_n=_n+1}forEach _gruppe;
if(_i > -1)then
{
_s = group player createUnit [_soldaten select _i, Position player, [], 0, "FORM"];
_gruppe set [_i, _s];
};
sleep 5
};
};

hmm... also der trigger auf der Map hat den namen newmember, weiss einer wie ich den prüfen kann in dem script ob er gelöst wurde oder nicht ?

Vienna
22.02.2009, 19:53
Initialisiere eine globale Variable im Skript z.B.

NeueSoldatenWest = false;

Dann im Mehrfach-Trigger bei

Bedingung: deine Bedingung
Bei Akt: NeueSoldatenWest = true
Bei Deakt: NeueSoldatenWest = false

(Ich habe dir ein Beispiel in den Anhang gestellt.)

Dann im Skript
Gruppe_West.sqf

//Erstellen einer Gruppe Soldaten für den Spieler. [Vienna 22.02.2009]
//
//Stirbt ein Soldat der Gruppe, so wird er ersetzt wenn die Variable NeueSoldatenWest true ist.

//Variable welche gesetzt sein muss, dass die Gruppensoldaten wiederhergestellt werden sollen
NeueSoldatenWest = false;

Private ["_soldaten","_gruppe","_i"];

//Typen der zu erstellenden Soldaten (eine Type kann auch öfter angeführt sein)]
_soldaten = ["SoldierWB","SoldierWAT","SoldierWMG","SoldierWB"];

//Gruppe erstellen
_gruppe = [];
{_gruppe = _gruppe+[group player createUnit[_x,Position player,[],0,"FORM"]]}forEach _soldaten;

//Ersetzen von getöteten Soldaten
while {true} do
{
if (NeueSoldatenWest) then
{
_i=0;
{
if (!alive _x) then
{
_gruppe set[_i,group player createUnit[typeOf _x,Position player,[],0,"FORM"]]
};
_i=_i+1
}forEach _gruppe
};
sleep 5
}


(Eine logische Variable musst du nicht Variable==true abfragen, da reich der Variabename. Das brauchst du nur, wenn zu false abfragen willst.)

aXXIs262
25.02.2009, 07:18
danke, funktioniert ganz gut... genau das was ich haben wollte :)
und das übergeben der variablen hab ich nun auch verstanden...