User Login



Passwort vergessen

Du hast noch keinen Account ? ? ?

Geniese die Vorteile wenn du registriert bist.

Jetzt registrieren

eingetragen am:
Montag, den 01. 01. 2024
Kommentare:
0
Happy New Year...
Autor: LordOfDeath
Forum:
Allgemein
Antworten:
276
letzte Antwort:
von LordOfDeath
am 31.10.18 um 18:14 Uhr
Ich hau mich weg...
Autor: LordOfDeath
Forum:
Games
Antworten:
12
letzte Antwort:
von Gulle
am 16.09.18 um 12:17 Uhr
SCUM
Autor: Matchbox
Forum:
Games
Antworten:
2
letzte Antwort:
von LordOfDeath
am 04.02.18 um 19:34 Uhr
Hunt:Showdown
Autor: LordOfDeath
Forum:
Games
Antworten:
15
letzte Antwort:
von LordOfDeath
am 04.02.18 um 19:33 Uhr
Ghost Recon Wildlands
Autor: gelöschter User
  • Battlefield 3
  • Battlefield 4
  • Battlefield 1
  • Rainbow Six Siege
  • DayZ
  • ARMA 3
  • Breaking Point
Forum » Games » Arma 3 » Scripting - Tipps, Scripte, Vorschläge
Willkommen auf der Homepage des Old Men Battalion...

offline
User Pic
Level_8
Posts: 169
Dabei seit: 31.10.2014
 1 Mitglied findet den Beitrag gut.
1 gelöschter User
Mo. 27.04.2015 - 17:21 Uhr


Moinsen.

Ich habe das Thema mal eröffnet, damit sich der ein oder andere einen Tipp holen kann oder Anregungen geben kann, wie man etwas anders gestalten könnte.

Es geht um performantes Scripten. Also um den Server bzw. den Clienten so wenig wie möglich zu zuscheißen. Wird z.B. ein Code öfters bebraucht, lohnt es sich eine Variable zu definieren.
Desweiteren freut sich die FPS, wenn der Server nicht so viele Einheiten permanent zu verarbeiten hat. Auch per Modul versteckte Einheiten sind vorhanden und werden berechnet!


Ich will hier mal auf eine sehr einfache Variante eingehen, wie man schnell einen Panzer oder Hubschrauberangriff realisieren kann. Diese Variante kann man später öfters im Spiel einbauen

Ich habe es so gestaltet. Ich habe ein Verzeichnes names "Variablen". In diesem steht die Variable.sqf
Das dient einfach der übersichtlichkeit.
In der init.sqf ladet ihr dann: if (isServer) then {execVM "variablen\variablen.sqf";}
Habt ihr eine initServer.sqf dann: execVM "variablen\variablen.sqf";
** Natürlich nur eine von beiden. Die Variante mit der initServer.sqf ist die besser **

Warum auf den Server begrenzen? Was wollen die Clienten damit, wenn die KI der Server verwaltet.

So in der Variablen.sqf definiert ihr eure eigene Variable


   Code
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:
 
dof_bth3_vehattack =
   {
      private ["_wph", "_grp", "_ziel", "_lfz", "_vehtype"];
      _vehtype = _this select 0;
      _spawnpos = (_this select 1);
      _ziel = (_this select 2);
         
      switch (typeName _spawnpos) do
      {
         case "ARRAY" : {_lfz = _vehtype createVehicle _spawnpos};
         case "STRING": {_lfz = _vehtype createVehicle (getMarkerpos _spawnpos)};
         case "OBJECT": {_lfz= _vehtype createVehicle (position _spawnpos);};
      };
      
         
      createVehicleCrew _lfz;
      _lfz allowfleeing 0;      
      switch (typeName _ziel) do
      {
         case "ARRAY" : {_wph = (group _lfz) addwaypoint [_ziel, 0]};
         case "STRING": {_wph = (group _lfz) addwaypoint [(getMarkerPos _ziel), 0]};
         case "OBJECT": {_wph = (group _lfz) addwaypoint [(getPos _ziel), 0]};
      };
      
      
      _wph setWaypointtype "SAD";
      _wph setWaypointSpeed "FULL";
      _wph setWaypointBehaviour "COMBAT";
      _wph setWaypointCombatMode "RED";
      
   
   };


DOF_BHT3_VehAttack ist nun eine Variable, welche einen Code enthält.
DOF steht für Drunken Officer und BHT3 für BornholmTeil3. Eine Varibale sollte logisch aufgebaut sein.

Wie ihr seht, verarbeitet das Script eine Einheit, einen Startpunkt und einen Endpunkt, welcher ein Search und Destroy Wegpunkt ist. Das Script kann als Start- und Endpunkt ein Objekt, einen Array oder einen Marker verarbeiten.

Jetzt könnt ihr ganz einfach den Aufruf in einer durch den Server verwalten SQF oder per Trigger machen.
Folgene Aufrufbeispiele zeige ich euch an:

["BWA3_Puma_Fleck", [15128.6,5215.68,0.00145721], [14763.5,5147.2,0.00143433] ] spawn DOF_BTH3_VehAttack;[/code]
["rhs_bmp2k_vdv", "tspawn1_1", "MA_tsk_rettung"] spawn DOF_BTH3_VehAttack;
["O_Heli_Attack_02_black_F", kampfheli_spawn1, player] spawn DOF_BTH3_VehAttack;

Wie ihr seht, werden verschieden Einheiten kreiert. Die Einheiten schließen sich automatisch der Seite an, zu welcher das Fahrzeug gehört.
Ich arbeite mit spawn, da es parallel aus meinem Missionscript heraus arbeitet. Ein call würde es anhalten. Es kommt auf den Einsatzzweck an. Aber die Einheiten sollen ja flüssig im Spielbetrieb erscheinen.

Beispiel 1 arbeitet mit 2 Arrays, die man auslesen kann. (Jekko, das ist der Aufruf copytoClipboard in meiner Testphase)
Beispiel 2 arbeitet mit 2 Markern. Marker gehören als String geschrieben. ""
Beispiel 3 arbeitet mit 2 Objekten.

Natürlich wäre auc möglich

["O_Heli_Attack_02_black_F", kampfheli_spawn1, [14763.5,5147.2,0.00143433]] spawn DOF_BTH3_VehAttack;


Wird es über einen Trigger ausgeführt, so gehört in die Aktivierungsteil:
Aktivierung: z.B. (!alive HansDampf)
if (isSErver) then {["O_Heli_Attack_02_black_F", kampfheli_spawn1, [14763.5,5147.2,0.00143433]] spawn DOF_BTH3_VehAttack; }

So das soll mal ein kleiner Auszug zum schnellen erstellen von Einheiten sein, die gewisse Punkte anfahren/fliegen/laufen und da auch kämpfen. Vlt treffen wir in der ein oder anderen Mission auf Helis. Bei BH Teil3 auf alle Fälle :D


Zuletzt modifiziert von Drunken Officer am 27.04.2015 - 17:41:15

User Pic
gelöschter User

 0 Mitglieder finden den Beitrag gut.
Mo. 27.04.2015 - 21:37 Uhr


Sehr feine Hilfestellung :danke:
Das werde ich mir mal ausgeruht durchlesen...

Aber super, daß du hier mal echt konkrete Beispiele postest! :wow:
Das hilft allen, die mal an einer Mission basteln wollen.

User Pic
gelöschter User

 0 Mitglieder finden den Beitrag gut.
Mo. 27.04.2015 - 22:00 Uhr


Ja, Jekko hat recht. Drunken finde ich echt klasse!!!

PS: Wenn ich meine Rente durch habe, dann werde ich loslegen. Missionen vom Feinsten!

offline
User Pic
Level_8
Posts: 169
Dabei seit: 31.10.2014
 0 Mitglieder finden den Beitrag gut.
Mi. 06.05.2015 - 09:47 Uhr


Heut will ich euch mal eine einfache Variante für ein Heli Abhol bzw Reinflugscript zeigen

Wenn der Heli mehrfach fliegen soll, so kann man es mit vielen Wegpunkte und Triggern machen. Ist aber nicht unbedingt sinnvoll.

Wir gehen wieder in unsere bereits erwähnte Variablen.sqf, welche aus der InitServer.sqf heraus geladen wird.

Jetzt erweitern wir diese Variablen.sqf um eine weitere Variable.

   Code
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:
 dof_bth3_vehattack = { bla bla };

[emph]DOF_BHT3_Heli[/emph] =
   {
      private ["_lfz", "_gruppe", "_LZ", "_LP", "_wph", "_wpe", "_dof_repair_parts"];
      _lfz = _this select 0;
      _gruppe = _this select 1;
      _LZ = _this select 2;
      _LP = _this select 3;
      _art = _this select 4;
      
      switch (_art) do
      
      {
         case "rein":
                     {
                           _wph = (group _lfz) addwaypoint [getMarkerPos _LZ, 0];
                           _wph setWaypointtype "MOVE";
                           _wph setWaypointSpeed "NORMAL";
                           _wph setWaypointBehaviour "SAFE";
                           _wph setWaypointStatements ["true", "(vehicle this) LAND 'GET OUT';"];
                           waitUntil {sleep 1; _lfz distance getWPPos [(group _lfz), 1] < 1000};   
                           _wph setWaypointSpeed "LIMITED";
                              waituntil {sleep 2; {_x in _lfz} count units _gruppe == 0 };
                     };
         case "raus":
                     {
                           _wph = (group _lfz) addwaypoint [getMarkerPos _LZ, 0];
                           _wph setWaypointtype "MOVE";
                           _wph setWaypointSpeed "NORMAL";
                           _wph setWaypointBehaviour "SAFE";
                           _wph setWaypointStatements ["true", "(vehicle this) LAND 'GET IN';"];
                           waituntil {sleep 2; {_x in _lfz} count units _gruppe == count units _gruppe };
                     };
      };
            _wpe = (group _lfz) addwaypoint [(getpos _LP), 0];
            _wpe setWaypointStatements ["true", "(vehicle this) LAND 'LAND';"];
            waitUntil {sleep 5; isTouchingGround _lfz};
            _lfz action ["engineOff", _lfz];
            _dof_repair_parts = (configfile >> "CfgVehicles" >> typeof _lfz >> "HitPoints") call BIS_fnc_getCfgSubClasses;
            _lfz setDammage 0;
            {_lfz setHit [_x, 0] } forEach _dof_repair_parts;
            _lfz setfuel 1;
            _lfz setVehicleAmmo 1;
                     
      
                     
   };


Es werden 5 Argumente abgefragt:
Name des Fahrzeuges
Name der Gruppe
Landzone
Landepunkt
die Art und Weiße

Sieh kompliziert aus, ist es aber nicht. Wir brauchen:
einen Helikopter (z.B. Transe)
ein Helipad (BasisLP)
einen Marker (MA_LZ_Mission1)

Entweder ihr benennt eure Gruppe ( in die Init eines Spielers z.B. trango31 = group this; oder ihr laßt die Leute in eine bereits erstellt gruppe beitreten) oder aber ihr benennt eure Firguren (S1, S2, S3)

Nun zum Aufruf. Wir wollen eingefolgen werden
[transe, tango31, "MA_LZ_Rettung", BasisLP, "rein"] spawn DOF_BHT3_Heli;
--> der Hubschraube, der Gruppenname, der Marker wo er hinfliegt, der Landplatz nach dem Absetzen, rein steht für reinfliegen. Das ganze als Spawn, da mit Wegpunkten gearbeitet wird.

Es würde auch funktionieren
[transe, (group s1), "MA_LZ_Rettung", BasisLP, "rein"] spawn DOF_BHT3_Heli;

Das 2. Argument muss eine Gruppe sein.


Und genau so funktioniert der Aufruf, wenn ihr ausgeflogen werden wollt
[transe, tango31, "MA_LZ_Rettung", BasisLP, "raus"] spawn DOF_BHT3_Heli;

Am Ende des Scriptes wird der Heli ganz gemacht, aufgetrankt und aufmunitioniert. Denkt aber daran, wenn das Dinge kaputt ist und ihr den neu spawnen laßt, muß der wieder als Transe benannt werden. Es reicht aus, wenn der SErver es weiß, ihr müßt es nicht pubic machen. Das ganze Script wird auch nur auf dem Server ausgeführt, da die Variablen.sqf nur vom Server geladen wurde.

Ich hänge euch zeitnah ein Mission dran.


Zuletzt modifiziert von Drunken Officer am 06.05.2015 - 09:49:27

offline
User Pic
Level_8
Posts: 169
Dabei seit: 31.10.2014
 0 Mitglieder finden den Beitrag gut.
Mi. 06.05.2015 - 21:46 Uhr


Ich habe hier mal ein Tutorial-Mission erstellt. Einfach entpacken. Das Verzeichnis in die eigenen Dokumente, damit man die Mission im Editor bearbeiten kann.
Die PBO kommt in den MPMission-Ordner.

Eine Lies_mich.txt ist auch dabei! Desweiteren habe ich mit vielen Kommentierungen gearbeitet.


In dieser Mission wird Triggerfrei in Multiplayer-Misson gezeigt. Es zeigt u.A die vorher erklärten Varianten eines Heli an und Abflug auf. Es wird ein Hubschrauberangriff geben und ich gehe auch das Thema Zufallspawn von Einheiten ein.

Ich persönlich erstelle Tasks mit dem BIS eigenen Befehl. Vielleicht kannte den Befehl der ein oder andere nicht und ist erstaunt wie leicht es geht.

Desweiteren kratze ich an der InitPlayerlocal.sqf. In dieser wird kurz gezeigt, wie man Gruppen beitreten kann und somit Pflichtslots umgehen kann. Desweiteren wird gezeigt, wie eine individuelle Ausrüstung erstellt werden kann. Ich gehe aber nicht auf jeden möglichen Befehl zum Beladen von Einheiten ein.

Die Missionsverlauf.sqf sieht erstmal sau viel aus!!! Aber wer genau hinsieht wird feststellen, da es sich um Etappen handelt, die mit Waituntil gestoppt werden. diese SQF steuert halt die Misison.

Es wird 4 Aufgaben geben. Ihr seit aber alle unsterblich, weil es eine Trainingsmission ist.


Viel Spaß

http://drunkenofficer.bplaced.net/ArmA_3_Downloads/Tutorial.zip

User Pic
gelöschter User

 0 Mitglieder finden den Beitrag gut.
Do. 07.05.2015 - 20:47 Uhr


Super Idee Drunken. Ein ganz fettes Dankeschön für deine Mühe. :cool: :danke:

offline
User Pic
Level_8
Posts: 169
Dabei seit: 31.10.2014
 0 Mitglieder finden den Beitrag gut.
Di. 26.05.2015 - 13:16 Uhr


Wieder etwas geniales gefunden.

Es geht um die mp-fähige Abspielung von Sounds, welche an Objekte gebunden sind


Total einfach:
In die INIT.SQF kommt das rein

   Code
1:
2:
3:
4:
5:
6:
7:
8:
9:
 
// ----- Example from Killzone-Kid
MISSION_ROOT = call {
private "_arr";
_arr = toArray __FILE__;
_arr resize (count _arr - 8);
toString _arr
};   

Serverseitig läßt ihr dann einfach etwas abspielen

   Code
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
 
[] spawn
   {
      private ["_sound"];

         
         while {true} do
         {

            //--- wartet bis bedingung wahr, Abfrage aller 2 sekunden
            waituntil {sleep 2; {_x distance (getMarkerpos "MA_Stadtmitte") < 700} count playableunits > 0 };
            
               //--- startet einen LOOP solange wie Bedingung wahr ist
               while { {_x distance (getMarkerpos "MA_Stadtmitte") < 700} count playableunits > 0 } do
                  {            
                  _sound = MISSION_ROOT + "sounds\arabischermarkt_1.ogg";
                  { playSound3D [_sound , _x]; } forEach [Marktstand1, Marktstand2, Marktstand3];
                  sleep 14;
                  }; //---- ende innerer loop
            //---- bedingung nicht wahr, wird übergangen und springt in äußeren loop (Dauer-loop weil true) geblockt durch Waitunitl
         };
   };
      


PlaySound3D wird über das Netzwerk verteilt und ist für jeden hörbar. KK hat einen Weg aufgezeigt, wie man eigene Soundfiles damit abspielt, was sonst recht tricky war.

Wer das ganze als Zufallswiedergabe benötigt, mit mehreren Soundfiles und damit verschiedener Abspiellängen einfach mich anschreiben.


Zuletzt modifiziert von Drunken Officer am 26.05.2015 - 13:25:16




Images by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Powered by IlchBB Forum 3.1 © 2010 Weblösungen Florian Körner