PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann man Einheiten im Triggerradius löschen?


niels001
28.06.2016, 09:43
Hallo,
ich spawne in einer Stadt per Trigger einige Einheiten und würde gerne die übrig gebliebene AI löschen sobald der Spieler den Trigger verlässt.
Ich habe folgenden Code gefunden:
{if (side _x == EAST AND _x in thisList) then {_x setDamage 1};} foreach allunits;

Für mich sieht der Code richtig aus und ich finde da auch keinen Fehler aber wenn ich ihn in den Trigger packe funktioniert er nicht. Er lässt sich zwar ausführen aber die Einheiten werden nicht gelöscht.

Ich hab den setDamage Befehl auch schon gegen {deleteVehicle _x} getauscht aber auch da klappt es nicht.

Könnt ihr mir sagen was daran falsch ist?

Sarogahtyp
28.06.2016, 10:10
wenn du löschen willst dann solltest du dies auch tun und nicht einfach nur töten.

{if (side _x == east AND _x in thisList) then {deleteVehicle _x;}; true} count allUnits;

aber allUnits ist vermutlich garnicht notwendig.

{if (side _x == east) then {deleteVehicle _x;}; true} count thisList;

Drunken Officer
28.06.2016, 11:55
Ich würde auch die 2 Variante vorschlagen. Warum alle Einheiten zählen lassen, wenn man eh nur die Einheiten aus dem Trigger braucht.

Sarogahtyp, wieso hast ein "true" in deine Count Abfrage gepackt?

niels001
28.06.2016, 12:03
Danke für die Antworten bisher.

Ich habe beide Varianten versucht und bekomme die Fehlermeldung:
Bei Aktivierung:Typ Zahl, erwartet nichts.

Sarogahtyp
28.06.2016, 12:21
mach mal:
nix = {if (side _x == east) then {deleteVehicle _x;}; true} count thisList; nix = nil;

das true ist ne Angewohnheit weil count mit der {code}count xxx; syntax eigtl. einen rückgabewert erwartet. Ich meine ich hätt so auch schon mal Fehlermeldungen im .rpt beseitigt.

niels001
28.06.2016, 12:26
Eine Fehlermeldung gibt es nun keine mehr aber die AI wird noch immer nicht gelöscht.

Sarogahtyp
28.06.2016, 12:30
Danke für die Antworten bisher.

Ich habe beide Varianten versucht und bekomme die Fehlermeldung:
Bei Aktivierung:Typ Zahl, erwartet nichts.

Nunja, irgendwie stimmt da auch was nicht, die sollten doch bei Deaktivierung gelöscht werden, also wenn der Spieler den Trigger verlässt?

Gib mal den Code aus allen Feldern Deines Triggers!

niels001
28.06.2016, 12:53
Zum testen habe ich einen East Soldaten in einen Trigger gestellt, hab den Code bei Aktivieren eingetragen und habe auf Funk Alpha gestellt zum auslösen.
Sonst steht nichts weiter im Trigger.

Sarogahtyp
28.06.2016, 13:00
dann müssen wir mal ans debuggen gehen:

nix = {if (side _x == east) then {deleteVehicle _x;}; true} count thisList; systemChat str nix;

sag mal ob und was er dann in den chat schreibt...

niels001
28.06.2016, 13:03
im Chat steht 0

Sarogahtyp
28.06.2016, 13:07
das bedeutet das die thisList leer ist, count zählt jedes Element darin und schiebt es in nix rein.

Der Trigger aktiviert zwar, aber es gibt kein Objekt im Triggerradius was die Bedingung erfüllt...

Was steht im Feld Bedingung bzw. Condition ???

niels001
28.06.2016, 13:08
ich habe doch aber EAST Soldaten im Trigger stehen, die werden doch mit side _x == east abgefragt oder nicht?

Sarogahtyp
28.06.2016, 13:15
ich habe doch aber EAST Soldaten im Trigger stehen, die werden doch mit side _x == east abgefragt oder nicht?
Nö...


der Trigger guckt ins Bedingungsfeld und schiebt alle Objekte die die BEdingung erfüllen in die thisList.

ich denke da muß true drin stehn damit es funktioniert.

Sarogahtyp
28.06.2016, 13:23
Ich sehe da auch noch ein Problem, alle toten Einheiten werden nicht gelöscht weil Sie nicht mehr bei side east sonder civilian sind...

kannst du die nicht beim spawnen alle in ein globales array speichern? Dann wäre das löschen einfacher...

niels001
28.06.2016, 13:26
Nein, auch dann klappt es leider nicht.

kannst du die nicht beim spawnen alle in ein globales array speichern? Dann wäre das löschen einfacher...

Gebe ich das Globale array dann einfach so wie ein normal array ein zum löschen oder muss ich da auf eine bestimmte schreibweise achten?

Sarogahtyp
28.06.2016, 13:43
Was mit Deinem Trigger schief läuft weiß iuch jetzt auch nicht, eventuell ist der Radius 0?

Zeig mal wie du spawnst dann sag ich dir wie das mit dem array am besten geht.

Ich mach jetzt erstmal Mittagspause, melde mich also ne halbe stunde lang nicht...

niels001
28.06.2016, 14:37
ich poste das heute abend fix. Hatte heute eigentlich frei darf aber nun doch arbeiten :daumen:

Sarogahtyp
28.06.2016, 14:50
okay, ich kann dann vermutlich erst morgen wieder antworten...

Sarogahtyp
28.06.2016, 19:18
so funktioniert es, ist aber nicht schön, weil allUnits benutzt wird. das kann unter umständen langsam sein.
nix = {deleteVehicle _x; true}count (allUnits select {(side _x == east) and (_x inArea thisTrigger)})
tote einheiten werden mit dieser methode auch nicht gelöscht, da sie side civilian sind.


besser ist es wenn du alle gespawnten einheiten in einem array hast dann werden auch tote gelöscht und das geht dann so:

nix = {if(!isNull _x) then {deleteVehicle _x;}; true}count yourglobalarray

Das mit der thisList hat nichgt funktioniert weil nur die objekte darin enthalten sind die den trigger aktiviert haben (glaube ich). in diesem fall nur du weil du gefunkt hast.


dein array baust du in etwa so (variiert je nachdem wie du spawnst):


yourglobalarry = []; //leeres array erzeugen
_jeep = "Jeep" createVehicle position player; // jeep spawnen und in _jeep speichern

yourglobalarry pushBack _jeep; // _jeep als letztes element vom array speichern


jetzt ist in yourglobalarray der gespawnte jeep drin. geht naturlich auch ohne lokale _jeep variable:


yourglobalarry = [];
yourglobalarry pushBack ("Jeep" createVehicle position player);

Sarogahtyp
28.06.2016, 20:22
Und so gehts richtig:

Trigger

Typ: keine
Aktivierung: Jeder

Bedingung:
this && {(isPlayer _x) and (alive _x)}count thisList > 0

Bei Aktivierung:
yourglobalarray = [];
nix = yourglobalarray pushBack ("O_G_Soldier_F" createVehicle position thisTrigger);
nix = yourglobalarray pushBack ("O_G_Soldier_F" createVehicle position thisTrigger)

Bei Deaktivierung:

nix = {if(!isNull _x) then {deleteVehicle _x;};true} count yourglobalarray;
yourglobalarray=nil

wenn du in den trigger rein rennst dann spawnen 2 opfor, wenn du ihn verlässt werden sie gelöscht.

niels001
29.06.2016, 11:57
wow, danke für die ausführlich Antwort, ich werde es heute Abend gleich testen gehen.

Gestern hat es mit der Antwort nicht mehr ganz hingehauen aber so lasse ich Units spawnen:

_spawnpos = [Objekt, 1+(random 1), (random 359)] call BIS_fnc_relPos;
_grp1 = [_spawnPos , EAST, ["Classnames"]] call BIS_fnc_spawnGroup;

Sarogahtyp
29.06.2016, 13:47
okay, das änderst du einfach wie folgt um:


_spawnpos = [Objekt, 1+(random 1), (random 359)] call BIS_fnc_relPos;
_grp1 = [_spawnPos , EAST, ["Classnames"]] call BIS_fnc_spawnGroup;
yourglobalarray = units _grp1;


dann sollte alles klappen.

Drunken Officer
30.06.2016, 09:09
Probiert es mal so.

Typ: Keiner
Aktivierung: Jeder

Bedingung: this && { side _x == west } count thislist == 0
Bei Akt: { if (side _x == EAST) then { deletevehicle _x} }foreach thislist;

Damit werden alle Einheiten gelöscht, die EAST sind und im Trigger drin sind, wenn sich keine blaue Einheit mehr im Trigger befindet

Sarogahtyp
30.06.2016, 11:43
Probiert es mal so.

Typ: Keiner
Aktivierung: Jeder

Bedingung: this && { side _x == west } count thislist == 0
Bei Akt: { if (side _x == EAST) then { deletevehicle _x} }foreach thislist;

Damit werden alle Einheiten gelöscht, die EAST sind und im Trigger drin sind, wenn sich keine blaue Einheit mehr im Trigger befindet

Ehrlich gesagt finde ich meine Lösung aus Post 20 besser, sie beinhaltet spawnen und deleten, und löscht auch tote einheiten und auch die, die aus dem triggerbereich heraus gelaufen sind.

Drunken Officer
30.06.2016, 12:26
Ohne Zweifel ist sie umfangreicher. Die Frage ist ja nun, will er spawn / löschen oder will er nur löschen oder will er spawen /löschen /spawen...

Dann kommt man mit einem Trigger nicht mehr weit und es muss ein Script her, was mit waitUntil arbeitet