Armed-Assault.de Twitter


Editing The world is a Script - write it!

Antwort
 
Themen-Optionen Ansicht
Alt 30.01.2009, 04:19   #1 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 23.10.2008
Beiträge: 120
Standard Granadiere/MGs/usw. sollen Ihre Muni bekommen

Hallo,

wenn eine Gruppe vor einem Objekt steht, sollen die jeweiligen Einheite Ihre Munition bekommen, aber unabhängig von der Maximalen anzahl (unabhängig von setVehicleAmmo 1). Ein Granadier soll z.B. immer 8 Magazine erhalten, egal wie viel Munition sie bei sich tragen also nicht einfach Munition voll, sondern plus 8!

Ich hab an einem Auslöser gedacht. Wenn die Soldaten da rein gehen, sollen sie ihre Munition, die sie brauchen erhalten. Logisch: Ein Sniper kann mit der Munition von einem Granadier nichts anfangen.

Das hab ich schon heraus gefunden:

  • Man muss sicherlich mit dem "_x" arbeiten. {_x addMagazine "30Rnd_545x39_AK"} forEach typeOf == SoldierEG - Das geht leider nicht. Schade, aber hoffe jm. weiß wie. Alles in diesem Bereich ansprechen auf jeden fall.
  • Oder So muss vielleicht die Bedingung aussehen: if (typeOf Einheit== "SoldierEG") then {}
Damit möchte ich das weiter eingrenzen auf den Granadier in diesem Falle.

Doch leider erhalten dann ja alle (auch z.B. die Sniper) Ak-Munition, wenn sich einer in der Gruppe/im Auslöser befindet.

Es interessiert mich das so zu lösen, da ich gerne wissen möchte wie man mit diesem "_x" genauer arbeiten kann bzw. eingrenzen kann.
__________________
Besser verrückt, als normal und langweilig zu sein. Wer den allen gesellschaftlichen Normen und Regeln folgen will, wird zwangsläufig irgendwann am Fenster stehen und sich aufregen, weil jemand auf der Straße ein Taschentuch nicht aufheben möchte. Man wird zu jemanden, den man schon als Kind gehasst hat.
Dann bin ich lieber verrückt und glücklich, durchgeknallt, aber interessant -> einzigartig!
Hercules-HH ist offline   Mit Zitat antworten
Alt 30.01.2009, 10:45   #2 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

Das hier wäre eine Lösung (triggerliste ersetzen durch die Liste des Triggers, wie auch immer), ach ja, nicht getestet:

Code:
_addMags = {
    private ["_unit","_magtype","_how_many"];
    _unit = _this select 0;
    _magtype = _this select 1;
    _how_many = _this select 2;
    for "_i" from 1 to _how_many do {
        _unit addMagazine [_magtype];
    };
};

{
    if (_x isKindOf "Man") then {
        switch (typeOf _x) do {
            case "SoldierEG": {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25 ",8] call _addMags;
            };
            case "SoldierESniper": {
                [_x,"10Rnd_762x54_SVD",8] call _addMags;
            };
            // default immer acht AK Magazine
            default {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
            };
        };
        sleep 0.01;
    };
} forEach triggerliste;
Die "magische" Variable _x ist eine Referenz auf das aktuelle Objekt in einer Iteration.

Abfragen mit: if (typeOf Einheit== "SoldierEG") then {} gehen auch, oder if (typeOf Einheit in ["SoldierEG","SoldierEB"]) then {}.

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.

Geändert von Xeno (30.01.2009 um 10:48 Uhr).
Xeno ist offline   Mit Zitat antworten
Alt 31.01.2009, 02:41   #3 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 23.10.2008
Beiträge: 120
Standard

Na super, jetzt hast du es geschafft: Ich hab jetzt mehr Fragen an dich!
(Scherz)

Danke, dass du dir die Mühe gemacht hast. Du kannst das ja ganz gut. Ich würde das auch gerne können, doch da ich schon bisschen Zeit bebraucht habe das zu verstehen, merke ich, dass ich ein blutiger Anfänger bin.

Zitat:

Zitat von Xeno
Das hier wäre eine Lösung (triggerliste ersetzen durch die Liste des Triggers, wie auch immer),

wie meinst du das jetzt? Ich hab das jetzt so verstanden, dass der Auslöser den Namen Triggerliste haben muss. Oder tap ich da im Dunkeln?

Ich hab das jetzt jedenfalls so gemacht und
  • Auslöser Von Opfor
  • bei Aktivierung steht: this exec "Muni-A.sqs" (Datei-Name)
  • Name: Triggerliste
Da kommt ein Fehler:
Sleep 0.01
Error Allgemeiner Fehler im Ausdruck
Ich hab bis her immer ~0.1 benutzt, weil ich auch gar nicht so richtig den unterschied verstehe: ~30 bedeutet, dass er 30 Sekunden runter zählt bis er weiter machen kann, doch bei sleep 30 muss er doch auch 30 Sekunden warten, also muss er doch auch die Zeit zählen. Wie soll man das schlafen verstehen?

Wenn das ok für dich, dann kannst du auf folgendes auch antworten. Muss aber nicht sein - möchte nicht zu viel verlangen von dir/Vom Forum erwarte ich das natürlich auch nicht.
Bin aber total neugierig wie das aufgebaut ist und funkioniert.

Hier oben legst du also fest, wo was eingesetzt wird
Code:
_addMags = {
    private ["_unit","_magtype","_how_many"];
    _unit = _this select 0;
    _magtype = _this select 1;
    _how_many = _this select 2;
    for "_i" from 1 to _how_many do {
        _unit addMagazine [_magtype];
    };
};
und hier kann man das einsetzten - wie man das vom starten/verweisen auf ein Skript kennt.
Code:
[_x,"30Rnd_545x39_AK",8] call _addMags;
Gleiches Prinzip
Code:
[hier 0,hier 1,hier 2] exec "Dateiname.sqs"
Nur das hier ein verweis auf oben nötig ist. Mit dem call sagst du also ruf das ab:
Code:
[_x,"30Rnd_545x39_AK",8] call _addMags;
Richtig?

Doch ich verstehe nicht was das hier genau bedeutet:
Code:
    for "_i" from 1 to _how_many do {
        _unit addMagazine [_magtype];

Soll er etwa acht mal das gleiche machen?
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"

Was passiert da genau mit dem "_i"
for "_i" from 1 to _how_many

also in meinem Falle:
for "_i" from 1 to 8
Wie gesagt verstehe ich dich total, wenn du darauf nicht antworten möchtest, weil das über den Sinn des Forums hinaus geht. Ich sag immer: "Müssen muss man nur auf Toilette."

Hast du eine Ausbildung/ein Studium gemacht oder warum kannst du das so gut??? Egal ob da ein Fehler drin steckt oder nicht, nur das Prinzip verstehen ist ja schon eine tolle Sache und die eigentliche Kunst.
__________________
Besser verrückt, als normal und langweilig zu sein. Wer den allen gesellschaftlichen Normen und Regeln folgen will, wird zwangsläufig irgendwann am Fenster stehen und sich aufregen, weil jemand auf der Straße ein Taschentuch nicht aufheben möchte. Man wird zu jemanden, den man schon als Kind gehasst hat.
Dann bin ich lieber verrückt und glücklich, durchgeknallt, aber interessant -> einzigartig!
Hercules-HH ist offline   Mit Zitat antworten
Alt 31.01.2009, 11:35   #4 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

Zitat von Hercules-HH Beitrag anzeigen

wie meinst du das jetzt? Ich hab das jetzt so verstanden, dass der Auslöser den Namen Triggerliste haben muss. Oder tap ich da im Dunkeln?

Wenn Du dem Auslöser den Namen Triggerliste gibst, dann musst Du nach dem forEach noch list hinzufügen, also } forEach list Triggerliste. Du kannst aber als Parameter für den Aufruf des Scriptes auch z.B. die thislist des Triggers übergeben.

Zitat von Hercules-HH Beitrag anzeigen

Ich hab das jetzt jedenfalls so gemacht und

  • Auslöser Von Opfor
  • bei Aktivierung steht: this exec "Muni-A.sqs" (Datei-Name)
  • Name: Triggerliste
Da kommt ein Fehler:
Sleep 0.01
Error Allgemeiner Fehler im Ausdruck
Da es sich um ein sqf Script handelt und nicht um sqs ist der Aufruf mit exec falsch. Bitte execVM benutzen, z.B. handle = [] execVM "meinscript.sqf".

Zitat von Hercules-HH Beitrag anzeigen

Ich hab bis her immer ~0.1 benutzt, weil ich auch gar nicht so richtig den unterschied verstehe: ~30 bedeutet, dass er 30 Sekunden runter zählt bis er weiter machen kann, doch bei sleep 30 muss er doch auch 30 Sekunden warten, also muss er doch auch die Zeit zählen. Wie soll man das schlafen verstehen?

~x = sqs
sleep x; = sqf
Das Script wartet/schläft x Sekunden, bis es weitermacht.

Zitat von Hercules-HH Beitrag anzeigen

Hier oben legst du also fest, wo was eingesetzt wird

Code:
_addMags = {
    private ["_unit","_magtype","_how_many"];
    _unit = _this select 0;
    _magtype = _this select 1;
    _how_many = _this select 2;
    for "_i" from 1 to _how_many do {
        _unit addMagazine [_magtype];
    };
};
Das ist eine Funktion innerhalb des Scripts (salopp ausgedrückt ein kleines Unterprogramm), in diesem Falle eine private Funktion die nur innerhalb des Scriptes eingesetzt werden kann (auch noch woanders, wenn man z.B. das Script zu einem Array hinzufügt).

Zitat von Hercules-HH Beitrag anzeigen

und hier kann man das einsetzten - wie man das vom starten/verweisen auf ein Skript kennt.

Code:
[_x,"30Rnd_545x39_AK",8] call _addMags;
Mit call ruft man eine Funktion auf. Eine Funktion kann auch einen Wert zurückliefern, muss aber nicht (also sie liefert immer etwas zurück, nur werten wir das in diesem Falle nicht aus). Die Parameterübergabe erfolgt analog der eines Scriptaufrufes.

Zitat von Hercules-HH Beitrag anzeigen

Doch ich verstehe nicht was das hier genau bedeutet:
[code] for "_i" from 1 to _how_many do {
_unit addMagazine [_magtype];

Soll er etwa acht mal das gleiche machen?
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"
Einheit addMagazine "30Rnd_545x39_AK"

Genau. Einfacher als das acht mal hinzuschreiben und flexibler, da ja in der Funktion die Einheit, der Magazintyp und die Anzahl der Magazine frei wählbar durch die Parameterübergabe ist.

Zitat von Hercules-HH Beitrag anzeigen

Was passiert da genau mit dem "_i"
for "_i" from 1 to _how_many

Mit der Variable _i passiert in dieser for Schleife nichts. Der Befehl erfordert aber eine Variable. Die Variable gibt innerhalb der for Schleife den momentanen Zyklusstand der Schleife zurück (und ist natürlich wie jede andere Variable auch ganz normal verwendbar innerhalb der Schleife).

Zitat von Hercules-HH Beitrag anzeigen

Hast du eine Ausbildung/ein Studium gemacht oder warum kannst du das so gut???

Ich habe an der staatlichen Universität zu Paraiso promoviert

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.
Xeno ist offline   Mit Zitat antworten
Alt 01.02.2009, 00:51   #5 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 23.10.2008
Beiträge: 120
Standard

Super - danke

Leider kommt jetzt ein anderer Fehler, doch ich hab den Fehler gefunden und beseitigt.

Da muss die Eckige Klammer weg:
Code:
    for "_i" from 1 to _how_many do {
        _unit addMagazine [_magtype];
Und hier nur ne Leertaste zu viel
Code:
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25",8] call _addMags;


Noch mal für alle den Skript von Xeno fehlerfrei:

Code:
_addMags = {
    private ["_unit","_magtype","_how_many"];
    _unit = _this select 0;
    _magtype = _this select 1;
    _how_many = _this select 2;
    for "_i" from 1 to _how_many do {
        _unit addMagazine _magtype;
    };
};

{
    if (_x isKindOf "Man") then {
        switch (typeOf _x) do {
            case "SoldierEG": {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25",8] call _addMags;
            };
            case "SoldierESniper": {
                [_x,"10Rnd_762x54_SVD",8] call _addMags;
            };
            // default immer acht AK Magazine
            default {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
            };
        };
        sleep 0.01;
    };
} forEach list triggerliste;
Wie oben bereits gesagt, würde der Auslöser wie folgt aussehen:

  • Aktivierung: Jeder/Opfor/... (je nachdem)
  • Mehrfach (wenn die Munition dort immer/mehrmals vergeben werden soll)
  • Bei Akt.: Muni1 = [] execVM "meinscript.sqf" (Wobei der Namen, Muni1, auch anders heißen kann)

Und so einfach kann man dann den Skripte erweitern, wenn noch andere Soldaten ihre Munition erhalten sollen:

Code:
            case "SoldierEG": {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25",8] call _addMags;
            };
            case "SoldierESniper": {
                [_x,"10Rnd_762x54_SVD",8] call _addMags;
            };
            // default immer acht AK Magazine
            default {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
            };

Einfach wie eine Vorlage drei Zeilen kopieren und die nötigen Sachen überschreiben:

            case "SoldierEG": {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25",8] call _addMags;
            };
            case "SoldierESniper": {
                [_x,"10Rnd_762x54_SVD",8] call _addMags;
            };
            case "KlassenName": {
                [_x,"MagazinName",Anzahl der Magazine] call _addMags;
            };
            // default immer acht AK Magazine
            default {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
            };
Herzlichen Dank nochmal Xeno!!!

----------------------------------------------------------------------------------------------------------------------------------
Ich hab viel Zeit innerhalb weniger Monate investiert und ich muss zugeben, dass das was man selber sich bei bringt, niemals vergessen wird. Doch leider schleift man erlernte Fehler mit und eine kleine banale Unwissenheiten, die innerhalb Sekunden gelöst werden kann, raubt Wochen und lässt Richtiges falsch aussehen. Wenn jemand ein anderen was bei bringt, ist das besser, effizienter, schneller und ...

Deshalb, mein Anliegen:
Sollte jemand in Hamburg wohnen, der so etwas kann, dann würde ich ihn auf ein Kaffee oder zum Essen einladen und mich freuen, wenn mir jemand ein paar Sachen erklären könnte.

Über Skype und MSN kann man auch gerne sich unterhalten. Nur der Kaffee wird dann immer kalt sein bis er in einer anderen Stadt ankommt. Doch ich kann mich auch anders dankbar zeigen.

Wer gerne möchte, kann sich ja melden bei mir.
__________________
Besser verrückt, als normal und langweilig zu sein. Wer den allen gesellschaftlichen Normen und Regeln folgen will, wird zwangsläufig irgendwann am Fenster stehen und sich aufregen, weil jemand auf der Straße ein Taschentuch nicht aufheben möchte. Man wird zu jemanden, den man schon als Kind gehasst hat.
Dann bin ich lieber verrückt und glücklich, durchgeknallt, aber interessant -> einzigartig!
Hercules-HH ist offline   Mit Zitat antworten
Alt 01.02.2009, 01:10   #6 (permalink)
50 Beiträge100 Beiträge
 
Registriert seit: 23.10.2008
Beiträge: 120
Standard

Ich würde jetzt gern das hier so umsetzten, damit ich praktisch schon im Editor den Namen Auslöser reinschreiben kann:

Code:
Muni1 = [triggerliste1] execVM "meinscript.sqf"
Ist das irgendwie machbar mit SQF-datein? So auf jeden Fall nicht, leider. aber ich finde, es ist eine gute Idee.
Code:
_MuniTrigger = _this select 0

_addMags = {
    private ["_unit","_magtype","_how_many"];
    _unit = _this select 0;
    _magtype = _this select 1;
    _how_many = _this select 2;
    for "_i" from 1 to _how_many do {
        _unit addMagazine _magtype;
    };
};

{
    if (_x isKindOf "Man") then {
        switch (typeOf _x) do {
            case "SoldierEG": {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
                [_x,"1Rnd_HE_GP25",8] call _addMags;
            };
            case "SoldierESniper": {
                [_x,"10Rnd_762x54_SVD",8] call _addMags;
            };
            // default immer acht AK Magazine
            default {
                [_x,"30Rnd_545x39_AK",8] call _addMags;
            };
        };
        sleep 0.01;
    };
} forEach list _MuniTrigger;
__________________
Besser verrückt, als normal und langweilig zu sein. Wer den allen gesellschaftlichen Normen und Regeln folgen will, wird zwangsläufig irgendwann am Fenster stehen und sich aufregen, weil jemand auf der Straße ein Taschentuch nicht aufheben möchte. Man wird zu jemanden, den man schon als Kind gehasst hat.
Dann bin ich lieber verrückt und glücklich, durchgeknallt, aber interessant -> einzigartig!
Hercules-HH ist offline   Mit Zitat antworten
Antwort

Stichworte
abfrage eingrenzen, abfrage mit _x


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MGs in ArmA Guipas Mods & Addons 22 08.12.2006 18:17
Muni LKW nutzen SvenPatrick Technische Fragen & Probleme 1 07.12.2006 17:51
Muni/Waffenkisten Radar O´Reilly Editing 1 06.12.2006 17:30
OFP-Resistance: Wo zu bekommen? Garry Hilfe 12 22.05.2005 14:07
Sollen Lehrer durch ihre Schüler benotet werden? Kompost Diskussionsplattform 9 05.02.2004 16:48


Kontakt - HX3.de - Archiv - Nach oben

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