HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Fragen zum Missionsbau (https://hx3.de/editing-scripting-167/fragen-missionsbau-22194/)

Drunken Officer 28.01.2013 01:21

Fragen zum Missionsbau
 
So nachdem ich meine Grundkenntisse im scripten durch das Addon-Bauen gewonnen habe und hier lese, was im Missionsbau so möglich ist, reizt mich der Missionsbau.
Dazu habe ich schonmal die erste Frage.

Ich will einen Auftragskill machen. 5 SUV fahren von a nach b. Die Zielperson soll in einem der SUV sitzen. Aber per Zufallprinzip.
Person: Opfer
SUV heißen: car_suv_1 (-5)
Code:

opfer moveincargo ???
es wäre möglich mit random eine Zahl zwischen 1 - 5 zu erstellen und jeder Zahl ein Auto zuzuwiesen. Aber ich denke das geht auch einfacher, oder?

Wolkenbeisser 28.01.2013 08:16

Ich als 'Nicht-so-gut-skripter' würde das wie folgt lösen:

1. Opfer abseits an den Kartenrand stellen
2. 4 Marker in der Nähe des Opfers platzieren
3. Die Marker mit dem Opfer Gruppieren (F2)

--> Resultat: Bei jedem Missionsstart ist das Opfer - zufällig - entweder an der Startposition, oder bei einem der Marker.

4. Um jeden Marker und um die Originalstartposition des Opfers einen Auslöser (= total 5 Auslöser):

Aktivierung: Jeder
Radius: ca. 6m
Zeitverzögerung: 2 Sek.
Bedingung: this and Opfer in thislist
Aktivierung: Opfer moveInCargo car_suv_1

5. In der Aktivierungszeile eines jeden Auslösers jeweils einen anderen SUV als Ziel angeben (siehe fettgedruckte Zahl oben).

Ich weiss, es geht eleganter. Das wäre einfach mal die 'kommt mir als Erstes in den Sinn' Variante ohne Script. :D

Vienna 28.01.2013 10:17

In die Initialisierungszeile des Opfers schreibst du folgendes rein:

this moveInCargo([car1,car2,car3,car4,car5]select(floor(random 5)));

Anstelle von car1 - car5 nimmst du die Namen deiner Fahrzeuge.

Rockhount 28.01.2013 10:30

oder, wenn man es ein wenig dynamischer haben möchte:


In die Initzeile des mittleren SUV's:
Code:

temp = [this,Opfer,50] execVM "MoveInSUV.sqf";
Opfer = Name des Opfers
50 = Entfernung vom mittleren SUV bis zum entferntesten SUV


MoveInSUV.sqf:
Code:

private ["_this","_suv","_opfer","_radius","_suvs"];

_suv = _this select 0;
_opfer = _this select 1;
_radius = _this select 2;

if (isServer) then
{
        _suvs = nearestObjects [getPos _suv, typeOf _suv, _radius];
        _suv = _suvs select (floor (random (count _suvs)));
        _opfer moveInCargo _suv;
        _opfer assignAsCargo _suv;
};

Edit:
Zitat:

Zitat von Vienna (Beitrag 440756)
this moveInCargo([car1,car2,car3,car4,car5]select(floor(random 5)));

Du darfst die Lokalität nicht vergessen. Bei deinem Beispiel würde das Opfer bei 10 Spieler auch 11 mal umplaziert werden, da moveInCargo global wirkt.

Vienna 28.01.2013 12:35

Richtig Rockhount, für MP muss dass in der Initzeile dann so aussehen: if (local this) then {....}

Das ist auch ein gutes Beispiel um aufzuzeigen wie man das mit einem spawn-Skript lösen kann. Dabei soll es auch möglich sein anstelle von "moveInCargo" auch "moveInDriver" oder "moveInGunner" zu verwenden.

Das Beispiel zeigt gleichzeitig auf, wie mit dem Befehl "format" ein Code zusammengestellt wird, welcher dann mit "call compile" auszuführen ist.

Der Code der Routine könnte stark verkürzt werden. Er ist aber zur besseren Verständlichkeit umfangreicher gestaltet. Die Textausgabe des Befehls dient nur der Information.


Paramter: [UnitName,"Befehl",[Array mit Fahrzeugnamen]]
Code:

temp = [Opfer,"moveInCargo",[car1,car2,car3,car4,car5]] spawn
 {
  private ["_unit","_befehl","_vehicleListe","_i"];
  _unit        = _this select 0;
  _befehl      = _this select 1;
  _vehicleListe = _this select 2;
  if (! local _unit) exitWith {};
  moveOut _unit;
  _i = count _vehicleListe;
  _i = floor (random _i);
  _befehl = format
  [
    "%1 %2 %3",
    _unit,
    _befehl,
    _vehicleListe select _i
  ];
  call compile _befehl;
  player groupChat "Befehl: " + _befehl
 };

Diese Routine ist in einen Auslöser oder in ein Skript einfügbar. Die Unit kann sich auch bereits in einem Fahrzeug befinden (aussteigen mit: moveOut _unit), aber es muss der gewünschte Platz frei sein. Ist MP tauglich (if (! local _unit) exitWith {}).

Drunken Officer 30.01.2013 06:16

1. Ich habe mir vom Moerderhoschi die TUT-Mission runtergeladen. (Super Ding zum lernen :daumen: )Er arbeitet mit einem Funktionsmanger für die Random-Patrol.
Ich möchte zivilisten ebenfalls per Zufall durch die Stadt laufen lassen. Muß ich da einen neuen Funktionsmanger einfügen? So richtig habe ich das noch nicht geschnackelt.

2. Gibt es ne Möglichkeit sich die Koordinaten für Positionen im Editor anzeigen zu lassen.

z.B. soll ein Marker gelöscht werden (bekomme ich hin) und ein 2. soll gesetzt werden (neue Zielzone). Ich arbeite momentan ohne Missionseinträge, da ich mich erstmal einfuchsen muß.
Erreichen würde ich dies mit setMarker so wie in der Anleitung vom Mr-Murry. Aber ich bekomme nur die genaue Position, wenn ich da was platziere -> rein in die Mission .sqm -> copy&paste -> und zurück.
Gibt es da einen einfacheren Weg um an die Koordinaten zu kommen?

Vienna 30.01.2013 10:23

Zu 2.

copyToClipboard format["%1",position player]; z.B. über einen Funkauslöser aufrufen.

Du kannst jetzt die Position im Editor z.B. in den Code eines Auslösers mit Tasten Strg+V einfügen oder mit Tasten Alt+Esc raus aus Arma und die Position z.B. in ein Skript einfügen.

Moerderhoschi 30.01.2013 18:58

@Drunken Officer

Das Funktionsmanager Modul muss nur einmal erstellt werden. Wenn du moechtest das auch Zivilisten mit dem ArmA eigenen Random Waypoint System durch die Gegend marschieren musst Du ihnen einen Waypoint geben mit
Code:

0=[group this, position this, 50] call BIS_fnc_taskPatrol;
wie bei den OPFOR Einheiten in der Beispielmission.

€dit:

wobei die letze Angabe, in diesem Beispiel 50, die Distanz zwischen den Random Waypoints festlegt.

gruß
hoschi

Drunken Officer 03.02.2013 13:06

Mal ne generelle Frage.

Meine Mission soll wie so viele Andere auch nach dem Motto: "rein - zuschlagen - raus" aussehen. Ist glaube ich das Beste zum lernen.

Nun wäre es ja Quatsch, die ganze Karte mit Einheiten zu übersähen.
Wie machen es die "alten Hasen"? Einheiten setzen, postion speichern, löschen und später abrufen? Oder innerhalb eines definierten Bereich setzen, wenn die Zeit gekommen ist?
Ich frage deshalb, weil
Ziel 1: ist die Störung der Funkverbindung (Türme wegsprengen gekomme ich hin)

Ziel 2: Strand von MG-Nestern beräumen

Allerdings laufe ich Gefahr das die MG-Nester zuflällig im 1 Durchlauf entdeckt würden und es alles net mehr hinhaut.

Vienna 06.02.2013 19:18

Das wurde erst kürzlich behandelt: http://hx3.de/editing-scripting-167/...-script-22011/

Drunken Officer 06.02.2013 19:48

Puh, da bin ich noch meilen weit von entfernt... :ugly:

Ich würde es vlt erstmal so probieren, dass ich einen Marker für das nächste Zielgebiet erstelle. Dies kann ich ja über den Auslöser machen, wenn das 1. ziel erreicht wurde.

Kannst du mir verraten, wie der Code aussieht, wenn ich dann in dem Bereich zufällig Einheiten haben will.
Das Problem ist, dass ich zwar die Befehle kenne (createUnit, creategroup, createMarker usw.) aber ich tue mich schwer diese richtig zu verpacken. :(
das erstllen würde ich vielleicht irgendwann mal hinbekommen, aber wie hänge ich z.B. der Einheit den Wegpunkt an, wo ich die Einheiten mit dem scriptbeispiel von Moerderhoschi laufen lasse.

burns 06.02.2013 20:02

Zitat:

Zitat von Drunken Officer (Beitrag 441265)
Kannst du mir verraten, wie der Code aussieht, wenn ich dann in dem Bereich zufällig Einheiten haben will.

Dynamic-AI-Creator (DAC) V3.0 released ;)

Vienna 07.02.2013 07:56

Zitat:

Zitat von Drunken Officer (Beitrag 441265)
Puh, da bin ich noch meilen weit von entfernt... :ugly:

Ich würde es vlt erstmal so probieren, dass ich einen Marker für das nächste Zielgebiet erstelle. Dies kann ich ja über den Auslöser machen, wenn das 1. ziel erreicht wurde.

Kannst du mir verraten, wie der Code aussieht, wenn ich dann in dem Bereich zufällig Einheiten haben will.
Das Problem ist, dass ich zwar die Befehle kenne (createUnit, creategroup, createMarker usw.) aber ich tue mich schwer diese richtig zu verpacken. :(
das erstllen würde ich vielleicht irgendwann mal hinbekommen, aber wie hänge ich z.B. der Einheit den Wegpunkt an, wo ich die Einheiten mit dem scriptbeispiel von Moerderhoschi laufen lasse.

Mein Skript betrifft nur Objekte (Autos, Panzer usw.). Hier ein neues Beispiel wie das mit Auslösern zu verwirklichen ist: Einheiten spawnen/ löschen script - HX3 Foren

Für Soldaten verwende das von Burns vorgeschlagene Programm.

Drunken Officer 16.02.2013 19:18

Ich möchte über die Parameter den Skill-Wert der feindlichen Einheiten festlegen.

Mein setskill.sqf sieht so aus
Code:

//{_x setSkill (paramsArray select 4)} forEach units east;
{
if (side _x == east) then { _x setSkill (paramsArray select 4)};
 } forEach allUnits;

Sowohl die eine als auch die andere Variante führen nicht zum Erfolg. Auch dann nicht, wenn ich statt dem paramsArray den Wert direkt festlege.
Ich rufe den Wert via Funkauslöser von "Testkeule" >> (sk= skill testkeule; hint format ["%1", sk]; << hab.
Ich starte des Script in der Init.sqf mittels execVM "scripte\setskill.sqf";

***
Mal angenommen, ich mache es komlpett quer-feld-ein, ohne Parameter denne, müßte es heißen
{_x setSkill (random 1)}; forEach allUnits?

Gruß

Vienna 16.02.2013 21:22

Einfachstes Beispiel: {if (side _x == EAST) then {_x setSkill 0}} forEach allUnits;

Hier gibt es Genaueres: http://hx3.de/editing-scripting-167/...nheiten-20470/

Drunken Officer 17.02.2013 08:18

Hm, dein Code ist identisch zu meinem, außer das du ein ; weniger hast.

Also müßte es eigentlich funktionieren!? Muß ich beim setzen der Einheiten den Schieber auf null stellen?
Ich werde es ebenfalls mal mit einem Auslöser probieren, so wie in deinem Thread. Nur Ein Auslöser ruft das Script auf. Wenn das script in der Init.sqf aufgerufen, wird es doch auch aufgerufen :ugly:

Vienna 17.02.2013 09:15

Der Code bei setSkill war in meinen Beispiel falsch! Ich habe das jetzt ausgebessert (fett hervorgehoben).

Auf Spieler wirkt der Befehl nicht, nur auf KI. Mit hint str skill UnitName kannst du dir den Wert anzeigen lassen (natürlich von einer KI der richtigen Seite).

Drunken Officer 20.02.2013 08:54

Problem.
Ich habe ein kleines Zeltlager. 4 Zelte, eine Feuerstelle. Damit das Lager nicht jedesmal an der gleichen Stelle ist, habe ich 3 Marker.
Wenn ich die Objekte jetzt mit dem Marker verbinde, macht Arma2 das, was es machen soll. Jedem Objekt wird zufällig eine Postion an den 3 Markern gegeben.
Wie also kann ich die Objekte als "Gruppe" behandeln, damit das gesamte Zeltlager zufällig an einem der 3 Marker spawnt?
Mit F2 kann man keine Objekte verbinden. f5 bringt auch keinen Erfolg

Pfandgiraffe 20.02.2013 11:34

Benutze Kompositionen, dann ist es einfacher.
https://community.bistudio.com/wiki/...t_Compositions

Vienna 20.02.2013 13:51

Hier findest du ein Beispiel, wie man eine Gruppe von Objekten an eine andere Position verlegen kann. Die Aufstellung der Objekte zueinander wird beibehalten.

http://hx3.de/editing-scripting-167/...14/#post431110


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