Arma 3 - Kommunikation mit AI
Um mit Zivilisten zu interagieren gibt es mehrere Wege, u.a über Ace Interaktion oder mit einem einfachem Interaction-Menu. Weil ich das Interaction aufgrund der Bedienbarkeit für Spieler mit ACE zu langatmig empfand, habe ich mich in dem nachfolgendem Beispiel in einer Vietnam Mission mit globalchat und den mitgeliferten Unsung Soundfiles bedient.
Nachdem ich mir eine ganze Reihe von Soundfiles aus dem besagtem Mod rausgeschrieben habe, habe ich die Namen für den Aufruf dazu in 2 verschiedene Arrays geschrieben, damit diese niemals das gleiche wiederholen.
Anmerkung: Ich kann kein vietnamesisch und habe keinen Plan was die also brabbeln ! .
Auftrag: Die Spieler waren hier halt angehalten in der Nähe eines Dorfes zu patroullieren und die Zivilisten nach Vietcong-Aktivitäten zu befragen. Erst daraus begann die eingentliche Mission.
Die Befehlszeile für das addaction am Zivilisten. kommt in jeden Zivilisten der befragt werden kann oder soll.
talking = this addAction ["<t color='#FF0000'>Befragen</t>", "talktounit.sqf", "", 0, true, true, "", "_this distance cursortarget < 3"];
Das Skript als solches ist für die allgemeine Konversation zur Untermalung gedacht für die Spieler. Hier sind keine relevanten Infos für den Spieler, eher nur zur Beschäftigung. Sie weisen auf den Dorffältesten , mit dem man reden soll. Der Dorfälteste hat dann in ähnlicher Form ein anderes Skript mit den eigentlichen Informationen zur Mission.
Desweiteren sollten die AI Zivis stehen bleiben soweit man diese angesprochen hatte und sich erst wieder in Bewegung setzen, wenn as Gespräch beendet ist.
Einge bekamen zum Gepräch auch einige Bewegungsanimationen um das ganze zu untermalen. Um die Soundfiles abzuspielen nutze ich hier say3D . Ab und zu fiel auch mal ne Grante vor die Füsse . Alles Ausagen sind wiegesagt auch random, so das sie Spieler auch durchaus damit mal länger beschäftigt sein können ...
Das Skript in einer talktounit.sqf (oder wie immer sie bei euch heißen wird)
if ((isMultiplayer) || (!isdedicated)) then { _GTcivilian = _this select 0; _GTplayer = _this select 1; _id = _this select 2; _GTcivilian removeAction _id; _voice1 = ["VC1","VC10","VC100","VC101","VC102","VC103","VC104","VC105","VC106","VC107","VC108","VC109","VC11","VC110","VC112","VC113","VC114","VC115","VC116","VC117","VC118","VC119","VC12","VC121","VC122","VC123","VC124","VC125","VC126","VC127","VC128","VC129"]call BIS_fnc_selectRandom; _voice2 = ["VC13","VC131","VC132","VC133","VC134","VC135","VC136","VC37","VC138","VC139","VC14","VC141","VC142","VC143","VC144","VC145","VC146","VC147","VC148","VC149","VC15","VC151","VC152","VC153","VC154","VC155","VC156","VC157","VC158","VC159","VC16"]call BIS_fnc_selectRandom; if(alive _GTcivilian)then{ _GTcivilian switchmove ""; _GTcivilian disableAi "move"; _randomNum = ["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","!7","18","19","20","21","22","23","24","25"] call BIS_fnc_selectRandom; _reaction = ["A","B","C","D","E","F","G","H","I","J","K"] call BIS_fnc_selectRandom; _GTcivilian say3D _voice1; switch(_reaction) Do { case"A":{ _GTcivilian globalChat "Wer ?";}; case"B":{ _GTcivilian globalChat "Quatsch mich nicht voll!";}; case"C":{ _GTcivilian globalChat "Um was geht es ??";}; case"D":{ _GTcivilian globalChat "Warum so agressiv ? Packen Sie erstmal ihre Waffe weg ... ";}; case"E":{ _GTcivilian globalChat "Sonst noch was ??";}; case"F":{ _GTcivilian globalChat "Jo, Mann, deinen Stoff habe ich gerade nicht dabei ... ";}; case"G":{ _GTcivilian globalChat "Um was geht es ?";}; case"H":{ _GTcivilian globalChat "Das habe ich ihrem Kollegen schon gesagt.";}; case"I":{ _GTcivilian globalChat "Immer die gleichen Fragen!?";}; case"J":{ _GTcivilian globalChat "Was denn ? ";}; case"K":{ _GTcivilian globalChat "Nein!? Ich weis nix. ";}; default { _null = "grenadeHand" createVehicle getPos _GTcivilian; }; }; sleep 5; _GTcivilian say3D _voice2; switch(_randomNum) Do { case "1": {_GTcivilian globalChat "Sie stellen Fragen, sehe ich so aus als wüsste ich das ?";}; case "2": {_GTcivilian globalChat "Ich mag die Besatzungstruppen nicht!"; }; case "3": {_GTcivilian globalChat "Ich mache keine Probleme ...und ich will auch keine!Frage den Dorfältesten!";}; case "4": {_GTcivilian globalChat "Ich kann Ihnen keine Auskunft geben ... Entschuldigen Sie bitte, ich muss weiter ... ";}; case "5": {_GTcivilian globalChat "Sie werden sicher verstehen, das ich nichts mit Ihnen zu haben will! ";}; case "6": {_GTcivilian globalChat "Ich habe davon gehört ? Er ist Ihr Problem nicht meins ...";}; case "7": {_GTcivilian globalChat "Belästigen Sie mich nicht!";}; case "8": {_GTcivilian globalChat "Ich soll Ihnen helfen ? Nein Danke. Ich unterstütze keine Besatzer!";sleep 5;_GTcivilian switchmove 'Acts_AidlPercMstpSlowWrflDnon_pissing';_GTcivilian globalChat "Alter! Hier haste meine Pisse und mehr bekommst du nicht!"; }; case "9": {_GTcivilian globalChat "So langsam geht ihr mir auf den Sack ...Verpiss Dich";_null = "grenadeHand" createVehicle getPos _GTcivilian;}; case "10": {_GTcivilian globalChat "Ich habe nichts zusagen....Frage den Dorfältesten!"; }; case "11": {_GTcivilian globalChat "Was genau wollen Sie in diesem Gespräch erreichen? Ich sag nix."; }; case "12": {_GTcivilian globalChat "Was genau könnte das „Worst Case“ für Sie hier gleich bedeuten, wenn Sie mich nicht in Ruhe lassen ?";sleep 3; _null = "grenadeHand" createVehicle getPos _GTcivilian; }; case "13": {_GTcivilian globalChat "Sie bringen mich mit Ihren Fragen zum Lachen hahaha"; }; case "14": { _GTcivilian switchmove 'Acts_B_briefings'; _GTcivilian globalChat "Sie bringen nur Leid."; sleep 5; _GTcivilian globalChat "Ich brauche was zu Essen."; sleep 2; _GTcivilian globalChat "Aber, ich weis wirklich nichts ...!"; }; case "15": {_GTcivilian globalChat "Ich habe nichts zusagen..."; sleep 3; }; case "16": {_GTcivilian globalChat "Ich weis wirklich nichts."; }; case "17": {_GTcivilian globalChat "Ihre Frage kann ich genauso wenig beantworten, wie dem anderen Soldaten vorhin"; }; case "18": {_GTcivilian globalChat "Tut mir Leid, ich muss mich um meine Ernte kümmern"; }; case "19": {_GTcivilian globalChat "Ja, hier kam aber nur ein Munitions LKW durch...der fuhr nach "}; case "20": {_GTcivilian globalChat "Fragen Sie einfach mal andere.";sleep 4; _GTcivilian globalChat "Bin hier völlig ratlos.";}; case "21": {_GTcivilian globalChat "Ihre Fragen können nerven, aber Antworten kriegen Sie von mir keine."}; case "22": {_GTcivilian globalChat "Ich habe nichts gesehen ... ";}; case "23": {_GTcivilian globalChat "Ich wirklich nicht helfen kann"; }; case "24": {_GTcivilian switchmove 'Acts_Kore_PointingForward'; _GTcivilian globalChat "Von mir erfahren Sie nichts ausser suchen Sie mal im nächsten Dorf oder fragen den Dorfältesten!"; }; case "25": {_GTcivilian switchmove 'Acts_AidlPercMstpSnonWnonDnon_warmup_1_loop'; _GTcivilian globalChat "Ich kann ihnen nicht helfen, fragen Sie da mal jemand anders.Tut mir Leid"}; default { //_null = "grenadeHand" createVehicle getPos _GTcivilian; }; }; sleep 5; _GTcivilian switchmove ""; _GTcivilian enableAi "move"; sleep 15; if(alive _GTcivilian)then{ talking = _GTcivilian addAction ["<t color='#FF0000'>Befragen</t>", "GT\GTtalktounit.sqf", "", 0, true, true, "", "_this distance cursortarget < 3"]; }; }; };
So siehts dann inGame aus:
Eine Kommentarfunktion ist in diesem Blog nicht vorgesehen.
Bei Problemen zum Skript bitte im Gametwitter.de Forum registieren und dort die Kommentarfunktion nutzen.