HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Hilfe bei Funktion um Gegnerspawns zu erstellen (https://hx3.de/editing-scripting-167/hilfe-funktion-um-gegnerspawns-erstellen-20032/)

Ante G. 23.11.2010 20:18

Hilfe bei Funktion um Gegnerspawns zu erstellen
 
Hi liebes Forum!

Hab jetzt mal nach langer Überlegung angefangen für ARMA 2 Missionen zu baschteln.

Bin grad an ner Mission, da sollen an verschiedenen Markern jeweils Gegner spawnen. Damit das einfacher geht, rufe ich einfach eine Funktion mit paar Parametern auf, dass spart mir viel Arbeit. Denkste...
Häng schon den ganzen Tag an dieser Funktion, ich krieg die Krise langsam :stupid:

Code:

createcenter RESISTANCE;
gegner1 = Creategroup RESISTANCE;

_spawnpunkt = _this select 0; //woher kommen die einheiten
_angriffpunkt = _this select 1; // wohin rennen sie
_radius = _this select 2; // in welchem radius stürmen die daher
_einheit = _this select 3; //was für ne einheit soll spawnen

hint format["Ubergabe: %1 Angriffpunkt %2", _einheit, _angriffpunkt];

switch (_einheit) do {
    case 1: { // LEICHTE INFANTERIE
        //_soldat1 = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        //_soldat2 = gegner1 createUnit ["TK_INS_Soldier_2_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        //_soldat3 = gegner1 createUnit ["TK_INS_Soldier_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1, "", 0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_2_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1 = group this;",0.3, "PRIVATE"];
       
    };
    case 2: { // MEDIUM INFANTERIE + MG
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_AR_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
    };
    case 3: { // SCHWER + RPG
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_AR_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat4 = "TK_INS_Soldier_AT_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
    };
    case 4: { // JEEP MIT MG
        _fahrzeug = createVehicle ["Offroad_DSHKM_INS", getMarkerPos _spawnpunkt, [], 0, "NONE"];
        _fahrer = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _gunner  = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _fahrer moveInDriver _fahrzeug;
        _gunner moveInGunner _fahrzeug;
   
    };
    default {
        hint "KEINE SWITCHPARAMETER UEBERGEBEN";
    };
;}

// WEGPUNKT
_WP1 = (group gegner1) addWaypoint [getMarkerPos _angriffpunkt, _radius];
_WP1 setWaypointBehaviour "AWARE";
_WP1 setWaypointType "SAD";

gegner1 doMove (getMarkerPos _angriffpunkt);

exit;

Also ich bau einen Trigger im Editor ein und bei "on activation" rufe ich diese Funktion auf. Dann kann ich sagen was für Einheiten angreifen sollen.

Ich finde das alles ziemlich verwirrend. Es gibt ja zwei verschiedene createUnits (OFP + ARMA) genauso wie createVehicles.
in der OFP Version, welche ich nutze, kann man viel mehr einstellen als in der arma Version (lt. BI API createUnit ARRAY). Wieso ist die Methode createUnit von OFP "besser" als die von ARMA?

Naja, jedenfalls spawnen alle ganz fleissig. Das klappt auch. Aber die wollen nicht zum WP1 rennen. Wär lieb wenn vllt. jemand mal über die Funktion fliegen könnt und mir die Fehler rauspickt oder mich aufklärt :zahn:

Thx im Voraus!
Schönen Abend noch!
Ich geh jetzt zocken, das Scripten hängt mir momentan zum Hals raus :zahn:

burns 23.11.2010 20:26

Code:

if (!isServer) exitWith {};
_pos = getmarkerPos "spawn1s";
_skill = [0.5, 0.9];
_side = WEST;
_units = ["AFR_Officer", "AFR_Rifleman", "AFR_Soldier_MG", "AFR_Soldier_Engineer", "AFR_Soldier_AT", "AFR_Medic", "AFR_Soldier_GL"];
afrgrp1 = [_pos, _side, _units, [], [], _skill] call BIS_fnc_spawnGroup;
sleep 3;
_ewp1 = afrgrp1 addWaypoint [getMarkerpos "spawn1d", 10];
_ewp1 setWaypointType "SAD";
_ewp1 setWaypointSpeed "NORMAL";
_ewp1 setWaypointFormation "LINE";
_ewp1 setWaypointCombatMode "RED";


Hiermit latschen´se vom Spawnpunkt (spawn1s) zum Wegpunkt (spawn1d), musst das Funktionsmodul auf die Karte setzen damits läuft. Allerdings wirfts im MP gerne Fehler weil _ewp1 wohl undefinierte Variablen sind, keine Ahnung was er mir damit sagen will, hab mir das Script aus allen Ecken der Welt zusammengeklaut und generell keinen Plan von sowas.


Finds ja schon gemein das jemand der sich "mal ebent" entschlossen hat Missionen zu bauen hier ankommt und schon scripten kann :faust::confused:

Pfandgiraffe 23.11.2010 21:00

hallo,


zeig mal deine kommandozeile mit der du dein script startest. und beim ersten überfliegen: das "exit" am ende ist .sqs und hat in deinem .sqf nichts zu suchen.

was gibt dein kontroll-hint aus? (hint format["Ubergabe: %1 Angriffpunkt %2", _einheit, _angriffpunkt];)

werden die gegner gespawnt?




mfg

Ante G. 23.11.2010 21:08

Hi,

danke für die Antworten.

@Burns: das skript blickt doch kein Mensch :nixweiss: Die vorgegebenen Units werden ja in dem Array gespeichert. Für meinen Einsatz leider nicht verwendbar.

@psycho:

Der trigger schaut so aus:
Code:

position[]={5536.9653,333.49664,821.78033};
            a=150;
            b=150;
            activationBy="WEST";
            interruptable=1;
            age="UNKNOWN";
            expCond="true";
            expActiv="_d = [""spawn2"",""gue_attack_1"",20,1] execVM ""skripte\contact_1.sqf"";";
            class Effects
            {
            };

Spawnen am Marker spawn2, wegpunkt sollte auf Marker gue_attack_1 gelegt werden im radius von 20, die eins steht für die einheit, in dem Fall 3xleichte soldaten (Switch case).

den hint hab ich mir eingebaut weil ich nicht sicher war ob die Parameter in der Funktion ankommen. So quasi als Debug ;)
Ach, das Exit.. Wusste ich nicht. Befasse mich mit der Thematik erst seid 2 Tagen.

Ja, die Gegner spawnen. Bewegen sich aber keinen milimeter. Als ich folgendes nutzte:

Code:

        //_soldat3 = gegner1 createUnit ["TK_INS_Soldier_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
Hat eine der gespawnten Einheit der anderen in den Rücken geschossen. :stupid: Kein sinn...
Deshalb sind die auskommentiert im case 1.

Thx!

PS: ich vermut mal das haperts mit der gruppe gegner1. Aber ich versteh das ganze noch nicht so ganz

Ante G. 24.11.2010 16:54

So jetzt geht's :naughty:

Ein Semikolon falsch gesetzt und die Initialisierung der Gruppe gegner1 mal in die init.sqs gesetzt. Ich weiss nicht ob die Gruppe nach Funktionsende gelöscht wird (sollte ja eig. nicht sein, da es keine lokale Gruppe _gegner1 ist sondern gegner1. Das gleiche mit _WP1. _WP1 wird aber nach Funktionsende trotzdem anerkannt und die gruppe rennt hin. :stupid: Versteh ich nicht... ).

Es läuft jedenfalls:

Code:

_spawnpunkt = _this select 0;
_angriffpunkt = _this select 1;
_radius = _this select 2;
_einheit = _this select 3;

//hint format["Ubergabe: %1 Angriffpunkt %2", _einheit, _angriffpunkt];

switch (_einheit) do {
    case 1: { // LEICHTE INFANTERIE
        //_soldat1 = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        //_soldat2 = gegner1 createUnit ["TK_INS_Soldier_2_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        //_soldat3 = gegner1 createUnit ["TK_INS_Soldier_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1, "gegner1=this", 0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_2_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
       
    };
    case 2: { // MEDIUM INFANTERIE + MG
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_AR_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
    };
    case 3: { // SCHWER + RPG
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_AR_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat4 = "TK_INS_Soldier_AT_EP1" createUnit [getMarkerPos _spawnpunkt, gegner1,"gegner1=this",0.3, "PRIVATE"];
    };
    case 4: { // JEEP MIT MG
        _fahrzeug = createVehicle ["Offroad_DSHKM_INS", getMarkerPos _spawnpunkt, [], 0, "NONE"];
        _fahrer = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _gunner  = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _fahrer moveInDriver _fahrzeug;
        _gunner moveInGunner _fahrzeug;
   
    };
    default {
        hint "KEINE SWITCHPARAMETER UEBERGEBEN";
    };
};

// WEGPUNKT

_WP1 = (group gegner1) addWaypoint [getMarkerPos _angriffpunkt, _radius];
_WP1 setWaypointBehaviour "AWARE";
_WP1 setWaypointType "SAD";


Ante G. 24.11.2010 17:01

Das ist echt zum Haare rausreissen :motz:
Infanterie funktioniert, nur der scheiss Jeep will nicht zufahren:

Code:

case 4: { // JEEP MIT MG
        _fahrzeug = createVehicle ["Offroad_DSHKM_INS", getMarkerPos _spawnpunkt, [], 0, "NONE"];
        //_fahrer = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        //_gunner = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
        _fahrer = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _gunner  = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
        _fahrer moveInDriver _fahrzeug;
        _gunner moveInGunner _fahrzeug;
   
    };
    default {
        hint "KEINE SWITCHPARAMETER UEBERGEBEN";
    };
};

// WEGPUNKT

_WP1 = (group gegner1) addWaypoint [getMarkerPos _angriffpunkt, _radius];
_WP1 setWaypointBehaviour "AWARE";
_WP1 setWaypointType "SAD";

Wenn ich den Fahrer /Gunner mit

_fahrer = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];

erstelle, hockt der zwar im Jeep, will aber nicht zufahren.

WEnn ich den Fahrer / gunner mit

_fahrer = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this", 0.3, "CORPORAL"];


erstelle, will er sich nicht in den Jeep setzen sondern rennt direkt zum _WP1.

:ugly²:


EDIT: noch schöner wär es ja das ich ganz dynamisch die units spawnen lasse. Sprich ich rufe die SQF auf und übergebe ein ARRAY(spawnpunkte). Somit können die spawnpunkte dann als übergabewert mit _this select 0 in ein switch case rein. Dann ein random für die case und schwupps spawnen die einheiten variabel. ich will nämlich das von zwei Flanken angegriffen wird BIS eine Bedingung erfüllt wurde.

Daher meine Frage:

Ich kann ja ein Array festlegen:
_array = ["spawn_marker_1", "spawn_marker_2"];

so, nun rufe ich die SQF auf mit:
_dummy = [_array, bla, blubb] exec "funktion.sqf";

FRAGE:

wie kann ich in der funktion.sqf auf den inhalt von _array (sprich spawn_marker1 und spawn_marker_2) zugreifen???

Pfandgiraffe 24.11.2010 18:30

schreib das mal so:
Code:

_drivers = grpNull;
_drivers = createGroup (east);
"TK_INS_Soldier_3_EP1" createUnit [getmarkerpos _spawnpunkt, _drivers];Sleep 0.1;
"TK_INS_Soldier_3_EP1" createUnit [getmarkerpos _spawnpunkt, _drivers];Sleep 0.1;
_fahrzeug = createVehicle ["Offroad_DSHKM_INS", getMarkerPos _spawnpunkt, [], 0, "NONE"];
(units _drivers select 0) assignAsDriver _fahrzeug;
(units _drivers select 1) assignAsGunner _fahrzeug;
(units _drivers select 0) moveInDriver _fahrzeug;
(units _drivers select 1) moveInGunner _fahrzeug;
_drivers setCombatMode "RED";

_wp1 = _drivers addWaypoint [getMarkerpos _angriffpunkt, _radius];
_wp1 setWaypointBehaviour "AWARE";
_wp1 setWaypointType "SAD";
(units _drivers select 0) commandFollow (units _drivers select 0);




das problem ist das du deine variablen überschreibst:
erklärung...

Code:

_fahrer = gegner1 createUnit ["TK_INS_Soldier_3_EP1", getMarkerPos _spawnpunkt, [], 0, "FORM"];
in diesem beispiel erstellst du richtig eine einheit. diese hat die lokale variable _fahrer und gehört der gruppe Gegner1 an. nun gibst du den waypoint befehl:
Code:

_WP1 = (group gegner1) addWaypoint [getMarkerPos _angriffpunkt, _radius];
...und das funktioniert nicht weil du group gegner1 sagst. gegner1 ist ja schon eine gruppe. schreibe also nur gegner1.




Code:

_fahrer = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _spawnpunkt,gegner1,"gegner1=this",  0.3, "CORPORAL"];
in diesem beispiel überschreibst du deinen gruppennamen gegner1 weil du die var gegner1 dem soldaten zuweist. (das machst du mit dem gegner1=this;) daher steigt er nicht mehr ein (weil er nicht mehr _fahrer ist), bewegt sich dafür aber brav zum wegpunkt. (da er sich ja mit group gegner1 nun angesprochen fühlt) ;)



mfg

Pfandgiraffe 24.11.2010 18:42

random spawnpunkt:


schreibe deine spawnpunkte mal manuel in dein script...


Code:

_angriffpunkt = _this select 0;
_radius = _this select 1;
_einheit = _this select 2;

_spawnpunkt = ["pos1","pos2","pos3"];
_spawnpos = count _spawnpunkt;
_poscreate = getmarkerpos (_spawnpunkt select ((round random _spawnpos)-1));


//hint format["Ubergabe: %1 Angriffpunkt %2", _einheit, _angriffpunkt];

switch (_einheit) do {
    case 1: { // LEICHTE INFANTERIE
        _soldat1 = "TK_INS_Soldier_3_EP1" createUnit [getMarkerPos _poscreate, gegner1, "gegner1=this", 0.3, "CORPORAL"];
        _soldat2 = "TK_INS_Soldier_2_EP1" createUnit [getMarkerPos _poscreate, gegner1,"gegner1=this",0.3, "PRIVATE"];
        _soldat3 = "TK_INS_Soldier_EP1" createUnit [getMarkerPos _poscreate, gegner1,"gegner1=this",0.3, "PRIVATE"];
       
    };


die punkte pos1, pos2 und pos3 sind marker auf deiner map.
anschließend wird der inhalt deines arrays gezählt. (also 3). dann wird per random eine position aus dem array gewählt. dabei wird gesagt: wähle zufällig eine zahl zwischen 1 und 3 (da bis 3 gezählt wurde). die positionen im array beginnen aber mit 0. (also 0,1,2,...) daher die -1, die da sagt gehe von gewählter position eine zurück. wird also die zahl 3 gewählt nimmt er die position 2 im array die pos3 darstellt an 3. stelle im array. ;-)

...na verwirrt?!



mfg

p.s.: _dummy = [_array, bla, blubb] execVM "funktion.sqf"; !!!

Ante G. 24.11.2010 18:53

wow cool! Danke PsychoB. :daumen:

Werde das gleich mal inhalieren, brauch aber ersma ne Pause. Mein Kopf qualmt.

Danke nochmals!

:juhu:

PS: ne bin net verwirrt. Habe Grundkenntnisse was Entwicklung angeht. Die Syntax macht mir bisschen zu schaffen.

PPS ;): Ist es nun möglich übergebene Arrays in der SQF anzusprechen? Sonst muss ich für jede Position auf der Map eigene SQFs erstellen (wegen der - in der Funktion - deklarierten Markerpositionen).

Vienna 25.11.2010 12:14

Die Parameter sind in der Variablen _this vorhanden. Wenn du ein Array übergibst, dann wie üblich array select index.

this - Bohemia Interactive Community
select - Bohemia Interactive Community
Array - Bohemia Interactive Community
Function - Bohemia Interactive Community
call - Bohemia Interactive Community
Script (File - Bohemia Interactive Community)
Category:Scripting Topics - Bohemia Interactive Community
Category:Scripting Commands ArmA2 - Bohemia Interactive Community
SQF syntax - Bohemia Interactive Community
Control Structures - Bohemia Interactive Community
usw.

Pfandgiraffe 25.11.2010 17:26

die antwort auf deine frage zu den arrays steckt schon hier drin:


Code:

_spawnpunkt = ["pos1","pos2","pos3"];
_spawnpos = count _spawnpunkt;
_poscreate = getmarkerpos (_spawnpunkt select ((round random _spawnpos)-1));



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