PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : KI Kontrolle


VidosQ
16.05.2013, 12:21
Hi,

in einer Mission möchte ich eine bestimmte KI festnehmen. Ich möchte an diese KI rangehen mit dem Mausrad ein "AddAction" befehl ausführen und diese KI soll dann bei mir, oder einem anderen spieler der den befehl ausgeführt hat, gebunden also in mit ihm in einer Gruppe sein.

Kennt da jemand etwas oder hat eine Idee?

Vienna
16.05.2013, 20:11
Auslöser

Achse A und B: 0
Aktivierung : Keiner | Einmal
Bedingung : player distance NameKI < 5
Bei Akt. : den folgenden Code reinkopieren

if(isNil "GefangeneKI") then
{
[NameKI] join player;
GefangeneKI = true;
publicVariable "GefangeneKI"
}

Der Spieler, welcher sich als erster der KI unter 5 Meter nähert, erhält die Kontrolle über die KI. Die Zuordnung erfolgt durch den Befehl [NameKI] join player;

VidosQ
16.05.2013, 20:18
gibt es auch sowas mit Addaction befehl, also das ich mit dem mausrad jemanden in die gruppe holen kann?

Vienna
16.05.2013, 21:07
Das erfordert aber ein Skript, mit Namen und Code wie unten angeführt.

In die Initialisierungszeile der zu fangenden KI kopieren:
this addAction["KI gefangen nehmen","Gefangen.sqf",[],1,true,true]

Skript Gefangen.sqf

if(isNil "GefangeneKI") then
{
[_this select 0] join player;
GefangeneKI = true;
publicVariable "GefangeneKI"
}
else
{
player GroupChat "Gefangennahme bereits erfolgt!"
};
_this select 0 removeAction 0;

Nähert sich ein Spieler der KI, dann wird die Aktion eingeblendet. Die Aktion ist nur beim ersten Aufrufer wirksam. Sie wird nach dem Aufruf beim jeweils aufrufenden Spieler entfernt.

VidosQ
16.05.2013, 22:35
gott ist das geil, vielen dank!

Avatar-X
03.06.2013, 19:49
Man könnte es auch so einstellen, dass der Gefangene ab einer bestimmten Reichweite <5,<10 oder was auch immer automatisch der Gruppe joint ohne angesprochen zu werden.

VidosQ
05.06.2013, 02:20
Ja ich bin es wieder:D

Und wieder komme ich mit einer frage:

Ich habe nun diese zivilperson gefangengebenden. ( wie oben beschrieben mit dem addaction Befehl + Script) aber wie werde ich den wieder los? Ich will ja nicht die ganze zeit mit einem Zivilisten/ gefangen rumlaufen ich will ihn irgendwo hinbringen und da loswerden entweder mit Auslöser oder wieder mit einem extra Script hat da jemand eine Lösung für?

Ja ich weiß wieder so eine dumme frage :ugly:

Vienna
05.06.2013, 09:51
So wirst du ihn wieder los: [NameGefangener] join grpNull; Diesen Befehl kannst du z.B. in einen Auslöser, der mit dem Gefangenen verbunden ist, eingeben. Beim Betreten durch den Gefangenen wird der Befehl dann ausgeführt.

Informationen zu den Befehlen findest du hier: http://community.bistudio.com/wiki/Category:Scripting_Commands_ArmA2

VidosQ
06.06.2013, 00:00
Frage, kann ich mit dem Script auch mehrere Personen "Einfangen"? Wie müsste ich das Script verändern. Leider hab ich keine ahnung davon =(

Vienna
06.06.2013, 09:30
Für jede weitere KI kopierst du das Skript. Dabei vergibst du eine "fortlaufende Nummer":

im Skriptnamen,
dreimal im jeweiligen Skript und
einmal im Aktionsaufruf.

Skriptname: Gefangen1.sqf

if(isNil "GefangeneKI1") then
{
[_this select 0] join player;
GefangeneKI1 = true;
publicVariable "GefangeneKI1"
}
else
{
player GroupChat "Gefangennahme bereits erfolgt!"
};
_this select 0 removeAction 0;


this addAction["KI gefangen nehmen","Gefangen1.sqf",[],1,true,true]

Hier ist die "fortlaufende Nummer" 1 und fett hervorgehoben.

Rockhount
07.06.2013, 09:41
Das geht aber auch mit nur einem Aufruf und ohne 100 Script Dateien:
/*
Made by Rockhount v1.0
Aufruf: temp = [Player, [KI1, KI2, KI3]] execVM "Gefangen.sqf";
*/
if (!isDedicated) then
{
_Modus = _this select 0;
if (_Modus == Player) then
{
"KIGefangen" addPublicVariableEventHandler
{
_KI = (_this select 1) select 0;
_ActionID = (_this select 1) select 1;
_KI removeAction _ActionID;
};
_KIs = _this select 1;
for [{_Index = 0},{_Index < count _KIs},{_Index = _Index + 1}] do
{
_Dialog = format["%1 gefangen nehmen", name (_KIs select _Index)];
(_KIs select _Index) addAction [_Dialog, "Gefangen.sqf"];
};
}
else
{
_KI = _Modus;
_Player = _this select 1;
_ActionID = _this select 2;
[_KI] join (group _Player);
_KI removeAction _ActionID;
KIGefangen = [_KI, _ActionID];
publicVariable "KIGefangen";
};
};
Dieser Code wurde nicht von mir getestet.

Gibt es eine Möglichkeit, womit man den Pfad oder zumindest den Dateinamen des Scripts herausfinden kann?

Vienna
07.06.2013, 20:50
Bei Aufruf: temp = [Player, [KI1, KI2, KI3]] execVM "Gefangen.sqf"; steht der Pfad in temp.

So schwer wollte ich es mir eigentlich nicht machen. Das Skript mit der Doppelfunktion und dem EventHandler ist natürlich eine bessere Lösung. Allerdings ohne Kommentare nicht leicht zu verstehen.

Ich habe versucht das übersichtlicher zu gestalten:


//KIs an den Spieler binden. Skript mit Doppelfunktion!!
//
// 1. Erstellen einer Aktion bei KIs und eines Eventhändlers bei den Spielern
// 2. Wird von der erstellten Aktion verwendet um KI an den Spieler zu binden
// und die Aktion nach der Anbindung zu entfernen
//
//Einmaliger Aufruf bei allen Spielern: temp = [[Ki1,Ki2,Ki3]] execVM "Gefangen.sqf";

if (count _this == 1) then //*******Initialisieren von Aktion und EventHandler****
{
if (isDedicated) exitWith {};
//Aktion bei den übergebenen KIs hinzufügen
for "_i" from 0 to count(_this select 0) do
{
(_this select 0)select _i addAction [format["%1 gefangen nehmen!",name((_this select 0)select _i)],"Gefangen.sqf",[],5,true,true]
};
//EventHandler erstellen der bei den anderen PCs die Aktion löscht
// Variable KIGefangen enthält Array mit [KI-Name,AktionID]
"KIGefangen" addPublicVariableEventHandler
{
(_this select 1) select 0 removeAction ((_this select 1) select 1)
}
}
else //*****************************wenn Aufruf durch die Aktion******************
{
//KI unter Kontrolle des Spielers stellen
[_this select 0] join group player;
//Aktion beim Spieler löschen
_this select 0 removeAction (_this select 2);
//Aktion über den EventHandler bei den anderen Spielern löschen
KIGefangen = [_this select 0,_this select 2];
publicVariable "KIGefangen"
}
//************************************************** ******************************

Jetzt sind die Aktionen nicht mehr in die KI direkt einzutragen, das erledigt das Skript. Das Skript ist bei allen Spielern aufzurufen. Entweder in der init.sqf oder über einen Auslöser.

Rockhount
08.06.2013, 16:21
Bei Aufruf: temp = [Player, [KI1, KI2, KI3]] execVM "Gefangen.sqf"; steht der Pfad in temp.

Ich bräuchte den Pfad innerhalb des Scripts, nicht außerhalb. Außerdem wäre ich mit exitWith vorsichtig. Laut Doku soll es für das Beenden eines Scripts nicht immer funktionieren.

Vienna
09.06.2013, 01:14
Du willst in einem Skript nach einer Datei suchen? Da muss dir ja zumindest der Dateiname bekannt sein. So einen Suchen-Befehl habe ich noch nicht gesehen.

Wenn das Dateien aus der eigenen Mission sind, dann nicht in einem Unterordner speichern. So benötigt man kein Pfad-Angabe.