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: 28 August 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. moeck

    Beiträge von moeck

    • [TUTORIAL][Altis Life 4.4r3] RyanTTs Dynamic Market System

      • moeck
      • 11. April 2018 um 23:22

      kann man bestimmt einbauen, allerdings müsste man sich das mal genauer anschauen ;)

    • [Tutorial] Drogendealer und andere illegale Shops abfragen

      • moeck
      • 11. April 2018 um 22:41

      hmpf, problem ist ich habe keine 5.0 bzw 4.4. zum testen sondern schreibe das für die tuts immer um. ich schaue morgen nochmal nach. oder schaue mal bei dir wie die requestreceive aufgerufen wird

    • Sie wurden aus dem Spiel entfernt. (BattlEye: AttachToRestriction#1)

      • moeck
      • 11. April 2018 um 20:32

      es könnte dieser eintrag sein ![BO]_MRAP_0[12]_(hmg_)?F

    • [TUTORIAL][Altis Life 4.4r3] RyanTTs Dynamic Market System

      • moeck
      • 11. April 2018 um 20:30

      das ist ein faktor _itemFactorOfGroup der wiederum hier verwendet wird _NEWPRICE = _curItemOldPrice-(_itemAmountSold*(_curItemOldPrice/2000)*_itemFactorOfGroup); anscheined kann man damit bestimmen wie stark der Preis pro Gruppe schwanken soll.

      Also verät mir das gerade heruntergeladene Script das so 8o

    • [Tutorial] Drogendealer und andere illegale Shops abfragen

      • moeck
      • 11. April 2018 um 19:34

      So update gemacht, übrigens fehlte die erste Zeile also das include dash aber hier auch nochmal die geänderte Datei ^^ inklusive dem umbau auf remoteExec dash

      C: fn_receiveDealer.sqf
      #include "..\..\script_macros.hpp"
      /*
          File: fn_receiveDealer.sqf
          Author: moeck (Lost of Paradise)
          
          Description:
          Get the answer from the dealer
      */
      params [
          ["_sellers",[],[[]]]
          ,["_shop","",[""]]
      ];
      if( _sellers isEqualTo []) exitWith {hint localize "STR_Cop_DealerQuestion"}; //No data.
      life_action_inUse = true;
      _crimes = LIFE_SETTINGS(getArray,"crimes");
      
      _names = "";
      {
          _val = 0;
          if ((_x select 2) > 150000) then {
              _val = round((_x select 2) / 16);
          } else {
              _val = ["483",_crimes] call TON_fnc_index;
              _val = ((_crimes select _val) select 1);
              if (_val isEqualType "") then {
                  _val = parseNumber _val;
              };
          };
          [(_x select 0),(_x select 1),"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV];
          _names = _names + format ["%1<br/>",(_x select 1)];
          true
      } count _sellers;
      
      hint parseText format [(localize "STR_Cop_DealerMSG")+ "<br/><br/>%1",_names];
      [2,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV];
      life_action_inUse = false;
      Alles anzeigen
    • [Tutorial] Drogendealer und andere illegale Shops abfragen

      • moeck
      • 11. April 2018 um 19:03

      ups, da habe ich noch so nen life_fnc_MP vergessen dash ändere das dann

    • Ein Skin auf der selben Klamotte

      • moeck
      • 11. April 2018 um 13:03

      BeFreezy klar geht es auch mit einer Variablen, daher hatte ich ja geschrieben dass lizenz oder coplevel 2 von mehreren Möglichkeiten sind. Man kann auch den Kontostand oder Waffe oder oder nehmen ^^ ganz nach dem eigenen geschmack 8o

    • Wie viel Stunden habt ihr?

      • moeck
      • 11. April 2018 um 00:26

      zu viele ^^ über 5,1k

    • Ein Skin auf der selben Klamotte

      • moeck
      • 11. April 2018 um 00:25

      so als tipp über lizenz oder coplevel wären 2 von mehreren möglichkeiten ;)

    • [Tutorial] Drogendealer und andere illegale Shops abfragen

      • moeck
      • 10. April 2018 um 23:22

      #Update: nun durchgetestet und funktionsfähig 8)

    • Sie wurden aus dem Spiel entfernt. (BattlEye: AttachToRestriction#1)

      • moeck
      • 10. April 2018 um 20:10

      so und welches Fahrzeug hast du eingefügt?

    • [TUTORIAL][Altis Life 4.0+] AAN News Rundnachrichten

      • moeck
      • 10. April 2018 um 17:20

      Lad Dir mal die common.hpp und newsStation.hpp aus dem Framework runter.

    • [IDEE] Zusammenschluss mit Unternehmensstruktur

      • moeck
      • 10. April 2018 um 15:23

      Moin,

      ja kann funktionieren nur gibt es die Herausforderung, die passenden Leute zu finden. Leider gibt es zum Beispiel gute Scripter nicht wie Sand am Meer. Die meisten Scripter, die nicht nur per Copy & Paste arbeiten haben in der Regel schon ein Projekt oder sind mittlerweile nicht mehr im Arma Umfeld aktiv. Klar kann man alles lernen und vor 1,5 Jahren war ich selbst noch ein Neuling im Scripten, aber ich denke das ist eher die Ausnahme.

      Des Weiteren gibt es mittlerweile eine relativ starke Konkurenz im Umfeld Altis Life mit den GTA Mod und aktuell sehe ich halt einfach relativ viele Leute Richtung GTA abwandern, da man dort einfach von Haus aus mehr Möglichkeiten hat und das Ganze nicht so militärisch angehaucht ist.

      Es käme halt auf einen Versuch an sofern es Projekt gibt, die sich auf so ein Experiment einlassen.

      Gruß,

      moeck

    • Sie wurden aus dem Spiel entfernt. (BattlEye: AttachToRestriction#1)

      • moeck
      • 10. April 2018 um 14:47

      Dann solltest du mal in deinen BEFiltern schauen ob da etwas gelistet ist ;) . Vermutlich in der attachto.txt

    • Skin Switch

      • moeck
      • 10. April 2018 um 13:52

      So je nachdem welche Variante Du nutzen möchtest musst Du halten den Aufruf gestalten. In meinem Beispiel würde das wie folgt aussehen

      Erstelle im Ordner core\functions\  die Datei fn_skinChange.sqf mit folgendem Inhalt

      C: fn_skinChange.sqf
      /*
          Skinwechsel
          Author: moeck
      
          Description: Changes Skin of a special unit.
      */
      private _skin = 0;
      if (playerside isEqualTo west) then {
          if (isNil (player getVariable ["special"]) exitWith {
              player setVariable ["special",0,true];
              [] call life_fnc_playerSkins;
          };
          _skin = (player getVariable ["special",0,[0]]);
          if (_skin isEqualto 0) exitWith {
              player setVariable ["special",1,true];
       [] call life_fnc_playerSkins;
          };
          if (_skin isEqualto 1) exitWith {
       player setVariable ["special",0,true];
       [] call life_fnc_playerSkins;
       };
      };
      Alles anzeigen

      füge dann noch in der Functions.hpp class skinChange {}; unter functions ein.

      In die Init des Schildes muss dann noch der Aufruf

      Code
      this addAction["Umziehen",life_fnc_skinChange,"",0,false,false,"",'playerSide isEqualTo west'];

      Achtung, du musst auch noch eine entsprechende Anpassung in der fn_playerSkins.sqf machen, damit der Skin geladen wird.

      Gruß,

      moeck

    • [Tutorial] Drogendealer und andere illegale Shops abfragen

      • moeck
      • 10. April 2018 um 13:42

      Moin,

      da wir random Drogendealer nutzen und auch weitere illegale Shops auf der Insel haben, wollten wir eine Möglichkeit schaffen, diese von den Cops prüfen zu lassen. Da mir persönlich die Implementierung im Standard Framework nicht gefallen hat, habe ich das Ganze jetzt mal an unsere Bedürfnisse angepasst.

      Wenn man jetzt was beim Drogendealer verkauft landet das in der Datenbank und die Cops können das dann auch entsprechend abfragen. Des Weiteren kann man relativ einfach weitere Shops in das System einbinden ohne dass man hier viel ändern muss.

      Bevor wir loslegen, gilt wie immer, daß ihr das Tutorial gern benutzen allerdings nicht in anderen Foren oder Plattformen veröffentlich dürft.


      1. Anlegen einer neuen Tabelle

      SQL
      CREATE TABLE IF NOT EXISTS `shops` (
        `uid` int(6) NOT NULL AUTO_INCREMENT,
        `name` varchar(32) NOT NULL,
        `pid` varchar(17) NOT NULL,
        `shop` varchar(17) NOT NULL,
        `value` int(100) NOT NULL DEFAULT '0',
        PRIMARY KEY (`uid`),
        KEY `pid` (`pid`),
        KEY `shop` (`shop`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=12 ;

      2. Änderungen in der Mission

      2.1. fn_virt_sell.sqf

      Hier sucht ihr Euch folgenden Eintrag raus.

      C
      f (life_shop_type isEqualTo "drugdealer") then {
          private ["_array","_ind","_val"];
          _array = life_shop_npc getVariable ["sellers",[]];
          _ind = [getPlayerUID player,_array] call TON_fnc_index;
          if (!(_ind isEqualTo -1)) then {
              _val = ((_array select _ind) select 2);
              _val = _val + _price;
              _array set[_ind,[getPlayerUID player,profileName,_val]];
              life_shop_npc setVariable ["sellers",_array,true];
          } else {
              _array pushBack [getPlayerUID player,profileName,_price];
              life_shop_npc setVariable ["sellers",_array,true];
          };
      };
      Alles anzeigen

      Diesen ersetzt ihr wie folgt

      Code
      if(life_shop_type in ["drugdealer"]) then {
          private _shop = if (life_shop_type isEqualTo "drugdealer") then {(vehicleVarName life_shop_npc)} else {_type};
          [1,_shop,player,_price] remoteExec ["DB_fnc_shops",RSERV];
      };

      Sollte ihr weitere Shops einbinden wollen, einfach das Array ["drugdealer"] um den entsprechenden Eintrag erweitern.

      2.2. fn_questionDealer.sqf

      Die komplette Datei ersetzt ihr durch die folgende.

      C: fn_questionDealer.sqf
      #include "..\..\script_macros.hpp"
      /*
          File: fn_questionDealer.sqf
          Author: Bryan "Tonic" Boardwine
          modified by moeck
      
          Description:
          Questions the drug dealer and sets the sellers wanted.
      */
      params [
          ""
          ,""
          ,""
          ,["_shop","",[""]]
      ];
      if (_shop isEqualTo "") exitWith {};
      [0,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV];
      Alles anzeigen

      2.3. fn_receiveDealer.sqf

      Ihr legt eine neue Datei namens fn_receiveDealer.sqf

      Code
      #include "..\..\script_macros.hpp"
      /*
          File: fn_receiveDealer.sqf
          Author: moeck (Lost of Paradise)
          
          Description:
          Get the answer from the dealer
      */
      params [
          ["_sellers",[],[[]]]
          ,["_shop","",[""]]
      ];
      if( _sellers isEqualTo []) exitWith {hint localize "STR_Cop_DealerQuestion"}; //No data.
      life_action_inUse = true;
      _crimes = LIFE_SETTINGS(getArray,"crimes");
      
      _names = "";
      {
          _val = 0;
          if ((_x select 3) > 150000) then {
              _val = round((_x select 3) / 16);
          } else {
              _val = ["483",_crimes] call TON_fnc_index;
              _val = ((_crimes select _val) select 1);
              if (_val isEqualType "") then {
                  _val = parseNumber _val;
              };
          };
          [(_x select 0),(_x select 1),"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV];
          _names = _names + format ["%1<br/>",(_x select 1)];
          true
      } count _sellers;
      
      hint parseText format [(localize "STR_Cop_DealerMSG")+ "<br/><br/>%1",_names];
      [2,_shop,player,0] remoteExec ["DB_fnc_shops",RSERV];
      life_action_inUse = false;
      Alles anzeigen

      2.4. Init des NPCs / Object des Dealers

      In der Init des Drogendealers muss folgende Anpassung gemacht werden.

      Code
      this addAction[localize "STR_MAR_Question_Dealer",life_fnc_questionDealer,"",0,false,false,"",' isNull objectParent player && player distance _target < 5 && playerSide isEqualTo west && !life_action_inUse'];

      den Eintrag ersetzt ihr mit diesem hier

      Code
      this addAction[localize "STR_MAR_Question_Dealer",life_fnc_questionDealer,"Dealer_1",0,false,false,"",' isNull objectParent player && player distance _target < 5 && playerSide isEqualTo west && !life_action_inUse'];

      Achtung ihr müsst natürlich schauen um welchen Dealer es sich handelt und den Wert entsprechend anpassen. Also dann für die anderen Dealer halt "Dealer_2" oder "Dealer_3" verwenden! Oder falls es um einen anderen Shop geht halt das Gewünscht Item (z.B. turtle_soup)

      2.5. Anpassung CfgRemoteExec.hpp

      Ihr müsst natürlich die Nutzung der neuen Funktion noch erlauben. Fügt in die CfgRemoteExec.hpp folgendes ein

      Code
      F(life_fnc_receiveDealer,CLIENT)
      F(DB_fnc_shops,SERVER)

      2.6. Anpassungen Functions.hpp

      In der class Copmuss die neue Funktion noch definiert werden

      Code
      class Cop {
              file = "core\cop";
              class bountyReceive {};
              class containerInvSearch {};
              class copInteractionMenu {};
              class copLights {};
              class copLoadout {};
              class copMarkers {};
              class copSearch {};
              class copSiren {};
              class doorAnimate {};
              class fedCamDisplay {};
              class licenseCheck {};
              class licensesRead {};
              class questionDealer {};
              class radar {};
              class repairDoor {};
              class restrain {};
              class searchClient {};
              class seizeClient {};
              class sirenLights {};
              class spikeStripEffect {};
              class ticketGive {};
              class ticketPaid {};
              class ticketPay {};
              class ticketPrompt {};
              class vehInvSearch {};
              class wantedGrab {};
              class receiveDealer {};
          };
      Alles anzeigen

      So das wars auch schon in der Mission ;)

      3. Änderungen life_server

      3.1. config.cpp

      Hier sucht ihr Euch den Eintrag MySQL_Database raus und fügt unten class shops {}; ein. Das sieht dann ungefähr so aus.

      Code
      class MySQL_Database {
              tag = "DB";
              class MySQL
              {
                  file = "\life_server\Functions\MySQL";
                  class numberSafe {};
                  class mresArray {};
                  class queryRequest{};
                  class asyncCall{};
                  class insertRequest{};
                  class updateRequest{};
                  class mresToArray {};
                  class insertVehicle {};
                  class bool {};
                  class mresString {};
                  class updatePartial {};
                  class shops {};
              };
          };
      Alles anzeigen

      3.2. fn_shops.sqf

      Ihr geht in den Ordner \life_server\Functions\MySQL und erstellt dort die Datei fn_shops.sqf mit folgendem Inhalt

      C: fn_shops.sqf
      /*
      File: fn_shops
      Author: moeck
      
      handle the shops if actions are stored to the DB
      modes:
          0: just get the info from DB
          1: add or update an existing record
          2: delete shop entries
      
      */
      params [
          ["_mode",0,[0]]
          ,["_shop","",[""]]
          ,["_unit",objNull,[objNull]]
          ,["_value",0,[0]]
      ];
      //Stop bad data being passed.
      if (_shop isEqualTo "") exitWith {diag_log "Fehler fn_shops, es fehlt der shop!"};
      private _uid = getPlayerUID _unit;
      private _name = name _unit;
      private _query = "";
      private _queryResult = [];
      //_value = [_value] call DB_fnc_numberSafe;
      
      //Check shop entries
      if (_mode isEqualTo 0) exitWith {
          _query = format ["select pid, name, shop, value from shops where shop = '%1'", _shop];
          _queryResult = [_query,2,true] call DB_fnc_asyncCall;
          [_queryResult,_shop] remoteExec ["life_fnc_receiveDealer",_unit];
      };
      
      //Add or update a record
      if (_mode isEqualTo 1) exitWith {
          if ( _unit isEqualTo objNull || _value isEqualTo 0) exitWith {diag_log "Fehler fn_shops, es fehlen unit oder value ist 0!"};
          _query = format ["select pid, name, shop, value from shops where shop = '%1' and pid = '%2'", _shop,_uid];
          _queryResult = [_query,2] call DB_fnc_asyncCall;
          if (_queryResult isEqualTo []) then {
              _query = format ["insert into shops (pid, name, shop, value) Values ('%1', '%2', '%3', '%4')",
                  _uid
                  ,_name
                  ,_shop
                  ,_value
              ];
              [_query,1] call DB_fnc_asyncCall;
          } else {
              _oldvalue = (_queryResult select 3);
              _value = _oldvalue + _value;
              _query = format ["update shops set `value` = '%1' where pid = '%2' and shop = '%3'",
                  _value
                  ,_uid
                  ,_shop
              ];
              [_query,1] call DB_fnc_asyncCall;
          };
      };
      
      //Delete records for a shop
      if (_mode isEqualTo 2) exitWith {
          _query = format ["delete from shops where shop = '%1'",_shop];
          [_query,1] call DB_fnc_asyncCall;
      };
      Alles anzeigen

      3.3. Änderung init.sqf

      In der life_server\init.sqf sucht ihr Euch folgenden Eintrag heraus

      Code
      [] spawn {
          for "_i" from 0 to 1 step 0 do {
              uiSleep (30 * 60);
              {
                  _x setVariable ["sellers",[],true];
              } forEach [Dealer_1,Dealer_2,Dealer_3];
          };
      };

      und ersetzt diesen durch das

      Code
      //Remove old dealer entries
      {
          [2,_x,objNull,0] call DB_fnc_shops;
          true
      } count ["Dealer_1","Dealer_2","Dealer_3"];
      
      //clear every 30 minutes the dealer list
      [] spawn {
          for "_i" from 0 to 1 step 0 do {
              uiSleep (30 * 60);
              { 
                  [2,_x,objNull,0] call DB_fnc_shops;
                  true
              } count ["Dealer_1","Dealer_2","Dealer_3"];
          };
      };
      Alles anzeigen

      Falls ihr wie oben weitere Shops hinzugefügt habt müsst ihr das Array wieder entsprechend erweitern mit dem gewünschten Shop bzw. Item (z.B. turtle_soup).

      Damit wären wir dann auch schon wieder fertig. :saint:

      Viel Spaß damit.

      Gruß,

      moeck

    • [TUTORIAL][Altis Life 4.0+] AAN News Rundnachrichten

      • moeck
      • 10. April 2018 um 07:49

      vielleicht solltest Du dir das hier mal anschauen ^^

      Code
      ] execVM “script\zlt_fastrope.sqfâ€;
      
      
      
      MAC_fn>
        Error position: <“script\zlt_fastrope.sqfâ€;
      
      
      
      MAC_fn>
        Error Invalid number in expression
      File mpmissions\__cur_mp.Altis\init.sqf, line 14
      Alles anzeigen
    • [Tutorial] Manuelle Wanted Liste - Altis Life

      • moeck
      • 10. April 2018 um 07:47

      also blackfisch warum das den nicht 8o .

    • [IDEE] Zusammenschluss mit Unternehmensstruktur

      • moeck
      • 10. April 2018 um 07:13

      Moin,

      habe es gestern leider nicht mehr geschafft ^^ zu antworten. Nach meiner bisherigen Erfahrung kann das nur gelingen, wenn man sich mit den "richtigen" Leuten zusammenschließt. Heißt die Chemie zwischen den Beteiligten muss passen, sonst kann man das direkt wieder beerdigen. Des Weiteren müssen alle Beteiligten über ein gewisse geistige Reife verfügen und auch in der Lage sein Kompromisse einzugehen. So da das noch nicht reicht müssen sich auch die Beteiligten darüber einig sein ob es ein modded oder vanilla Projekt wird ^^ .

      Nur so als Beispiel blackfisch und ich würdsen uns wahrscheinlich nicht einig werden was das Thema modded oder vanilla angeht 8o . blackfisch zieht nun mal modded Server vor und ich bevorzuge nun mal vanilla.

      Grundsätzlich spricht nix gegen jüngere Projektmitglieder aber, wenn da 2 Generationen auf einander prallen birgt das doch einiges an Konfliktpotenzial. Des Weiteren ist darauf zu achten, dass der Kreis der "Entscheider" nicht zu groß wird. In meinem vorherigen Projekt war es so, dass alle Teammitglieder über Verbesserungsideen und Weiterentwicklungen abgestimmt haben. Dies führt zu fast 3 Jahren stillstand, weil immer irgendjemand etwas gegen eine Veränderung hatte. Erst durch eine neue Projektleitung und einen brauchbaren Scripter ("hust") konnte man dann neue Sachen umsetzen bzw. Dinge verändern.

      Gruß,

      moeck

    • Fahrzeug ClanSkin System

      • moeck
      • 9. April 2018 um 15:33

      oder man versucht es so ;)

      Code
      #include "..\..\script_macros.hpp"
      /*
       File: Skin System
       Author: Julian
       modified by moeck
       Description:
       Switch Vehicle Skins by Clicking
      */
      private _vehicle = life_vInact_curTarget;
      private _type = typeOf _vehicle;
      private _textures = M_CONFIG(getArray,"LifeCfgVehicles",_type,"textures");
      {
          if ([_x] call life_fnc_levelCheck) then {
              for "_i" from 0 to (count(_x select 2)-1) step 1 do {
                  _vehicle setObjectTextureGlobal [_i, ((_x select 2) select _i)];
              };
      true
      } count _textures;
      Alles anzeigen

      Edit: ein then vergessen ;( copy und paste ist keine gute idee :rolleyes:


      Gruß,

      moeck

    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™