HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   buildingpos auslesen (https://hx3.de/editing-scripting-167/buildingpos-auslesen-19282/)

hypercop 12.07.2010 13:34

buildingpos auslesen
 
Gibt es eine Möglichkeit, dass man auslesen kann, wieviele Gebäudepositionen es in einem Gebäude gibt?

Ich möchte bei einem zufälligen Gebäude alle Positionen mit Soldaten besetzen. Das Gebäude ist bei Missionsbeginn jedesmal ein anderes (Wird druch ein HeliH mit Radius 1000 und dann nearest buildung HeliH festgelegt).

.kju 12.07.2010 14:15

Scheint nur möglich per Selbsttest.

Die Seite kennst?
buildingPos - Bohemia Interactive Community

hypercop 12.07.2010 14:30

Die Seite kenne ich, trotzdem danke. Was meinst du mit Selbsttest?

Fogu 12.07.2010 15:12

Naja Du sollts selber TESTEN wieviele Positionen die Gebäude haben:naughty:
Zitat:

Übrigens wenn du der Einheit vorher einen Wegpunkt auf das Haus setzt, kannst du sehen welche Positionen im Haus verfügbar sind....

TeRp 12.07.2010 17:18

Code:

_building = _this select 0;
_dude = _this select 1;

_i = 0;

while {(_building buildingPos _i) distance [0,0,0] > 1} do
{ _i = _i + 1; };

_pos = floor(random _i);
if (_pos == _i) then { _pos = _i - 1; };

_dude setPos (_building buildingPos _pos);

Oh, Frage falsch gelesen.
Aber sollte als Basis zur Lösung des Problems durchaus genügen.

hypercop 12.07.2010 22:47

Ich habe jetzt 2 Std lang probiert und habs nicht hinbekommen. Meine Soldaten spawnen zwar an den verschiedenen Positionen im Gebäude, sind aber immer in der gleichen Gruppe und verlassen deshalb ihre Positionen und formieren sich beim ersten erstellten Soldaten.

[sodat] join GrpNull hab ich schon probiert, geht aber nicht, da die soldaten scheinbar immer die gleichen Namen zugewiesen bekommen.

Bitte TeRp, schrieb mir die Lösung etwas präzieser. Mein Script möchte ich hier lieber nicht posten, hehe.

.kju 13.07.2010 05:51

zB doStop - Bohemia Interactive Community

hypercop 15.07.2010 22:33

Oh man, ich mach jetzt seit mehreren Abenden an dem Script herum. Mir sagt der Tipp von TeRp ehrlich gesagt nicht sehr viel. Ich hab es probiert und das Einzige was passiert ist, dass ein Sodat gespawnt wird und dieser immer wieder an eine neue Position im Gebäude gebeamt wird.

Ich möchte folgendes:

Auf der Karte habe ich ein Helipad mit einem Radius von 1000. Jetzt soll ein Script überprüfen, welches Gebäude sich am nächsten zu dem Helipad befindet.
Ferner soll das script prüfen, wieviele Gebäudepostitionen sich im Gebäude befinden und diese Positionen mit Soldaten besetzen.

Ich hab mir auch schon mal das "Random-House-Position-and-Patrol-Script" angeschaut. Auch daraus bin ich nicht schlauer geworden. Bitte helft mir bei dem Script weiter.

TeRp 16.07.2010 11:00

Wenn du mein Scriptbeispiel mal Befehl für Befehl auseinander nimmst, wirst du ganz schnell auf die Lösung kommen.
Ich bin kein Freund dieser "Postet mir bitte ein komplettes Script"-Fragen, denn da ist der Lerneffekt Null und der nächste Thread mit dem nächsten Scriptwunsch folgt meist sogleich.
Wie gesagt, nimm mein Script mal Befehl für Befehl (oder Absatz für Absatz) auseinander, was dort genau geschieht.
Das kannst du ja mal hier posten und dann können wir von mir aus von dort an gemeinsam weiter machen, aber dir jetzt einfach ein Script vorkauen mach ich eher weniger. ;)

hypercop 17.07.2010 17:00

Hallo TeRP,
es ist verständlich, dass du kein fertig Script vorgeben willst. Ich wünschte auch, dass ich von selber auf die Lösung kommen würde, da der Editor und das Scripten, bei Arma eigentlich mit das Tollste am Spiel ist. Leider bin ich ein Noob.

Also hier mal meine Probleme:

while {(_building buildingPos _i) distance [0,0,0] > 1} do { _i = _i + 1; };

Diese Zeile bedeutet, dass solange die Gebäudeposition _i immer um 1 addiert wird, solange die Gebäudeposition nicht mehr als 1m von 0,0,0 (also ganz links unten auf der Karte) entfernt ist.
Warum macht man dies nicht mit der If THEN ELSE-Schleife?

_pos = floor(random _i);
if (_pos == _i) then { _pos = _i - 1; };


Diese beiden Zeilen sagen mir nichts. Den floor-Befehl hab ich noch nie verwendet. Und die zweite Zeile bedeutet, dass _pos (was immer das auch darstellt), wenn es die gleiche Größe wie _i hat, irgendwo etwas abgezogen wird?!:oh:

TraX 17.07.2010 17:27

Tach:ugly:
vielleicht hilft ja das Module: Visual House Positions - Bohemia Interactive Forums

.kju 17.07.2010 17:32

Hier alle Befehle in A2/OA:
Category:Scripting Commands ArmA2 - Bohemia Interactive Community

hypercop 17.07.2010 18:22

Danke für die Hinweise, haben mich aber auch nicht wirklich weiter gebracht.

Cyborg11 17.07.2010 19:49

Zitat:

Zitat von hypercop (Beitrag 322745)
while {(_building buildingPos _i) distance [0,0,0] > 1} do { _i = _i + 1; };

Diese Zeile bedeutet, dass solange die Gebäudeposition _i immer um 1 addiert wird, solange die Gebäudeposition nicht mehr als 1m von 0,0,0 (also ganz links unten auf der Karte) entfernt ist.
Warum macht man dies nicht mit der If THEN ELSE-Schleife?

Meinst du etwa so?

Code:

While {true} do
{
    If ((_building buildingPos _i) distance [0,0,0] > 1) then { _i = _i + 1};
};

Welche Lösung schaut denn nun eleganter aus? :confused:
Außerdem müsstest du dort noch eine Bedingung einbauen, dass die Schleife verlassen wird.

Warum einfach, wenn es auch umständlich geht?

Pfandgiraffe 17.07.2010 20:09

warum sollte er denn die schleife doppeln?! er hat doch nur den code von terp kopiert und versucht zu interpretieren, was ihm ja auch gut gelungen ist.

das einzige was er noch benötigt ist der spawn eines soldaten an jeder pos, die er ja eigentlich schon hat... ich hab mich nu mal erbarmt.



Code:

private ["_i","_building","_grp"];
if (!isServer) exitWith {};

_heliH = _this select 0;
_building = nearestBuilding _heliH;
_i = 0;


while {(_building buildingPos _i) distance [0,0,0] > 1} do{ _i = _i + 1;};

_grp = createGroup (east);
for [{_j=1}, {_j < _i}, {_j=_j+1}] do
{
        _pos = _building buildingPos _j;       
        _unit = _grp createUnit ["TK_Soldier_EP1", _pos, [], 0, "NONE"]; sleep 1;
        _unit disableAI "MOVE";
};
_grp allowFleeing 0;


natürlich ungetestet und ohne gewähr.





EDIT:
hab aus interesse nun mal selbst probiert. funktioniert so.


p.s.: disableai "move" zieht der ki die zähne und wenn man ihr die bewegung lässt laufen sie sofort los wenn sie einen gegner sehen... also aus dem haus raus.

TeRp 17.07.2010 21:21

Du bist es.

hypercop 19.07.2010 00:36

Sehr cool, vielen Dank.

Ich hatte erst gerade Zeit es auszuprobieren. Hat aber nicht ganz funktioniert. Die Soldaten werden immer auf dem Dach des Gebäudes gespawnt. Ich werd mal ein bischen rumprobieren.

PS. Das Script verwirrt mich. Ich check das keinen Meter. Ne Erklärung wäre echt toll. Von mir aus auch ein ganzer Aufsatz, hehe.

hypercop 19.07.2010 21:00

Es geht, es geht.:D

Ich hab die eine Zeile folgendermaßen verändert:

for [{_j=1}, {_j < _i}, {_j=_j+1}] do { _pos = _building buildingPos _j; _unit = _grp createUnit ["TK_Soldier_EP1", _pos, [], 0, "NONE"]; sleep 1; _unit disableAI "MOVE";_unit setPos (_building buildingPos _j)};

Zuvor standen die Soldaten immer auf den Dächern. Jetzt sind sie drin.

Vielen Dank nochmals. Auch wenn ich nicht verstehe, wie dieses Script genau funktioniert. Ich werd mich damit nochmals ein bischen auseinandersetzten.


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