HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Heal/Repair Script / Einheiten in einem Radius zufällig generieren lassen (https://hx3.de/editing-scripting-167/heal-repair-script-einheiten-radius-zufaellig-generieren-lassen-19440/)

Noobfire 31.07.2010 16:57

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 01.08.2010 21:51

Ich hab mich mal ein wenig schlau gemacht in der comref. Falls es noch jemand nicht wusste, schreib ichs mal hier rein ;)


Der Befehl für das Aufmunitionieren, unabhängig von deren Waffen/Munitionsart ist:

Code:

object setVehicleAmmo value
Und für das zufällige Plazieren in einem Radius:

Code:

group createUnit [type, position, markers, placement, special]
Wobei hier der Parameter "placement" für den Radius steht.
Funktioniert auch mit:

Code:

createVehicle [type, position, markers, placement, special]
object
setVehiclePosition [position, markers, placement]


Jetzt habe ich aber immernoch die Frage, wie ich überprüfen kann, ob durch beliebig oft gestartete Skripte gespawnte Leute tot sind.
Also sagen wir, ich starte 3 mal das Skript spawnT.sqf, und erst, wenn alle drei dadurch gespawnten Panzer tot sind, soll die Mission weitergehen. Aber eben so, dass es auch bei 2 oder 4 gestarteten Malen funktioniert.

Anemia 03.08.2010 16:56

also ich werd mal bisschen *puschen* weil mich die frage auch interessiert :oh:

Noobfire 03.08.2010 19:13

Schön zu sehen, dass hier auch mal jemand reinschreibt :zahn: :rolleyes:

Noch ne kleine andere Frage am Rande:
Ich hab mir so ein Spawn/Freischaltsystem gemacht. Es werden Cars gespawnt, welche man dann erst gegen "Punkte" freischalten, sprich aufschließen kann.
Das Spawnscript muss natürlich nur auf dem Server laufen, sonst hat man später dutzende von Autos in einem drinstecken, da die ja dann sonst mehrfach ausgeführt werden würden.

Ich habe also ganz unten in meinem spawnscript (welches nur auf dem Server ausgeführt wird) das Freischalt und von mir geschriebene Respawnsystem initialisiert:
Code:

_unlocks = _car addAction ["Freischaltungen","unlocks.sqf",[],0,false,true];
unlock = _car addAction [format ["%1 freischalten",typeOf _car],"unlock.sqf",[_car,_type],1,false,true];
_nil = [_car,10] execVM "respawncar.sqf";

Das Problem dabei ist, dass es nur der Host sehen kann.. Und ich verzweifle langsam daran, wie ich das machen könnte.. Ich kanns ja nur für den Server ausführen lassen.. Und vor dem Spawnen kann ichs nich ausführen, da das neue Car, auf dem diese Aktionen appliziert werden sollen, nicht existieren.. Aber wenn ichs dann nach dem Spawnen mache, hat jeder 5000 Cars in einem stecken :motz:

Ich kann ja nicht in einem externen Skript das alles machen, da die ganzen Cars ja keinen eindeutigen Namen haben KÖNNEN.. Ich lösche ja erst das Car, und spawne dann auf der exakt gleichen Position ein neues.. Ich habs nachher sogar soweit getrieben, dass ich einfach gesagt habe, nach dem Spawnvorgang soll ein völlig unabhängig dazu ablaufendes Skript per "nearestObjects" das neue Car in diesem Radius suchen und so die Aktionen im Aktionsmenü hinzufügen.. Aber der Host hat dann die Funktionen 2 mal, und jeder Client gar kein mal.. Es ist zum ausflippen! Obwohl ich einfach im Editor dieses Skript (also für jeden, nicht nur den Server) ausgeführt habe, sieht es trotzdem immer noch nur der Host.. Was mache ich falsch?

EDIT:
Achja, ich habs auch schon mal mit setVehicleInit ausprobiert, dann hatte aber nicht mal der Host die Option?

Code:

_unlocks = _car addAction ["Freischaltungen","unlocks.sqf",[],0,false,true];unlock = _car addAction [format ["%1 freischalten",typeOf _car],"unlock.sqf",[_car,_type],1,false,true];
processInitCommands;


Pfandgiraffe 05.08.2010 16:27

und warum erfindest du sachen neu die es schon gibt? mit diesem script kannst du all das machen was du vor hast...

übrigens gibt es auch schon ein repair und heal-script.:naughty:

Noobfire 06.08.2010 00:31

Danke schonmal hier für die erste Antwort :zahn:

Also, vielleicht hast du es etwas falsch verstanden, naja ich habs bis jetzt auch noch nicht richtig erklärt.

Ich hab ein spawnscript. Bei dem kannste n Typen angeben, und dann wird zu diesem Typen dann zufällig eines von vielen Autos ausgewählt, die eben zu diesem Typen passen. (bsp. Typ 1 = HMMWVEs (dann werden entweder M2 oder Mk19 HMMWVEs gespawnt)). Das möchte ich einfach aufgrund einer leichten Abwechslung implementieren. Spricht aber auch nicht richtig zur Sache jetzt.
Respawn, etc. das funktioniert alles perfekt.

Mir geht es nur um die Frage:
Wie kann ich ein Skript starten, das von allen ausgeführt wird, in einem Skript, das nur der Server gestartet hat. :confused:

Ich möchte NACH
Code:

!isServer exitWith {};
etwas starten, was jeder ausführt.

Normal müsste das ja mit
Code:

setVehicleInit ""
gehen, richtig?

Anemia 06.08.2010 06:33

Ich glaube das funktioniert über eine "serverinit"

Also in deine init schreibst du :

Code:

if ( (!isServer) && (player != player) ) then
{
waitUntil {player == player};
waitUntil {time > 10};
};
if !(isnull player) then {
if (playerSide == west && player == playableUnits) then {nul = [] execVM "playerinit.sqf";
nul = [] execVM "server_init.sqf"};



Hier eine "respawn_Playerinit" um zum beispiel nach dem respawn einer einheit, die scripte wieder auf diesem Spieler zu starten .

Code:

if ( (!isServer) && (player != player) ) then{};
if !(isnull player) then {
DEIN CODE
};

Also ich habe das nun auch nur aus einem mir bekannten skript welches eine "Serverinit" nutzt ausgeliehen, aber zumindest machen die das dort so.

Wenns dich interessiert, ich habs aus diesem Skript: Armaholic.com - LK Script Pack


Hoffe das hilft dir bisschen weiter, ansonsten mal das Script paket laden und da nochmal reinschauen, schließlich arbeitet das skript auch mit einer Serverinit und es scheint ja zu funktionieren :)

Noobfire 06.08.2010 15:17

Ich könnt echt durchdrehen :ugly:

Fehler war:
Ich hab das so aufgerufen:
Code:

_car setVehicleInit "unlocks = this addAction ["Freischaltungen","unlocks.sqf",[],0,false,true];"
Ist natürlich falsch. Woher soll ArmA wissen, dass die "" bei Freischaltungen und unlocks.sqf nicht das VehicleInit abschließen, sondern dazu gehören.
Wenn man innerhalb von "" etwas in "" schreiben will, muss man diese doppelt machen, also so:

Code:

_car setVehicleInit "unlocks = this addAction [""Freischaltungen"",""unlocks.sqf"",[],0,false,true];"
Danke an @Psychobastard und @Anemia, aber letztendlich hats ja an was anderem gelegen :confused:

Cyborg11 06.08.2010 15:22

Anstelle von ""Text"" kannst du auch 'Text' schreiben :)
Ist auch so einfacher zu lesen. :daumen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 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 120