Einzelnen Beitrag anzeigen
Alt 31.07.2010, 17:57   #1 (permalink)
Noobfire
Newbie
 
Registriert seit: 31.07.2009
Beiträge: 37
Standard Heal/Repair Script / Einheiten in einem Radius zufällig generieren lassen

Heyhey

Ich habe mich mal ein wenig rangesetzt und habe so ein paar Skripts gemacht, sind die soweit richtig, kann man die noch irgendwie verbessern?
(healps = Heal per Second)

repair.sqf
Code:
// Repair script by Noobfire
// Usage:
// _nil = [object,range,healps] execVM "repair.sqf";
// Example:
// _nil = [this,25,0.2] execVM "repair.sqf";

_object = _this select 0;
_range = _this select 1;
_healps = _this select 2;

While {(true)} do {

_distance = vehicle player distance _object;
_dammage = getDammage vehicle player;
_fuel = fuel vehicle player;

    While {(vehicle player != player && _distance < _range  && _dammage > 0 || vehicle player != player &&  _distance < _range && _fuel < 0.98)} do {
    
        _distance = vehicle player distance _object;
        _dammage = getDammage vehicle player;
        _fuel = fuel vehicle player;

        hint "Repariert.."; 
        vehicle player setDamage _dammage - _healps; 
        vehicle player setFuel _fuel + _healps;
    
        sleep 1;
    };
sleep 1;
};
heal.sqf
Code:
// Heal script by Noobfire
// Usage:
// _nil = [object,range,healps] execVM "heal.sqf";
// Example:
// _nil = [this,25,0.2] execVM "heal.sqf";

_object = _this select 0;
_range = _this select 1;
_healps = _this select 2;

While {(true)} do {

_distance = player distance _object;
_dammage = getDammage player;

    While {(vehicle player == player && _distance < _range && _dammage > 0)} do {
    
        _distance = player distance _object;
        _dammage = getDammage player;

        hint "Heilt.."; 
        player setDamage _dammage - _healps; 
        sleep 1;
    };
sleep 1;
};
Man kann die einfach auf irgendwelche Objekte draufmachen und dann wird man dementsprechend geheilt/repariert eben Meine Fragen sind jetzt:

1. Ist das soweit okay, funktionieren tut es ja, geht es nur "besser"?
2. Wie kann man ein Fahrzeug aufmunitunieren? Klar, man kann ihm Magazine wieder adden, aber ich mein das eben so, wie es z.B. ein Repairtruck macht.

-------------------------------------------------------------
-------------------------------------------------------------

Und dann hab ich noch ein Skript für eine Mission gemacht, wo ein Panzer und verschiedene Infantrieeinheiten gespawnt werden. Auch hier wieder die Frage, ob man etwas verbessern kann.


(EBase3 ist ein Heli-H für den Spawnpunkt der Gegner, Base3 die eigene Base)
wellen.sqf
Code:
_nil = [EBase3,Base3] execVM "spawnT.sqf";
_nil = [EBase3,Base3] execVM "spawnI1.sqf";
_nil = [EBase3,Base3] execVM "spawnI2.sqf";

_T=0;
_I1=0;
_I2=0;

While {true} do {
    if (!alive tank && _T==0 || { alive _x } count units T == 0 && _T==0) then {
        hint "Panzer wurde vernichtet!";
        _T=1;
    };
    if ({ alive _x } count units I1 == 0 && _I1 == 0) then {
        hint"Infantrie 1 wurde vernichtet!";
        _I1=1;
    };
    if ({ alive _x } count units I2 == 0 && _I2 == 0) then {
        hint"Infantrie 2 wurde vernichtet!";
        _I2=1;
    };
    sleep 1;
};
spawnI1.sqf
Code:
_EBase = _this select 0;
_Base = _this select 1;

I1 = createGroup east;
"TK_Soldier_SL_EP1" createUnit [position _EBase, I1, "I1_1=this;"];
"TK_Soldier_Medic_EP1" createUnit [position _EBase, I1, "I1_2=this;"];
"TK_Soldier_EP1" createUnit [position _EBase, I1, "I1_3=this;"];
"TK_Soldier_LAT_EP1" createUnit [position _EBase, I1, "I1_4=this;"];
"TK_Soldier_B_EP1" createUnit [position _EBase, I1, "I1_5=this;"];
"TK_Soldier_Medic_EP1" createUnit [position _EBase, I1, "I1_6=this;"];
"TK_Soldier_MG_EP1" createUnit [position _EBase, I1, "I1_7=this;"];
"TK_Soldier_GL_EP1" createUnit [position _EBase, I1, "I1_8=this;"];

_wp = I1 addWaypoint [position _Base, 0];
spawnT.sqf
Code:
_EBase = _this select 0;
_Base = _this select 1;

_rnd = round random 3;
if (_rnd==0) then {tank = "T72_TK_EP1" createVehicle (position _EBase);};
if (_rnd==1) then {tank = "T55_TK_EP1" createVehicle (position _EBase);};
if (_rnd==2) then {tank = "T34_TK_EP1" createVehicle (position _EBase);};
if (_rnd==3) then {tank = "BMP2_TK_EP1" createVehicle (position _EBase);};


T = createGroup east;
"TK_Soldier_Crew_EP1" createUnit [position _EBase, T, "T_1=this; this moveInCommander tank;"];
"TK_Soldier_Crew_EP1" createUnit [position _EBase, T, "T_2=this; this moveInDriver tank;"];
"TK_Soldier_Crew_EP1" createUnit [position _EBase, T, "T_3=this; this moveInGunner tank;"];

T_1 doMove (position _Base);
Wie oben, geht es irgendwo performanter/kürzer?
Kann ich irgendwie einen Radius einfügen, wo die erstellt werden sollen? So befinden die sich jetzt alle auf einer Stelle.

So, jetzt eine etwas kompliziertere Frage:
Ich habe ja, wie ihr bestimmt sieht, den Einheiten eindeutige Namen gegeben.
Code:
I1 = createGroup east;
"TK_Soldier_SL_EP1" createUnit [position _EBase, I1, "I1_1=this;"];
Eigentlich wollte ich erst mit lokalen Namen wie _grp und _unit1 versuchen, damit man die Einheiten beliebig oft nachspawnen kann. Aber ich möchte ja abfragen (und das extern), ob die Einheiten tot sind:
Code:
if ({ alive _x } count units I1 == 0 && _I1 == 0) then {
Ich habe das schon mit killed Eventhandlern lokal probiert, das will aber irgendwie nicht so richtig.. Und ich muss ja irgendeine Variable zurückgeben, die true wird, wenn die Einheiten tot sind.. Und wenn ich z.b. sage (lokal in spawnI.sqf):
Code:
 if (!alive _unit1) then {Variable=true};
Dann kann ich die ja beliebig oft nachspawnen, da ihre Namen lokal sind, aber es gibt ja immer noch nur eine globale Variable die ich überprüfen kann, ob die tot sind..

Hoffe, ihr versteht, was mein Problem ist..
Ich kann ja lokal überprüfen, ob die tot sind, und vielleicht einen hint machen oder sowas in der Richtung. Aber wenn man jetzt zwei Infantriegruppen mit dem gleichen Skript spawnt, würden die ja bei ihrem jeweiligen Tod eine gemeinsame Variable auf 1 setzen, obwohl die andere Gruppe ja noch lebt.


Wie kann ich global überprüfen, ob lokal gespawnte Einheiten tot sind?

Oder gibt es irgendeine andere Methode, beliebig oft nachspawnbare Einheiten auf ihren Tod zu überprüfen?
Noobfire ist offline   Mit Zitat antworten