20.02.2011, 15:49 | #1 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Surrender/Kapitulieren - Script / Modul
Hallo zusammen,
ich würde für eine Mission gerne die möglichkeit haben das sich die Feinde ergeben, das ganze funktioniert soweit auch mit dem Surrender Modul, allerdings ist es noch nicht so ganz das was ich mir da vorgestellt habe und die BIS seite spuckt nicht gerade viel infos aus : Surrender - Bohemia Interactive Community und auch die sachen die ich im BIS forum gefunden habe beschreiben nur Hostage situationen und führen nicht wirklich dazu das sich feinde ergeben. Also muss wohl was eigenes her..... Was ich bisher habe ist noch nicht viel aber funktioniert.... surrender.sqf Code:
// ----------------------------------------------- // Author: Anemia // welcome to the jungle // ----------------------------------------------- hint "start surr"; _unit = _this select 0; if(alive _unit) then { sleep 5; _unit setpos getmarkerpos "jail"; [_unit] joinSilent group prisoner; _unit allowdammage false; _unit setUnitPos "Up"; dostop _unit; _unit playMoveNow "AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon"; _unit disableAI "MOVE"; _unit disableAI "ANIM"; }; hint "end surr"; Derzeit wird die surrender.sqf über ein addaction eintrag in dem jeweiligen Gegner ausgelößt. Code:
this addAction ["go in jail", "surrender\surrender.sqf"] Ich würde gerne in einem Bereich um den Spieler prüfen (ca. 30 m) ob feindliche Einheiten vorhanden sind, wenn ja dann soll diesen der addaction eintrag automatisch angehängt werden. checkenemy.sqf Code:
// ----------------------------------------------- // Author: Anemia // welcome to the jungle // ----------------------------------------------- hint "start check"; _suspect_ring=createTrigger["EmptyDetector",getPos player]; _suspect_ring triggerAttachVehicle [player]; _suspect_ring setTriggerArea[5,5,0,false]; _suspect_ring setTriggerActivation["EAST","PRESENT",false]; _suspect_ring setTriggerStatements["this", "this addAction ['go in jail', 'surrender\surrender.sqf' forEach list _suspect_ring]", "hint 'no enemy near'"]; sleep 2; hint "trigger near done"; deleteVehicle _suspect_ring; _no_suspect=createTrigger["EmptyDetector",getPos player]; _no_suspect triggerAttachVehicle [player]; _no_suspect setTriggerArea[5,5,0,false]; _no_suspect setTriggerActivation["EAST","NOT PRESENT",false]; _no_suspect setTriggerStatements["this", "hint 'no enemy near'", "hint 'no enemy near'"]; sleep 2; hint "trigger no near done"; deleteVehicle _no_suspect; Code:
_suspect_ring setTriggerStatements["this", "this addAction ['go in jail', 'surrender\surrender.sqf' forEach list _suspect_ring]", "hint 'no enemy near'"]; Ziel soll es sein das alle Feindlichen einheiten auf der Karte nachher "verhaftet" werden können nachdem sie sich ergeben haben. Bin für jede hilfe dankbar ! außerdem währen auch noch andere features super , zu dennen ich aber noch nicht gekommen bin. Vielleicht hat aber der ein oder andere neen guten vorschlag wie man da was bewerkstelligen kann... Weitere Ideen: Kapitulieren bei Gruppen dezimierung , wenn also die Gruppe mit 6 man startet und von diesen erledigt man 4, sollten sich die anderen 2 ergeben..evtl. Prozentual , wenn 70 % der gruppe ausgelöscht sind ergiebt sich der rest der gruppe.... mir schwirren auch noch weitere ideen im kopf rum , aber das soll erstmal reichen.... denke mal man kann da noch eine menge machen |
20.02.2011, 16:22 | #2 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Ich glaube Dein Problem liegt darin, dass Du eine lokale Variable (_suspect_ring) für den Trigger nutzt, den Du später mit list _suspect_ring abfragst. Da verlangt ArmA normalerweise nach einer globalen Variable...
Ich kann mich aber irren... |
20.02.2011, 16:44 | #3 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Irgend eine idee wie ich das Problem dann lösen kann ?! Irgendwie verstehe ich nicht so ganz was du meinst , wenn arma da eine globale variable will ?!? sie hat doch eine ... die _suspect_ring ?!?! ich bin verwirrt , vielleicht hab ich auch heut schon zu lange auf den code geschaut |
20.02.2011, 17:01 | #5 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Ich sag doch ich bin heute schon ein wenig verwirrt .... habs verstanden dennoch , ich habe es mit globalen variablen probiert ..... aber wie du schon vermutet hast ändert das nichts an meinem problem. Code:
// ----------------------------------------------- // Author: Anemia // welcome to the jungle // ----------------------------------------------- hint "start check"; suspect_ring=createTrigger["EmptyDetector",getPos player]; suspect_ring triggerAttachVehicle [player]; suspect_ring setTriggerArea[5,5,0,false]; suspect_ring setTriggerActivation["EAST","PRESENT",false]; suspect_ring setTriggerStatements["this", "this addAction ['go in jail', 'surrender\surrender.sqf' forEach list suspect_ring]", "hint 'no enemys near'"]; sleep 2; hint "trigger near done"; deleteVehicle suspect_ring; Ist das zuweisen des addaction eintrags überhaupt richtig ?! EDIT: Mal nee andere frage , wie erfasse ich alle feindlichen gruppen auf der karte , erfasse die jeweilige gruppengröße und erfasse die dann um sie weiter zu verwenden ? Geändert von Anemia (20.02.2011 um 17:12 Uhr). |
20.02.2011, 17:17 | #6 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Nö.. Code:
suspect_ring setTriggerStatements["this", "_x addAction ['go in jail', 'surrender\surrender.sqf' forEach list suspect_ring]", "hint 'no enemys near'"]; Das könnte erstmal helfen: allGroups count Geändert von Buliwyf (20.02.2011 um 17:24 Uhr). |
20.02.2011, 18:43 | #7 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
ein bisschen viel "erfassen" in dem satz ....
Ahh selbst der deutschen sprache bin ich nicht mehr mächtig. Ich wollte halt wissen wie ich alle feindlichen gruppen erfassen kann, um dann die gruppengröße der einzelnen gruppen weiter zu verwenden. Wie in meiner idee oben , wenn 70% einer gruppe ausgelöscht sind soll sich der rest der Gruppe ergeben. Aber ich glaube du hast mich schon verstanden , die links führen aufjedenfall zu nützlichen inhalten Danke schonmal für die geleistete Hilfe, werd meine arbeit für heute aber niederlegen ... Weitere Tipps sind natürlich erwünscht ! |
20.02.2011, 19:01 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Mit dieser Abfrage solltest du automatisch "Zugriff" auf alle fliehenden Feinde im Umkreis von 30m zum Spieler haben.
Code:
while {true} do { { if (fleeing _x and player countEnemy[_x]==1) then { ...; <hier deine Surrender Routine einfügen>; ...; } } forEach nearestObjects [player, ["Man"], 30]; sleep 1 }; |
20.02.2011, 21:19 | #9 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Klasse danke .... ich glaube das bringt mich schon ein ganzes stück weiter , werds morgen gleich mal austesten ..... |
26.02.2011, 14:22 | #10 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Bin nun erst heute dazu gekommen das zu testen, in der woche doch mehr zu tuhen gehabt als erwartet. Wie dem auch sei , es scheint irgendwie nicht zu funktionieren. Habe das script in einen addaction eintrag an den spieler gekoppelt, damit ich es zu testzwecken von dort starten kann. Um zu überprüfen ob es geht habe ich dann ein hint text eingetragen.... leider tut sich aber nichts. Code:
hint "start surr"; while {true} do { { if (fleeing _x and player countEnemy[_x]==1) then { hint "FEIND"; } } forEach nearestObjects [player, ["Man"], 30]; sleep 1 }; hint "end surr"; |
26.02.2011, 15:46 | #11 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Dann flieht der 3. vermutlich noch nicht, oder du bist zu weit von ihm entfernt. 30 Meter sind sehr gering, auch schießt er wahrscheinlich noch auf dich.
Zum Ende darfst du nicht kommen, weil es sich um eine "Endlosschleife" handelt, die erst mit Missionsende beendet wird. Zum Testen erhöhe die Reichweite auf 1000 und lasse dir mit der Abfrage einmal alle Fliehenden anzeigen: Code:
hint "start surr"; while {true} do { { if (fleeing _x ) then { player groupChat format["%1 Feind? %2",_x,player countEnemy[_x]==1]; } } forEach nearestObjects [player, ["Man"], 1000]; sleep 1 }; hint "end surr"; Zum Testen kannst du die Feinde gleich auf "Fliehend" setzen. Gib in die Initzeile der Soldaten ein: removeAllWeapons this; this allowFleeing 1 Edit: Zwischen ... _x und Player ... muss ein Beistrich stehen,kein Strichpunkt! player groupChat format["%1 Feind? %2",_x , player countEnemy[_x]==1]; Geändert von Vienna (26.02.2011 um 15:54 Uhr). |
26.02.2011, 16:21 | #12 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
Klasse funktioniert soweit alles !
Danke ! Weißt du evtl. auch wie ich die Feinde erfassen kann die sich ergeben habe ?! also nicht gerade weglaufen, sondern schon die arme über den kopf nehmen. Man bräuchte dann ja nur "fleeing" mit ... ?! ersetzen um diese zu erfassen. |
26.02.2011, 18:20 | #13 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
So erhältst du die Kontrolle über die feindliche KI und kannst sie mit einer Funktionstaste ansprechen und wie üblich Befehle geben.
Code:
while {true} do { { if (fleeing _x and player countEnemy[_x]==1) then { removeAllWeapons _x; //Alle Waffen entfernen [_x] joinSilent group player; //Der Spieler erhält die Kontrolle über _x //hier dann die gewünschte Animation einfügen } } forEach nearestObjects [player, ["Man"], 30]; sleep 1 }; ArmA 2: Actions - Bohemia Interactive Community Sonstige Befehle findest du hier: Category:Scripting Commands ArmA2 - Bohemia Interactive Community |
26.02.2011, 21:32 | #14 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
super , danke .... made my day
nee idee warum ich kein addaction eintrag an x hängen kann ?! Code:
while {true} do { { if (fleeing _x and player countEnemy[_x]==1) then { removeAllWeapons _x; //Alle Waffen entfernen // [_x] joinSilent group player; //Der Spieler erhält die Kontrolle über _x [_x] switchmove "AmovPercMstpSsurWnonDnon"; [_x] addAction ["Arrest","surrender/gotojail.sqf"]; //hier dann die gewünschte Animation einfügen } } forEach nearestObjects [player, ["Man"], 30]; sleep 1 }; |
26.02.2011, 23:42 | #16 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
hmmm irgendwo abgeschaut, ich bin mir auch nicht sicher Danke das hat aufjedenfall dazu geführt das die animation ausgeführt wird. allerdings leider kein erfolg bei dem Addaction eintrag. Bin mir auch nicht sicher ob das überhaupt so geht, müssten sich dann nicht die addaction einträge dupplizieren ?! Mit der Animation ansich gibt es auch noch probleme..... sie nehmen die hände hoch, allerdings dann auch gleich wieder runter .... und dann wieder hoch, da sie die animation ja immerwieder ausführen. habe also versucht per animationState die animation von _x aus zu lesen und das in eine if schleife zu legen , aber ich hab bestimmt wieder irgendwelche formatierungsfehler verbaut.Habs irgendwie nicht zum laufen bekommen. Code:
while {true} do { { if (fleeing _x ) then { _animi = animationState _x; if (_animi == AmovPercMstpSsurWnonDnon) then { _X disableAI "ANIM"; } else { player groupChat format["%1 Feind? %3 Animation %2",_x,_animi,player countEnemy[_x]==1]; _x addAction ["Arrest","surrender/gotojail.sqf"]; _x playmove "AmovPercMstpSsurWnonDnon"; } } } forEach nearestObjects [player, ["Man"], 50]; sleep 1 }; die derzeit funktionierende varriante .... leider ohne addaction... Code:
while {true} do { { if (fleeing _x ) then { _animi = animationState _x; player groupChat format["%1 Feind? %3 Animation %2",_x,_animi,player countEnemy[_x]==1]; _x addAction ["Arrest","surrender/gotojail.sqf"]; _x playmove "AmovPercMstpSsurWnonDnon"; } } forEach nearestObjects [player, ["Man"], 50]; sleep 1 }; |
27.02.2011, 00:26 | #17 (permalink) |
also die formatierungsfehler sind mal behoben worden aber testen darfst du alleine.
Code:
while {true} do { {if (fleeing _x ) then { _animi = animationState _x; if (_animi == "AmovPercMstpSsurWnonDnon") then { _X disableAI "ANIM"; } else { player groupChat format["%1 Feind? %3 Animation %2",_x,_animi,player countEnemy[_x]==1]; _x addAction ["Arrest","surrender/gotojail.sqf"]; _x playmove "AmovPercMstpSsurWnonDnon"; }; };} forEach nearestObjects [player, ["Man"], 50]; sleep 1; };
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
27.02.2011, 01:23 | #18 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wenn der Spieler die KI unter seiner Kontrolle hat, dann lässt die KI die Hände nicht oben. Gibt man den Befehl in eine Dauerschleife, dann ist die KI blockiert.
Blockieren kann man die KI einfacher mit: KI Hände über den Kopf und bewegungslos: Name switchMove "AmovPercMstpSsurWnonDnon"; Name disableAI "ANIM" Wenn man der KI wieder Befehle geben will, dann muss die Blockade aufgehoben werden: Name enableAI "ANIM" Manche Befehle verlangen, dass auch bei nur einem Parameter das in einem Array erfolgt. Wie z.B. bei [_x] joinSilent group player. Die richtige Syntax muss man sich immer in der Beschreibung ansehen. |
27.02.2011, 11:23 | #19 (permalink) |
Registriert seit: 20.05.2009
Beiträge: 605
|
@Psycho
Dank dir , es funktioniert. Ich musste die wiederholungszeit der schleife noch runtersetzen, da er sonst einige zeit braucht um die animation im richtigen moment zu erfassen. Auch der addaction eintrag taucht unterdessen auf,allerdings nur bei toten einheiten ??? . Code:
while {true} do { {if (fleeing _x ) then { _animi = animationState _x; if (_animi == "AmovPercMstpSsurWnonDnon") then { _x disableAI "ANIM"; _x addAction ["Arrest","surrender\gotojail.sqf"]; } else { player groupChat format["%1 Feind? %3 Animation %2",_x,_animi,player countEnemy[_x]==1]; _x switchmove "AmovPercMstpSsurWnonDnon"; }; };} forEach nearestObjects [player, ["Man"], 50]; sleep 0.1; }; Hatte nun auch schon bisschen gelesen und man kann ja scheinbar irgendwie die id des actioneintrags erfassen und dann wenn diese schon vorhanden ist den eintrag nicht nochmal eintragen lassen. Allerdings sind meine versuche kläglich gescheitert. lt. Wiki : Möchte mich an dieser stelle auch schonmal für eure bisher geleistete unterstützung bedanken ! Sollte das script jemals funktionieren ..... werdet ihr aufjedenfall in den credits erwähnt |
27.02.2011, 11:32 | #20 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Mit der ID wirst Du nicht weit kommen, weil jeder neuer AddAction-Eintrag auch eine neue ID bekommt.
Vielmehr könntest Du mit zB _x setVariable ["ARRESTED", true, true]; einen Gefangenen markieren und Deine Bedingung erweitern, in dem Du if (_animi == "AmovPercMstpSsurWnonDnon" AND not (_x getVariable "ARRESTED")) then { hinzufügst. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Beta-Patch für OpA erschienen | det99 | Community | 1429 | 18.07.2014 16:51 |
Day & Weather Script | Moerderhoschi | Editing & Scripting | 13 | 02.12.2012 10:29 |
UAV Modul nur für den Teamleader | SniperWolf | Editing & Scripting | 2 | 24.01.2011 15:58 |
marker über script erzeugen | hypercop | Editing & Scripting | 2 | 28.08.2010 22:40 |
Improved Bullet Cam Script | miromanu | Editing & Scripting | 3 | 21.08.2010 01:01 |