HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   KI Kontrolle (https://hx3.de/editing-scripting-167/ki-kontrolle-22578/)

VidosQ 16.05.2013 11:21

KI Kontrolle
 
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 19:11

Auslöser
Code:

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 19:18

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

Vienna 16.05.2013 20: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
Code:

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 21:35

gott ist das geil, vielen dank!

Avatar-X 03.06.2013 18: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 01: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 08: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/C...Commands_ArmA2

VidosQ 05.06.2013 23: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 08: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
Code:

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 08:41

Das geht aber auch mit nur einem Aufruf und ohne 100 Script Dateien:
Code:

/*
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 19: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:

Code:

//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 15:21

Zitat:

Zitat von Vienna (Beitrag 451581)
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 00: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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.

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