HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Suicide Bomber (https://hx3.de/editing-scripting-167/suicide-bomber-23650/)

JSR 10.04.2014 09:13

Suicide Bomber
 
Moin!

Will ein suicide Bomber machen, der random vom Spiel ausgesucht wird.

Angefangen mit:

SBomber = nearestObjects [player, ["Civilian"], 200]; ///// SBomber = Suicide Bomber/////

Er sucht im Raum von 200 Metern Zivilisten. Meine erste Frage und eig. auch der Kern: wie kann ich jetzt sagen, dass er einen von den rauspickt und als "Object" benennt, damit ich später im Waituntil (in einer Schleife) die Distance zum Player abchecken lassen kann?




while {true} do {
SBomber = nearestObjects [player, ["Civilian"], 200];



_dist = {_x distance Player} foreach SBomber; /// Hier fehlt der Punkt, wo er nicht mehr nach weiteren Zivilisten im 200 Meter Radius abfragt, sondern einen zufälligen Zivilisten auswählt und ihn eine Variable zuteilt. /////

if (true) then {SBomber commandMove (getPos player); waitUntil {SBomber = nearestObject [player, "Civilian"]; SBomber distance player < 10;};};

Bomb="R_OG9_HE" createVehicle position SBomber ;
};

Vienna 10.04.2014 12:44

Wenn du keinen Wert drauf legst welcher der Zivilisten von mehreren genommen wird:

Code:

SBomber = [];

while {count SBomber == 0} do
 {
  sleep 1;
  SBomber = nearestObjects [player, ["Civilian"], 200]
 };
 
SBomber = SBomber select 0;

waitUntil {sleep 0.5; SBomber distance player < 10};

"R_OG9_HE" createVehicle position SBomber ;


JSR 10.04.2014 14:22

Hey Vienna, wieder mal danke für die Antwort! :)

Ich probiere das Ganze zu verstehen:

SBomber = []; /// Es wird ein "leerer" Array eingefügt, damit NearestOBjects funktioniert (in dem Fall) und den Zivilisten als Wert in die Klammern einfügen kann - richtig?

In der Bedingung von While wird solange abgefragt, bis aus null eins wird, bzw. ein Zivilist ausgewählt ist. Dann SBomber = Sbomber select 0; weil es ja - logischerweise - der erste Wert in []; bzw im Array ist, richtig?

Danach ist ja eig. alles ziemlich easy.

Nochmals danke!




Code:

SBomber = [];

while {count SBomber == 0} do
 {
  sleep 1;
  SBomber = nearestObjects [player, ["Civilian"], 200]
 };
 
SBomber = SBomber select 0;

waitUntil {sleep 0.5; SBomber distance player < 10};

"R_OG9_HE" createVehicle position SBomber ;


Vienna 10.04.2014 18:35

Zitat:

Zitat von JSR (Beitrag 471033)

In der Bedingung von While wird solange abgefragt, bis aus null eins wird, ...

Das ist keine logische Abfrage, sondern es wird gezählt wie viele Zivilisten im Bereich sind. Es können somit auch mehr als einer sein. Mit select 0 wird aber immer nur der erste in der Liste genommen.

Man könnte als Bedingung auch count SBomber < 1 nehmen.

JSR 11.04.2014 12:03

Okay danke, habe es verstanden! :daumen: Top.


PS:

Kleine Erweiterung.
Code:

SBomber = [];
_r = random 10;
_rf = floor _r;
while {count SBomber == 0} do
 {
  sleep 1;
  SBomber = nearestObjects [player, ["Civilian"], 200]
 };
 
SBomber = SBomber select _rf;

waitUntil {sleep 0.5; SBomber distance player < 10};

"R_OG9_HE" createVehicle position SBomber;


Man achte auf die Variable _rf.

Somit wird ein zufälliger Zivi genommen, der sich im Radius von 200 Metern befindet. Mit select 0 wird immer der nähste gewählt.


Auch für Leute, die durch Google hier her stoßen!

Vienna 11.04.2014 12:42

Das würde nur dann funktionieren, wenn immer 11 oder mehr Zivilisten im Bereich wären.

So wird die Auswahl an die Anzahl der vorhandenen Zivilisten angepasst:
Code:

SBomber = [];

while {count SBomber < 1} do
 {
  sleep 1;
  SBomber = nearestObjects [player, ["Civilian"], 200]
 };

SBomber = SBomber select (floor(random(count SBomber - 1)));

waitUntil {sleep 0.5; SBomber distance player < 10};

"R_OG9_HE" createVehicle position SBomber;

count SBomber - 1 ist notwendig, weil der Index von Arrays mit 0 beginnt.

JSR 11.04.2014 12:43

Okay verstehe! Dann ist Random und Floor aber doch gar nicht mehr nötig, oder?


PS: Ach doch klar, sonst wird immer der gleiche abgewählt.

Vienna 11.04.2014 12:50

Falls du das schon kopiert hast, ich habe bei while das Zeichen von > auf < geändert!

floor ist notwendig für die Rundung für Arrays und random um einen Inhalt zufällig auszuwählen. Ohne random würde immer der letzte Zivilist von mehreren genommen.

JSR 11.04.2014 13:03

Code:

while {count SBomber < 1}
Hier wird die Schleife ausgeführt, solange bis die Anzahl der SBomber Variable unter 1 ist.



SBomber =
Code:

SBomber select (floor ( random (count SBomber -1)));
Das mit Floor und Random habe ich verstanden. Der Wert von Random wird gerundet und somit ein Wert aus dem Array abgezogen.

Aber wenn ich 10 Zivilisten habe und der -1 Befehl kommt, bedeutet das, dass ein Zivilist genommen wird der in den Array SBomber[1]; gesteckt wird?




PS: Script so verändert, dass er auf die Distance zum Westsoldier achtet und nicht mehr auf den Spieler fixiert ist:


Code:


SBomber = [];
while {count SBomber < 1} do
 {
  sleep 1;
  SBomber = nearestObjects [player, ["Civilian"], 200]
 };
 
SBomber = SBomber select (floor ( random (count SBomber -1)));
waitUntil { sleep 1; ( {side _x == WEST && (_x distance SBomber) < 10} count allUnits) > 0};

"R_OG9_HE" createVehicle position SBomber;


Bei nearestObjects kann man natürlich dann auch "Player" mit West tauschen oder einfach den Radius dementsprechend groß machen, so dass sowieso jede Einheit betroffen ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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