Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 31.07.2010, 17:57   #1 (permalink)
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  
Alt 01.08.2010, 22:51   #2 (permalink)
Newbie
 
Registriert seit: 31.07.2009
Beiträge: 37
Standard

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.
Noobfire ist offline  
Alt 03.08.2010, 17:56   #3 (permalink)
500 Beiträge
 
Benutzerbild von Anemia
 
Registriert seit: 20.05.2009
Beiträge: 605
Standard

also ich werd mal bisschen *puschen* weil mich die frage auch interessiert
Anemia ist offline  
Alt 03.08.2010, 20:13   #4 (permalink)
Newbie
 
Registriert seit: 31.07.2009
Beiträge: 37
Standard

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

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

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;

Geändert von Noobfire (03.08.2010 um 20:38 Uhr).
Noobfire ist offline  
Alt 05.08.2010, 17:27   #5 (permalink)
500 Beiträge1000 Beiträge
 
Benutzerbild von Pfandgiraffe
 
Registriert seit: 16.09.2008
Ort: Berlin
Alter: 38
Beiträge: 1.737
Pfandgiraffe eine Nachricht über ICQ schicken Pfandgiraffe eine Nachricht über Skype™ schicken
Standard

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.
__________________
Niemand hat die Absicht eine Tüte zu bauen!
​​​​​​​
___<<<A3 Wounding System>>>___
Pfandgiraffe ist offline  
Alt 06.08.2010, 01:31   #6 (permalink)
Newbie
 
Registriert seit: 31.07.2009
Beiträge: 37
Standard

Danke schonmal hier für die erste Antwort

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.

Ich möchte NACH
Code:
!isServer exitWith {};
etwas starten, was jeder ausführt.

Normal müsste das ja mit
Code:
setVehicleInit ""
gehen, richtig?
Noobfire ist offline  
Alt 06.08.2010, 07:33   #7 (permalink)
500 Beiträge
 
Benutzerbild von Anemia
 
Registriert seit: 20.05.2009
Beiträge: 605
Standard

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
Anemia ist offline  
Alt 06.08.2010, 16:17   #8 (permalink)
Newbie
 
Registriert seit: 31.07.2009
Beiträge: 37
Standard

Ich könnt echt durchdrehen

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
Noobfire ist offline  
Alt 06.08.2010, 16:22   #9 (permalink)
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von Cyborg11
 
Registriert seit: 26.03.2008
Beiträge: 2.822
Standard

Anstelle von ""Text"" kannst du auch 'Text' schreiben
Ist auch so einfacher zu lesen.
Cyborg11 ist offline  
 


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


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