31.07.2010, 17:57 | #1 (permalink) |
Registriert seit: 31.07.2009
Beiträge: 37
|
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; }; 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; }; 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; }; 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]; 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); 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;"]; Code:
if ({ alive _x } count units I1 == 0 && _I1 == 0) then { Code:
if (!alive _unit1) then {Variable=true}; 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? |
01.08.2010, 22:51 | #2 (permalink) |
Registriert seit: 31.07.2009
Beiträge: 37
|
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 Code:
group createUnit [type, position, markers, placement, special] 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. |
03.08.2010, 20:13 | #4 (permalink) |
Registriert seit: 31.07.2009
Beiträge: 37
|
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"; 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). |
05.08.2010, 17:27 | #5 (permalink) |
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>>>___ |
|
06.08.2010, 01:31 | #6 (permalink) |
Registriert seit: 31.07.2009
Beiträge: 37
|
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 {}; Normal müsste das ja mit Code:
setVehicleInit "" |
06.08.2010, 07:33 | #7 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
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 }; 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 |
06.08.2010, 16:17 | #8 (permalink) |
Registriert seit: 31.07.2009
Beiträge: 37
|
Ich könnt echt durchdrehen
Fehler war: Ich hab das so aufgerufen: Code:
_car setVehicleInit "unlocks = this addAction ["Freischaltungen","unlocks.sqf",[],0,false,true];" 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];" |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|