1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Downloads
  4. Galerie
    1. Alben
  5. Toolbox
    1. Passwort Generator
    2. Portchecker
  6. Mitglieder
    1. Mitgliedersuche
    2. Benutzer online
    3. Trophäen
    4. Team
Mo: 19 Mai 2025
  • Anmelden oder registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Forum
  • Dateien
  • Seiten
  • Bilder
  • Erweiterte Suche

Schön, dass du den Weg zu NodeZone.net gefunden hast! Aktuell bist du nicht angemeldet und kannst deshalb nur eingeschränkt auf unsere Community zugreifen. Um alle Funktionen freizuschalten, spannende Inhalte zu entdecken und dich aktiv einzubringen, registriere dich jetzt kostenlos oder melde dich mit deinem Account an.

Anmelden oder registrieren
    1. Nodezone.net Community
    2. Mitglieder
    3. ProteusSpectrum

    Beiträge von ProteusSpectrum

    • Eigenen DB Eintrag

      • ProteusSpectrum
      • 29. April 2018 um 21:47

      Zahlen liest di so aus der Datenbank (queryRequest.sqf von der life_server)

      _tmp = _queryResult select 7;

      _queryResult set[7,[_tmp] call DB_fnc_numberSafe];

      Die 7 musst du anpassen ^^

      und in der requestReceived musst du das so machen:

      perx_quests = parseNumber(_this select 7);

      und schon ist es eine Zahl


      Also bei dir muss es dann so heißen:

      perx_quests = parseNumber(_this select 14);

    • Eigenen DB Eintrag

      • ProteusSpectrum
      • 29. April 2018 um 16:22
      Zitat von Julian
      Code
      _query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', civ_licenses='%4', civ_gear='%5', arrested='%6', civ_stats='%7', civ_alive='%8', civ_position='%9', playtime='%10' , quest = (quest + 1) WHERE pid='%11'",_name,_cash,_bank,_licenses,_gear,[_this select 8] call DB_fnc_bool,_stats,[_alive] call DB_fnc_bool,_position,_playtime_update,_uid];  
      [_query,1] call DB_fnc_asyncCall;

      So wird es glaube ich nicht funktionieren... aber vielleicht guckst du es dir mal an ...

      Habe quest mal hinzugefügt .. aber wird so nicht klappen.. denke ich weil bei jedem call DB_fnc_asyncCall es pllus 1 gerchnet wird

      Mit dem würdest du das Questsystem total abfucken xD

      Du würdest nämlich hier bei JEDEM speichern die Questvariable hochsetzen, egal ob der User den Questteil abgeschlossen hat oder nciht

      Code
      quest = (quest + 1)

      Das habe ich noch nicht ausprobiert, also wüsste jetzt nicht ob das gehen würde.

      In diesem Fall absolut egal, weil es nicht den Sinn und Zweck erfüllen würde ^^

    • Eigenen DB Eintrag

      • ProteusSpectrum
      • 29. April 2018 um 16:19

      So, es gibt im missions-Ordner eine Datei, wo bereits die Variable hochgezählt wird, so habe ich das jetzt verstanden.

      Diese ist natürlich nur bis zum reconnect vorhanden.

      Du gehst in die Questdatei (wo die Variable aktualisiert wird) hinein und fügst in dem entsprechenden Abschnitt folgenden Code ein:

      [DEINCASE] call SOCK_fnc_updatePartial; //Hier musst du DEINCASE durch eine Zahl ersetzen! Hier: [8] call SOCK_fnc_updatePartial;

      Nun gehen wir in den core/session/ Ordner und öffnen die fn_updatePartial.sqf Datei.

      Dort erstellen wir ein neues Case.

      BSP:

      Code
      //Questsystem
      case 8:
      
      {
      
      _packet set[2,life_QuestLevel]; //Variable musst du natürlich anpassen ^^
      
      };

      _packet setzt sich hier wiefolgt zusammen: (0) - UID, (1) - Spielerseite, (2) - nil; hier: QuestLevel, (3) - Mode

      Nun gehst du in den Life_Server-Ordner und öffnest im Ordner life_server/functions/MySQL/ die fn_updatePartial.sqf

      Auch dort legst du ein neuen Case an.

      BSP:

      Code
      case 8: //MUSS GENAU DIE GLEICHE ZAHL SEIN WIE OBEN!!!
      {
          _value = [_this,2,0,[0]] call BIS_fnc_param;    //QUestlevel wird hier abgerufen
          _value = [_value] call DB_fnc_numberSafe;        //Wert in Nummer umgewandelt
          _query = format ["UPDATE players SET quest='%1' WHERE pid='%2'",_value,_uid];
      };

      und schon wird das Level immer aktualisiert, wenn du im Quest aufsteigst

      Nun ist die Speicherung implementiert, du musst nun nur noch den Wert aus der Datenbank auslesen lassen

    • Schießplatz-System

      • ProteusSpectrum
      • 29. April 2018 um 11:43
      Zitat von blackfisch

      eine Sache, die mir bei all deinen Tutorials aufgefallen ist: du nutzt zu viele globale Variablen ;) Die sollte man nur verwenden, wenn die dazu da sind wirklich irgendwas persistent für diverse Systeme zu speichern, nicht wie hier als Hit-Count z.B. ;)

      Das stimmt, wie gesagt, ich habe nun mit der Programmierung aufgehört und möchte einfach nur der Community ein paar Werke von mir veröffentlichen, damit die nicht auf der Festplatte schmoren xD

      Ich habe mit meiner Arma-Zeit vieles dazugelernt. Diese Skripte stammen von Anfang bis zum Ende, alles iwann gemacht und in der Mission verpackt. Da ich mich nun von A3 abwende, habe ich auch keine Lust mehr gehabt, alles umzuschreiben und zu verbessern ;)

    • Schießplatz-System

      • ProteusSpectrum
      • 29. April 2018 um 11:02
      Zitat von powerafro2

      Aber wer das Script verwenden will muss das Notification-System von Lucian benutzen oder das auf hint umschreiben.

      Hey :D danke :D habe es oben ergänzt ^^ mir gar nicht aufgefallen xD danke :D

    • Schießplatz-System

      • ProteusSpectrum
      • 29. April 2018 um 10:48

      Hallo Zusammen,

      hiermit möchte ich das Schießplatz-System für euch zugänglich machen.

      Mit diesem System ist es Spielern nur noch möglich, den Waffenschein zu erwerben, wenn diese das Schießtraining erfolgreich absolviert haben.

      Ihr dürft alles bearbeiten wie ihr möchtet!
      Ich habe mit der Arma 3 Programmierung aufgehört, sodass ich die Skripte nicht mehr gebrauchen kann, möchte diese aber nicht vorenthalten!
      Also viel Spaß damit!

      Fangen wir doch mal an:

      Ihr braucht entweder das Notification-System von Lucian oder schreibt es auf hint um.

      Dieses Skript ist nicht das performanteste bzw. bestgeschriebenste Skript! Auch ich lernte immer weiter dazu ;)

      Schritt 1: Geht in eure Mission.sqm

      mission.sqm

      1. Sucht euch eine Fläche

      2. Baut dort einen Schießplatz (lasst euren Ideen freien Lauf!) mit 8 Zielen Classname: "Target_PopUp_Moving_90deg_F"

      3. In die oberste Zeile tragt ihr bei jedem Ziel target1, target2, ...., target8 ein.

      4. Nun sucht euch eine Startposition aus und erstellt dort einen Marker mit dem Namen "start_1".

      5. Nun müsst ihr in der Nähe noch ein Schild platzieren, damit man das Training starten kann.

      Folgende Init benötigt ihr: "this addAction ['[$5000]Waffenlizenz erwerben',life_fnc_schiessplatz_start];"

      6. Das war nun der Mission.sqm Teil

      Schritt 2: Erstellt die Datei "fn_schiessplatz_start.sqf im Ordner core/civilian/ mit folgendem Inhalt

      C: fn_schiessplatz_start.sqf
      /**
       * fn_schiessplatz_start.sqf
       *
       * LICENSE: This file is subject to the terms and conditions defined in
       * file "LICENSE.md", which is part of this source code package.
       *
       * @author     ProteusSepctrum
       * @copyright  2018 ProteusSepctrum 
       *
       * Dieses Script sorgt dafür, dass die Spieler eine Schiessübung machen müssen, um den Waffenschein zu erhalten
       */
      #include "..\..\script_macros.hpp";
      hit = 0;
      
      _Statusabfrage = allPlayers select {_x getVariable ["Statusgunrange",false]};
      _statusrange = (count _Statusabfrage);
      if (license_civ_gun) exitWith {hint "Du hast schon eine Waffenlizenz!";};
      if(_statusrange >= 1) exitWith {hint "Es tut uns leid, leider können wir nur eine Person prüfen. Kommen sie ein anderes mal wieder oder warten sie ein paar Minuten";};
      if (CASH < 5000 ) exitWith {hint"Du hast nicht genügend Geld um die Prüfung anzutreten! Du benötigst 5000$";};
      if (!((handgunWeapon player) isEqualTo "")) exitWith {hint "Lege deine Waffe weg du bist nicht berechtigt diese zu tragen! Dich prüfen wir nicht";};
      if (!((primaryWeapon player) isEqualTo "")) exitWith {hint "Lege deine Waffe weg du bist nicht berechtigt diese zu tragen! Dich prüfen wir nicht!";};
      
      player setVariable ["Statusgunrange",true, true];
      CASH = CASH - 5000;
      hint "Du hast 5000$ für die Waffenschein-Prüfung ausgegeben!";
      sleep 2;
      hint "Begebe dich auf die Startposition!";
      sleep 2;
      hint "Du hast 15 Sekunden Zeit um auf die Startposition zu gehen!";
      sleep 2;
      _timeleft = 15;
      while {_timeleft >= 0} do {
          hintsilent format ["Prüfung startet in %1", [((_timeleft)/60)+.01,"HH:MM"] call bis_fnc_timetostring];
          _timeleft = _timeleft -1;
          sleep 1;
      };
      if ((player distance (getMarkerPos "start_1")) < 4) then {
          for "_i" from 1 to 2 do {player addMagazine "16Rnd_9x21_Mag";};
          player addWeapon "hgun_P07_khk_F";
      
          nopop = true;
          trueVar = false;
          timeleft = 20;
          hit = 0;
          target1 animate["terc",1];
          target2 animate["terc",1];
          target3 animate["terc",1];
          target4 animate["terc",1];
          target5 animate["terc",1];
          target6 animate["terc",1];
          target7 animate["terc",1];
          target8 animate["terc",1];
          
          target1 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target2 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target3 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target4 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target5 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target6 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target7 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          target8 addMPEventHandler ["MPHit", {hit = hit + 1;}];
          
          []spawn 
          {
              while {timeleft > 0} do 
              {
                  hintsilent format ["Verbleibende Zeit %1", [((timeleft)/60)+.01,"HH:MM"] call bis_fnc_timetostring];
                  timeleft = timeleft - 1;
                  sleep 1;
              };
              [] spawn life_fnc_schiessplatz_end;
          };
          []spawn 
          {
              while {timeleft > 0} do 
              {
                  _target = [];
                  _target = [target1,target2,target3,target4,target5,target6,target7,target8] call BIS_fnc_selectRandom;
                  _target animate["terc",0];
                  sleep 1.5;
                  hint format ["%1 Treffer.",hit];
                  _target animate["terc",1];
              };
          };
          
      } else {
          _handle = [] spawn life_fnc_schiessplatz_end;
          hint "Du hast warst nicht an der Startposition!";    
          CASH = CASH + 5000;
      };
      Alles anzeigen

      Schritt 3: Erstelle die Datei fn_schiessplatz_end.sqf im Ordner core/civilian/ mit folgendem Inhalt

      C: fn_schiessplatz_end.sqf
      /**
       * fn_schiessplatz_end.sqf
       *
       * LICENSE: This file is subject to the terms and conditions defined in
       * file "LICENSE.md", which is part of this source code package.
       *
       * @author     ProteusSepctrum
       * @copyright  2018 ProteusSepctrum 
       *
       * Dieses Script sorgt dafür, dass die Spieler eine Schiessübung machen müssen, um den Waffenschein zu erhalten
       */
      #include "..\..\script_macros.hpp";
      nopop = false;
      trueVar = false;
      out = false;
      player setVariable ["Statusgunrange",false, true];
      if (hit >= 8) then {
          hint "Du hast deine Prüfung bestanden und besitzt nun den Waffenschein!";    
          license_civ_gun = true;
      } else {
          hint "Du hast deine Prüfung nicht bestanden bitte übe noch etwas!";    
      };
      hit = 0;
      player removeWeapon "hgun_P07_khk_F";
      player removeMagazines "16Rnd_9x21_Mag";
      timeleft = 20;
      target1 animate["terc",0];
      target2 animate["terc",0];
      target3 animate["terc",0];
      target4 animate["terc",0];
      target5 animate["terc",0];
      target6 animate["terc",0];
      target7 animate["terc",0];
      target8 animate["terc",0];
      
      target1 removeAllMPEventHandlers "MPHit";
      target2 removeAllMPEventHandlers "MPHit";
      target3 removeAllMPEventHandlers "MPHit";
      target4 removeAllMPEventHandlers "MPHit";
      target5 removeAllMPEventHandlers "MPHit";
      target6 removeAllMPEventHandlers "MPHit";
      target7 removeAllMPEventHandlers "MPHit";
      target8 removeAllMPEventHandlers "MPHit";
      Alles anzeigen

      Schritt 4: Nun müsst ihr die neuerstellten Dateien noch in die Functions.h eintragen

      Code: functions.h
      class Civilian {
       file = "core\civilian";
       class schiessplatz_start{};
       class schiessplatz_end{};
       };

      Nun war´s das auch schon wieder!

      Viel Spaß!

    • Eigenen DB Eintrag

      • ProteusSpectrum
      • 29. April 2018 um 10:09

      perx, Was hast du vor?

      Questsystem, das ist klar, soll dies nur temporär oder dauerhaft sein?

      Sprich, sollst du nur während der Serverperiode auf diese Quests zugreifen oder sollst du auch nach Serverrestart darauf zugreifen?

      Solltest du nach Serverrestart auch noch darauf zugreifen sollen, kannst du deine Abfrage ganz einfach in die normalen SELECT-Statements deines Scriptes machen.

      (siehe dazu einfach die CopLevel oder so ^^)

      Sobald du deine Quest´s startest, lässt du einfach eine Variable von der geladenen 0 (aus der DB) auf 1 springen und diese Variable wird auch wie die ganzen anderen normal gespeichert, wenn du Speicherst.

      (musst es halt nur noch so einbauen)

      Oder du machst ein extra Statement dafür auf:

      UPDATE players SET quest='1' WHERE pid='%1'",_uid

      Aber ich muss sagen, dass dies schon die absoluten Basics sind, die man MINDESTENS drauf haben muss, ansonsten ist man auf der falschen Position ^^

    • theoretische Führerscheinprüfungen

      • ProteusSpectrum
      • 28. April 2018 um 21:57

      Hallo Zusammen,

      hiermit möchte ich euch mein Script zur theoretischen Führerscheinprüfung online stellen.

      Nun hat es sich ausgelacht für einige Spieler. Mit diesem Script ist es euch nicht mehr möglich, an den Lizenzen-Shop zu gehen und dort einfach die PKW/LKW-LIzenz zu kaufen.

      Mit diesem System muss jeder Bürger eine theoretische Prüfung ablegen, um den Führerschein zu erwerben.

      Ihr dürft alles bearbeiten wie ihr möchtet!

      Ich habe mit der Arma 3 Programmierung aufgehört, sodass ich die Skripte nicht mehr gebrauchen kann, möchte diese aber nicht vorenthalten.

      Also viel Spaß damit!

      Erstellt bevor ihr anfangt ein Backup! Ich garantiere nicht zur Lauffähigkeit dieses Scriptes und hafte für keine Fehler!

      Wir fangen mal an:

      Schritt 1: Wir erstellen den Informations-Dialog "info_theorie_fuhrerschein.hpp" ("Eure Mission/dialog/")

      Diese Datei befindet sich im Datei-Anhang

      Schritt 2: Wir erstellen den Prüfungs-Dialog "fuhrerscheine.hpp" ("Eure Mission/dialog/")

      Diese Datei befindet sich im Datei-Anhang

      Die Dialoge stammen aus einer etwas älteren Zeit, sodass die durchaus schöner gemcht werden können ;)


      Schritt 3: Nun hinterlegt die neuen Dateien in der "Masterhandler.hpp"

      C: MasterHandler.hpp
      #include "info_theorie_fuhrerschein.hpp"
      #include "fuhrerscheine.hpp"

      Schritt 4: Nun stellt ein Schild auf die mission.sqm und fügt diesem folgende Init hinzu:

      Code: mission.sqm
      this addAction ['PKW-Fuehrerschein beantragen', {createDialog 'life_info_theorie';},'',0,false,false,'',' vehicle player == player && player distance _target < 3 && playerSide == civilian && !license_civ_driver']; 
      this addAction ['LKW-Fuehrerschein beantragen', {createDialog 'life_info_theorie2';},'',0,false,false,'',' vehicle player == player && player distance _target < 3 && playerSide == civilian && !license_civ_trucking'];

      Schritt 5: Nun erstellen wir das PKW-Theorie-Prüfungs-Skript "fn_pkwtheorie.sqf" im Ordner "core/civilian/"

      Diese Datei befindet sich im Datei-Anhang

      Die Buttons sind immer gleich aufgebaut:

      Frage, Richtige Antwort und danach 2 falsche Antworten. Nur die Reihenfolge der richtigen buttons variiert!

      Schritt 6: Nun erstellen wir das LKW-Theorie-Prüfungs-Skript "fn_lkwtheorie.sqf" im Ordner "core/civilian/"

      Diese Datei befindet sich im Datei-Anhang

      Die Buttons sind immer gleich aufgebaut:

      Frage, Richtige Antwort und danach 2 falsche Antworten. Nur die Reihenfolge der richtigen buttons variiert!

      Schritt 7: Nun müssen wir noch die neuerstellen Dateien in der Functions.h eintragen

      Code: functions.h
      class Civilian {
              file = "core\civilian";
              class lkwtheorie{};
              class pkwtheorie{};
          };

      Das müsste es gewesen sein ;)

      Viel Spaß euch damit!!

      Dateien

      Fuehrerscheine.rar 217,04 kB – 846 Downloads
    • Dienstantritt als Zivilist

      • ProteusSpectrum
      • 28. April 2018 um 21:26

      Hallo Zusammen,


      ich habe nach langem hin und her überlege, mich dazu entschieden, dieses Script zu veröffentlichen.

      Das Script ist nicht das performanteste und bestgeschriebenste Script, denn auch ich lernte immer was dazu. Also es gibt bestimmt schönere Wege, wie man das gleiche Ziel erreichen kann.

      Was macht das Script??

      Das Script dient dem Einloggen als Zivilist. Das bedeutet, dass es keine weiteren Fraktionen ausser den Zivilisten gibt. Alle Polizisten und Sanitäter müssen sich als Zivilist einloggen, um ihren Dienst zu beginnen.

      WICHTIG: Dieses System ist NICHTS für Anfänger! Wer nur Copy/Pasten kann, sollte hier nicht weiterlesen! Dieses Skript bedarf weiterführende Kenntnisse in der Programmierung, deshalb Schwierigkeit 5!!

      Erstellt bevor ihr anfangt ein Backup! Ich garantiere nicht zur Lauffähigkeit dieses Scriptes und hafte für keine Fehler!

      Dieses System müsst ihr selbst einbauen können! Schwierigkeit 5 bedeutet, dass ihr dies alleine hinbekommen müsst!


      Ihr dürft alles bearbeiten wie ihr möchtet!


      Ich habe mit der Arma 3 Programmierung aufgehört, sodass ich die Skripte nicht mehr gebrauchen kann, möchte diese aber nicht vorenthalten.

      Also viel Spaß damit!


      Dann fangen wir doch mal an:

      Leider musste ich einige Dateien anhängen, da mir nur 20.000 Zeichen zur Verfügung stehen ...

      Datenbank-Teil:

      Schritt 1: (ich habe dies über PHPmyAdmin gemacht!)

      Spoiler anzeigen

      1. Öffnet die Tabelle "players" und klickt auf "Struktur".

      2. Sucht die Zeile "coplevel" und bearbeitet diese.

      3. Ändert den TYP von "ENUM" auf "INT" mit der Länge "2". Dadurch ist es euch möglich, bis zu 99 Ränge bei der Polizei zu erstellen.

      Dies müsste dann so aussehen:

      nodezone.net/attachment/13191/

      4. Habt ihr weitere Fraktionen (ADAC/Rettungsdienst), müsst ihr dies dort genauso tun!

      5. Durch diese Änderung ist es zudem möglich, Ingame die Spieler zu whitelisten.

      Missions-Teil:

      Schritt 2: Wir erstellen im Ordner "euer Missionsordner/core/" die Datei "fn_einloggen.sqf" mit folgendem Inhalt:

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 3: Wir erstellen im Ordner "euer Missionsordner/core/" die Datei "fn_ausloggen.sqf" mit folgendem Inhalt:

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 4: Wir gehen in die mission.sqm und geben folgende Init in einen Gegenstand ein:

      Code: mission.sqm
      this addAction['Polizeidienst beginnen',life_fnc_einloggen,'polizei',0,false,false,'','!life_cop'];   " \n "this addAction['Polizeidienst beenden',life_fnc_ausloggen,'polizei',0,false,false,'','life_cop'];

      Ihr könnt nach dem Tutorial alle Blufor und Opfor/Widerstand-NPC´s von der Karte entfernen!

      Schritt 5: In der configuration.sqf hinterlegen wir nun die hinzugefügten Variablen:

      Code: configuration.sqf
      life_rettungsdienst = false;
      life_cop = false;
      life_gehalt = false;

      Schritt 6: Ich habe meine fn_loadGear.sqf umgebaut. (/core/functions/)

      Code: fn_loadGear.sqf
      #include "..\..\script_macros.hpp"
      /*
          File: fn_loadGear.sqf
          Author: Bryan "Tonic" Boardwine
      
          Description:
          Loads saved civilian gear, this is limited for a reason and that's balance.
      */
      private ["_itemArray","_handle"];
      load_side = "";
      if(life_cop) then {load_side = "cop";};                            //Abfrage ob derzeit im Polizei-Dienst
      if(life_retttungsdienst) then {load_side = "san";};                //Abfrage ob derzeit im Rettungsdienst
      if(!life_retttungsdienst && !life_cop) then {load_side = "civ";};  //Falls beides nein, dann Zivilist
      [getPlayerUID player,load_side,player] remoteExec ["TON_fnc_holeUpdates",RSERV];    //Aufruf zur holeUpdates datei! (ANDERE WEISE DER DATENBESCHAFFUNG!!!)
      Alles anzeigen

      Schritt 7: Wir erstellen im Ordner "euer Missionsordner/core/functions/" die Datei "fn_loadGear2.sqf" mit folgendem Inhalt:

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 8: Ich habe meine fn_saveGear.sqf umgebaut. (/core/functions/)

      Code: fn_saveGear.sqf
      #include "..\..\script_macros.hpp"
      /*
          File: fn_saveGear.sqf
          Author: Bryan "Tonic" Boardwine
          Full Gear/Y-Menu Save by Vampire
          Edited: Itsyuka
      
          Description:
          Saves the players gear for syncing to the database for persistence..
      */
      private ["_return","_uItems","_bItems","_vItems","_pItems","_hItems","_yItems","_uMags","_vMags","_bMags","_pMag","_hMag","_uni","_ves","_bag","_handled","_savedVirtualItems"];
      _return = [];
      _savedVirtualItems = LIFE_SETTINGS(getArray,"saved_virtualItems");
      
      _return pushBack uniform player;
      _return pushBack vest player;
      _return pushBack backpack player;
      _return pushBack goggles player;
      _return pushBack headgear player;
      _return pushBack assignedITems player;
      if (playerSide isEqualTo west || playerSide isEqualTo civilian && {LIFE_SETTINGS(getNumber,"save_civilian_weapons") isEqualTo 1}) then {
          _return pushBack primaryWeapon player;
          _return pushBack handgunWeapon player;
      } else {
          _return pushBack [];
          _return pushBack [];
      };
      
      _uItems = [];
      _uMags  = [];
      _bItems = [];
      _bMags  = [];
      _vItems = [];
      _vMags  = [];
      _pItems = [];
      _hItems = [];
      _yItems = [];
      _uni = [];
      _ves = [];
      _bag = [];
      
      if (!(uniform player isEqualTo "")) then {
          {
              if (_x in (magazines player)) then {
                  _uMags pushBack _x;
              } else {
                  _uItems pushBack _x;
              };
          } forEach (uniformItems player);
      };
      
      if (!(backpack player isEqualTo "")) then {
          {
              if (_x in (magazines player)) then {
                  _bMags pushBack _x;
              } else {
                  _bItems pushBack _x;
              };
          } forEach (backpackItems player);
      };
      
      if (!(vest player isEqualTo "")) then {
          {
              if (_x in (magazines player)) then {
                  _vMags pushBack _x;
              } else {
                  _vItems pushBack _x;
              };
          } forEach (vestItems player);
      };
      
      if (count (primaryWeaponMagazine player) > 0 && alive player) then {
          _pMag = ((primaryWeaponMagazine player) select 0);
      
          if (!(_pMag isEqualTo "")) then {
              _uni = player canAddItemToUniform _pMag;
              _ves = player canAddItemToVest _pMag;
              _bag = player canAddItemToBackpack _pMag;
              _handled = false;
      
              if (_ves) then {
                  _vMags pushBack _pMag;
                  _handled = true;
              };
      
              if (_uni && !_handled) then {
                  _uMags pushBack _pMag;
                  _handled = true;
              };
      
              if (_bag && !_handled) then {
                  _bMags pushBack _pMag;
                  _handled = true;
              };
          };
      };
      
      if (count (handgunMagazine player) > 0 && alive player) then {
          _hMag = ((handgunMagazine player) select 0);
      
          if (!(_hMag isEqualTo "")) then {
              _uni = player canAddItemToUniform _hMag;
              _ves = player canAddItemToVest _hMag;
              _bag = player canAddItemToBackpack _hMag;
              _handled = false;
      
              if (_ves) then {
                  _vMags pushBack _hMag;
                  _handled = true;
              };
      
              if (_uni && !_handled) then {
                  _uMags pushBack _hMag;
                  _handled = true;
              };
      
              if (_bag && !_handled) then {
                  _bMags pushBack _hMag;
                  _handled = true;
              };
          };
      };
      
      if (count (primaryWeaponItems player) > 0) then {
          {
              _pItems pushBack _x;
          } forEach (primaryWeaponItems player);
      };
      
      if (count (handgunItems player) > 0) then {
          {
              _hItems pushBack _x;
          } forEach (handGunItems player);
      };
      
      {
          _val = ITEM_VALUE(_x);
          if (_val > 0) then {
              _yItems pushBack [_x,_val];
          };
      } forEach _savedVirtualItems;
      _savedVirtualItems = [];
      
      _return pushBack _uItems;
      _return pushBack _uMags;
      _return pushBack _bItems;
      _return pushBack _bMags;
      _return pushBack _vItems;
      _return pushBack _vMags;
      _return pushBack _pItems;
      _return pushBack _hItems;
      if (LIFE_SETTINGS(getNumber,"save_virtualItems") isEqualTo 1) then {
          _return pushBack _yItems;
          _yItems = [];
      } else {
          _return pushBack [];
      };
      
      life_gear = _return;
      if(!life_cop && !life_rettungsdienst) then {life_civ_gear = life_gear;[4] spawn life_fnc_UpdateSpieler;};    //Speichere Zivilisten-Inventar
      if(life_cop) then {life_cop_gear = life_gear;[5] spawn life_fnc_UpdateSpieler;};                             //Speichere Polizei-Inventar
      if(life_rettungsdienst) then {life_med_gear = life_gear;[6] spawn life_fnc_UpdateSpieler;};                  //Speichere Rettungsdienst-Inventar
      life_gear = [];
      _return = [];
      Alles anzeigen

      Schritt 9: Ich habe meine fn_requestReceived.sqf umgebaut. (/core/session/)

      Wichtig! Ihr dürft hier kein Copy/Paste machen! Selbst nachschauen und kontrollieren!!

      CONST(life_coplevel,(_this select 7)); müsst ihr zu life_copLevel = parseNumber(_this select 6); umbauen.

      Ihr braucht durch dieses Script keine Abfrage der Playerside mehr!!

      Code: fn_requestReceived.sqf (Beispiel)
      #include "..\..\script_macros.hpp"
      /*
          File: fn_requestReceived.sqf
          Author: Bryan "Tonic" Boardwine
      
          Description:
          Called by the server saying that we have a response so let's
          sort through the information, validate it and if all valid
          set the client up.
      */
      private _count = count _this;
      life_session_tries = life_session_tries + 1;
      if (life_session_completed) exitWith {}; //Why did this get executed when the client already initialized? 
      if (life_session_tries > 3) exitWith {cutText[localize "STR_Session_Error","BLACK FADED"]; 0 cutFadeOut 999999999;};
      
      0 cutText [localize "STR_Session_Received","BLACK FADED"];
      0 cutFadeOut 9999999;
      //Error handling and junk..
      if (isNil "_this") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
      if (_this isEqualType "") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
      if (count _this isEqualTo 0) exitWith {[] call SOCK_fnc_insertPlayerInfo;};
      if ((_this select 0) isEqualTo "Error") exitWith {[] call SOCK_fnc_insertPlayerInfo;};
      if (!(getPlayerUID player isEqualTo (_this select 0))) exitWith {[] call SOCK_fnc_dataQuery;};
      
      
      //Parse basic player information.
      CASH = parseNumber (_this select 2);
      BANK = parseNumber (_this select 3);
      life_adminlevel = (_this select 4);
      
      //Loop through licenses
      if (count (_this select 8) > 0) then {
          {missionNamespace setVariable [(_x select 0),(_x select 1)];} forEach (_this select 8);
      };
      
      life_gear_default = _this select 10;
      life_default_gear = life_gear_default;
      
      life_is_arrested = _this select 9;
      life_copLevel = parseNumber(_this select 6);
      life_medicLevel = parseNumber(_this select 5);
      life_panlevel = parseNumber(_this select 7);
      
      life_isCop = parseNumber(_this select 15);
      life_isMedic = parseNumber(_this select 16);
      life_isPan = parseNumber(_this select 17);
      life_justizlevel = parseNumber(_this select 18);
      
      if (LIFE_SETTINGS(getNumber,"save_playerStats") isEqualTo 1) then {
          life_hunger = ((_this select 11) select 0);
          life_thirst = ((_this select 11) select 1);
          player setDamage ((_this select 11) select 2);
      };
      
      life_houses = _this select (_count - 3);
      
      if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 1) then {
          life_is_alive = _this select 12;
          life_civ_position = _this select 13;
          if (life_is_alive) then {
              if !(count life_civ_position isEqualTo 3) then {diag_log format ["[requestReceived] Bad position received. Data: %1",life_civ_position];life_is_alive =false;};
              if (life_civ_position distance (getMarkerPos "respawn_civilian") < 300) then {life_is_alive = false;};
          };
      };
      
      {
          _house = nearestObject [(call compile format ["%1",(_x select 0)]), "House"];
          life_vehicles pushBack _house;
      } forEach life_houses;
      
      life_gangData = _this select (_count - 2);
      if !(count life_gangData isEqualTo 0) then {
          [] spawn life_fnc_initGang;
      };
      [] spawn life_fnc_initHouses;
      
      if (count (_this select (_count - 1)) > 0) then {
          {life_vehicles pushBack _x;} forEach (_this select (_count - 1));
      };
      
      life_session_completed = true;
      Alles anzeigen

      Schritt 10: Ich habe meine fn_updateRequest.sqf umgebaut. (/core/session/)

      Wichtig! Ihr dürft hier kein Copy/Paste machen! Selbst nachschauen und kontrollieren!!

      Code: fn_updateRequest.sqf (Beispiel)
      #include "..\..\script_macros.hpp"
      /*
          File: fn_updateRequest.sqf
          Author: Tonic
      
          Description:
          Passes ALL player information to the server to save player data to the database.
      */
      private ["_packet","_array","_flag","_alive","_position"];
      _side = "";
      if(life_cop) then {_side = "cop";};
      if(life_rettungsdienst) then {_side = "san";};
      if(!life_rettungsdienst && !life_cop ) then {_side = "civ";};
      _packet = [getPlayerUID player,(profileName),_side,CASH,BANK];
      _array = [];
      _alive = alive player;
      _position = getPosATL player;
      [] call life_fnc_saveGear;
      _flag = switch (playerSide) do {case west: {"cop"}; case civilian: {"civ"}; case independent: {"med"};};
      
      {
          _varName = LICENSE_VARNAME(configName _x,_flag);
          _array pushBack [_varName,LICENSE_VALUE(configName _x,_flag)];
      } forEach (format ["getText(_x >> 'side') isEqualTo '%1'",_flag] configClasses (missionConfigFile >> "Licenses"));
      
      _packet pushBack _array;
      
      if(!life_rettungsdienst && !life_cop) then
      {
          _packet pushBack life_civ_gear;
      };
      if(life_cop) then
      {
          _packet pushBack life_cop_gear;
      };
      
      if(life_rettungsdienst) then
      {
          _packet pushBack life_med_gear;
      };
      
      _array = [];
      _array pushBack life_hunger;
      _array pushBack life_thirst;
      _array pushBack (damage player);
      _packet pushBack _array;
      
      _packet pushBack life_coplevel;
      _packet pushBack life_medicLevel;
      
      _packet pushBack life_is_arrested;
      _packet pushBack _alive;
      _packet pushBack _position;
      
      
      if (life_HC_isActive) then {
          _packet remoteExecCall ["HC_fnc_updateRequest",HC_Life];
      } else {
          _packet remoteExecCall ["DB_fnc_updateRequest",RSERV];
      };
      Alles anzeigen

      Schritt 11: Wir erstellen im Ordner "euer Missionsordner/core/" die Datei "fn_paycheck.sqf" mit folgendem Inhalt:

      Code: fn_paycheck.sqf
      #include "..\script_macros.hpp"
      /**
       * fn_paycheck.sqf
       *
       * LICENSE: This file is subject to the terms and conditions defined in
       * file "LICENSE.md", which is part of this source code package.
       *
       * @author     ProteusSpectrum
       * @copyright  2016 ProteusSpectrum
       */
      if(life_gehalt) exitWith {};
      life_dienstgehalt = 0;
      systemChat format ["Du erhälst deinen Lohn in 15 Minuten."];
      life_gehalt = true;
      
      //Polizei
          while {life_cop} do
          {
              sleep 900;
              if(!life_cop) exitWith {};
              
              switch (life_coplevel) do
              {
                  case 1: {life_dienstgehalt = 8303;};    //Meisteranwärter
                  case 2: {life_dienstgehalt = 10303;};    //Polizeimeister
                  case 3: {life_dienstgehalt = 12303;};    //Polizeiobermeister
                  case 4: {life_dienstgehalt = 14303;};    //Polizeihauptmeister
                  case 5: {life_dienstgehalt = 16303;};    //Polizeikommissaranwärter
                  case 6: {life_dienstgehalt = 18303;};    //Polizeikommissar
                  case 7: {life_dienstgehalt = 20303;};    //Polizeioberkommissar
                  case 8: {life_dienstgehalt = 36900;};    //Polizeihauptkommissar
                  case 9: {life_dienstgehalt = 41000;};    //Polizeipräsident
              };
              systemChat format["Du hast deinen Lohn in Höhe von $%1 erhalten.",[life_dienstgehalt] call life_fnc_numberText];
              BANK = BANK + life_dienstgehalt;
              life_gehalt = false;
          };
      
      //Sanitäter
          while {life_rettungsdienst} do
          {
              sleep 900;
              if(!life_rettungsdienst) exitWith {};
              
              switch (life_medicLevel) do
              {
                  case 1: {life_dienstgehalt = 8303;};    //Ersthelfer
                  case 2: {life_dienstgehalt = 11070;};    //Rettungsdienst
                  case 3: {life_dienstgehalt = 14760;};    //Rettungssanitäter
                  case 4: {life_dienstgehalt = 36900;};    //Notarzt
                  case 5: {life_dienstgehalt = 41000;};    //Leitender Notarzt
              };
              systemChat format["Du hast deinen Lohn in Höhe von $%1 erhalten.",[life_dienstgehalt] call life_fnc_numberText];
              BANK = BANK + life_dienstgehalt;
              life_gehalt = false;
          };
      Alles anzeigen

      Schritt 12: Wir erstellen im Ordner "euer Missionsordner/core/civilian" die Datei "fn_UpdateSpieler.sqf" mit folgendem Inhalt:

      Diese Datei sorgt dafür, dass die Anfragen zur Speicherung an die Life_Server-Datei übergeben wird.

      Da ich noch weitere Funktionen eingefügt habe, müsst ihr euch diese Datei anpassen. Für dieses Tutoriale wichtige Inhalte habe ich euch markiert.

      Code: fn_UpdateSpieler.sqf
      #include "..\..\script_macros.hpp"
      /*
          File: fn_updateSpieler.sqf
          Author: Tonic
      
          Description:
          Passes ALL player information to the server to save player data to the database.
      */
      private ["_packet","_array","_flag","_alive","_position"];
      _mode = _this select 0;
      
      switch (_mode) do 
      {
          //Kontakte speichern
          case 0:
          {
              _packet = [0, getPlayerUID player, life_kontakte];
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
          //Kontakte laden
          case 1:
          {
              _packet = [1, getPlayerUID player, player];
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
          //Kontakte einspeichern
          case 2:
          {
              life_kontakte = _this select 1;
          };
          //AceActions Lizenzen speichern
          case 3:
          {
              _packet = [2, getPlayerUID player];
              _array = [];
              _flag = switch (playerSide) do {case west: {"cop"}; case civilian: {"civ"}; case independent: {"med"};};
              {
                  _varName = LICENSE_VARNAME(configName _x,_flag);
                  _array pushBack [_varName,LICENSE_VALUE(configName _x,_flag)];
              } forEach (format ["getText(_x >> 'side') isEqualTo '%1'",_flag] configClasses (missionConfigFile >> "Licenses"));
              _packet pushBack _array;
              
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
          //Zivilisten Gear
          case 4:
          {
              _packet = [3, getPlayerUID player, player, life_civ_gear];
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
          //Polizei Gear
          case 5:
          {
              _packet = [4, getPlayerUID player, player, life_cop_gear];
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
          //Rettungsdienst Gear
          case 6:
          {
              _packet = [5, getPlayerUID player, player, life_med_gear];
              _packet remoteExecCall ["TON_fnc_Updates",RSERV];
          };
      };
      Alles anzeigen

      Schritt 13: Nun müsst seit ihr dran:

      Code
      Alle Abfragen von der Playerside (BSP: switch (playerSide) do { ... };) auf folgendes umschreiben:
      Bei Polizei: if(life_cop)then {...};
      Bei Rettungsdienst: if(life_rettungsdienst)then {...};
      Da dies je nach Mission unterschiedlich ist, müsst ihr das erledigen!

      Schritt 14: Nun müsst ihr nur noch die neuerstellten Dateien in die functions.h eintragen im entsprechenden Bereich und die RemoteExec Aufruf-Dateien in der CfgRemoteExec.hpp!

      Da dieses Tutorial die Stufe 5 vorweist, denke ich, dass ihr das selbst hinbekommen müsst.


      Life-Server-Teil:

      Schritt 15: Nun geht in die "life_server/init.sqf" und fügt folgendes hinzu (sofern nicht schon vorhanden!)

      Code: fn_init.sqf
      unter der Zeile "[8,true,24] execFSM "\life_server\FSM\timeModule.fsm";"
      
      life_adminLevel = 0;
      life_medicLevel = 0;
      life_copLevel = 0;

      Schritt 16: Nun geht in die "life_server/functions/MySQL/fn_queryRequest.sqf".

      Wichtig: Wer hier Copy/Paste macht, ist selbst Schuld! Dies muss genau an euren Server angepasst sein!

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 17: Nun geht in die "life_server/functions/MySQL/fn_updateRequest.sqf".

      Wichtig! Ihr müsst auch hier selbst nachdenken! Wer keine fortgeschrittenen Kenntnisse hat, sollte von diesem System die Finger weglassen!

      Bei mir sind alle Abfragen anders! Die angehängte Datei ist nur ein Beispiel!!!

      Die Datei ist für euch in den Dateinanhängen hinterlegt.


      Aufgrund der maximalen Statement-Länge habe ich die Lizenzen getrennt von den Variablen gespeichert und in ein eigenes Statement gepackt.

      Schritt 18: Wir erstellen im Ordner "life_server/functions/Systems/" die Datei "fn_holeUpdates.sqf" mit folgendem Inhalt:

      Diese Datei sorgt dafür, dass alle Spielerinventare auf Anfrage geladen werden!

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 19: Wir erstellen im Ordner "life_server/functions/Systems/" die Datei "fn_Updates.sqf" mit folgendem Inhalt:

      Auch hier hatte ich weitere Update-Statements, die ihr ignorieren könnt.

      Die Datei ist für euch in den Dateinanhängen hinterlegt.

      Schritt 20: Auch hier müsst ihr alle neu erstellen Dateien in die entsprechenden Dateien eintragen.

      Das solltet ihr hinbekommen.

      Nun sollte alles wichtige implementiert sein.

      Ich wünsche euch viel Spaß mit diesem System!

      Dateien

      Dienstantritt.rar 8,14 kB – 638 Downloads
    • Brauche Hilfe bei fn_vehInvSearch

      • ProteusSpectrum
      • 18. Januar 2016 um 14:40

      Hallo liebe Native-Gamer Community,

      ich möechte gerne meine fn_vehInvSearch.sqf umschreiben.

      Bekomme aber immer diesen Fehler:

      Spoiler anzeigen


      16:39:22 Error in expression <select 0 == _item) then
      {
      (_x select 1) = ((_x select 1) + 1);
      }
      else
      {
      _x = _x >
      16:39:22 Error position: <= ((_x select 1) + 1);
      }
      else
      {
      _x = _x >
      16:39:22 Error Missing ;
      16:39:22 File mpmissions\...\core\cop\fn_vehInvSearch.sqf, line 38
      16:39:22 Error in expression <select 0 == _item) then
      {
      (_x select 1) = ((_x select 1) + 1);
      }
      else
      {
      _x = _x >
      16:39:22 Error position: <= ((_x select 1) + 1);
      }
      else
      {
      _x = _x >
      16:39:22 Error Missing ;

      Der Dateiabschnitt sieht wiefolgt aus:

      Spoiler anzeigen


      #include <macro.h>
      /*
      File: fn_vehInvSearch.sqf
      Author: Bryan "Tonic" Boardwine

      Description:
      Searches the vehicle for all items.
      */
      private["_vehicle","_vehicleInfo","_value","_return","_array","_item","_itemValue = (_x select 1)","_itemValue = _itemValue + 1","_itemValue = (_x select 1)"];
      _vehicle = cursorTarget;
      if(isNull _vehicle) exitWith {};
      if(!((_vehicle isKindOf "Air") OR (_vehicle isKindOf "Ship") OR (_vehicle isKindOf "LandVehicle"))) exitWith {};

      _vehicleInfo = _vehicle getVariable ["Trunk",[]];
      if(count _vehicleInfo == 0) exitWith {hint localize "STR_Cop_VehEmpty"};
      _return = "";
      _array = [];
      _item = "";

      _value = 0;
      {
      _var = _x select 0;
      _val = _x select 1;
      _index = [_var,__GETC__(sell_array)] call TON_fnc_index;
      if(_index != -1) then
      {
      _vIndex = [_var,__GETC__(sell_array)] call TON_fnc_index;
      if(_vIndex != -1) then
      {
      _value = _value + (_val * ((__GETC__(sell_array) select _vIndex) select 1));
      _item = (__GETC__(sell_array) select _vIndex) select 0;
      {
      if (_x select 0 == _item) then
      {
      (_x select 1) = ((_x select 1) + 1);
      }
      else
      {
      _x = _x + [[_item, 1]];
      };
      } foreach (_array);
      };
      };
      } foreach (_vehicleInfo select 0);

      if (_value > 0) then
      {
      _return = "Der Spieler hat folgende Gegenstände im Fahrzeug:<br/>";
      {
      _return = _return + _x select 1 + "x " + _x select 0 + "<br/>";
      } foreach (_array);
      hint _return;
      }
      else
      {
      hint "Dieses Fahrzeug ist leer";
      };


      Ich möchte gerne, dass die Cops alles in den Fahrzeugen sehen können, sprich auch die legalen Items.

      Vielleicht könnt ihr mir ja weiterhelfen!

      Danke im Voraus!

      Gruß Marcel

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von Native-Servers.com? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Benutzerkonto erstellen

    Wichtige Links & Informationen

    Server & Hosting-Ressourcen

      Server Administration & Hosting Basics

      Windows Server Support & Guides

      Linux Server Configuration & Help

      Setting up TeamSpeak 3 & VoIP Servers

      Domains & Web Hosting for Beginners & Professionals

      Cloud Hosting, Docker & Kubernetes Tutorials

    Gameserver & Modding-Ressourcen

      ArmA 3 Tutorials & Script Collection

      Renting & Operating Gameservers

      DayZ Server Management & Help

      FiveM (GTA V) Server & Script Development

      Rust Server Modding & Administration

      Setting up & Optimizing ARK Survival Servers

    NodeZone.net – Deine Community für Gameserver, Server-Hosting & Modding

      NodeZone.net ist dein Forum für Gameserver-Hosting, Rootserver, vServer, Webhosting und Modding. Seit 2015 bietet unsere Community eine zentrale Anlaufstelle für Server-Admins, Gamer und Technikbegeisterte, die sich über Server-Management, Hosting-Lösungen und Spielemodding austauschen möchten.


      Ob Anleitungen für eigene Gameserver, Hilfe bei Root- und vServer-Konfigurationen oder Tipps zu Modding & Scripting – bei uns findest du fundiertes Wissen und praxisnahe Tutorials. Mit einer stetig wachsenden Community findest du hier Antworten auf deine Fragen, Projektpartner und Gleichgesinnte für deine Gaming- und Serverprojekte. Schließe dich NodeZone.net an und werde Teil einer aktiven Community rund um Server-Hosting, Gameserver-Management und Modding-Ressourcen.

    Wer jetzt nicht teilt ist selber Schuld:
    1. Nutzungsbestimmungen
    2. Datenschutzerklärung
    3. Impressum
    4. Urheberrechts- oder Lizenzverstoß melden
  • Trimax Design coded & layout by Gino Zantarelli 2023-2025©
    Community-Software: WoltLab Suite™