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
Do: 22 Mai 2025
  • Anmelden oder registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • 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. Forum
    3. Gameserver & Hosting
    4. ArmA Series - ArmA 3 / Reforger
    5. Tutorials & Releases

    [Tutorial] Risk's verbessertes Verarbeiten

      • Altis Life
    • Risk
    • 1. August 2019 um 21:33
    • Risk
      Kenner
      Reaktionen
      193
      Trophäen
      11
      Beiträge
      573
      • 1. August 2019 um 21:33
      • #1

      Servus Leute.

      Hier mal eine fn_processAction von mir. Ihr habt eine Zeit Pro Item + Abfrage für einen Skill von Maverick.

      Ja mehr gibt es da nicht zu sagen :D

      Bei Verbesserungen bitte melden.

      Kann auch leider keine Commands in das Script machen oder schritt für schritt Anleitung weil ich einiges verändert habe.

      Hier ein Config Beispiel

      Spoiler anzeigen
      Code
      class die_sippe_Sunflower {
              MaterialsReq[] = {{"die_sippe_SunflowerU",1}};
              MaterialsGive[] = {{"die_sippe_SunflowerP",1}};
              Text = "Sonnenblumen verarbeiten";
              NoLicenseCost = 1200;
              time = 8;
              benoetigteLizenz = "farmer";
              skill = "perk_gaertner_4";
          };

      Die Zeit ist hier die Zeit Pro Item in Sekunden. Das heißt Pro Item benötigt ihr hier 8 Sekunden.


      fn_processAction.sqf

      Spoiler anzeigen
      Code
      #include "..\..\script_macros.hpp"
       /*
          File: fn_processAction.sqf
          Author: Bryan "Tonic" Boardwine
          Modified : NiiRoZz
          rewriten by Risk
          Description:
          Master handling for processing an item.
          NiiRoZz : Added multiprocess
      */
      params[
          ["_vendor", objNull, [objNull]],
          "",
          "", 
          ["_type", "", [""]]
      ];
      //Error check
      if (isNull _vendor || _type isEqualTo "" || (player distance _vendor > 10)) exitWith {};
      life_action_inUse = true; //Lock out other actions during processing.
      private _materialsRequired = M_CONFIG(getArray, "ProcessAction", _type, "MaterialsReq");
      private _materialsGiven = M_CONFIG(getArray, "ProcessAction", _type, "MaterialsGive");
      private _processTime = M_CONFIG(getNumber, "ProcessAction", _type, "time");
      private _neededLicense = M_CONFIG(getText, "ProcessAction", _type, "benoetigteLizenz");
      private _text = M_CONFIG(getText, "ProcessAction", _type, "Text");
      //private _xpToAdd = M_CONFIG(getNumber, "ProcessAction", _type, "XPtoAdd");
      private _noLicenseCost = M_CONFIG(getNumber, "ProcessAction", _type, "noLicenseCost");
      _processTime = _processTime - missionNamespace["mav_ttm_var_processMultiplier",0];
      
      if(isLocalized _text) then{
          _text = localize _text;
      }else{
          diag_log format["::::processAction - %1[TYPE:%2] wurde nicht localized", _text, _type];
          diag_log format["::::processAction - %1[TYPE:%2] wurde nicht localized", _text, _type];
          diag_log format["::::processAction - %1[TYPE:%2] wurde nicht localized", _text, _type];
      };
      private _itemInfo = [_materialsRequired, _materialsGiven, format ["%1", _text]];
      
      if (count _itemInfo isEqualTo 0) exitWith {
          life_action_inUse = false;
      };
      
      //Setup vars.
      _itemInfo params[
          "_oldItem",
          "_newItem",
          "_upp"
      ];
      _exit = false;
      if (count _oldItem isEqualTo 0) exitWith {
          life_action_inUse = false;
      };
      if !(getText(missionConfigFile >> "ProcessAction" >> _type >> "skill") isEqualTo "NONE" OR [life_currentExpPerks, getText(missionConfigFile >> "ProcessAction" >> _type >> "skill")] call mav_ttm_fnc_hasPerk) exitWith{
          hint format["Du benötigst den %1 Skill um hier zu verarbeiten!", getText(missionConfigFile >> "Maverick_TTM" >> "perks" >> getText(missionConfigFile >> "ProcessAction" >> _type >> "skill") >> "displayName")];
          life_action_inUse = false;  
          life_is_processing = false;      
      };
      
      private _totalConversions = []; 
      {
          _var = ITEM_VALUE(_x select 0);
          if (_var isEqualTo 0) exitWith {
              _exit = true;
          };
          if (_var < (_x select 1)) exitWith {
              _exit = true;
          };
          _totalConversions pushBack(floor(_var / (_x select 1)));
      } forEach _oldItem;
      
      //private _xpToAddEnd = format["ItemProcessed_%1", _xpToAdd];
      
      if (_exit) exitWith {
          life_is_processing = false;
          hint "Es gibt nicht's (nicht's mehr) zum verarbeiten!";
          life_action_inUse = false;
      };
      private _hasLicense = false;
      _hasLicense = LICENSE_VALUE(_neededLicense, "civ");
      
      private _minimumConversions = _totalConversions call BIS_fnc_lowestNum;
      private _oldItemWeight = 0; 
      {
          _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
          _oldItemWeight = _oldItemWeight + _weight;
      }count _oldItem;
      
      _newItemWeight = 0;
      {
          _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1);
          _newItemWeight = _newItemWeight + _weight;
      } count _newItem;
      
      _exit = false;
      
      if (_newItemWeight > _oldItemWeight) then {
          _netChange = _newItemWeight - _oldItemWeight;
          _freeSpace = life_maxWeight - life_carryWeight;
          if (_freeSpace < _netChange) exitWith {
              _exit = true;
          };
          private _estConversions = floor(_freeSpace / _netChange);
          if (_estConversions < _minimumConversions) then {
              _minimumConversions = _estConversions;
          };
      };
      
      if (!_hasLicense) then {
          private _licenseText = M_CONFIG(getText, "Licenses", _neededLicense, "displayName");
          private _action = [
              format["Dir fehlt die %1, willst du trotzdem verarbeiten? Es würde dich %2 %3 kosten.", localize _licenseText, _noLicenseCost, (localize "STR_Item_Money")],
              format["%1", _text],
              localize "STR_Global_Yes",
              localize "STR_Global_No"
          ] call BIS_fnc_guiMessage;
          if (_action) then {
              if (CASH < _noLicenseCost) then { 
                  hint "Du hast leider nicht genug Geld dabei!"; 
                  _exit = true;
              }else{
                  CASH = CASH - _noLicenseCost;
                  _hasLicense = true;
              };
          }else{
              _exit = true;
          };
      };
      if (_exit) exitWith {
          life_is_processing = false;
          life_action_inUse = false;
      };
      
      //Setup our progress bar.
      disableSerialization;
      "progressBar" cutRsc ["life_progress", "PLAIN", 2, false];
      private _ui = uiNamespace getVariable "life_progress";
      private _progress = _ui displayCtrl 38201;
      private _pgText = _ui displayCtrl 38202;
      _pgText ctrlSetText format["%1", _upp];
      _progress progressSetPosition 0.01;
      private _cP = 0.01;
      _dauerInSek = 0;
      private _processRuns = 0; 
      {
          _dauerInSek = (_x select 1) * _minimumConversions;
      } count _newItem;
      
      _dauerInSek = _dauerInSek * _processTime;
      private _anzahlPausen = _dauerInSek / 0.1;
      private _fortschrittProIntervall = 1.10 / _anzahlPausen;
      if _hasLicense then {
          life_is_processing = true;
      };
      if (!life_is_processing) exitWith {
          hint "verarbeiten abgebrochen!";
          "progressBar" cutText ["", "PLAIN"];
          life_is_processing = false;
          life_action_inUse = false;    
      };
      
      for "_i" from 0 to 1 step 0 do {
          uiSleep 0.1;
          _cP = _cP + _fortschrittProIntervall;
          _progress progressSetPosition _cP;
          _pgText ctrlSetText format["%1", _upp];
          if (_cP >= 1) exitWith {};
          if (player distance _vendor > 10) exitWith {
              hint localize "STR_Process_Stay";
              "progressBar" cutText ["", "PLAIN"];
              life_is_processing = false;
              life_action_inUse = false;
          };
      };
      
      if (player distance _vendor > 10) exitWith {
          hint localize "STR_Process_Stay";
          "progressBar" cutText ["", "PLAIN"];
          life_is_processing = false;
          life_action_inUse = false;
      };
      
      {
          [false,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
      } count _oldItem;
      
      {
          [true,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv;
      } count _newItem;
      
      "progressBar" cutText ["", "PLAIN"];
      player playMoveNow "Stand";
      life_is_processing = false;
      life_action_inUse = false;
      //[_xpToAddEnd] spawn mav_ttm_fnc_addExp;
      Alles anzeigen

      Wenn ihr script Ideen habt lasst es mich wissen. Ich werde diese dann immer im Stream mit euch umsetzten.

      mfg Risk

      https://www.twitch.tv/theriskarma

    • CrypteX
      Fortgeschrittener
      Reaktionen
      23
      Trophäen
      9
      Beiträge
      316
      • 1. August 2019 um 23:10
      • #2

      Hey Risk,

      daumen hoch dafür, aber falls du es noch nicht getestet hast, Zeile 27 müsste so aussehen so wird ein Fehler ausgeworfen.

      Code
      _processTime = _processTime - (missionNamespace["mav_ttm_var_processMultiplier", 1]);

      Eben getestet und korrigiert, danach läufts super.

    • Saturin78
      Profi
      Reaktionen
      409
      Trophäen
      10
      Beiträge
      1.340
      • 2. August 2019 um 05:07
      • #3

      Haha Risk,

      Wenn das nun noch so zu erweitern ist,, dass man direkt die items aus dem eigenen Fahrzeug verarbeiten kann, auch wenn mehrere Leite mit Fahrzeugen da stehen, dann muss ich leider brüllen : " Risk ich will ein Kind von dir! Heirate mich." :P :D

      Genau sowas versuche ich grad.

      Tapse mich wieder ins Arma3 xxx-Life rein :D

    • Risk
      Kenner
      Reaktionen
      193
      Trophäen
      11
      Beiträge
      573
      • 2. August 2019 um 09:19
      • #4
      Zitat von CrypteX

      Hey Risk,

      daumen hoch dafür, aber falls du es noch nicht getestet hast, Zeile 27 müsste so aussehen so wird ein Fehler ausgeworfen.

      Code
      _processTime = _processTime - (missionNamespace["mav_ttm_var_processMultiplier", 1]);

      Eben getestet und korrigiert, danach läufts super.

      Vllt weil du die skills nicht hast? :D

      Weil bei mir läufts :D

      mfg Risk

      https://www.twitch.tv/theriskarma

    • Risk
      Kenner
      Reaktionen
      193
      Trophäen
      11
      Beiträge
      573
      • 2. August 2019 um 09:21
      • #5
      Zitat von Saturin78

      Haha Risk,

      Wenn das nun noch so zu erweitern ist,, dass man direkt die items aus dem eigenen Fahrzeug verarbeiten kann, auch wenn mehrere Leite mit Fahrzeugen da stehen, dann muss ich leider brüllen : " Risk ich will ein Kind von dir! Heirate mich." :P :D

      Genau sowas versuche ich grad.

      Ja kann ich mich die tage dran setzen. Morgen erstmal heiraten :D

      mfg Risk

      https://www.twitch.tv/theriskarma

    • Krypton91
      Schüler
      Reaktionen
      10
      Trophäen
      7
      Beiträge
      154
      • 2. August 2019 um 09:46
      • #6

      Wenn du willst das er die Items aus dem Inventar vom Auto nimmt musst du eigentlich nur in der Init des Schildes das PlayerInv also wo er die Abfrage macht ob du das zeug im Inventar hast durch dein Fahrzeug inventar ersetzen also so: (Bitte testen bin am Handy und hatte kein Wiki ;D)

      Code
      this enableSimulation false;  this allowDamage false;  this addAction[localize"STR_MAR_Process_Rock",life_fnc_processAction,"cement",0,false,false,"",' life_inv_rock > 0 && !life_is_processing && !life_action_inUse',5];  this addAction[format ["%1 ($%2)",localize (getText(missionConfigFile >> "Licenses" >> "cement" >> "displayName")), [(getNumber(missionConfigFile >> "Licenses" >> "cement" >> "price"))] call life_fnc_numberText],life_fnc_buyLicense,"cement",0,false,false,"",' !license_civ_cement && playerSide isEqualTo civilian ',5];

      wird zu:

      Code
      this enableSimulation false;  this allowDamage false;  this addAction[localize"STR_MAR_Process_Rock",life_fnc_processAction,"cement",0,false,false,"",' vehInventory_rock > 0 && !life_is_processing && !life_action_inUse',5];  this addAction[format ["%1 ($%2)",localize (getText(missionConfigFile >> "Licenses" >> "cement" >> "displayName")), [(getNumber(missionConfigFile >> "Licenses" >> "cement" >> "price"))] call life_fnc_numberText],life_fnc_buyLicense,"cement",0,false,false,"",' !license_civ_cement && playerSide isEqualTo civilian ',5];

      ---------------------------------------------------------

      Projektleitung bei http://forum.planb-life.com

      teamspeak: ts.planb-life.com

    • blackfisch
      Legende
      Reaktionen
      2.944
      Trophäen
      9
      Beiträge
      5.966
      Dateien
      6
      Bilder
      63
      • 2. August 2019 um 13:00
      • #7
      Zitat von Krypton91

      Wenn du willst das er die Items aus dem Inventar vom Auto nimmt musst du eigentlich nur in der Init des Schildes das PlayerInv also wo er die Abfrage macht ob du das zeug im Inventar hast durch dein Fahrzeug inventar ersetzen also so: (Bitte testen bin am Handy und hatte kein Wiki ;D)

      Code
      this enableSimulation false;  this allowDamage false;  this addAction[localize"STR_MAR_Process_Rock",life_fnc_processAction,"cement",0,false,false,"",' life_inv_rock > 0 && !life_is_processing && !life_action_inUse',5];  this addAction[format ["%1 ($%2)",localize (getText(missionConfigFile >> "Licenses" >> "cement" >> "displayName")), [(getNumber(missionConfigFile >> "Licenses" >> "cement" >> "price"))] call life_fnc_numberText],life_fnc_buyLicense,"cement",0,false,false,"",' !license_civ_cement && playerSide isEqualTo civilian ',5];

      wird zu:

      Code
      this enableSimulation false;  this allowDamage false;  this addAction[localize"STR_MAR_Process_Rock",life_fnc_processAction,"cement",0,false,false,"",' vehInventory_rock > 0 && !life_is_processing && !life_action_inUse',5];  this addAction[format ["%1 ($%2)",localize (getText(missionConfigFile >> "Licenses" >> "cement" >> "displayName")), [(getNumber(missionConfigFile >> "Licenses" >> "cement" >> "price"))] call life_fnc_numberText],life_fnc_buyLicense,"cement",0,false,false,"",' !license_civ_cement && playerSide isEqualTo civilian ',5];

      das wird so in keiner Form funktionieren.

      1. Wie kommst du drauf, das Fahrzeuginventar wird in Variablen beim Spieler gespeichert? Das liegt auf dem Fahrzeug.

      2. Nur weils in der Condition steht macht das Script doch nichts damit

      Wenn's so einfach wäre würde das ja jeder machen :) In der Praxis ist das gespeicherte Inventar vom Fahrzeug erstmal komplett anders aufgebaut und damit ein Grauen (finde ich) damit zu arbeiten

      #MakeArmaNotWar

      Kein Support via PN & Steam! / No Support via DM & Steam!


      Mit freundlichen Grüßen
      blackfisch
      ______________________

      Web: blackfisch.me

      GitHub: GitHub.com/blackfisch

      Mail: [email protected]

      ______________________
      Wichtige Links:
      [Erklärung|Leitfaden] Code Optimierung

      [Tutorial] life_fnc_MP zu remoteExec

      Ohne Logs & entsprechende Dateien kein Support!

      ______________________

    Registrieren oder Einloggen

    Du bist noch kein Mitglied von NodeZone.net? Registriere dich kostenlos und werde Teil einer großartigen Community!

    Registrieren

    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™